From 9e7fe3d33fe86990d43d8f63378d6ee3332273f7 Mon Sep 17 00:00:00 2001 From: Jerome Benoit Date: Sun, 29 Aug 2021 13:45:57 +0100 Subject: [PATCH] Import merkaartor_0.19.0+ds.orig.tar.xz [dgit import orig merkaartor_0.19.0+ds.orig.tar.xz] --- .../INSTALL.TXT | 254 + .../LGPL_EXCEPTION.txt | 23 + .../LICENSE.GPL3 | 674 ++ .../LICENSE.LGPL | 504 ++ .../README.TXT | 7 + .../buildlib/buildlib.pro | 13 + .../common.pri | 6 + .../config.pri | 0 .../configure | 112 + .../doc/html/classic.css | 139 + .../doc/html/images/qt-logo.png | Bin 0 -> 4075 bytes .../doc/html/index.html | 48 + .../doc/html/qtlockedfile-members.html | 166 + .../doc/html/qtlockedfile.html | 111 + .../qtsingleapplication-example-loader.html | 184 + .../qtsingleapplication-example-trivial.html | 110 + .../doc/html/qtsingleapplication-members.html | 231 + .../html/qtsingleapplication-obsolete.html | 31 + .../doc/html/qtsingleapplication.dcf | 53 + .../doc/html/qtsingleapplication.html | 160 + .../doc/html/qtsingleapplication.index | 112 + .../doc/html/qtsingleapplication.qch | Bin 0 -> 52224 bytes .../doc/html/qtsingleapplication.qhp | 65 + ...singlecoreapplication-example-console.html | 127 + .../html/qtsinglecoreapplication-members.html | 126 + .../doc/html/qtsinglecoreapplication.html | 94 + .../doc/images/qt-logo.png | Bin 0 -> 4075 bytes .../doc/index.qdoc | 47 + .../examples/console/console.pro | 5 + .../examples/console/console.qdoc | 71 + .../examples/console/main.cpp | 95 + .../examples/examples.pro | 4 + .../examples/loader/file1.qsl | 1 + .../examples/loader/file2.qsl | 1 + .../examples/loader/loader.pro | 5 + .../examples/loader/loader.qdoc | 87 + .../examples/loader/main.cpp | 158 + .../examples/trivial/main.cpp | 84 + .../examples/trivial/trivial.pro | 5 + .../examples/trivial/trivial.qdoc | 82 + .../qtsingleapplication.pro | 6 + .../src/QtLockedFile | 1 + .../src/QtSingleApplication | 1 + .../src/qtlocalpeer.cpp | 209 + .../src/qtlocalpeer.h | 81 + .../src/qtlockedfile.cpp | 199 + .../src/qtlockedfile.h | 101 + .../src/qtlockedfile_unix.cpp | 121 + .../src/qtlockedfile_win.cpp | 216 + .../src/qtsingleapplication.cpp | 354 + .../src/qtsingleapplication.h | 105 + .../src/qtsingleapplication.pri | 16 + .../src/qtsinglecoreapplication.cpp | 155 + .../src/qtsinglecoreapplication.h | 73 + .../src/qtsinglecoreapplication.pri | 10 + AUTHORS | 30 + CHANGELOG | 992 +++ CMakeLists.txt | 705 ++ COMPILE.md | 207 + CREDITS | 5 + HACKING.md | 92 + Icons/128x128/merkaartor.png | Bin 0 -> 33958 bytes Icons/16x16/merkaartor.png | Bin 0 -> 1030 bytes Icons/192x192/merkaartor.png | Bin 0 -> 68817 bytes Icons/22x22/merkaartor.png | Bin 0 -> 1624 bytes Icons/24x24/merkaartor.png | Bin 0 -> 1849 bytes Icons/256x256/merkaartor.png | Bin 0 -> 113391 bytes Icons/32x32/merkaartor.png | Bin 0 -> 2972 bytes Icons/36x36/merkaartor.png | Bin 0 -> 3640 bytes Icons/40x40/merkaartor.png | Bin 0 -> 4364 bytes Icons/42x42/merkaartor.png | Bin 0 -> 4746 bytes Icons/48x48/merkaartor.png | Bin 0 -> 5671 bytes Icons/512x512/merkaartor.png | Bin 0 -> 384401 bytes Icons/64x64/merkaartor.png | Bin 0 -> 10057 bytes Icons/72x72/merkaartor.png | Bin 0 -> 12385 bytes Icons/80x80/merkaartor.png | Bin 0 -> 14910 bytes Icons/8x8/merkaartor.png | Bin 0 -> 555 bytes Icons/96x96/merkaartor.png | Bin 0 -> 20628 bytes Icons/AllIcons.qrc | 398 + Icons/Frisius.xpm | 503 ++ Icons/Frisius_100x100.png | Bin 0 -> 21845 bytes Icons/Frisius_16x16.ico | Bin 0 -> 1406 bytes Icons/Frisius_48x48.ico | Bin 0 -> 7358 bytes Icons/Frisius_large.xcf | Bin 0 -> 886313 bytes Icons/Frisius_splash.png | Bin 0 -> 185308 bytes Icons/Frisius_splash.xcf | Bin 0 -> 277427 bytes Icons/Gps_Marker.svg | 81 + Icons/Grab.png | Bin 0 -> 3418 bytes Icons/Mapnik/aerodrome.p.16.png | Bin 0 -> 377 bytes Icons/Mapnik/aerodrome.png | Bin 0 -> 888 bytes Icons/Mapnik/aiga_parking1.png | Bin 0 -> 1542 bytes Icons/Mapnik/airport.p.16.png | Bin 0 -> 389 bytes Icons/Mapnik/airport.png | Bin 0 -> 903 bytes Icons/Mapnik/arrow.png | Bin 0 -> 320 bytes Icons/Mapnik/arrow_back.png | Bin 0 -> 353 bytes Icons/Mapnik/atm.png | Bin 0 -> 222 bytes Icons/Mapnik/atm2.p.16.png | Bin 0 -> 437 bytes Icons/Mapnik/bank2.p.16.png | Bin 0 -> 410 bytes Icons/Mapnik/bar.p.20.png | Bin 0 -> 459 bytes Icons/Mapnik/beach.png | Bin 0 -> 162 bytes Icons/Mapnik/bus_stop.p.12.png | Bin 0 -> 353 bytes Icons/Mapnik/bus_stop.png | Bin 0 -> 904 bytes Icons/Mapnik/cable_car.png | Bin 0 -> 229 bytes Icons/Mapnik/cafe.p.16.png | Bin 0 -> 361 bytes Icons/Mapnik/camping.n.16.png | Bin 0 -> 517 bytes Icons/Mapnik/chair_lift.png | Bin 0 -> 230 bytes Icons/Mapnik/christian3.p.14.png | Bin 0 -> 252 bytes Icons/Mapnik/cinema.p.24.png | Bin 0 -> 791 bytes Icons/Mapnik/cliff.png | Bin 0 -> 26214 bytes Icons/Mapnik/cliff2.png | Bin 0 -> 26214 bytes Icons/Mapnik/communications.p.20.png | Bin 0 -> 445 bytes Icons/Mapnik/danger.png | Bin 0 -> 146 bytes Icons/Mapnik/food_bar.p.16.png | Bin 0 -> 376 bytes Icons/Mapnik/forest.png | Bin 0 -> 124 bytes Icons/Mapnik/fuel.p.16.png | Bin 0 -> 306 bytes Icons/Mapnik/gate.png | Bin 0 -> 106 bytes Icons/Mapnik/gate2.png | Bin 0 -> 111 bytes Icons/Mapnik/glacier.png | Bin 0 -> 122 bytes Icons/Mapnik/glacier2.png | Bin 0 -> 199 bytes Icons/Mapnik/grave_yard.png | Bin 0 -> 291 bytes Icons/Mapnik/halt.png | Bin 0 -> 94 bytes Icons/Mapnik/hospital.p.16.png | Bin 0 -> 557 bytes Icons/Mapnik/hospital.png | Bin 0 -> 491 bytes Icons/Mapnik/hotel2.p.20.png | Bin 0 -> 368 bytes Icons/Mapnik/islamic3.p.16.png | Bin 0 -> 387 bytes Icons/Mapnik/jewish3.p.16.png | Bin 0 -> 397 bytes Icons/Mapnik/landfill.png | Bin 0 -> 122 bytes Icons/Mapnik/level_crossing.png | Bin 0 -> 124 bytes Icons/Mapnik/level_crossing2.png | Bin 0 -> 154 bytes Icons/Mapnik/library.p.20.png | Bin 0 -> 715 bytes Icons/Mapnik/london-tube-24.png | Bin 0 -> 621 bytes Icons/Mapnik/marsh.png | Bin 0 -> 621 bytes Icons/Mapnik/mini_round.png | Bin 0 -> 26852 bytes Icons/Mapnik/mosque.png | Bin 0 -> 1023 bytes Icons/Mapnik/motorway_shield1.png | Bin 0 -> 176 bytes Icons/Mapnik/motorway_shield2.png | Bin 0 -> 256 bytes Icons/Mapnik/motorway_shield3.png | Bin 0 -> 251 bytes Icons/Mapnik/motorway_shield4.png | Bin 0 -> 239 bytes Icons/Mapnik/motorway_shield5.png | Bin 0 -> 205 bytes Icons/Mapnik/motorway_shield6.png | Bin 0 -> 207 bytes Icons/Mapnik/mud.png | Bin 0 -> 104 bytes Icons/Mapnik/museum.p.16.png | Bin 0 -> 311 bytes Icons/Mapnik/nature_reserve.png | Bin 0 -> 141 bytes Icons/Mapnik/nature_reserve2.png | Bin 0 -> 170 bytes Icons/Mapnik/parking.p.16.png | Bin 0 -> 312 bytes Icons/Mapnik/parking.png | Bin 0 -> 409 bytes Icons/Mapnik/peak.png | Bin 0 -> 119 bytes Icons/Mapnik/pint.png | Bin 0 -> 486 bytes Icons/Mapnik/place_of_worship.png | Bin 0 -> 209 bytes Icons/Mapnik/place_of_worship3.p.16.png | Bin 0 -> 190 bytes Icons/Mapnik/place_of_worship3.png | Bin 0 -> 103 bytes Icons/Mapnik/post_box.p.16.png | Bin 0 -> 367 bytes Icons/Mapnik/post_box.png | Bin 0 -> 337 bytes Icons/Mapnik/post_office.p.16.png | Bin 0 -> 494 bytes Icons/Mapnik/post_office.png | Bin 0 -> 413 bytes Icons/Mapnik/postoffice.png | Bin 0 -> 297 bytes Icons/Mapnik/power_line.png | Bin 0 -> 131 bytes Icons/Mapnik/power_tower.png | Bin 0 -> 115 bytes Icons/Mapnik/power_wind.png | Bin 0 -> 638 bytes Icons/Mapnik/primary_shield1.png | Bin 0 -> 175 bytes Icons/Mapnik/primary_shield2.png | Bin 0 -> 181 bytes Icons/Mapnik/primary_shield3.png | Bin 0 -> 181 bytes Icons/Mapnik/primary_shield4.png | Bin 0 -> 197 bytes Icons/Mapnik/primary_shield5.png | Bin 0 -> 197 bytes Icons/Mapnik/primary_shield6.png | Bin 0 -> 199 bytes Icons/Mapnik/primary_shield7.png | Bin 0 -> 199 bytes Icons/Mapnik/primary_shield8.png | Bin 0 -> 207 bytes Icons/Mapnik/pub.p.16.png | Bin 0 -> 433 bytes Icons/Mapnik/pub.png | Bin 0 -> 307 bytes Icons/Mapnik/quarry.png | Bin 0 -> 131 bytes Icons/Mapnik/quarry2.png | Bin 0 -> 139 bytes Icons/Mapnik/recycle.png | Bin 0 -> 1118 bytes Icons/Mapnik/recycling.p.16.png | Bin 0 -> 562 bytes Icons/Mapnik/recycling.png | Bin 0 -> 645 bytes Icons/Mapnik/restaurant.p.16.png | Bin 0 -> 502 bytes Icons/Mapnik/scrub.png | Bin 0 -> 166 bytes Icons/Mapnik/secondary_shield1.png | Bin 0 -> 168 bytes Icons/Mapnik/secondary_shield2.png | Bin 0 -> 174 bytes Icons/Mapnik/secondary_shield3.png | Bin 0 -> 176 bytes Icons/Mapnik/secondary_shield4.png | Bin 0 -> 191 bytes Icons/Mapnik/secondary_shield5.png | Bin 0 -> 194 bytes Icons/Mapnik/secondary_shield6.png | Bin 0 -> 196 bytes Icons/Mapnik/secondary_shield7.png | Bin 0 -> 195 bytes Icons/Mapnik/secondary_shield8.png | Bin 0 -> 202 bytes Icons/Mapnik/sikh.png | Bin 0 -> 1297 bytes Icons/Mapnik/sikh3.p.16.png | Bin 0 -> 400 bytes Icons/Mapnik/station.png | Bin 0 -> 95 bytes Icons/Mapnik/station_small.png | Bin 0 -> 95 bytes Icons/Mapnik/synagogue.png | Bin 0 -> 376 bytes Icons/Mapnik/telephone.p.16.png | Bin 0 -> 444 bytes Icons/Mapnik/tertiary_shield1.png | Bin 0 -> 176 bytes Icons/Mapnik/tertiary_shield2.png | Bin 0 -> 182 bytes Icons/Mapnik/tertiary_shield3.png | Bin 0 -> 184 bytes Icons/Mapnik/tertiary_shield4.png | Bin 0 -> 204 bytes Icons/Mapnik/tertiary_shield5.png | Bin 0 -> 204 bytes Icons/Mapnik/tertiary_shield6.png | Bin 0 -> 206 bytes Icons/Mapnik/tertiary_shield7.png | Bin 0 -> 206 bytes Icons/Mapnik/tertiary_shield8.png | Bin 0 -> 214 bytes Icons/Mapnik/toilets.p.20.png | Bin 0 -> 586 bytes Icons/Mapnik/tower.png | Bin 0 -> 327 bytes Icons/Mapnik/tree.png | Bin 0 -> 102 bytes Icons/Mapnik/trunk_shield1.png | Bin 0 -> 175 bytes Icons/Mapnik/trunk_shield2.png | Bin 0 -> 181 bytes Icons/Mapnik/trunk_shield3.png | Bin 0 -> 184 bytes Icons/Mapnik/trunk_shield4.png | Bin 0 -> 202 bytes Icons/Mapnik/trunk_shield5.png | Bin 0 -> 202 bytes Icons/Mapnik/trunk_shield6.png | Bin 0 -> 205 bytes Icons/Mapnik/trunk_shield7.png | Bin 0 -> 204 bytes Icons/Mapnik/trunk_shield8.png | Bin 0 -> 212 bytes Icons/Mapnik/turning_circle.13.png | Bin 0 -> 280 bytes Icons/Mapnik/turning_circle.15.png | Bin 0 -> 332 bytes Icons/Mapnik/turning_circle.17.png | Bin 0 -> 379 bytes Icons/Mapnik/turning_circle.19.png | Bin 0 -> 361 bytes Icons/Mapnik/vineyard.png | Bin 0 -> 149 bytes Icons/Mapnik/windmill.png | Bin 0 -> 186 bytes Icons/Mapnik/zoo.png | Bin 0 -> 129 bytes Icons/Merkaartor.xpm | 509 ++ Icons/Merkaartor_100x100.png | Bin 0 -> 21054 bytes Icons/Merkaartor_16x16.ico | Bin 0 -> 1406 bytes Icons/Merkaartor_48x48.ico | Bin 0 -> 7358 bytes Icons/Merkaartor_installer.bmp | Bin 0 -> 154542 bytes Icons/Merkaartor_large.xcf | Bin 0 -> 706744 bytes Icons/Merkaartor_splash.png | Bin 0 -> 158856 bytes Icons/Merkaartor_splash.xcf | Bin 0 -> 252900 bytes Icons/Places/place_hamlet.png | Bin 0 -> 259 bytes Icons/Places/place_town.png | Bin 0 -> 231 bytes Icons/Places/place_village.png | Bin 0 -> 329 bytes Icons/QToolBarDialog/back.png | Bin 0 -> 678 bytes Icons/QToolBarDialog/down.png | Bin 0 -> 594 bytes Icons/QToolBarDialog/forward.png | Bin 0 -> 655 bytes Icons/QToolBarDialog/minus.png | Bin 0 -> 250 bytes Icons/QToolBarDialog/plus.png | Bin 0 -> 462 bytes Icons/QToolBarDialog/qttoolbardialog.qrc | 10 + Icons/QToolBarDialog/up.png | Bin 0 -> 692 bytes Icons/Tiles/000.png | Bin 0 -> 11397 bytes Icons/Tiles/100.png | Bin 0 -> 10990 bytes Icons/Tiles/101.png | Bin 0 -> 5420 bytes Icons/Tiles/110.png | Bin 0 -> 11889 bytes Icons/Tiles/111.png | Bin 0 -> 4851 bytes Icons/actions/GPS.png | Bin 0 -> 695 bytes Icons/actions/align_nodes.png | Bin 0 -> 912 bytes Icons/actions/axisalign.png | Bin 0 -> 3701 bytes Icons/actions/break_apart_roads.png | Bin 0 -> 1289 bytes Icons/actions/build_bridge.png | Bin 0 -> 305 bytes Icons/actions/camera.png | Bin 0 -> 580 bytes Icons/actions/create_area.png | Bin 0 -> 932 bytes Icons/actions/create_node.png | Bin 0 -> 618 bytes Icons/actions/create_road.png | Bin 0 -> 916 bytes Icons/actions/detach_node.png | Bin 0 -> 802 bytes Icons/actions/document_import.png | Bin 0 -> 851 bytes Icons/actions/document_new.png | Bin 0 -> 873 bytes Icons/actions/document_open.png | Bin 0 -> 796 bytes Icons/actions/download.png | Bin 0 -> 1146 bytes Icons/actions/download_more.png | Bin 0 -> 997 bytes Icons/actions/edit-cut.png | Bin 0 -> 1177 bytes Icons/actions/edit_copy.png | Bin 0 -> 644 bytes Icons/actions/edit_delete.png | Bin 0 -> 670 bytes Icons/actions/edit_move.png | Bin 0 -> 1028 bytes Icons/actions/edit_paste.png | Bin 0 -> 816 bytes Icons/actions/edit_paste_tags.png | Bin 0 -> 1033 bytes Icons/actions/edit_rotate.png | Bin 0 -> 869 bytes Icons/actions/edit_rotate.svg | 565 ++ Icons/actions/emblem-important.png | Bin 0 -> 717 bytes Icons/actions/emblem-unreadable.png | Bin 0 -> 669 bytes Icons/actions/find.png | Bin 0 -> 1030 bytes Icons/actions/goto.png | Bin 0 -> 591 bytes Icons/actions/join_areas.png | Bin 0 -> 3649 bytes Icons/actions/join_roads.png | Bin 0 -> 917 bytes Icons/actions/list-add.png | Bin 0 -> 386 bytes Icons/actions/list-remove.png | Bin 0 -> 252 bytes Icons/actions/offline.png | Bin 0 -> 807 bytes Icons/actions/preferences.png | Bin 0 -> 1255 bytes Icons/actions/redo.png | Bin 0 -> 513 bytes Icons/actions/reverse_road.png | Bin 0 -> 652 bytes Icons/actions/save.png | Bin 0 -> 798 bytes Icons/actions/select.png | Bin 0 -> 888 bytes Icons/actions/software-update-available.png | Bin 0 -> 740 bytes Icons/actions/split_area.png | Bin 0 -> 1126 bytes Icons/actions/split_road.png | Bin 0 -> 823 bytes Icons/actions/spread_nodes.png | Bin 0 -> 977 bytes Icons/actions/subdivide_road.png | Bin 0 -> 977 bytes Icons/actions/terrace_building.png | Bin 0 -> 1198 bytes Icons/actions/transform-move.png | Bin 0 -> 638 bytes Icons/actions/transform-rotate.png | Bin 0 -> 863 bytes Icons/actions/transform-scale.png | Bin 0 -> 902 bytes Icons/actions/undo.png | Bin 0 -> 512 bytes Icons/actions/upload.png | Bin 0 -> 1038 bytes Icons/actions/zoom_fit_best.png | Bin 0 -> 1203 bytes Icons/actions/zoom_in.png | Bin 0 -> 1191 bytes Icons/actions/zoom_out.png | Bin 0 -> 1173 bytes Icons/add.xpm | 30 + Icons/dialog-error.png | Bin 0 -> 1645 bytes Icons/dialog-warning.png | Bin 0 -> 1391 bytes Icons/edit-copy.png | Bin 0 -> 725 bytes Icons/edit-cut.png | Bin 0 -> 1177 bytes Icons/edit-paste.png | Bin 0 -> 773 bytes Icons/edit-redo.xpm | 98 + Icons/edit-undo.xpm | 109 + Icons/emblem-readonly.png | Bin 0 -> 430 bytes Icons/empty.xpm | 44 + Icons/eye.xpm | 44 + Icons/frisius-win32.rc | 1 + Icons/geotagged.png | Bin 0 -> 213 bytes Icons/grabbing.png | Bin 0 -> 3397 bytes .../map-icons/classic.small/accommodation.png | Bin 0 -> 474 bytes .../classic.small/accommodation/camping.png | Bin 0 -> 517 bytes .../accommodation/camping/caravan.png | Bin 0 -> 529 bytes .../accommodation/camping/dump-station.png | Bin 0 -> 654 bytes .../accommodation/camping/gas-refill.png | Bin 0 -> 460 bytes .../accommodation/camping/hookup.png | Bin 0 -> 436 bytes .../accommodation/camping/trash.png | Bin 0 -> 439 bytes .../accommodation/camping/wastewater.png | Bin 0 -> 548 bytes .../accommodation/camping/water.png | Bin 0 -> 471 bytes .../classic.small/accommodation/chalet.png | Bin 0 -> 582 bytes .../accommodation/guest_house.png | Bin 0 -> 629 bytes .../classic.small/accommodation/hostel.png | Bin 0 -> 520 bytes .../classic.small/accommodation/hotel.png | Bin 0 -> 474 bytes .../accommodation/hotel/five_star.png | Bin 0 -> 454 bytes .../accommodation/hotel/four_star.png | Bin 0 -> 441 bytes .../accommodation/hotel/one_star.png | Bin 0 -> 401 bytes .../accommodation/hotel/three_star.png | Bin 0 -> 428 bytes .../accommodation/hotel/two_star.png | Bin 0 -> 419 bytes .../classic.small/accommodation/motel.png | Bin 0 -> 535 bytes .../accommodation/shelter-bw.png | Bin 0 -> 643 bytes .../classic.small/accommodation/shelter.png | Bin 0 -> 1032 bytes Icons/map-icons/classic.small/education.png | Bin 0 -> 598 bytes .../classic.small/education/college.png | Bin 0 -> 549 bytes .../classic.small/education/kindergarten.png | Bin 0 -> 679 bytes .../classic.small/education/school.png | Bin 0 -> 487 bytes .../education/school/primary.png | Bin 0 -> 255 bytes .../classic.small/education/university.png | Bin 0 -> 432 bytes Icons/map-icons/classic.small/empty.png | Bin 0 -> 333 bytes Icons/map-icons/classic.small/food.png | Bin 0 -> 817 bytes .../classic.small/food/bacon_and_eggs.png | Bin 0 -> 957 bytes Icons/map-icons/classic.small/food/bar.png | Bin 0 -> 381 bytes .../classic.small/food/biergarten.png | Bin 0 -> 946 bytes Icons/map-icons/classic.small/food/cafe.png | Bin 0 -> 859 bytes .../classic.small/food/drinking_water.png | Bin 0 -> 656 bytes .../map-icons/classic.small/food/fastfood.png | Bin 0 -> 912 bytes .../food/fastfood/burger-king.png | Bin 0 -> 991 bytes .../food/fastfood/mc-donalds.png | Bin 0 -> 952 bytes .../map-icons/classic.small/food/icecream.png | Bin 0 -> 834 bytes Icons/map-icons/classic.small/food/pub.png | Bin 0 -> 307 bytes .../classic.small/food/restaurant.png | Bin 0 -> 201 bytes .../food/restaurant/japanese.png | Bin 0 -> 933 bytes Icons/map-icons/classic.small/food/snacks.png | Bin 0 -> 827 bytes .../classic.small/food/snacks/pizza.png | Bin 0 -> 958 bytes .../map-icons/classic.small/food/teashop.png | Bin 0 -> 200 bytes .../classic.small/food/wine_tavern.png | Bin 0 -> 854 bytes Icons/map-icons/classic.small/geocache.png | Bin 0 -> 590 bytes Icons/map-icons/classic.small/health.png | Bin 0 -> 264 bytes .../classic.small/health/dentist.png | Bin 0 -> 669 bytes .../map-icons/classic.small/health/doctor.png | Bin 0 -> 439 bytes .../classic.small/health/emergency.png | Bin 0 -> 507 bytes .../classic.small/health/eye_specialist.png | Bin 0 -> 873 bytes .../classic.small/health/hospital.png | Bin 0 -> 531 bytes .../classic.small/health/optician.png | Bin 0 -> 831 bytes .../classic.small/health/pharmacy.png | Bin 0 -> 441 bytes .../classic.small/health/veterinary.png | Bin 0 -> 1019 bytes .../classic.small/incomming/Broad.png | Bin 0 -> 78 bytes .../classic.small/incomming/OLmarker.png | Bin 0 -> 542 bytes .../classic.small/incomming/amenity.png | Bin 0 -> 106 bytes .../classic.small/incomming/aroad.png | Bin 0 -> 78 bytes .../classic.small/incomming/bridleway.png | Bin 0 -> 77 bytes .../classic.small/incomming/byway.png | Bin 0 -> 77 bytes .../classic.small/incomming/contours.png | Bin 0 -> 193 bytes .../classic.small/incomming/footpath.png | Bin 0 -> 77 bytes .../classic.small/incomming/fwpbr.png | Bin 0 -> 78 bytes .../classic.small/incomming/industry.png | Bin 0 -> 162 bytes .../classic.small/incomming/interest.png | Bin 0 -> 141 bytes .../incomming/london-tube-24.png | Bin 0 -> 621 bytes .../classic.small/incomming/minorroad.png | Bin 0 -> 77 bytes .../incomming/motorway_shield2.png | Bin 0 -> 251 bytes .../incomming/motorway_shield3.png | Bin 0 -> 239 bytes .../map-icons/classic.small/incomming/one.png | Bin 0 -> 106 bytes .../classic.small/incomming/pbridleway.png | Bin 0 -> 70 bytes .../classic.small/incomming/place.png | Bin 0 -> 184 bytes .../classic.small/incomming/railway.png | Bin 0 -> 77 bytes .../classic.small/incomming/road.png | Bin 0 -> 78 bytes .../classic.small/incomming/station.png | Bin 0 -> 381 bytes .../classic.small/incomming/stationnew.png | Bin 0 -> 175 bytes .../classic.small/incomming/three.png | Bin 0 -> 110 bytes .../map-icons/classic.small/incomming/two.png | Bin 0 -> 101 bytes Icons/map-icons/classic.small/misc.png | Bin 0 -> 831 bytes Icons/map-icons/classic.small/misc/bunny.png | Bin 0 -> 760 bytes .../classic.small/misc/butterfly.png | Bin 0 -> 829 bytes .../classic.small/misc/construction.png | Bin 0 -> 456 bytes Icons/map-icons/classic.small/misc/danger.png | Bin 0 -> 644 bytes .../classic.small/misc/deprecated.png | Bin 0 -> 650 bytes Icons/map-icons/classic.small/misc/door.png | Bin 0 -> 320 bytes .../classic.small/misc/housenumber.png | Bin 0 -> 428 bytes .../classic.small/misc/information.png | Bin 0 -> 495 bytes .../map-icons/classic.small/misc/landmark.png | Bin 0 -> 302 bytes .../classic.small/misc/landmark/barn.png | Bin 0 -> 495 bytes .../classic.small/misc/landmark/beacon.png | Bin 0 -> 356 bytes .../classic.small/misc/landmark/building.png | Bin 0 -> 434 bytes .../classic.small/misc/landmark/bunker.png | Bin 0 -> 471 bytes .../classic.small/misc/landmark/chimney.png | Bin 0 -> 331 bytes .../classic.small/misc/landmark/crane.png | Bin 0 -> 527 bytes .../classic.small/misc/landmark/farm.png | Bin 0 -> 651 bytes .../classic.small/misc/landmark/gasometer.png | Bin 0 -> 543 bytes .../classic.small/misc/landmark/glacier.png | Bin 0 -> 314 bytes .../misc/landmark/glacier_small.png | Bin 0 -> 283 bytes .../misc/landmark/lighthouse.png | Bin 0 -> 537 bytes .../classic.small/misc/landmark/mine.png | Bin 0 -> 648 bytes .../misc/landmark/mountain_pass.png | Bin 0 -> 507 bytes .../classic.small/misc/landmark/peak.png | Bin 0 -> 366 bytes .../misc/landmark/peak_small.png | Bin 0 -> 298 bytes .../classic.small/misc/landmark/pier.png | Bin 0 -> 532 bytes .../classic.small/misc/landmark/plant.png | Bin 0 -> 759 bytes .../classic.small/misc/landmark/power.png | Bin 0 -> 391 bytes .../misc/landmark/power/fossil.png | Bin 0 -> 525 bytes .../misc/landmark/power/hydro.png | Bin 0 -> 462 bytes .../misc/landmark/power/nuclear.png | Bin 0 -> 664 bytes .../misc/landmark/power/tower.png | Bin 0 -> 572 bytes .../misc/landmark/power/tower_small.png | Bin 0 -> 397 bytes .../misc/landmark/power/wind.png | Bin 0 -> 591 bytes .../classic.small/misc/landmark/range.png | Bin 0 -> 619 bytes .../misc/landmark/reservoir_covered.png | Bin 0 -> 519 bytes .../classic.small/misc/landmark/spring.png | Bin 0 -> 259 bytes .../misc/landmark/survey_point.png | Bin 0 -> 430 bytes .../classic.small/misc/landmark/tower.png | Bin 0 -> 309 bytes .../classic.small/misc/landmark/trees.png | Bin 0 -> 819 bytes .../classic.small/misc/landmark/volcano.png | Bin 0 -> 292 bytes .../misc/landmark/volcano_small.png | Bin 0 -> 236 bytes .../misc/landmark/wastewater_plant.png | Bin 0 -> 654 bytes .../misc/landmark/water_tower.png | Bin 0 -> 346 bytes .../classic.small/misc/landmark/windmill.png | Bin 0 -> 554 bytes .../classic.small/misc/landmark/works.png | Bin 0 -> 488 bytes .../classic.small/misc/landuse/commercial.png | Bin 0 -> 305 bytes .../misc/landuse/residential.png | Bin 0 -> 408 bytes .../classic.small/misc/lock_closed.png | Bin 0 -> 625 bytes .../classic.small/misc/lock_open.png | Bin 0 -> 653 bytes .../map-icons/classic.small/misc/no_icon.png | Bin 0 -> 335 bytes .../classic.small/misc/no_smoking.png | Bin 0 -> 867 bytes Icons/map-icons/classic.small/misc/note.png | Bin 0 -> 336 bytes .../map-icons/classic.small/misc/proposed.png | Bin 0 -> 633 bytes .../classic.small/misc/surveillance.png | Bin 0 -> 482 bytes .../classic.small/misc/tap_drinking.png | Bin 0 -> 455 bytes Icons/map-icons/classic.small/money.png | Bin 0 -> 494 bytes Icons/map-icons/classic.small/money/atm.png | Bin 0 -> 606 bytes Icons/map-icons/classic.small/money/bank.png | Bin 0 -> 672 bytes .../classic.small/money/bank/vr-bank.png | Bin 0 -> 577 bytes .../classic.small/money/exchange.png | Bin 0 -> 629 bytes Icons/map-icons/classic.small/nautical.png | Bin 0 -> 212 bytes .../classic.small/nautical/alpha_flag.png | Bin 0 -> 401 bytes .../classic.small/nautical/anchor.png | Bin 0 -> 361 bytes .../classic.small/nautical/aqueduct.png | Bin 0 -> 333 bytes .../map-icons/classic.small/nautical/boat.png | Bin 0 -> 559 bytes .../classic.small/nautical/boatyard.png | Bin 0 -> 709 bytes .../classic.small/nautical/lock_gate.png | Bin 0 -> 308 bytes .../classic.small/nautical/marina.png | Bin 0 -> 361 bytes .../classic.small/nautical/slipway.png | Bin 0 -> 432 bytes .../classic.small/nautical/turning.png | Bin 0 -> 323 bytes .../classic.small/nautical/waterfall.png | Bin 0 -> 394 bytes .../map-icons/classic.small/nautical/weir.png | Bin 0 -> 350 bytes Icons/map-icons/classic.small/people.png | Bin 0 -> 304 bytes .../classic.small/people/friends.png | Bin 0 -> 517 bytes .../classic.small/people/friendsd.png | Bin 0 -> 693 bytes Icons/map-icons/classic.small/people/work.png | Bin 0 -> 305 bytes Icons/map-icons/classic.small/places.png | Bin 0 -> 513 bytes .../map-icons/classic.small/places/island.png | Bin 0 -> 602 bytes .../classic.small/places/locality.png | Bin 0 -> 397 bytes .../classic.small/places/settlement.png | Bin 0 -> 353 bytes .../places/settlement/capital.png | Bin 0 -> 314 bytes .../classic.small/places/settlement/city.png | Bin 0 -> 278 bytes .../classic.small/places/settlement/town.png | Bin 0 -> 278 bytes Icons/map-icons/classic.small/public.png | Bin 0 -> 1166 bytes .../public/administration/court_of_law.png | Bin 0 -> 535 bytes .../public/administration/prison.png | Bin 0 -> 236 bytes .../classic.small/public/arts_centre.png | Bin 0 -> 717 bytes .../classic.small/public/firebrigade.png | Bin 0 -> 534 bytes .../map-icons/classic.small/public/police.png | Bin 0 -> 761 bytes .../classic.small/public/post_box.png | Bin 0 -> 373 bytes .../classic.small/public/post_office.png | Bin 0 -> 561 bytes .../classic.small/public/recycling.png | Bin 0 -> 671 bytes .../public/recycling/trash-bin.png | Bin 0 -> 439 bytes .../classic.small/public/telephone.png | Bin 0 -> 729 bytes .../classic.small/public/toilets.png | Bin 0 -> 683 bytes Icons/map-icons/classic.small/recreation.png | Bin 0 -> 773 bytes .../classic.small/recreation/bench.png | Bin 0 -> 165 bytes .../classic.small/recreation/bicycling.png | Bin 0 -> 439 bytes .../classic.small/recreation/cinema.png | Bin 0 -> 721 bytes .../classic.small/recreation/common.png | Bin 0 -> 374 bytes .../classic.small/recreation/garden.png | Bin 0 -> 258 bytes .../classic.small/recreation/music.png | Bin 0 -> 443 bytes .../recreation/nature_reserve.png | Bin 0 -> 287 bytes .../classic.small/recreation/nightclub.png | Bin 0 -> 673 bytes .../classic.small/recreation/park.png | Bin 0 -> 113 bytes .../classic.small/recreation/picnic.png | Bin 0 -> 565 bytes .../classic.small/recreation/playground.png | Bin 0 -> 648 bytes .../classic.small/recreation/shelter.png | Bin 0 -> 684 bytes .../classic.small/recreation/theater.png | Bin 0 -> 922 bytes .../classic.small/recreation/theme_park.png | Bin 0 -> 871 bytes .../classic.small/recreation/water_park.png | Bin 0 -> 322 bytes .../classic.small/recreation/zoo.png | Bin 0 -> 723 bytes Icons/map-icons/classic.small/religion.png | Bin 0 -> 794 bytes .../classic.small/religion/cemetery.png | Bin 0 -> 331 bytes .../classic.small/religion/chapel.png | Bin 0 -> 505 bytes .../classic.small/religion/church.png | Bin 0 -> 261 bytes .../classic.small/religion/church/bahai.png | Bin 0 -> 705 bytes .../religion/church/buddhism.png | Bin 0 -> 613 bytes .../religion/church/catholic.png | Bin 0 -> 435 bytes .../religion/church/hinduism.png | Bin 0 -> 610 bytes .../classic.small/religion/church/jainism.png | Bin 0 -> 526 bytes .../classic.small/religion/church/mormon.png | Bin 0 -> 741 bytes .../classic.small/religion/church/mosque.png | Bin 0 -> 494 bytes .../religion/church/orthodox.png | Bin 0 -> 493 bytes .../religion/church/protestant.png | Bin 0 -> 448 bytes .../classic.small/religion/church/shinto.png | Bin 0 -> 355 bytes .../classic.small/religion/church/sikhism.png | Bin 0 -> 703 bytes .../religion/church/synagogue.png | Bin 0 -> 465 bytes .../classic.small/religion/church/taoism.png | Bin 0 -> 615 bytes .../classic.small/religion/wayside_cross.png | Bin 0 -> 206 bytes .../classic.small/religion/wayside_shrine.png | Bin 0 -> 469 bytes Icons/map-icons/classic.small/rendering.png | Bin 0 -> 256 bytes .../classic.small/rendering/beach.png | Bin 0 -> 162 bytes .../classic.small/rendering/cliff.png | Bin 0 -> 26214 bytes .../classic.small/rendering/cliff2.png | Bin 0 -> 26214 bytes .../classic.small/rendering/quarry.png | Bin 0 -> 131 bytes .../classic.small/rendering/quarry2.png | Bin 0 -> 139 bytes .../rendering/rail_preserved.png | Bin 0 -> 26027 bytes .../rendering/shield/motorway_shield.png | Bin 0 -> 256 bytes .../rendering/shield/motorway_shield1.png | Bin 0 -> 176 bytes .../rendering/shield/motorway_shield2.png | Bin 0 -> 256 bytes .../rendering/shield/motorway_shield3.png | Bin 0 -> 251 bytes .../rendering/shield/motorway_shield4.png | Bin 0 -> 239 bytes .../rendering/shield/motorway_shield5.png | Bin 0 -> 205 bytes .../rendering/shield/motorway_shield6.png | Bin 0 -> 207 bytes .../rendering/shield/primary_shield1.png | Bin 0 -> 175 bytes .../rendering/shield/primary_shield2.png | Bin 0 -> 181 bytes .../rendering/shield/primary_shield3.png | Bin 0 -> 181 bytes .../rendering/shield/primary_shield4.png | Bin 0 -> 197 bytes .../rendering/shield/primary_shield5.png | Bin 0 -> 197 bytes .../rendering/shield/primary_shield6.png | Bin 0 -> 199 bytes .../rendering/shield/primary_shield7.png | Bin 0 -> 199 bytes .../rendering/shield/primary_shield8.png | Bin 0 -> 207 bytes .../rendering/shield/secondary_shield1.png | Bin 0 -> 168 bytes .../rendering/shield/secondary_shield2.png | Bin 0 -> 174 bytes .../rendering/shield/secondary_shield3.png | Bin 0 -> 176 bytes .../rendering/shield/secondary_shield4.png | Bin 0 -> 191 bytes .../rendering/shield/secondary_shield5.png | Bin 0 -> 194 bytes .../rendering/shield/secondary_shield6.png | Bin 0 -> 196 bytes .../rendering/shield/secondary_shield7.png | Bin 0 -> 195 bytes .../rendering/shield/secondary_shield8.png | Bin 0 -> 202 bytes .../rendering/shield/tertiary_shield1.png | Bin 0 -> 176 bytes .../rendering/shield/tertiary_shield2.png | Bin 0 -> 182 bytes .../rendering/shield/tertiary_shield3.png | Bin 0 -> 184 bytes .../rendering/shield/tertiary_shield4.png | Bin 0 -> 204 bytes .../rendering/shield/tertiary_shield5.png | Bin 0 -> 204 bytes .../rendering/shield/tertiary_shield6.png | Bin 0 -> 206 bytes .../rendering/shield/tertiary_shield7.png | Bin 0 -> 206 bytes .../rendering/shield/tertiary_shield8.png | Bin 0 -> 214 bytes .../rendering/shield/trunk_shield1.png | Bin 0 -> 175 bytes .../rendering/shield/trunk_shield2.png | Bin 0 -> 181 bytes .../rendering/shield/trunk_shield3.png | Bin 0 -> 184 bytes .../rendering/shield/trunk_shield4.png | Bin 0 -> 202 bytes .../rendering/shield/trunk_shield5.png | Bin 0 -> 202 bytes .../rendering/shield/trunk_shield6.png | Bin 0 -> 205 bytes .../rendering/shield/trunk_shield7.png | Bin 0 -> 204 bytes .../rendering/shield/trunk_shield8.png | Bin 0 -> 212 bytes .../classic.small/rendering/station_small.png | Bin 0 -> 231 bytes .../classic.small/rendering/track/arrow.png | Bin 0 -> 320 bytes .../rendering/track/arrow_back.png | Bin 0 -> 353 bytes .../rendering/track/mini_round.png | Bin 0 -> 26852 bytes .../classic.small/rendering/track/rail.png | Bin 0 -> 217 bytes .../rendering/track/station_small.png | Bin 0 -> 231 bytes Icons/map-icons/classic.small/shopping.png | Bin 0 -> 896 bytes .../classic.small/shopping/beverages.png | Bin 0 -> 1020 bytes .../classic.small/shopping/chemist.png | Bin 0 -> 555 bytes .../classic.small/shopping/clothes.png | Bin 0 -> 653 bytes .../classic.small/shopping/computer.png | Bin 0 -> 664 bytes .../classic.small/shopping/diy_store.png | Bin 0 -> 944 bytes .../classic.small/shopping/electronics.png | Bin 0 -> 694 bytes .../classic.small/shopping/florist.png | Bin 0 -> 737 bytes .../classic.small/shopping/furniture.png | Bin 0 -> 864 bytes .../classic.small/shopping/garden_centre.png | Bin 0 -> 664 bytes .../shopping/groceries/bakery.png | Bin 0 -> 460 bytes .../shopping/groceries/butcher.png | Bin 0 -> 196 bytes .../shopping/groceries/fruits.png | Bin 0 -> 621 bytes .../classic.small/shopping/hairdresser.png | Bin 0 -> 651 bytes .../map-icons/classic.small/shopping/hifi.png | Bin 0 -> 703 bytes .../classic.small/shopping/jewelry.png | Bin 0 -> 897 bytes .../classic.small/shopping/kiosk.png | Bin 0 -> 609 bytes .../classic.small/shopping/laundry.png | Bin 0 -> 527 bytes .../map-icons/classic.small/shopping/mall.png | Bin 0 -> 679 bytes .../classic.small/shopping/optician.png | Bin 0 -> 483 bytes .../classic.small/shopping/rental/library.png | Bin 0 -> 263 bytes .../classic.small/shopping/shoes.png | Bin 0 -> 722 bytes .../classic.small/shopping/sports/outdoor.png | Bin 0 -> 868 bytes .../classic.small/shopping/supermarket.png | Bin 0 -> 896 bytes .../shopping/supermarket/aldi.png | Bin 0 -> 658 bytes .../shopping/supermarket/aldi_nord.png | Bin 0 -> 791 bytes .../shopping/supermarket/kaufland.png | Bin 0 -> 628 bytes .../shopping/supermarket/lidl.png | Bin 0 -> 781 bytes .../classic.small/shopping/tailor.png | Bin 0 -> 869 bytes .../map-icons/classic.small/shopping/toys.png | Bin 0 -> 929 bytes .../classic.small/shopping/video.png | Bin 0 -> 490 bytes Icons/map-icons/classic.small/sightseeing.png | Bin 0 -> 402 bytes .../sightseeing/archaeological.png | Bin 0 -> 287 bytes .../classic.small/sightseeing/battlefield.png | Bin 0 -> 757 bytes .../classic.small/sightseeing/castle.png | Bin 0 -> 270 bytes .../classic.small/sightseeing/memorial.png | Bin 0 -> 425 bytes .../classic.small/sightseeing/monument.png | Bin 0 -> 248 bytes .../classic.small/sightseeing/museum.png | Bin 0 -> 562 bytes .../classic.small/sightseeing/ruins.png | Bin 0 -> 447 bytes .../classic.small/sightseeing/viewpoint.png | Bin 0 -> 198 bytes Icons/map-icons/classic.small/sports.png | Bin 0 -> 801 bytes .../map-icons/classic.small/sports/10pin.png | Bin 0 -> 705 bytes .../classic.small/sports/archery.png | Bin 0 -> 731 bytes .../classic.small/sports/baseball.png | Bin 0 -> 951 bytes .../classic.small/sports/basketball.png | Bin 0 -> 934 bytes .../classic.small/sports/bicycle.png | Bin 0 -> 565 bytes .../map-icons/classic.small/sports/boule.png | Bin 0 -> 490 bytes .../map-icons/classic.small/sports/centre.png | Bin 0 -> 419 bytes .../classic.small/sports/cricket.png | Bin 0 -> 513 bytes .../classic.small/sports/croquet.png | Bin 0 -> 521 bytes .../classic.small/sports/cycling.png | Bin 0 -> 700 bytes Icons/map-icons/classic.small/sports/dart.png | Bin 0 -> 840 bytes .../map-icons/classic.small/sports/diving.png | Bin 0 -> 405 bytes .../classic.small/sports/fishing.png | Bin 0 -> 333 bytes .../classic.small/sports/football.png | Bin 0 -> 661 bytes Icons/map-icons/classic.small/sports/golf.png | Bin 0 -> 587 bytes .../classic.small/sports/handball.png | Bin 0 -> 507 bytes .../map-icons/classic.small/sports/hockey.png | Bin 0 -> 260 bytes .../classic.small/sports/indoor_pool.png | Bin 0 -> 650 bytes .../classic.small/sports/kiteflying.png | Bin 0 -> 556 bytes .../classic.small/sports/mountain_bike.png | Bin 0 -> 755 bytes .../map-icons/classic.small/sports/multi.png | Bin 0 -> 743 bytes .../map-icons/classic.small/sports/pitch.png | Bin 0 -> 773 bytes Icons/map-icons/classic.small/sports/pool.png | Bin 0 -> 610 bytes .../classic.small/sports/racquetball.png | Bin 0 -> 762 bytes .../map-icons/classic.small/sports/riding.png | Bin 0 -> 543 bytes .../map-icons/classic.small/sports/skiing.png | Bin 0 -> 730 bytes .../map-icons/classic.small/sports/soccer.png | Bin 0 -> 801 bytes .../classic.small/sports/stadium.png | Bin 0 -> 700 bytes .../classic.small/sports/swimming.png | Bin 0 -> 544 bytes .../classic.small/sports/table_tennis.png | Bin 0 -> 715 bytes .../map-icons/classic.small/sports/tennis.png | Bin 0 -> 800 bytes .../map-icons/classic.small/sports/track.png | Bin 0 -> 307 bytes .../classic.small/sports/volleyball.png | Bin 0 -> 1103 bytes Icons/map-icons/classic.small/transport.png | Bin 0 -> 559 bytes .../classic.small/transport/aerialway.png | Bin 0 -> 553 bytes .../transport/aerialway/cable_car.png | Bin 0 -> 553 bytes .../transport/aerialway/chair_lift.png | Bin 0 -> 614 bytes .../transport/aerialway/drag_lift.png | Bin 0 -> 507 bytes .../transport/aerialway/station.png | Bin 0 -> 416 bytes .../classic.small/transport/airport.png | Bin 0 -> 491 bytes .../transport/airport/airfield.png | Bin 0 -> 443 bytes .../transport/airport/helipad.png | Bin 0 -> 308 bytes .../transport/airport/terminal.png | Bin 0 -> 557 bytes .../classic.small/transport/bridge.png | Bin 0 -> 347 bytes .../transport/bridge/bridge-car.png | Bin 0 -> 463 bytes .../transport/bridge/bridge-pedestrian.png | Bin 0 -> 443 bytes .../transport/bridge/drawbridge.png | Bin 0 -> 444 bytes .../map-icons/classic.small/transport/bus.png | Bin 0 -> 608 bytes .../classic.small/transport/bus_small.png | Bin 0 -> 513 bytes .../map-icons/classic.small/transport/car.png | Bin 0 -> 438 bytes .../classic.small/transport/ferry.png | Bin 0 -> 370 bytes .../transport/ferry/ferry-car.png | Bin 0 -> 472 bytes .../transport/ferry/ferry-pedestrian.png | Bin 0 -> 459 bytes .../classic.small/transport/funicular.png | Bin 0 -> 937 bytes .../classic.small/transport/handicapped.png | Bin 0 -> 399 bytes .../classic.small/transport/harbour.png | Bin 0 -> 495 bytes .../classic.small/transport/park_ride.png | Bin 0 -> 423 bytes .../classic.small/transport/pedestrian.png | Bin 0 -> 433 bytes .../classic.small/transport/railway.png | Bin 0 -> 732 bytes .../classic.small/transport/railway_small.png | Bin 0 -> 231 bytes .../classic.small/transport/rapid_train.png | Bin 0 -> 731 bytes .../classic.small/transport/steps.png | Bin 0 -> 632 bytes .../classic.small/transport/taxi.png | Bin 0 -> 552 bytes .../transport/ticket-machine.png | Bin 0 -> 550 bytes .../classic.small/transport/track.png | Bin 0 -> 217 bytes .../classic.small/transport/tram.png | Bin 0 -> 373 bytes .../classic.small/transport/turntable.png | Bin 0 -> 551 bytes .../classic.small/transport/underground.png | Bin 0 -> 722 bytes Icons/map-icons/classic.small/unknown.png | Bin 0 -> 485 bytes Icons/map-icons/classic.small/vehicle.png | Bin 0 -> 473 bytes .../classic.small/vehicle/bicycle_rental.png | Bin 0 -> 793 bytes .../classic.small/vehicle/car_rental.png | Bin 0 -> 597 bytes .../classic.small/vehicle/car_rental/sixt.png | Bin 0 -> 813 bytes .../classic.small/vehicle/car_sharing.png | Bin 0 -> 614 bytes .../classic.small/vehicle/car_wash.png | Bin 0 -> 528 bytes .../classic.small/vehicle/cattle_grid.png | Bin 0 -> 402 bytes .../classic.small/vehicle/caution.png | Bin 0 -> 673 bytes .../classic.small/vehicle/crossing.png | Bin 0 -> 349 bytes .../classic.small/vehicle/crossing_small.png | Bin 0 -> 289 bytes .../classic.small/vehicle/emergency_phone.png | Bin 0 -> 563 bytes .../map-icons/classic.small/vehicle/exit.png | Bin 0 -> 492 bytes .../map-icons/classic.small/vehicle/ford.png | Bin 0 -> 608 bytes .../classic.small/vehicle/fuel_station.png | Bin 0 -> 535 bytes .../vehicle/fuel_station/agip.png | Bin 0 -> 701 bytes .../vehicle/fuel_station/aral.png | Bin 0 -> 815 bytes .../vehicle/fuel_station/elf.png | Bin 0 -> 628 bytes .../vehicle/fuel_station/esso.png | Bin 0 -> 705 bytes .../vehicle/fuel_station/jet.png | Bin 0 -> 712 bytes .../vehicle/fuel_station/omv.png | Bin 0 -> 660 bytes .../vehicle/fuel_station/shell.png | Bin 0 -> 720 bytes .../vehicle/fuel_station/texaco.png | Bin 0 -> 675 bytes .../vehicle/fuel_station/total.png | Bin 0 -> 798 bytes .../map-icons/classic.small/vehicle/gate.png | Bin 0 -> 600 bytes .../classic.small/vehicle/motorbike.png | Bin 0 -> 553 bytes .../classic.small/vehicle/parking.png | Bin 0 -> 528 bytes .../classic.small/vehicle/parking/bike.png | Bin 0 -> 751 bytes .../classic.small/vehicle/parking/car.png | Bin 0 -> 730 bytes .../classic.small/vehicle/parking/garage.png | Bin 0 -> 612 bytes .../vehicle/parking/handicapped.png | Bin 0 -> 709 bytes .../classic.small/vehicle/parking/hiking.png | Bin 0 -> 576 bytes .../vehicle/parking/motorbike.png | Bin 0 -> 760 bytes .../vehicle/parking/park_ride.png | Bin 0 -> 614 bytes .../vehicle/parking/restarea-toilets.png | Bin 0 -> 717 bytes .../vehicle/parking/restarea.png | Bin 0 -> 477 bytes .../vehicle/parking/underground.png | Bin 0 -> 566 bytes .../classic.small/vehicle/repair_shop.png | Bin 0 -> 314 bytes .../classic.small/vehicle/restrictions.png | Bin 0 -> 558 bytes .../vehicle/restrictions/access.png | Bin 0 -> 594 bytes .../restrictions/bicycle-designated.png | Bin 0 -> 924 bytes .../vehicle/restrictions/bicycle.png | Bin 0 -> 723 bytes .../vehicle/restrictions/bollard-bw.png | Bin 0 -> 683 bytes .../vehicle/restrictions/bollard.png | Bin 0 -> 517 bytes .../vehicle/restrictions/citylimit.png | Bin 0 -> 504 bytes .../vehicle/restrictions/dead_end.png | Bin 0 -> 424 bytes .../vehicle/restrictions/foot-designated.png | Bin 0 -> 825 bytes .../vehicle/restrictions/foot.png | Bin 0 -> 763 bytes .../vehicle/restrictions/goods.png | Bin 0 -> 708 bytes .../vehicle/restrictions/horse-designated.png | Bin 0 -> 856 bytes .../vehicle/restrictions/horse.png | Bin 0 -> 777 bytes .../vehicle/restrictions/incline.png | Bin 0 -> 688 bytes .../vehicle/restrictions/maxheight.png | Bin 0 -> 742 bytes .../vehicle/restrictions/maxlength.png | Bin 0 -> 773 bytes .../vehicle/restrictions/maxweight.png | Bin 0 -> 760 bytes .../vehicle/restrictions/maxwidth.png | Bin 0 -> 772 bytes .../vehicle/restrictions/minspeed.png | Bin 0 -> 828 bytes .../vehicle/restrictions/motorbike.png | Bin 0 -> 686 bytes .../vehicle/restrictions/motorcar.png | Bin 0 -> 757 bytes .../vehicle/restrictions/parking.png | Bin 0 -> 751 bytes .../vehicle/restrictions/play_street.png | Bin 0 -> 676 bytes .../vehicle/restrictions/psv.png | Bin 0 -> 743 bytes .../vehicle/restrictions/right_of_way.png | Bin 0 -> 603 bytes .../vehicle/restrictions/road_works.png | Bin 0 -> 735 bytes .../vehicle/restrictions/roundabout_left.png | Bin 0 -> 884 bytes .../vehicle/restrictions/roundabout_right.png | Bin 0 -> 864 bytes .../vehicle/restrictions/speed.png | Bin 0 -> 997 bytes .../vehicle/restrictions/speed/30-end.png | Bin 0 -> 903 bytes .../vehicle/restrictions/speed_trap.png | Bin 0 -> 456 bytes .../vehicle/restrictions/stop.png | Bin 0 -> 678 bytes .../vehicle/restrictions/traffic-light.png | Bin 0 -> 455 bytes .../vehicle/restrictions/traffic_jam.png | Bin 0 -> 709 bytes .../ireland/no_left_turn.png | Bin 0 -> 1730 bytes .../ireland/no_right_turn.png | Bin 0 -> 1730 bytes .../ireland/no_straight_on.png | Bin 0 -> 1697 bytes .../turn_restrictions/ireland/no_u_turn.png | Bin 0 -> 1495 bytes .../turn_restrictions/no_left_turn.png | Bin 0 -> 1590 bytes .../turn_restrictions/no_right_turn.png | Bin 0 -> 1587 bytes .../turn_restrictions/no_straight_on.png | Bin 0 -> 1728 bytes .../turn_restrictions/no_u_turn.png | Bin 0 -> 1504 bytes .../turn_restrictions/only_left_turn.png | Bin 0 -> 1397 bytes .../turn_restrictions/only_right_turn.png | Bin 0 -> 1391 bytes .../turn_restrictions/only_straight_on.png | Bin 0 -> 1328 bytes .../classic.small/vehicle/services.png | Bin 0 -> 594 bytes .../map-icons/classic.small/vehicle/stile.png | Bin 0 -> 413 bytes .../map-icons/classic.small/vehicle/tank.png | Bin 0 -> 508 bytes .../classic.small/vehicle/toll_station.png | Bin 0 -> 545 bytes .../classic.small/vehicle/towing.png | Bin 0 -> 562 bytes .../classic.small/vehicle/tunnel.png | Bin 0 -> 496 bytes .../classic.small/vehicle/turning_circle.png | Bin 0 -> 292 bytes .../classic.small/vehicle/viaduct.png | Bin 0 -> 338 bytes .../classic.small/vehicle/zebra_crossing.png | Bin 0 -> 227 bytes Icons/map-icons/classic.small/waypoint.png | Bin 0 -> 429 bytes .../map-icons/classic.small/waypoint/wpt1.png | Bin 0 -> 458 bytes .../map-icons/classic.small/waypoint/wpt2.png | Bin 0 -> 459 bytes .../map-icons/classic.small/waypoint/wpt3.png | Bin 0 -> 522 bytes .../map-icons/classic.small/waypoint/wpt4.png | Bin 0 -> 447 bytes .../map-icons/classic.small/waypoint/wpt5.png | Bin 0 -> 663 bytes .../map-icons/classic.small/waypoint/wpt6.png | Bin 0 -> 1132 bytes .../map-icons/classic.small/waypoint/wpt7.png | Bin 0 -> 967 bytes .../map-icons/classic.small/waypoint/wpt8.png | Bin 0 -> 1134 bytes .../map-icons/classic.small/waypoint/wpt9.png | Bin 0 -> 1129 bytes .../classic.small/waypoint/wptblue.png | Bin 0 -> 402 bytes .../classic.small/waypoint/wptgreen.png | Bin 0 -> 400 bytes .../classic.small/waypoint/wptorange.png | Bin 0 -> 433 bytes .../classic.small/waypoint/wptred.png | Bin 0 -> 400 bytes .../classic.small/waypoint/wpttemp.png | Bin 0 -> 850 bytes .../waypoint/wpttemp/wpttemp-green.png | Bin 0 -> 848 bytes .../waypoint/wpttemp/wpttemp-red.png | Bin 0 -> 839 bytes .../waypoint/wpttemp/wpttemp-yellow.png | Bin 0 -> 842 bytes .../classic.small/waypoint/wptyellow.png | Bin 0 -> 411 bytes Icons/map-icons/classic.small/wlan.png | Bin 0 -> 655 bytes Icons/map-icons/classic.small/wlan/closed.png | Bin 0 -> 433 bytes Icons/map-icons/classic.small/wlan/open.png | Bin 0 -> 447 bytes Icons/map-icons/classic.small/wlan/pay.png | Bin 0 -> 545 bytes .../map-icons/classic.small/wlan/pay/fon.png | Bin 0 -> 975 bytes Icons/map-icons/classic.small/wlan/wep.png | Bin 0 -> 473 bytes .../map-icons/square.small/accommodation.png | Bin 0 -> 547 bytes .../square.small/accommodation/camping.png | Bin 0 -> 552 bytes .../accommodation/camping/caravan.png | Bin 0 -> 610 bytes .../accommodation/camping/dump-station.png | Bin 0 -> 724 bytes .../accommodation/camping/gas-refill.png | Bin 0 -> 517 bytes .../accommodation/camping/hookup.png | Bin 0 -> 463 bytes .../accommodation/camping/trash.png | Bin 0 -> 610 bytes .../accommodation/camping/wastewater.png | Bin 0 -> 582 bytes .../accommodation/camping/water.png | Bin 0 -> 494 bytes .../square.small/accommodation/chalet.png | Bin 0 -> 752 bytes .../square.small/accommodation/empty.png | Bin 0 -> 249 bytes .../accommodation/guest_house.png | Bin 0 -> 670 bytes .../square.small/accommodation/hostel.png | Bin 0 -> 414 bytes .../square.small/accommodation/hotel.png | Bin 0 -> 547 bytes .../accommodation/hotel/five_star.png | Bin 0 -> 664 bytes .../accommodation/hotel/four_star.png | Bin 0 -> 632 bytes .../accommodation/hotel/one_star.png | Bin 0 -> 567 bytes .../accommodation/hotel/three_star.png | Bin 0 -> 613 bytes .../accommodation/hotel/two_star.png | Bin 0 -> 582 bytes .../square.small/accommodation/motel.png | Bin 0 -> 513 bytes .../square.small/accommodation/shelter-bw.png | Bin 0 -> 801 bytes .../square.small/accommodation/shelter.png | Bin 0 -> 789 bytes .../accommodation/youth-hostel.png | Bin 0 -> 642 bytes Icons/map-icons/square.small/education.png | Bin 0 -> 662 bytes .../square.small/education/empty.png | Bin 0 -> 249 bytes .../square.small/education/kindergarten.png | Bin 0 -> 804 bytes .../square.small/education/university.png | Bin 0 -> 432 bytes Icons/map-icons/square.small/food.png | Bin 0 -> 303 bytes .../square.small/food/bacon_and_eggs.png | Bin 0 -> 1299 bytes Icons/map-icons/square.small/food/bar.png | Bin 0 -> 693 bytes .../square.small/food/biergarten.png | Bin 0 -> 771 bytes Icons/map-icons/square.small/food/cafe.png | Bin 0 -> 384 bytes Icons/map-icons/square.small/food/empty.png | Bin 0 -> 249 bytes .../map-icons/square.small/food/fastfood.png | Bin 0 -> 763 bytes .../food/fastfood/burger-king.png | Bin 0 -> 990 bytes .../square.small/food/fastfood/kfc.png | Bin 0 -> 861 bytes .../square.small/food/fastfood/mc-donalds.png | Bin 0 -> 932 bytes .../square.small/food/fastfood/subway.png | Bin 0 -> 737 bytes .../map-icons/square.small/food/icecream.png | Bin 0 -> 546 bytes .../map-icons/square.small/food/pizzahut.png | Bin 0 -> 790 bytes Icons/map-icons/square.small/food/pub.png | Bin 0 -> 685 bytes .../square.small/food/restaurant.png | Bin 0 -> 303 bytes Icons/map-icons/square.small/food/snacks.png | Bin 0 -> 735 bytes Icons/map-icons/square.small/geocache.png | Bin 0 -> 452 bytes .../map-icons/square.small/geocache/empty.png | Bin 0 -> 317 bytes .../geocache/geocache_drivein.png | Bin 0 -> 728 bytes .../square.small/geocache/geocache_earth.png | Bin 0 -> 815 bytes .../square.small/geocache/geocache_event.png | Bin 0 -> 788 bytes .../square.small/geocache/geocache_found.png | Bin 0 -> 593 bytes .../square.small/geocache/geocache_math.png | Bin 0 -> 730 bytes .../square.small/geocache/geocache_multi.png | Bin 0 -> 788 bytes .../geocache/geocache_multi/multi_stage01.png | Bin 0 -> 554 bytes .../geocache/geocache_multi/multi_stage02.png | Bin 0 -> 609 bytes .../geocache/geocache_multi/multi_stage03.png | Bin 0 -> 603 bytes .../geocache/geocache_multi/multi_stage04.png | Bin 0 -> 572 bytes .../geocache/geocache_multi/multi_stage05.png | Bin 0 -> 637 bytes .../geocache/geocache_multi/multi_stage06.png | Bin 0 -> 609 bytes .../geocache/geocache_multi/multi_stage07.png | Bin 0 -> 563 bytes .../geocache/geocache_multi/multi_stage08.png | Bin 0 -> 619 bytes .../geocache/geocache_multi/multi_stage09.png | Bin 0 -> 611 bytes .../geocache/geocache_multi/multi_stage10.png | Bin 0 -> 561 bytes .../geocache/geocache_mystery.png | Bin 0 -> 900 bytes .../square.small/geocache/geocache_night.png | Bin 0 -> 1009 bytes .../geocache/geocache_traditional.png | Bin 0 -> 637 bytes .../geocache/geocache_virtual.png | Bin 0 -> 758 bytes .../square.small/geocache/geocache_webcam.png | Bin 0 -> 953 bytes Icons/map-icons/square.small/health.png | Bin 0 -> 372 bytes .../map-icons/square.small/health/doctor.png | Bin 0 -> 640 bytes .../square.small/health/emergency.png | Bin 0 -> 613 bytes Icons/map-icons/square.small/health/empty.png | Bin 0 -> 359 bytes .../square.small/health/hospital.png | Bin 0 -> 641 bytes .../square.small/health/pharmacy.png | Bin 0 -> 465 bytes .../square.small/health/veterinary.png | Bin 0 -> 855 bytes Icons/map-icons/square.small/incomming.png | Bin 0 -> 580 bytes .../square.small/incomming/empty.png | Bin 0 -> 413 bytes Icons/map-icons/square.small/misc.png | Bin 0 -> 173 bytes Icons/map-icons/square.small/misc/bunny.png | Bin 0 -> 698 bytes .../map-icons/square.small/misc/butterfly.png | Bin 0 -> 775 bytes .../square.small/misc/construction.png | Bin 0 -> 486 bytes Icons/map-icons/square.small/misc/danger.png | Bin 0 -> 653 bytes .../square.small/misc/deprecated.png | Bin 0 -> 556 bytes Icons/map-icons/square.small/misc/door.png | Bin 0 -> 350 bytes Icons/map-icons/square.small/misc/empty.png | Bin 0 -> 264 bytes .../square.small/misc/information.png | Bin 0 -> 561 bytes .../map-icons/square.small/misc/landmark.png | Bin 0 -> 374 bytes .../square.small/misc/landmark/barn.png | Bin 0 -> 579 bytes .../square.small/misc/landmark/bunker.png | Bin 0 -> 497 bytes .../square.small/misc/landmark/chimney.png | Bin 0 -> 449 bytes .../square.small/misc/landmark/crane.png | Bin 0 -> 565 bytes .../square.small/misc/landmark/empty.png | Bin 0 -> 225 bytes .../square.small/misc/landmark/farm.png | Bin 0 -> 700 bytes .../square.small/misc/landmark/gasometer.png | Bin 0 -> 526 bytes .../square.small/misc/landmark/lighthouse.png | Bin 0 -> 589 bytes .../square.small/misc/landmark/mine.png | Bin 0 -> 751 bytes .../misc/landmark/mountain_pass.png | Bin 0 -> 633 bytes .../square.small/misc/landmark/peak.png | Bin 0 -> 440 bytes .../square.small/misc/landmark/peak_small.png | Bin 0 -> 369 bytes .../square.small/misc/landmark/pier.png | Bin 0 -> 544 bytes .../square.small/misc/landmark/plant.png | Bin 0 -> 729 bytes .../square.small/misc/landmark/power.png | Bin 0 -> 503 bytes .../misc/landmark/power/fossil.png | Bin 0 -> 618 bytes .../misc/landmark/power/hydro.png | Bin 0 -> 546 bytes .../misc/landmark/power/nuclear.png | Bin 0 -> 735 bytes .../misc/landmark/power/tower.png | Bin 0 -> 689 bytes .../square.small/misc/landmark/power/wind.png | Bin 0 -> 679 bytes .../square.small/misc/landmark/range.png | Bin 0 -> 678 bytes .../misc/landmark/reservoir_covered.png | Bin 0 -> 587 bytes .../square.small/misc/landmark/spring.png | Bin 0 -> 485 bytes .../misc/landmark/survey_point.png | Bin 0 -> 529 bytes .../square.small/misc/landmark/tower.png | Bin 0 -> 629 bytes .../square.small/misc/landmark/trees.png | Bin 0 -> 841 bytes .../misc/landmark/wastewater_plant.png | Bin 0 -> 710 bytes .../misc/landmark/water_tower.png | Bin 0 -> 446 bytes .../square.small/misc/landmark/windmill.png | Bin 0 -> 633 bytes .../square.small/misc/landmark/works.png | Bin 0 -> 575 bytes .../square.small/misc/lock_closed.png | Bin 0 -> 582 bytes .../map-icons/square.small/misc/lock_open.png | Bin 0 -> 596 bytes Icons/map-icons/square.small/misc/no_icon.png | Bin 0 -> 434 bytes .../square.small/misc/no_smoking.png | Bin 0 -> 900 bytes .../map-icons/square.small/misc/proposed.png | Bin 0 -> 552 bytes .../square.small/misc/tap_drinking.png | Bin 0 -> 643 bytes Icons/map-icons/square.small/money.png | Bin 0 -> 691 bytes Icons/map-icons/square.small/money/atm.png | Bin 0 -> 600 bytes Icons/map-icons/square.small/money/bank.png | Bin 0 -> 665 bytes Icons/map-icons/square.small/money/empty.png | Bin 0 -> 249 bytes .../map-icons/square.small/money/exchange.png | Bin 0 -> 729 bytes Icons/map-icons/square.small/nautical.png | Bin 0 -> 1166 bytes .../square.small/nautical/alpha_flag.png | Bin 0 -> 434 bytes .../square.small/nautical/aqueduct.png | Bin 0 -> 423 bytes .../map-icons/square.small/nautical/empty.png | Bin 0 -> 241 bytes .../square.small/nautical/lock_gate.png | Bin 0 -> 572 bytes .../square.small/nautical/turning.png | Bin 0 -> 454 bytes .../map-icons/square.small/nautical/weir.png | Bin 0 -> 429 bytes Icons/map-icons/square.small/people.png | Bin 0 -> 504 bytes .../people/developer/gpsdrive.png | Bin 0 -> 692 bytes .../people/developer/openstreetmap.png | Bin 0 -> 706 bytes Icons/map-icons/square.small/people/empty.png | Bin 0 -> 242 bytes .../map-icons/square.small/people/friends.png | Bin 0 -> 464 bytes .../square.small/people/friendsd.png | Bin 0 -> 1106 bytes .../square.small/people/friendsd/airplane.png | Bin 0 -> 171 bytes .../square.small/people/friendsd/bike.png | Bin 0 -> 1232 bytes .../square.small/people/friendsd/boat.png | Bin 0 -> 171 bytes .../square.small/people/friendsd/car.png | Bin 0 -> 1106 bytes .../square.small/people/friendsd/walk.png | Bin 0 -> 171 bytes Icons/map-icons/square.small/people/home.png | Bin 0 -> 253 bytes Icons/map-icons/square.small/people/work.png | Bin 0 -> 266 bytes Icons/map-icons/square.small/places.png | Bin 0 -> 188 bytes Icons/map-icons/square.small/places/empty.png | Bin 0 -> 231 bytes .../square.small/places/settlement.png | Bin 0 -> 377 bytes .../places/settlement/capital.png | Bin 0 -> 586 bytes .../square.small/places/settlement/city.png | Bin 0 -> 407 bytes .../square.small/places/settlement/hamlet.png | Bin 0 -> 218 bytes .../square.small/places/settlement/town.png | Bin 0 -> 377 bytes .../places/settlement/village.png | Bin 0 -> 271 bytes Icons/map-icons/square.small/public.png | Bin 0 -> 1166 bytes .../public/administration/court_of_law.png | Bin 0 -> 982 bytes .../public/administration/prison.png | Bin 0 -> 800 bytes .../square.small/public/arts_centre.png | Bin 0 -> 1245 bytes Icons/map-icons/square.small/public/empty.png | Bin 0 -> 1166 bytes .../square.small/public/firebrigade.png | Bin 0 -> 1099 bytes .../map-icons/square.small/public/police.png | Bin 0 -> 1118 bytes .../square.small/public/post_box.png | Bin 0 -> 853 bytes .../square.small/public/post_office.png | Bin 0 -> 934 bytes .../square.small/public/recycling.png | Bin 0 -> 1250 bytes .../public/recycling/trash-bin.png | Bin 0 -> 1144 bytes .../square.small/public/recycling_small.png | Bin 0 -> 1288 bytes .../square.small/public/telephone.png | Bin 0 -> 972 bytes .../map-icons/square.small/public/toilets.png | Bin 0 -> 1223 bytes Icons/map-icons/square.small/recreation.png | Bin 0 -> 762 bytes .../square.small/recreation/bicycling.png | Bin 0 -> 921 bytes .../square.small/recreation/cinema.png | Bin 0 -> 935 bytes .../square.small/recreation/common.png | Bin 0 -> 648 bytes .../square.small/recreation/empty.png | Bin 0 -> 242 bytes .../square.small/recreation/garden.png | Bin 0 -> 700 bytes .../square.small/recreation/music.png | Bin 0 -> 756 bytes .../recreation/nature_reserve.png | Bin 0 -> 770 bytes .../square.small/recreation/nightclub.png | Bin 0 -> 693 bytes .../square.small/recreation/park.png | Bin 0 -> 559 bytes .../square.small/recreation/picnic.png | Bin 0 -> 1105 bytes .../square.small/recreation/playground.png | Bin 0 -> 702 bytes .../square.small/recreation/shelter.png | Bin 0 -> 783 bytes .../square.small/recreation/theater.png | Bin 0 -> 848 bytes .../square.small/recreation/theme_park.png | Bin 0 -> 980 bytes .../square.small/recreation/water_park.png | Bin 0 -> 669 bytes .../map-icons/square.small/recreation/zoo.png | Bin 0 -> 526 bytes Icons/map-icons/square.small/religion.png | Bin 0 -> 756 bytes .../square.small/religion/cemetery.png | Bin 0 -> 394 bytes .../square.small/religion/chapel.png | Bin 0 -> 547 bytes .../square.small/religion/church.png | Bin 0 -> 489 bytes .../square.small/religion/church/bahai.png | Bin 0 -> 681 bytes .../square.small/religion/church/buddhism.png | Bin 0 -> 642 bytes .../square.small/religion/church/catholic.png | Bin 0 -> 474 bytes .../square.small/religion/church/hinduism.png | Bin 0 -> 719 bytes .../square.small/religion/church/jainism.png | Bin 0 -> 531 bytes .../square.small/religion/church/mormon.png | Bin 0 -> 716 bytes .../square.small/religion/church/mosque.png | Bin 0 -> 539 bytes .../square.small/religion/church/orthodox.png | Bin 0 -> 524 bytes .../religion/church/protestant.png | Bin 0 -> 482 bytes .../square.small/religion/church/shinto.png | Bin 0 -> 407 bytes .../square.small/religion/church/sikhism.png | Bin 0 -> 663 bytes .../religion/church/synagogue.png | Bin 0 -> 651 bytes .../square.small/religion/church/taoism.png | Bin 0 -> 675 bytes .../map-icons/square.small/religion/empty.png | Bin 0 -> 247 bytes Icons/map-icons/square.small/rendering.png | Bin 0 -> 256 bytes Icons/map-icons/square.small/shopping.png | Bin 0 -> 1166 bytes .../square.small/shopping/beverages.png | Bin 0 -> 716 bytes .../square.small/shopping/computers.png | Bin 0 -> 1056 bytes .../square.small/shopping/confectioner.png | Bin 0 -> 1133 bytes .../square.small/shopping/diy_store.png | Bin 0 -> 701 bytes .../shopping/diy_store/hagebau.png | Bin 0 -> 850 bytes .../shopping/diy_store/hornbach.png | Bin 0 -> 752 bytes .../square.small/shopping/diy_store/obi.png | Bin 0 -> 472 bytes .../shopping/diy_store/praktiker.png | Bin 0 -> 439 bytes .../map-icons/square.small/shopping/empty.png | Bin 0 -> 236 bytes .../square.small/shopping/florist.png | Bin 0 -> 638 bytes .../square.small/shopping/furniture.png | Bin 0 -> 731 bytes .../shopping/groceries/bakery.png | Bin 0 -> 1078 bytes .../shopping/groceries/butcher.png | Bin 0 -> 466 bytes .../shopping/groceries/fruits.png | Bin 0 -> 1299 bytes .../square.small/shopping/kaufhof.png | Bin 0 -> 654 bytes .../map-icons/square.small/shopping/kiosk.png | Bin 0 -> 592 bytes .../square.small/shopping/laundry.png | Bin 0 -> 503 bytes .../square.small/shopping/sports/outdoor.png | Bin 0 -> 705 bytes .../square.small/shopping/supermarket.png | Bin 0 -> 638 bytes .../shopping/supermarket/aldi.png | Bin 0 -> 375 bytes .../shopping/supermarket/aldi_nord.png | Bin 0 -> 612 bytes .../shopping/supermarket/kaufland.png | Bin 0 -> 409 bytes .../shopping/supermarket/lidl.png | Bin 0 -> 942 bytes .../shopping/supermarket/norma.png | Bin 0 -> 430 bytes .../shopping/supermarket/real.png | Bin 0 -> 515 bytes .../shopping/supermarket/rewe.png | Bin 0 -> 389 bytes .../shopping/supermarket/tengelmann.png | Bin 0 -> 818 bytes Icons/map-icons/square.small/sightseeing.png | Bin 0 -> 416 bytes .../sightseeing/archaeological.png | Bin 0 -> 644 bytes .../square.small/sightseeing/battlefield.png | Bin 0 -> 753 bytes .../square.small/sightseeing/castle.png | Bin 0 -> 502 bytes .../square.small/sightseeing/empty.png | Bin 0 -> 241 bytes .../square.small/sightseeing/memorial.png | Bin 0 -> 501 bytes .../square.small/sightseeing/monument.png | Bin 0 -> 412 bytes .../square.small/sightseeing/museum.png | Bin 0 -> 683 bytes .../square.small/sightseeing/ruins.png | Bin 0 -> 496 bytes .../square.small/sightseeing/viewpoint.png | Bin 0 -> 1689 bytes Icons/map-icons/square.small/sports.png | Bin 0 -> 619 bytes .../square.small/sports/basketball.png | Bin 0 -> 694 bytes .../map-icons/square.small/sports/bicycle.png | Bin 0 -> 537 bytes .../map-icons/square.small/sports/centre.png | Bin 0 -> 628 bytes .../map-icons/square.small/sports/cycling.png | Bin 0 -> 667 bytes Icons/map-icons/square.small/sports/dart.png | Bin 0 -> 909 bytes Icons/map-icons/square.small/sports/empty.png | Bin 0 -> 246 bytes .../square.small/sports/football.png | Bin 0 -> 610 bytes Icons/map-icons/square.small/sports/golf.png | Bin 0 -> 840 bytes .../square.small/sports/indoor_pool.png | Bin 0 -> 706 bytes .../square.small/sports/kiteflying.png | Bin 0 -> 586 bytes .../square.small/sports/mountain_bike.png | Bin 0 -> 716 bytes Icons/map-icons/square.small/sports/pitch.png | Bin 0 -> 773 bytes Icons/map-icons/square.small/sports/pool.png | Bin 0 -> 676 bytes .../square.small/sports/racquetball.png | Bin 0 -> 749 bytes .../map-icons/square.small/sports/riding.png | Bin 0 -> 552 bytes .../map-icons/square.small/sports/skiing.png | Bin 0 -> 798 bytes .../map-icons/square.small/sports/soccer.png | Bin 0 -> 619 bytes .../square.small/sports/swimming.png | Bin 0 -> 548 bytes .../square.small/sports/table_tennis.png | Bin 0 -> 646 bytes .../map-icons/square.small/sports/tennis.png | Bin 0 -> 737 bytes Icons/map-icons/square.small/transport.png | Bin 0 -> 653 bytes .../square.small/transport/airport.png | Bin 0 -> 527 bytes .../transport/airport/airfield.png | Bin 0 -> 507 bytes .../transport/airport/helipad.png | Bin 0 -> 531 bytes .../transport/airport/terminal.png | Bin 0 -> 659 bytes .../square.small/transport/bridge.png | Bin 0 -> 427 bytes .../transport/bridge/bridge-car.png | Bin 0 -> 642 bytes .../transport/bridge/bridge-pedestrian.png | Bin 0 -> 614 bytes .../transport/bridge/drawbridge.png | Bin 0 -> 571 bytes .../map-icons/square.small/transport/bus.png | Bin 0 -> 574 bytes .../map-icons/square.small/transport/car.png | Bin 0 -> 502 bytes .../square.small/transport/empty.png | Bin 0 -> 244 bytes .../square.small/transport/ferry.png | Bin 0 -> 458 bytes .../transport/ferry/ferry-car.png | Bin 0 -> 592 bytes .../transport/ferry/ferry-pedestrian.png | Bin 0 -> 609 bytes .../square.small/transport/handicapped.png | Bin 0 -> 539 bytes .../square.small/transport/harbour.png | Bin 0 -> 570 bytes .../square.small/transport/park_ride.png | Bin 0 -> 591 bytes .../square.small/transport/pedestrian.png | Bin 0 -> 601 bytes .../square.small/transport/railway.png | Bin 0 -> 645 bytes .../square.small/transport/rapid_train.png | Bin 0 -> 870 bytes .../map-icons/square.small/transport/taxi.png | Bin 0 -> 680 bytes .../square.small/transport/ticket-machine.png | Bin 0 -> 644 bytes .../map-icons/square.small/transport/tram.png | Bin 0 -> 516 bytes .../square.small/transport/turntable.png | Bin 0 -> 675 bytes .../square.small/transport/underground.png | Bin 0 -> 513 bytes Icons/map-icons/square.small/unknown.png | Bin 0 -> 613 bytes Icons/map-icons/square.small/vehicle.png | Bin 0 -> 605 bytes .../square.small/vehicle/bicycle_rental.png | Bin 0 -> 795 bytes .../square.small/vehicle/car_rental.png | Bin 0 -> 669 bytes .../square.small/vehicle/car_rental/avis.png | Bin 0 -> 792 bytes .../vehicle/car_rental/europcar.png | Bin 0 -> 652 bytes .../square.small/vehicle/car_rental/hertz.png | Bin 0 -> 702 bytes .../square.small/vehicle/car_rental/sixt.png | Bin 0 -> 728 bytes .../square.small/vehicle/car_sharing.png | Bin 0 -> 751 bytes .../square.small/vehicle/caution.png | Bin 0 -> 626 bytes .../square.small/vehicle/crossing.png | Bin 0 -> 518 bytes .../square.small/vehicle/crossing_small.png | Bin 0 -> 441 bytes .../square.small/vehicle/emergency_phone.png | Bin 0 -> 551 bytes .../map-icons/square.small/vehicle/empty.png | Bin 0 -> 236 bytes Icons/map-icons/square.small/vehicle/exit.png | Bin 0 -> 523 bytes Icons/map-icons/square.small/vehicle/ford.png | Bin 0 -> 608 bytes .../square.small/vehicle/fuel_station.png | Bin 0 -> 476 bytes .../vehicle/fuel_station/agip.png | Bin 0 -> 649 bytes .../vehicle/fuel_station/aral.png | Bin 0 -> 693 bytes .../square.small/vehicle/fuel_station/elf.png | Bin 0 -> 471 bytes .../vehicle/fuel_station/esso.png | Bin 0 -> 648 bytes .../square.small/vehicle/fuel_station/jet.png | Bin 0 -> 687 bytes .../square.small/vehicle/fuel_station/omv.png | Bin 0 -> 609 bytes .../vehicle/fuel_station/shell.png | Bin 0 -> 698 bytes .../vehicle/fuel_station/texaco.png | Bin 0 -> 587 bytes .../vehicle/fuel_station/total.png | Bin 0 -> 838 bytes .../square.small/vehicle/motorbike.png | Bin 0 -> 619 bytes .../square.small/vehicle/parking.png | Bin 0 -> 431 bytes .../square.small/vehicle/parking/bike.png | Bin 0 -> 722 bytes .../square.small/vehicle/parking/car.png | Bin 0 -> 673 bytes .../square.small/vehicle/parking/garage.png | Bin 0 -> 535 bytes .../vehicle/parking/handicapped.png | Bin 0 -> 656 bytes .../square.small/vehicle/parking/hiking.png | Bin 0 -> 642 bytes .../vehicle/parking/motorbike.png | Bin 0 -> 654 bytes .../vehicle/parking/park_ride.png | Bin 0 -> 602 bytes .../vehicle/parking/restarea-toilets.png | Bin 0 -> 688 bytes .../square.small/vehicle/parking/restarea.png | Bin 0 -> 670 bytes .../square.small/vehicle/repair_shop.png | Bin 0 -> 420 bytes .../square.small/vehicle/restrictions.png | Bin 0 -> 706 bytes .../vehicle/restrictions/bollard-bw.png | Bin 0 -> 627 bytes .../vehicle/restrictions/bollard.png | Bin 0 -> 646 bytes .../vehicle/restrictions/dead_end.png | Bin 0 -> 423 bytes .../vehicle/restrictions/incline.png | Bin 0 -> 649 bytes .../vehicle/restrictions/motorbike.png | Bin 0 -> 706 bytes .../vehicle/restrictions/parking.png | Bin 0 -> 690 bytes .../vehicle/restrictions/play_street.png | Bin 0 -> 643 bytes .../vehicle/restrictions/right_of_way.png | Bin 0 -> 621 bytes .../vehicle/restrictions/road_works.png | Bin 0 -> 748 bytes .../vehicle/restrictions/roundabout_left.png | Bin 0 -> 780 bytes .../vehicle/restrictions/roundabout_right.png | Bin 0 -> 779 bytes .../vehicle/restrictions/stop.png | Bin 0 -> 654 bytes .../vehicle/restrictions/traffic-light.png | Bin 0 -> 416 bytes .../vehicle/restrictions/traffic_jam.png | Bin 0 -> 674 bytes .../square.small/vehicle/services.png | Bin 0 -> 540 bytes .../square.small/vehicle/toll_station.png | Bin 0 -> 846 bytes .../map-icons/square.small/vehicle/tunnel.png | Bin 0 -> 468 bytes .../square.small/vehicle/turning_circle.png | Bin 0 -> 380 bytes .../square.small/vehicle/viaduct.png | Bin 0 -> 330 bytes .../square.small/vehicle/zebra_crossing.png | Bin 0 -> 281 bytes Icons/map-icons/square.small/waypoint.png | Bin 0 -> 351 bytes .../map-icons/square.small/waypoint/empty.png | Bin 0 -> 225 bytes .../map-icons/square.small/waypoint/flag.png | Bin 0 -> 303 bytes .../square.small/waypoint/flag/blue.png | Bin 0 -> 303 bytes .../square.small/waypoint/flag/green.png | Bin 0 -> 300 bytes .../square.small/waypoint/flag/orange.png | Bin 0 -> 312 bytes .../square.small/waypoint/flag/red.png | Bin 0 -> 288 bytes .../square.small/waypoint/flag/temp.png | Bin 0 -> 585 bytes .../square.small/waypoint/flag/yellow.png | Bin 0 -> 305 bytes .../square.small/waypoint/routepoint.png | Bin 0 -> 476 bytes .../waypoint/routepoint/destination.png | Bin 0 -> 907 bytes .../square.small/waypoint/routepoint/left.png | Bin 0 -> 382 bytes .../waypoint/routepoint/left/exit.png | Bin 0 -> 703 bytes .../waypoint/routepoint/left/fork.png | Bin 0 -> 560 bytes .../waypoint/routepoint/left/hard.png | Bin 0 -> 675 bytes .../waypoint/routepoint/left/merge.png | Bin 0 -> 668 bytes .../waypoint/routepoint/left/soft.png | Bin 0 -> 575 bytes .../waypoint/routepoint/left/uturn.png | Bin 0 -> 412 bytes .../waypoint/routepoint/right.png | Bin 0 -> 392 bytes .../waypoint/routepoint/right/exit.png | Bin 0 -> 688 bytes .../waypoint/routepoint/right/fork.png | Bin 0 -> 548 bytes .../waypoint/routepoint/right/hard.png | Bin 0 -> 667 bytes .../waypoint/routepoint/right/merge.png | Bin 0 -> 649 bytes .../waypoint/routepoint/right/soft.png | Bin 0 -> 584 bytes .../waypoint/routepoint/right/uturn.png | Bin 0 -> 429 bytes .../waypoint/routepoint/straight.png | Bin 0 -> 331 bytes .../map-icons/square.small/waypoint/wpt1.png | Bin 0 -> 366 bytes .../map-icons/square.small/waypoint/wpt2.png | Bin 0 -> 404 bytes .../map-icons/square.small/waypoint/wpt3.png | Bin 0 -> 396 bytes .../map-icons/square.small/waypoint/wpt4.png | Bin 0 -> 382 bytes .../map-icons/square.small/waypoint/wpt5.png | Bin 0 -> 410 bytes .../map-icons/square.small/waypoint/wpt6.png | Bin 0 -> 399 bytes .../map-icons/square.small/waypoint/wpt7.png | Bin 0 -> 374 bytes .../map-icons/square.small/waypoint/wpt8.png | Bin 0 -> 395 bytes .../map-icons/square.small/waypoint/wpt9.png | Bin 0 -> 397 bytes .../waypoint/wpttemp/wpttemp-green.png | Bin 0 -> 587 bytes .../waypoint/wpttemp/wpttemp-red.png | Bin 0 -> 552 bytes .../waypoint/wpttemp/wpttemp-yellow.png | Bin 0 -> 596 bytes Icons/map-icons/square.small/wlan.png | Bin 0 -> 177 bytes Icons/map-icons/square.small/wlan/closed.png | Bin 0 -> 616 bytes Icons/map-icons/square.small/wlan/empty.png | Bin 0 -> 238 bytes Icons/map-icons/square.small/wlan/open.png | Bin 0 -> 643 bytes Icons/map-icons/square.small/wlan/pay.png | Bin 0 -> 483 bytes Icons/map-icons/square.small/wlan/pay/fon.png | Bin 0 -> 934 bytes Icons/map-icons/square.small/wlan/wep.png | Bin 0 -> 750 bytes Icons/merkaartor-win32.rc | 1 + Icons/merkaartor.icns | Bin 0 -> 518181 bytes Icons/move.xpm | 31 + Icons/remove.xpm | 30 + Icons/reverse.xpm | 33 + Icons/rotate.png | Bin 0 -> 819 bytes Icons/rotate.svg | 565 ++ Icons/small-remove.xpm | 18 + Icons/src/actions/GPS.svg | 73 + Icons/src/actions/align_nodes.pspimage | Bin 0 -> 4056 bytes Icons/src/actions/break_apart_roads.pspimage | Bin 0 -> 7513 bytes Icons/src/actions/build_bridge.xcf | Bin 0 -> 1420 bytes Icons/src/actions/camera.svg | 57 + Icons/src/actions/create_area.pspimage | Bin 0 -> 5254 bytes Icons/src/actions/create_node.pspimage | Bin 0 -> 3463 bytes Icons/src/actions/create_road.pspimage | Bin 0 -> 5152 bytes Icons/src/actions/detach_node.pspimage | Bin 0 -> 5383 bytes Icons/src/actions/join_roads.pspimage | Bin 0 -> 6057 bytes Icons/src/actions/node_4.png | Bin 0 -> 154 bytes Icons/src/actions/node_5.png | Bin 0 -> 224 bytes Icons/src/actions/plus_11_oxygen.png | Bin 0 -> 448 bytes Icons/src/actions/reverse_road.pspimage | Bin 0 -> 4239 bytes Icons/src/actions/shadow.xcf | Bin 0 -> 1864 bytes Icons/src/actions/split_road.pspimage | Bin 0 -> 7766 bytes Icons/src/actions/split_road_a.pspimage | Bin 0 -> 6457 bytes Icons/src/actions/split_road_b.pspimage | Bin 0 -> 6820 bytes Icons/toolselect.xpm | 30 + Icons/zoomico.xpm | 40 + LICENSE | 225 + Merkaartor.pro | 11 + README.md | 51 + Styles/Bicycle.mas | 426 + Styles/Classic.mas | 252 + Styles/Lighting.mas | 50 + Styles/Mapnik.mas | 715 ++ Styles/MapnikPlus.mas | 1004 +++ Styles/Maxspeed.mas | 205 + Styles/Merkaartor.mas | 1085 +++ Styles/Mobile.mas | 622 ++ Styles/None.mas | 2 + Styles/Styles.qrc | 14 + Styles/Validation.mas | 41 + Styles/Wireframe.mas | 680 ++ Templates/Brussels.mat | 99 + Templates/TagTemplate.xsd | 67 + Templates/Templates.qrc | 5 + Templates/default.mat | 2895 +++++++ Templates/mine.mat | 2803 +++++++ cmake/CMakeDMGBackground.tif | Bin 0 -> 213169 bytes cmake/CMakeDMGSetup.scpt | 58 + cmake/DS_Store.bin | Bin 0 -> 10244 bytes cmake/ModulesOverride/NSIS.template.in | 998 +++ cmake/deploy-osx.cmake.in | 15 + cmake/deploy-windows.cmake.in | 52 + cmake/upload-artifacts.sh.in | 12 + cmake/vcs-snapshot.cmake | 35 + cmake/vcs.cmake | 80 + include/RTree.h | 1600 ++++ interfaces/IBackend.h | 34 + interfaces/IDocument.h | 20 + interfaces/IFeature.h | 124 + interfaces/IImageManager.cpp | 86 + interfaces/IImageManager.h | 107 + interfaces/ILayer.h | 9 + interfaces/IMapAdapter.h | 139 + interfaces/IMapAdapterFactory.h | 32 + interfaces/IMapWatermark.h | 18 + interfaces/IMerkMainWindow.h | 25 + interfaces/IProgressWindow.h | 21 + interfaces/IProjection.h | 21 + interfaces/IRenderer.h | 48 + interfaces/Interfaces.pri | 13 + .../CadastreFrance.cpp | 406 + .../CadastreFrance.h | 192 + .../MCadastreFranceBackground.pro | 17 + .../MCadastreFranceBackground/qadastre.pri | 14 + .../qadastre/COPYING.txt | 674 ++ .../qadastre/cadastrebrowser.cpp | 87 + .../qadastre/cadastrebrowser.h | 47 + .../qadastre/cadastrebrowser.ui | 118 + .../qadastre/cadastrewrapper.cpp | 348 + .../qadastre/cadastrewrapper.h | 72 + .../qadastre/city.cpp | 95 + .../MCadastreFranceBackground/qadastre/city.h | 57 + .../qadastre/main.cpp | 37 + .../qadastre/qadastre.pro | 20 + .../qadastre/searchdialog.cpp | 105 + .../qadastre/searchdialog.h | 56 + .../qadastre/searchdialog.ui | 173 + .../qadastre/tile.cpp | 112 + .../MCadastreFranceBackground/qadastre/tile.h | 42 + .../MGdalBackground/GdalAdapter.cpp | 667 ++ .../background/MGdalBackground/GdalAdapter.h | 204 + .../MGdalBackground/GdalAdapter.json | 1 + .../MGdalBackground/MGdalBackground.pro | 38 + .../MGeoTiffBackground/GeoTiffAdapter.cpp | 429 + .../MGeoTiffBackground/GeoTiffAdapter.h | 201 + .../MGeoTiffBackground/GeoTiffAdapter.json | 1 + .../MGeoTiffBackground/MGeoTiffBackground.pro | 37 + .../MMsBingMapBackground.pro | 20 + .../MMsBingMapBackground/Resources.qrc | 5 + .../images/logo_powered_by.png | Bin 0 -> 4295 bytes .../MMsBingMapBackground/mapadapter.cpp | 46 + .../MMsBingMapBackground/mapadapter.h | 97 + .../MMsBingMapBackground/msbingmapadapter.cpp | 331 + .../MMsBingMapBackground/msbingmapadapter.h | 178 + .../msbingmapadapter.json | 1 + .../MWalkingPapersBackground.pro | 26 + .../WalkingPapersAdapter.cpp | 446 + .../WalkingPapersAdapter.h | 182 + .../WalkingPapersAdapter.json | 0 plugins/background/background.pro | 19 + plugins/background/common.pri | 9 + plugins/common.pri | 68 + plugins/plugins.cmake | 69 + plugins/plugins.pro | 6 + share/BookmarksList.xml | 5 + share/Projections.xml | 11 + share/TmsServersList.xml | 6 + share/WmsServersList.xml | 7 + share/share.qrc | 9 + src/Backend/Backend.pri | 8 + src/Backend/MemoryBackend.cpp | 395 + src/Backend/MemoryBackend.h | 61 + src/Commands/Command.cpp | 571 ++ src/Commands/Command.h | 110 + src/Commands/Commands.pri | 20 + src/Commands/DocumentCommands.cpp | 280 + src/Commands/DocumentCommands.h | 59 + src/Commands/FeatureCommands.cpp | 416 + src/Commands/FeatureCommands.h | 91 + src/Commands/NodeCommands.cpp | 129 + src/Commands/NodeCommands.h | 34 + src/Commands/RelationCommands.cpp | 275 + src/Commands/RelationCommands.h | 64 + src/Commands/TrackSegmentCommands.cpp | 196 + src/Commands/TrackSegmentCommands.h | 58 + src/Commands/WayCommands.cpp | 255 + src/Commands/WayCommands.h | 59 + src/Config.pri | 45 + src/Custom.pri | 0 src/Docks/DirtyDock.cpp | 198 + src/Docks/DirtyDock.h | 57 + src/Docks/DirtyDock.ui | 79 + src/Docks/Docks.pri | 23 + src/Docks/FeaturesDock.cpp | 483 ++ src/Docks/FeaturesDock.h | 89 + src/Docks/FeaturesDock.ui | 172 + src/Docks/GeoImage.pri | 15 + src/Docks/GeoImageDock.cpp | 1153 +++ src/Docks/GeoImageDock.h | 107 + src/Docks/InfoDock.cpp | 99 + src/Docks/InfoDock.h | 49 + src/Docks/LayerDock.cpp | 564 ++ src/Docks/LayerDock.h | 82 + src/Docks/MDockAncestor.cpp | 40 + src/Docks/MDockAncestor.h | 44 + src/Docks/MinimumRelationProperties.ui | 190 + src/Docks/MinimumRoadProperties.ui | 133 + src/Docks/MinimumTrackPointProperties.ui | 149 + src/Docks/PhotoLoadErrorDialog.ui | 172 + src/Docks/PropertiesDock.cpp | 1185 +++ src/Docks/PropertiesDock.h | 130 + src/Docks/StyleDock.cpp | 104 + src/Docks/StyleDock.h | 49 + src/Docks/StyleDock.ui | 49 + src/Features/Feature.cpp | 1108 +++ src/Features/Feature.h | 368 + src/Features/Features.h | 6 + src/Features/Features.pri | 17 + src/Features/Node.cpp | 768 ++ src/Features/Node.h | 150 + src/Features/Relation.cpp | 804 ++ src/Features/Relation.h | 72 + src/Features/TrackSegment.cpp | 413 + src/Features/TrackSegment.h | 70 + src/Features/Way.cpp | 1042 +++ src/Features/Way.h | 108 + src/GPS/GPS.pri | 40 + src/GPS/GpsFix.cpp | 75 + src/GPS/GpsFix.h | 102 + src/GPS/SatelliteStrengthView.cpp | 51 + src/GPS/SatelliteStrengthView.h | 33 + src/GPS/qgps.cpp | 241 + src/GPS/qgps.h | 67 + src/GPS/qgpsdevice.cpp | 1419 ++++ src/GPS/qgpsdevice.h | 380 + src/GPS/qgpsmainwindowui.ui | 207 + src/GPS/qgpssatellitetracker.cpp | 142 + src/GPS/qgpssatellitetracker.h | 49 + src/ImportExport/ExportDialog.ui | 106 + src/ImportExport/ExportGPX.cpp | 99 + src/ImportExport/ExportGPX.h | 31 + src/ImportExport/ExportOSM.cpp | 104 + src/ImportExport/ExportOSM.h | 17 + src/ImportExport/IImportExport.cpp | 70 + src/ImportExport/IImportExport.h | 59 + src/ImportExport/ImportCSVDialog.cpp | 565 ++ src/ImportExport/ImportCSVDialog.h | 95 + src/ImportExport/ImportCSVDialog.ui | 427 + src/ImportExport/ImportExport.pri | 62 + src/ImportExport/ImportExportCSV.cpp | 50 + src/ImportExport/ImportExportCSV.h | 35 + src/ImportExport/ImportExportGdal.cpp | 498 ++ src/ImportExport/ImportExportGdal.h | 72 + src/ImportExport/ImportExportKML.cpp | 320 + src/ImportExport/ImportExportKML.h | 35 + src/ImportExport/ImportExportOSC.cpp | 170 + src/ImportExport/ImportExportOSC.h | 35 + src/ImportExport/ImportExportPBF.cpp | 602 ++ src/ImportExport/ImportExportPBF.h | 94 + src/ImportExport/ImportGPX.cpp | 350 + src/ImportExport/ImportGPX.h | 34 + src/ImportExport/ImportNGT.cpp | 48 + src/ImportExport/ImportNGT.h | 12 + src/ImportExport/ImportNMEA.cpp | 230 + src/ImportExport/ImportNMEA.h | 45 + src/ImportExport/ImportOSM.cpp | 595 ++ src/ImportExport/ImportOSM.h | 49 + src/ImportExport/fileformat.pb.cc | 611 ++ src/ImportExport/fileformat.pb.h | 565 ++ src/ImportExport/fileformat.proto | 56 + src/ImportExport/osmformat.pb.cc | 3824 +++++++++ src/ImportExport/osmformat.pb.h | 2810 +++++++ src/ImportExport/osmformat.proto | 229 + src/Interactions/BuildBridgeInteraction.cpp | 174 + src/Interactions/BuildBridgeInteraction.h | 26 + src/Interactions/CreateAreaInteraction.cpp | 277 + src/Interactions/CreateAreaInteraction.h | 45 + src/Interactions/CreateDoubleWayDock.ui | 66 + .../CreateDoubleWayInteraction.cpp | 263 + src/Interactions/CreateDoubleWayInteraction.h | 41 + src/Interactions/CreateNodeInteraction.cpp | 133 + src/Interactions/CreateNodeInteraction.h | 28 + src/Interactions/CreatePolygonInteraction.cpp | 203 + src/Interactions/CreatePolygonInteraction.h | 36 + src/Interactions/CreateRoundaboutDock.ui | 106 + .../CreateRoundaboutInteraction.cpp | 190 + .../CreateRoundaboutInteraction.h | 39 + .../CreateSingleWayInteraction.cpp | 364 + src/Interactions/CreateSingleWayInteraction.h | 48 + src/Interactions/EditInteraction.cpp | 345 + src/Interactions/EditInteraction.h | 44 + src/Interactions/ExtrudeInteraction.cpp | 174 + src/Interactions/ExtrudeInteraction.h | 44 + src/Interactions/Interaction.cpp | 544 ++ src/Interactions/Interaction.h | 136 + src/Interactions/Interactions.pri | 38 + src/Interactions/MoveNodeInteraction.cpp | 324 + src/Interactions/MoveNodeInteraction.h | 40 + src/Interactions/RotateInteraction.cpp | 203 + src/Interactions/RotateInteraction.h | 42 + src/Interactions/ScaleInteraction.cpp | 194 + src/Interactions/ScaleInteraction.h | 41 + src/Interactions/ZoomInteraction.cpp | 87 + src/Interactions/ZoomInteraction.h | 31 + src/Layers/FilterEditDialog.ui | 108 + src/Layers/ImageMapLayer.cpp | 1054 +++ src/Layers/ImageMapLayer.h | 94 + src/Layers/Layer.cpp | 982 +++ src/Layers/Layer.h | 295 + src/Layers/LayerIterator.h | 70 + src/Layers/LayerPrivate.h | 40 + src/Layers/LayerWidget.cpp | 725 ++ src/Layers/LayerWidget.h | 207 + src/Layers/LayerWidget.ui | 41 + src/Layers/Layers.pri | 16 + src/Layers/LicenseDisplayDialog.ui | 69 + src/Layers/OsmRenderLayer.cpp | 275 + src/Layers/OsmRenderLayer.h | 74 + src/Main.cpp | 302 + src/MainWindow.cpp | 4326 ++++++++++ src/MainWindow.h | 350 + src/MainWindow.ui | 2178 +++++ src/NameFinder/NameFinder.pri | 14 + src/NameFinder/NameFinderResult.h | 60 + src/NameFinder/httpquery.cpp | 93 + src/NameFinder/httpquery.h | 60 + src/NameFinder/namefindertablemodel.cpp | 119 + src/NameFinder/namefindertablemodel.h | 57 + src/NameFinder/namefinderwidget.cpp | 146 + src/NameFinder/namefinderwidget.h | 83 + src/NameFinder/namefinderwidget.ui | 40 + src/NameFinder/xmlstreamreader.cpp | 167 + src/NameFinder/xmlstreamreader.h | 61 + src/PaintStyle/FeaturePainter.cpp | 833 ++ src/PaintStyle/FeaturePainter.h | 61 + src/PaintStyle/IPaintStyle.h | 28 + src/PaintStyle/MapCSSPaintstyle.cpp | 134 + src/PaintStyle/MapCSSPaintstyle.h | 43 + src/PaintStyle/MasPaintStyle.cpp | 140 + src/PaintStyle/MasPaintStyle.h | 36 + src/PaintStyle/PaintStyle.pri | 17 + src/PaintStyle/PaintStyleEditor.cpp | 855 ++ src/PaintStyle/PaintStyleEditor.h | 94 + src/PaintStyle/PaintStyleEditor.pri | 11 + src/PaintStyle/PaintStyleEditor.ui | 2358 ++++++ src/PaintStyle/Painter.cpp | 745 ++ src/PaintStyle/Painter.h | 174 + src/PaintStyle/PrimitivePainter.cpp | 537 ++ src/PaintStyle/PrimitivePainter.h | 58 + src/Preferences/BookmarksList.cpp | 143 + src/Preferences/BookmarksList.h | 54 + src/Preferences/FilterList.cpp | 128 + src/Preferences/FilterList.h | 52 + src/Preferences/FilterPreferencesDialog.cpp | 200 + src/Preferences/FilterPreferencesDialog.h | 67 + src/Preferences/FilterPreferencesDialog.ui | 198 + src/Preferences/MerkaartorPreferences.cpp | 1719 ++++ src/Preferences/MerkaartorPreferences.h | 502 ++ src/Preferences/OsmServerWidget.ui | 112 + src/Preferences/Preferences.pri | 43 + src/Preferences/PreferencesDialog.cpp | 691 ++ src/Preferences/PreferencesDialog.h | 96 + src/Preferences/PreferencesDialog.ui | 1881 +++++ src/Preferences/ProjPreferencesDialog.cpp | 145 + src/Preferences/ProjPreferencesDialog.h | 62 + src/Preferences/ProjPreferencesDialog.ui | 198 + src/Preferences/ProjectionsList.cpp | 156 + src/Preferences/ProjectionsList.h | 51 + src/Preferences/TMSPreferencesDialog.cpp | 397 + src/Preferences/TMSPreferencesDialog.h | 86 + src/Preferences/TMSPreferencesDialog.ui | 361 + src/Preferences/TmsServersList.cpp | 178 + src/Preferences/TmsServersList.h | 61 + src/Preferences/WMSPreferencesDialog.cpp | 747 ++ src/Preferences/WMSPreferencesDialog.h | 157 + src/Preferences/WMSPreferencesDialog.ui | 395 + src/Preferences/WmsServersList.cpp | 238 + src/Preferences/WmsServersList.h | 84 + src/QMapControl.pri | 31 + src/QMapControl/WmscMapAdapter.cpp | 166 + src/QMapControl/WmscMapAdapter.h | 113 + src/QMapControl/browserimagemanager.cpp | 393 + src/QMapControl/browserimagemanager.h | 142 + src/QMapControl/imagemanager.cpp | 197 + src/QMapControl/imagemanager.h | 96 + src/QMapControl/imagepoint.cpp | 43 + src/QMapControl/imagepoint.h | 62 + src/QMapControl/mapadapter.cpp | 87 + src/QMapControl/mapadapter.h | 128 + src/QMapControl/mapcontrol.cpp | 344 + src/QMapControl/mapcontrol.h | 276 + src/QMapControl/mapnetwork.cpp | 204 + src/QMapControl/mapnetwork.h | 76 + src/QMapControl/tilemapadapter.cpp | 154 + src/QMapControl/tilemapadapter.h | 112 + src/QMapControl/wmsmapadapter.cpp | 122 + src/QMapControl/wmsmapadapter.h | 141 + src/QToolBarDialog/QToolBarDialog.pri | 7 + src/QToolBarDialog/qttoolbardialog.cpp | 1892 +++++ src/QToolBarDialog/qttoolbardialog.h | 144 + src/QToolBarDialog/qttoolbardialog.ui | 240 + src/Render/MapRenderer.cpp | 397 + src/Render/MapRenderer.h | 125 + src/Render/NativeRenderDialog.cpp | 275 + src/Render/NativeRenderDialog.h | 71 + src/Render/NativeRenderDialog.ui | 331 + src/Render/RENDERING.md | 26 + src/Render/Render.pri | 25 + src/Sync/DirtyList.cpp | 833 ++ src/Sync/DirtyList.h | 159 + src/Sync/DirtyListExecutorOSC.cpp | 481 ++ src/Sync/DirtyListExecutorOSC.h | 67 + src/Sync/DownloadOSM.cpp | 742 ++ src/Sync/DownloadOSM.h | 89 + src/Sync/Sync.pri | 21 + src/Sync/SyncListDialog.ui | 319 + src/TagTemplate/TagTemplate.cpp | 1114 +++ src/TagTemplate/TagTemplate.h | 246 + src/TagTemplate/TagTemplate.pri | 16 + src/Tools/ActionsDialog.cpp | 177 + src/Tools/ActionsDialog.h | 37 + src/Tools/QFatFs/QFat.cpp | 585 ++ src/Tools/QFatFs/QFat.h | 114 + src/Tools/QFatFs/QFatFile.cpp | 78 + src/Tools/QFatFs/QFatFile.h | 29 + src/Tools/QFatFs/QFatFs.cpp | 278 + src/Tools/QFatFs/QFatFs.h | 91 + src/Tools/QFatFs/QFatFs.pri | 12 + src/Tools/RegionMapWidget.cpp | 138 + src/Tools/RegionMapWidget.h | 43 + src/Tools/Tools.pri | 19 + src/Utils/CheckBoxList.cpp | 156 + src/Utils/CheckBoxList.h | 35 + src/Utils/EditCompleterDelegate.cpp | 140 + src/Utils/EditCompleterDelegate.h | 39 + src/Utils/LineF.h | 299 + src/Utils/MDiscardableDialog.cpp | 81 + src/Utils/MDiscardableDialog.h | 37 + src/Utils/OsmLink.cpp | 238 + src/Utils/OsmLink.h | 27 + src/Utils/PictureViewerDialog.cpp | 71 + src/Utils/PictureViewerDialog.h | 39 + src/Utils/PictureViewerDialog.ui | 55 + src/Utils/PixmapWidget.cpp | 158 + src/Utils/PixmapWidget.h | 50 + src/Utils/ProjectionChooser.cpp | 129 + src/Utils/ProjectionChooser.h | 25 + src/Utils/ProjectionChooser.ui | 204 + src/Utils/RemoteControlServer.cpp | 134 + src/Utils/RemoteControlServer.hpp | 77 + src/Utils/SelectionDialog.cpp | 115 + src/Utils/SelectionDialog.h | 42 + src/Utils/SelectionDialog.ui | 171 + src/Utils/ShortcutOverrideFilter.cpp | 69 + src/Utils/ShortcutOverrideFilter.h | 29 + src/Utils/SlippyMapWidget.cpp | 513 ++ src/Utils/SlippyMapWidget.h | 94 + src/Utils/SvgCache.cpp | 35 + src/Utils/SvgCache.h | 8 + src/Utils/TagSelector.cpp | 1167 +++ src/Utils/TagSelector.h | 218 + src/Utils/TagSelectorWidget.cpp | 65 + src/Utils/TagSelectorWidget.h | 35 + src/Utils/TagSelectorWidget.ui | 117 + src/Utils/Utils.cpp | 115 + src/Utils/Utils.h | 33 + src/Utils/Utils.pri | 54 + src/Utils/Utils.qrc | 5 + src/common/AboutDialog.ui | 255 + src/common/Coord.cpp | 196 + src/common/Coord.h | 213 + src/common/Document.cpp | 1284 +++ src/common/Document.h | 188 + src/common/DownloadMapDialog.ui | 220 + src/common/FeatureManipulations.cpp | 1992 +++++ src/common/FeatureManipulations.h | 56 + src/common/Global.cpp | 147 + src/common/Global.h | 58 + src/common/GotoDialog.cpp | 214 + src/common/GotoDialog.h | 63 + src/common/GotoDialog.ui | 381 + src/common/MapTypedef.h | 27 + src/common/MapView.cpp | 1178 +++ src/common/MapView.h | 140 + src/common/MultiProperties.ui | 90 + src/common/Painting.cpp | 226 + src/common/Painting.h | 29 + src/common/Projection.cpp | 258 + src/common/Projection.h | 121 + src/common/PropertiesDialog.ui | 67 + src/common/RelationProperties.ui | 111 + src/common/TagModel.cpp | 198 + src/common/TagModel.h | 39 + src/common/TerraceDialog.cpp | 126 + src/common/TerraceDialog.h | 43 + src/common/TerraceDialog.ui | 289 + src/common/UploadMapDialog.ui | 174 + src/common/common.pri | 41 + src/org.merkaartor.merkaartor.appdata.xml | 43 + src/org.merkaartor.merkaartor.desktop | 13 + src/qextserialport/posix_qextserialport.cpp | 1117 +++ src/qextserialport/posix_qextserialport.h | 56 + src/qextserialport/qextserialbase.cpp | 250 + src/qextserialport/qextserialbase.h | 196 + src/qextserialport/qextserialport.cpp | 98 + src/qextserialport/qextserialport.h | 29 + src/qextserialport/qextserialport.pri | 17 + src/qextserialport/win_qextserialport.cpp | 880 ++ src/qextserialport/win_qextserialport.h | 49 + src/src.pro | 342 + tests/data/sample-shapefile/POINT.dbf | Bin 0 -> 37 bytes tests/data/sample-shapefile/POINT.prj | 1 + tests/data/sample-shapefile/POINT.shp | Bin 0 -> 212 bytes tests/data/sample-shapefile/POINT.shx | Bin 0 -> 132 bytes tests/data/sample-shapefile/POLYGON.dbf | Bin 0 -> 35 bytes tests/data/sample-shapefile/POLYGON.prj | 1 + tests/data/sample-shapefile/POLYGON.shp | Bin 0 -> 404 bytes tests/data/sample-shapefile/POLYGON.shx | Bin 0 -> 116 bytes tests/data/sample-shapefile/POLYLINE.dbf | Bin 0 -> 35 bytes tests/data/sample-shapefile/POLYLINE.prj | 1 + tests/data/sample-shapefile/POLYLINE.shp | Bin 0 -> 308 bytes tests/data/sample-shapefile/POLYLINE.shx | Bin 0 -> 116 bytes tests/data/sample.geojson | 1 + tests/test-projection.cpp | 85 + translations/README.md | 30 + translations/i18n.pl | 554 ++ translations/makefile | 32 + translations/maketar.pl | 57 + translations/merkaartor_cs.ts | 7379 ++++++++++++++++ translations/merkaartor_de.ts | 7397 +++++++++++++++++ translations/merkaartor_en.ts | 7336 ++++++++++++++++ translations/merkaartor_es.ts | 7368 ++++++++++++++++ translations/merkaartor_fi.ts | 7368 ++++++++++++++++ translations/merkaartor_fr.ts | 7368 ++++++++++++++++ translations/merkaartor_hr.ts | 7347 ++++++++++++++++ translations/merkaartor_hu.ts | 7391 ++++++++++++++++ translations/merkaartor_id_ID.ts | 7383 ++++++++++++++++ translations/merkaartor_it.ts | 7393 ++++++++++++++++ translations/merkaartor_ja.ts | 7378 ++++++++++++++++ translations/merkaartor_nl.ts | 7369 ++++++++++++++++ translations/merkaartor_pl.ts | 7386 ++++++++++++++++ translations/merkaartor_pt_BR.ts | 7379 ++++++++++++++++ translations/merkaartor_ru.ts | 7388 ++++++++++++++++ translations/merkaartor_sv.ts | 7367 ++++++++++++++++ translations/merkaartor_uk.ts | 7369 ++++++++++++++++ translations/merkaartor_zh_TW.ts | 7392 ++++++++++++++++ 1684 files changed, 254590 insertions(+) create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/INSTALL.TXT create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/LGPL_EXCEPTION.txt create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/LICENSE.GPL3 create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/LICENSE.LGPL create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/README.TXT create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/buildlib/buildlib.pro create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/common.pri create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/config.pri create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/configure create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/classic.css create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/images/qt-logo.png create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/index.html create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtlockedfile-members.html create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtlockedfile.html create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-example-loader.html create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-example-trivial.html create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-members.html create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-obsolete.html create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.dcf create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.html create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.index create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.qch create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.qhp create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsinglecoreapplication-example-console.html create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsinglecoreapplication-members.html create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsinglecoreapplication.html create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/images/qt-logo.png create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/doc/index.qdoc create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/examples/console/console.pro create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/examples/console/console.qdoc create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/examples/console/main.cpp create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/examples/examples.pro create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/file1.qsl create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/file2.qsl create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/loader.pro create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/loader.qdoc create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/main.cpp create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/examples/trivial/main.cpp create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/examples/trivial/trivial.pro create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/examples/trivial/trivial.qdoc create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/qtsingleapplication.pro create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/QtLockedFile create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/QtSingleApplication create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.cpp create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.h create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile.cpp create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile.h create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile_unix.cpp create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile_win.cpp create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.cpp create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.h create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.pri create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.cpp create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.h create mode 100644 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.pri create mode 100644 AUTHORS create mode 100644 CHANGELOG create mode 100644 CMakeLists.txt create mode 100644 COMPILE.md create mode 100644 CREDITS create mode 100644 HACKING.md create mode 100644 Icons/128x128/merkaartor.png create mode 100644 Icons/16x16/merkaartor.png create mode 100644 Icons/192x192/merkaartor.png create mode 100644 Icons/22x22/merkaartor.png create mode 100644 Icons/24x24/merkaartor.png create mode 100644 Icons/256x256/merkaartor.png create mode 100644 Icons/32x32/merkaartor.png create mode 100644 Icons/36x36/merkaartor.png create mode 100644 Icons/40x40/merkaartor.png create mode 100644 Icons/42x42/merkaartor.png create mode 100644 Icons/48x48/merkaartor.png create mode 100644 Icons/512x512/merkaartor.png create mode 100644 Icons/64x64/merkaartor.png create mode 100644 Icons/72x72/merkaartor.png create mode 100644 Icons/80x80/merkaartor.png create mode 100644 Icons/8x8/merkaartor.png create mode 100644 Icons/96x96/merkaartor.png create mode 100644 Icons/AllIcons.qrc create mode 100644 Icons/Frisius.xpm create mode 100644 Icons/Frisius_100x100.png create mode 100644 Icons/Frisius_16x16.ico create mode 100644 Icons/Frisius_48x48.ico create mode 100644 Icons/Frisius_large.xcf create mode 100644 Icons/Frisius_splash.png create mode 100644 Icons/Frisius_splash.xcf create mode 100644 Icons/Gps_Marker.svg create mode 100644 Icons/Grab.png create mode 100644 Icons/Mapnik/aerodrome.p.16.png create mode 100644 Icons/Mapnik/aerodrome.png create mode 100644 Icons/Mapnik/aiga_parking1.png create mode 100644 Icons/Mapnik/airport.p.16.png create mode 100644 Icons/Mapnik/airport.png create mode 100644 Icons/Mapnik/arrow.png create mode 100644 Icons/Mapnik/arrow_back.png create mode 100644 Icons/Mapnik/atm.png create mode 100644 Icons/Mapnik/atm2.p.16.png create mode 100644 Icons/Mapnik/bank2.p.16.png create mode 100644 Icons/Mapnik/bar.p.20.png create mode 100644 Icons/Mapnik/beach.png create mode 100644 Icons/Mapnik/bus_stop.p.12.png create mode 100644 Icons/Mapnik/bus_stop.png create mode 100644 Icons/Mapnik/cable_car.png create mode 100644 Icons/Mapnik/cafe.p.16.png create mode 100644 Icons/Mapnik/camping.n.16.png create mode 100644 Icons/Mapnik/chair_lift.png create mode 100644 Icons/Mapnik/christian3.p.14.png create mode 100644 Icons/Mapnik/cinema.p.24.png create mode 100644 Icons/Mapnik/cliff.png create mode 100644 Icons/Mapnik/cliff2.png create mode 100644 Icons/Mapnik/communications.p.20.png create mode 100644 Icons/Mapnik/danger.png create mode 100644 Icons/Mapnik/food_bar.p.16.png create mode 100644 Icons/Mapnik/forest.png create mode 100644 Icons/Mapnik/fuel.p.16.png create mode 100644 Icons/Mapnik/gate.png create mode 100644 Icons/Mapnik/gate2.png create mode 100644 Icons/Mapnik/glacier.png create mode 100644 Icons/Mapnik/glacier2.png create mode 100644 Icons/Mapnik/grave_yard.png create mode 100644 Icons/Mapnik/halt.png create mode 100644 Icons/Mapnik/hospital.p.16.png create mode 100644 Icons/Mapnik/hospital.png create mode 100644 Icons/Mapnik/hotel2.p.20.png create mode 100644 Icons/Mapnik/islamic3.p.16.png create mode 100644 Icons/Mapnik/jewish3.p.16.png create mode 100644 Icons/Mapnik/landfill.png create mode 100644 Icons/Mapnik/level_crossing.png create mode 100644 Icons/Mapnik/level_crossing2.png create mode 100644 Icons/Mapnik/library.p.20.png create mode 100644 Icons/Mapnik/london-tube-24.png create mode 100644 Icons/Mapnik/marsh.png create mode 100644 Icons/Mapnik/mini_round.png create mode 100644 Icons/Mapnik/mosque.png create mode 100644 Icons/Mapnik/motorway_shield1.png create mode 100644 Icons/Mapnik/motorway_shield2.png create mode 100644 Icons/Mapnik/motorway_shield3.png create mode 100644 Icons/Mapnik/motorway_shield4.png create mode 100644 Icons/Mapnik/motorway_shield5.png create mode 100644 Icons/Mapnik/motorway_shield6.png create mode 100644 Icons/Mapnik/mud.png create mode 100644 Icons/Mapnik/museum.p.16.png create mode 100644 Icons/Mapnik/nature_reserve.png create mode 100644 Icons/Mapnik/nature_reserve2.png create mode 100644 Icons/Mapnik/parking.p.16.png create mode 100644 Icons/Mapnik/parking.png create mode 100644 Icons/Mapnik/peak.png create mode 100644 Icons/Mapnik/pint.png create mode 100644 Icons/Mapnik/place_of_worship.png create mode 100644 Icons/Mapnik/place_of_worship3.p.16.png create mode 100644 Icons/Mapnik/place_of_worship3.png create mode 100644 Icons/Mapnik/post_box.p.16.png create mode 100644 Icons/Mapnik/post_box.png create mode 100644 Icons/Mapnik/post_office.p.16.png create mode 100644 Icons/Mapnik/post_office.png create mode 100644 Icons/Mapnik/postoffice.png create mode 100644 Icons/Mapnik/power_line.png create mode 100644 Icons/Mapnik/power_tower.png create mode 100644 Icons/Mapnik/power_wind.png create mode 100644 Icons/Mapnik/primary_shield1.png create mode 100644 Icons/Mapnik/primary_shield2.png create mode 100644 Icons/Mapnik/primary_shield3.png create mode 100644 Icons/Mapnik/primary_shield4.png create mode 100644 Icons/Mapnik/primary_shield5.png create mode 100644 Icons/Mapnik/primary_shield6.png create mode 100644 Icons/Mapnik/primary_shield7.png create mode 100644 Icons/Mapnik/primary_shield8.png create mode 100644 Icons/Mapnik/pub.p.16.png create mode 100644 Icons/Mapnik/pub.png create mode 100644 Icons/Mapnik/quarry.png create mode 100644 Icons/Mapnik/quarry2.png create mode 100644 Icons/Mapnik/recycle.png create mode 100644 Icons/Mapnik/recycling.p.16.png create mode 100644 Icons/Mapnik/recycling.png create mode 100644 Icons/Mapnik/restaurant.p.16.png create mode 100644 Icons/Mapnik/scrub.png create mode 100644 Icons/Mapnik/secondary_shield1.png create mode 100644 Icons/Mapnik/secondary_shield2.png create mode 100644 Icons/Mapnik/secondary_shield3.png create mode 100644 Icons/Mapnik/secondary_shield4.png create mode 100644 Icons/Mapnik/secondary_shield5.png create mode 100644 Icons/Mapnik/secondary_shield6.png create mode 100644 Icons/Mapnik/secondary_shield7.png create mode 100644 Icons/Mapnik/secondary_shield8.png create mode 100644 Icons/Mapnik/sikh.png create mode 100644 Icons/Mapnik/sikh3.p.16.png create mode 100644 Icons/Mapnik/station.png create mode 100644 Icons/Mapnik/station_small.png create mode 100644 Icons/Mapnik/synagogue.png create mode 100644 Icons/Mapnik/telephone.p.16.png create mode 100644 Icons/Mapnik/tertiary_shield1.png create mode 100644 Icons/Mapnik/tertiary_shield2.png create mode 100644 Icons/Mapnik/tertiary_shield3.png create mode 100644 Icons/Mapnik/tertiary_shield4.png create mode 100644 Icons/Mapnik/tertiary_shield5.png create mode 100644 Icons/Mapnik/tertiary_shield6.png create mode 100644 Icons/Mapnik/tertiary_shield7.png create mode 100644 Icons/Mapnik/tertiary_shield8.png create mode 100644 Icons/Mapnik/toilets.p.20.png create mode 100644 Icons/Mapnik/tower.png create mode 100644 Icons/Mapnik/tree.png create mode 100644 Icons/Mapnik/trunk_shield1.png create mode 100644 Icons/Mapnik/trunk_shield2.png create mode 100644 Icons/Mapnik/trunk_shield3.png create mode 100644 Icons/Mapnik/trunk_shield4.png create mode 100644 Icons/Mapnik/trunk_shield5.png create mode 100644 Icons/Mapnik/trunk_shield6.png create mode 100644 Icons/Mapnik/trunk_shield7.png create mode 100644 Icons/Mapnik/trunk_shield8.png create mode 100644 Icons/Mapnik/turning_circle.13.png create mode 100644 Icons/Mapnik/turning_circle.15.png create mode 100644 Icons/Mapnik/turning_circle.17.png create mode 100644 Icons/Mapnik/turning_circle.19.png create mode 100644 Icons/Mapnik/vineyard.png create mode 100644 Icons/Mapnik/windmill.png create mode 100644 Icons/Mapnik/zoo.png create mode 100644 Icons/Merkaartor.xpm create mode 100644 Icons/Merkaartor_100x100.png create mode 100644 Icons/Merkaartor_16x16.ico create mode 100644 Icons/Merkaartor_48x48.ico create mode 100644 Icons/Merkaartor_installer.bmp create mode 100644 Icons/Merkaartor_large.xcf create mode 100644 Icons/Merkaartor_splash.png create mode 100644 Icons/Merkaartor_splash.xcf create mode 100644 Icons/Places/place_hamlet.png create mode 100644 Icons/Places/place_town.png create mode 100644 Icons/Places/place_village.png create mode 100644 Icons/QToolBarDialog/back.png create mode 100644 Icons/QToolBarDialog/down.png create mode 100644 Icons/QToolBarDialog/forward.png create mode 100644 Icons/QToolBarDialog/minus.png create mode 100644 Icons/QToolBarDialog/plus.png create mode 100644 Icons/QToolBarDialog/qttoolbardialog.qrc create mode 100644 Icons/QToolBarDialog/up.png create mode 100644 Icons/Tiles/000.png create mode 100644 Icons/Tiles/100.png create mode 100644 Icons/Tiles/101.png create mode 100644 Icons/Tiles/110.png create mode 100644 Icons/Tiles/111.png create mode 100644 Icons/actions/GPS.png create mode 100644 Icons/actions/align_nodes.png create mode 100644 Icons/actions/axisalign.png create mode 100644 Icons/actions/break_apart_roads.png create mode 100644 Icons/actions/build_bridge.png create mode 100644 Icons/actions/camera.png create mode 100644 Icons/actions/create_area.png create mode 100644 Icons/actions/create_node.png create mode 100644 Icons/actions/create_road.png create mode 100644 Icons/actions/detach_node.png create mode 100644 Icons/actions/document_import.png create mode 100644 Icons/actions/document_new.png create mode 100644 Icons/actions/document_open.png create mode 100644 Icons/actions/download.png create mode 100644 Icons/actions/download_more.png create mode 100644 Icons/actions/edit-cut.png create mode 100644 Icons/actions/edit_copy.png create mode 100644 Icons/actions/edit_delete.png create mode 100644 Icons/actions/edit_move.png create mode 100644 Icons/actions/edit_paste.png create mode 100644 Icons/actions/edit_paste_tags.png create mode 100644 Icons/actions/edit_rotate.png create mode 100644 Icons/actions/edit_rotate.svg create mode 100644 Icons/actions/emblem-important.png create mode 100644 Icons/actions/emblem-unreadable.png create mode 100644 Icons/actions/find.png create mode 100644 Icons/actions/goto.png create mode 100644 Icons/actions/join_areas.png create mode 100644 Icons/actions/join_roads.png create mode 100644 Icons/actions/list-add.png create mode 100644 Icons/actions/list-remove.png create mode 100644 Icons/actions/offline.png create mode 100644 Icons/actions/preferences.png create mode 100644 Icons/actions/redo.png create mode 100644 Icons/actions/reverse_road.png create mode 100644 Icons/actions/save.png create mode 100644 Icons/actions/select.png create mode 100644 Icons/actions/software-update-available.png create mode 100644 Icons/actions/split_area.png create mode 100644 Icons/actions/split_road.png create mode 100644 Icons/actions/spread_nodes.png create mode 100644 Icons/actions/subdivide_road.png create mode 100644 Icons/actions/terrace_building.png create mode 100644 Icons/actions/transform-move.png create mode 100644 Icons/actions/transform-rotate.png create mode 100644 Icons/actions/transform-scale.png create mode 100644 Icons/actions/undo.png create mode 100644 Icons/actions/upload.png create mode 100644 Icons/actions/zoom_fit_best.png create mode 100644 Icons/actions/zoom_in.png create mode 100644 Icons/actions/zoom_out.png create mode 100644 Icons/add.xpm create mode 100644 Icons/dialog-error.png create mode 100644 Icons/dialog-warning.png create mode 100644 Icons/edit-copy.png create mode 100644 Icons/edit-cut.png create mode 100644 Icons/edit-paste.png create mode 100644 Icons/edit-redo.xpm create mode 100644 Icons/edit-undo.xpm create mode 100644 Icons/emblem-readonly.png create mode 100644 Icons/empty.xpm create mode 100644 Icons/eye.xpm create mode 100644 Icons/frisius-win32.rc create mode 100644 Icons/geotagged.png create mode 100644 Icons/grabbing.png create mode 100644 Icons/map-icons/classic.small/accommodation.png create mode 100644 Icons/map-icons/classic.small/accommodation/camping.png create mode 100644 Icons/map-icons/classic.small/accommodation/camping/caravan.png create mode 100644 Icons/map-icons/classic.small/accommodation/camping/dump-station.png create mode 100644 Icons/map-icons/classic.small/accommodation/camping/gas-refill.png create mode 100644 Icons/map-icons/classic.small/accommodation/camping/hookup.png create mode 100644 Icons/map-icons/classic.small/accommodation/camping/trash.png create mode 100644 Icons/map-icons/classic.small/accommodation/camping/wastewater.png create mode 100644 Icons/map-icons/classic.small/accommodation/camping/water.png create mode 100644 Icons/map-icons/classic.small/accommodation/chalet.png create mode 100644 Icons/map-icons/classic.small/accommodation/guest_house.png create mode 100644 Icons/map-icons/classic.small/accommodation/hostel.png create mode 100644 Icons/map-icons/classic.small/accommodation/hotel.png create mode 100644 Icons/map-icons/classic.small/accommodation/hotel/five_star.png create mode 100644 Icons/map-icons/classic.small/accommodation/hotel/four_star.png create mode 100644 Icons/map-icons/classic.small/accommodation/hotel/one_star.png create mode 100644 Icons/map-icons/classic.small/accommodation/hotel/three_star.png create mode 100644 Icons/map-icons/classic.small/accommodation/hotel/two_star.png create mode 100644 Icons/map-icons/classic.small/accommodation/motel.png create mode 100644 Icons/map-icons/classic.small/accommodation/shelter-bw.png create mode 100644 Icons/map-icons/classic.small/accommodation/shelter.png create mode 100644 Icons/map-icons/classic.small/education.png create mode 100644 Icons/map-icons/classic.small/education/college.png create mode 100644 Icons/map-icons/classic.small/education/kindergarten.png create mode 100644 Icons/map-icons/classic.small/education/school.png create mode 100644 Icons/map-icons/classic.small/education/school/primary.png create mode 100644 Icons/map-icons/classic.small/education/university.png create mode 100644 Icons/map-icons/classic.small/empty.png create mode 100644 Icons/map-icons/classic.small/food.png create mode 100644 Icons/map-icons/classic.small/food/bacon_and_eggs.png create mode 100644 Icons/map-icons/classic.small/food/bar.png create mode 100644 Icons/map-icons/classic.small/food/biergarten.png create mode 100644 Icons/map-icons/classic.small/food/cafe.png create mode 100644 Icons/map-icons/classic.small/food/drinking_water.png create mode 100644 Icons/map-icons/classic.small/food/fastfood.png create mode 100644 Icons/map-icons/classic.small/food/fastfood/burger-king.png create mode 100644 Icons/map-icons/classic.small/food/fastfood/mc-donalds.png create mode 100644 Icons/map-icons/classic.small/food/icecream.png create mode 100644 Icons/map-icons/classic.small/food/pub.png create mode 100644 Icons/map-icons/classic.small/food/restaurant.png create mode 100644 Icons/map-icons/classic.small/food/restaurant/japanese.png create mode 100644 Icons/map-icons/classic.small/food/snacks.png create mode 100644 Icons/map-icons/classic.small/food/snacks/pizza.png create mode 100644 Icons/map-icons/classic.small/food/teashop.png create mode 100644 Icons/map-icons/classic.small/food/wine_tavern.png create mode 100644 Icons/map-icons/classic.small/geocache.png create mode 100644 Icons/map-icons/classic.small/health.png create mode 100644 Icons/map-icons/classic.small/health/dentist.png create mode 100644 Icons/map-icons/classic.small/health/doctor.png create mode 100644 Icons/map-icons/classic.small/health/emergency.png create mode 100644 Icons/map-icons/classic.small/health/eye_specialist.png create mode 100644 Icons/map-icons/classic.small/health/hospital.png create mode 100644 Icons/map-icons/classic.small/health/optician.png create mode 100644 Icons/map-icons/classic.small/health/pharmacy.png create mode 100644 Icons/map-icons/classic.small/health/veterinary.png create mode 100644 Icons/map-icons/classic.small/incomming/Broad.png create mode 100644 Icons/map-icons/classic.small/incomming/OLmarker.png create mode 100644 Icons/map-icons/classic.small/incomming/amenity.png create mode 100644 Icons/map-icons/classic.small/incomming/aroad.png create mode 100644 Icons/map-icons/classic.small/incomming/bridleway.png create mode 100644 Icons/map-icons/classic.small/incomming/byway.png create mode 100644 Icons/map-icons/classic.small/incomming/contours.png create mode 100644 Icons/map-icons/classic.small/incomming/footpath.png create mode 100644 Icons/map-icons/classic.small/incomming/fwpbr.png create mode 100644 Icons/map-icons/classic.small/incomming/industry.png create mode 100644 Icons/map-icons/classic.small/incomming/interest.png create mode 100644 Icons/map-icons/classic.small/incomming/london-tube-24.png create mode 100644 Icons/map-icons/classic.small/incomming/minorroad.png create mode 100644 Icons/map-icons/classic.small/incomming/motorway_shield2.png create mode 100644 Icons/map-icons/classic.small/incomming/motorway_shield3.png create mode 100644 Icons/map-icons/classic.small/incomming/one.png create mode 100644 Icons/map-icons/classic.small/incomming/pbridleway.png create mode 100644 Icons/map-icons/classic.small/incomming/place.png create mode 100644 Icons/map-icons/classic.small/incomming/railway.png create mode 100644 Icons/map-icons/classic.small/incomming/road.png create mode 100644 Icons/map-icons/classic.small/incomming/station.png create mode 100644 Icons/map-icons/classic.small/incomming/stationnew.png create mode 100644 Icons/map-icons/classic.small/incomming/three.png create mode 100644 Icons/map-icons/classic.small/incomming/two.png create mode 100644 Icons/map-icons/classic.small/misc.png create mode 100644 Icons/map-icons/classic.small/misc/bunny.png create mode 100644 Icons/map-icons/classic.small/misc/butterfly.png create mode 100644 Icons/map-icons/classic.small/misc/construction.png create mode 100644 Icons/map-icons/classic.small/misc/danger.png create mode 100644 Icons/map-icons/classic.small/misc/deprecated.png create mode 100644 Icons/map-icons/classic.small/misc/door.png create mode 100644 Icons/map-icons/classic.small/misc/housenumber.png create mode 100644 Icons/map-icons/classic.small/misc/information.png create mode 100644 Icons/map-icons/classic.small/misc/landmark.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/barn.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/beacon.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/building.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/bunker.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/chimney.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/crane.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/farm.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/gasometer.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/glacier.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/glacier_small.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/lighthouse.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/mine.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/mountain_pass.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/peak.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/peak_small.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/pier.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/plant.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/power.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/power/fossil.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/power/hydro.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/power/nuclear.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/power/tower.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/power/tower_small.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/power/wind.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/range.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/reservoir_covered.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/spring.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/survey_point.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/tower.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/trees.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/volcano.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/volcano_small.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/wastewater_plant.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/water_tower.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/windmill.png create mode 100644 Icons/map-icons/classic.small/misc/landmark/works.png create mode 100644 Icons/map-icons/classic.small/misc/landuse/commercial.png create mode 100644 Icons/map-icons/classic.small/misc/landuse/residential.png create mode 100644 Icons/map-icons/classic.small/misc/lock_closed.png create mode 100644 Icons/map-icons/classic.small/misc/lock_open.png create mode 100644 Icons/map-icons/classic.small/misc/no_icon.png create mode 100644 Icons/map-icons/classic.small/misc/no_smoking.png create mode 100644 Icons/map-icons/classic.small/misc/note.png create mode 100644 Icons/map-icons/classic.small/misc/proposed.png create mode 100644 Icons/map-icons/classic.small/misc/surveillance.png create mode 100644 Icons/map-icons/classic.small/misc/tap_drinking.png create mode 100644 Icons/map-icons/classic.small/money.png create mode 100644 Icons/map-icons/classic.small/money/atm.png create mode 100644 Icons/map-icons/classic.small/money/bank.png create mode 100644 Icons/map-icons/classic.small/money/bank/vr-bank.png create mode 100644 Icons/map-icons/classic.small/money/exchange.png create mode 100644 Icons/map-icons/classic.small/nautical.png create mode 100644 Icons/map-icons/classic.small/nautical/alpha_flag.png create mode 100644 Icons/map-icons/classic.small/nautical/anchor.png create mode 100644 Icons/map-icons/classic.small/nautical/aqueduct.png create mode 100644 Icons/map-icons/classic.small/nautical/boat.png create mode 100644 Icons/map-icons/classic.small/nautical/boatyard.png create mode 100644 Icons/map-icons/classic.small/nautical/lock_gate.png create mode 100644 Icons/map-icons/classic.small/nautical/marina.png create mode 100644 Icons/map-icons/classic.small/nautical/slipway.png create mode 100644 Icons/map-icons/classic.small/nautical/turning.png create mode 100644 Icons/map-icons/classic.small/nautical/waterfall.png create mode 100644 Icons/map-icons/classic.small/nautical/weir.png create mode 100644 Icons/map-icons/classic.small/people.png create mode 100644 Icons/map-icons/classic.small/people/friends.png create mode 100644 Icons/map-icons/classic.small/people/friendsd.png create mode 100644 Icons/map-icons/classic.small/people/work.png create mode 100644 Icons/map-icons/classic.small/places.png create mode 100644 Icons/map-icons/classic.small/places/island.png create mode 100644 Icons/map-icons/classic.small/places/locality.png create mode 100644 Icons/map-icons/classic.small/places/settlement.png create mode 100644 Icons/map-icons/classic.small/places/settlement/capital.png create mode 100644 Icons/map-icons/classic.small/places/settlement/city.png create mode 100644 Icons/map-icons/classic.small/places/settlement/town.png create mode 100644 Icons/map-icons/classic.small/public.png create mode 100644 Icons/map-icons/classic.small/public/administration/court_of_law.png create mode 100644 Icons/map-icons/classic.small/public/administration/prison.png create mode 100644 Icons/map-icons/classic.small/public/arts_centre.png create mode 100644 Icons/map-icons/classic.small/public/firebrigade.png create mode 100644 Icons/map-icons/classic.small/public/police.png create mode 100644 Icons/map-icons/classic.small/public/post_box.png create mode 100644 Icons/map-icons/classic.small/public/post_office.png create mode 100644 Icons/map-icons/classic.small/public/recycling.png create mode 100644 Icons/map-icons/classic.small/public/recycling/trash-bin.png create mode 100644 Icons/map-icons/classic.small/public/telephone.png create mode 100644 Icons/map-icons/classic.small/public/toilets.png create mode 100644 Icons/map-icons/classic.small/recreation.png create mode 100644 Icons/map-icons/classic.small/recreation/bench.png create mode 100644 Icons/map-icons/classic.small/recreation/bicycling.png create mode 100644 Icons/map-icons/classic.small/recreation/cinema.png create mode 100644 Icons/map-icons/classic.small/recreation/common.png create mode 100644 Icons/map-icons/classic.small/recreation/garden.png create mode 100644 Icons/map-icons/classic.small/recreation/music.png create mode 100644 Icons/map-icons/classic.small/recreation/nature_reserve.png create mode 100644 Icons/map-icons/classic.small/recreation/nightclub.png create mode 100644 Icons/map-icons/classic.small/recreation/park.png create mode 100644 Icons/map-icons/classic.small/recreation/picnic.png create mode 100644 Icons/map-icons/classic.small/recreation/playground.png create mode 100644 Icons/map-icons/classic.small/recreation/shelter.png create mode 100644 Icons/map-icons/classic.small/recreation/theater.png create mode 100644 Icons/map-icons/classic.small/recreation/theme_park.png create mode 100644 Icons/map-icons/classic.small/recreation/water_park.png create mode 100644 Icons/map-icons/classic.small/recreation/zoo.png create mode 100644 Icons/map-icons/classic.small/religion.png create mode 100644 Icons/map-icons/classic.small/religion/cemetery.png create mode 100644 Icons/map-icons/classic.small/religion/chapel.png create mode 100644 Icons/map-icons/classic.small/religion/church.png create mode 100644 Icons/map-icons/classic.small/religion/church/bahai.png create mode 100644 Icons/map-icons/classic.small/religion/church/buddhism.png create mode 100644 Icons/map-icons/classic.small/religion/church/catholic.png create mode 100644 Icons/map-icons/classic.small/religion/church/hinduism.png create mode 100644 Icons/map-icons/classic.small/religion/church/jainism.png create mode 100644 Icons/map-icons/classic.small/religion/church/mormon.png create mode 100644 Icons/map-icons/classic.small/religion/church/mosque.png create mode 100644 Icons/map-icons/classic.small/religion/church/orthodox.png create mode 100644 Icons/map-icons/classic.small/religion/church/protestant.png create mode 100644 Icons/map-icons/classic.small/religion/church/shinto.png create mode 100644 Icons/map-icons/classic.small/religion/church/sikhism.png create mode 100644 Icons/map-icons/classic.small/religion/church/synagogue.png create mode 100644 Icons/map-icons/classic.small/religion/church/taoism.png create mode 100644 Icons/map-icons/classic.small/religion/wayside_cross.png create mode 100644 Icons/map-icons/classic.small/religion/wayside_shrine.png create mode 100644 Icons/map-icons/classic.small/rendering.png create mode 100644 Icons/map-icons/classic.small/rendering/beach.png create mode 100644 Icons/map-icons/classic.small/rendering/cliff.png create mode 100644 Icons/map-icons/classic.small/rendering/cliff2.png create mode 100644 Icons/map-icons/classic.small/rendering/quarry.png create mode 100644 Icons/map-icons/classic.small/rendering/quarry2.png create mode 100644 Icons/map-icons/classic.small/rendering/rail_preserved.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/motorway_shield.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/motorway_shield1.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/motorway_shield2.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/motorway_shield3.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/motorway_shield4.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/motorway_shield5.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/motorway_shield6.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/primary_shield1.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/primary_shield2.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/primary_shield3.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/primary_shield4.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/primary_shield5.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/primary_shield6.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/primary_shield7.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/primary_shield8.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/secondary_shield1.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/secondary_shield2.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/secondary_shield3.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/secondary_shield4.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/secondary_shield5.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/secondary_shield6.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/secondary_shield7.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/secondary_shield8.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/tertiary_shield1.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/tertiary_shield2.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/tertiary_shield3.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/tertiary_shield4.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/tertiary_shield5.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/tertiary_shield6.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/tertiary_shield7.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/tertiary_shield8.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/trunk_shield1.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/trunk_shield2.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/trunk_shield3.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/trunk_shield4.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/trunk_shield5.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/trunk_shield6.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/trunk_shield7.png create mode 100644 Icons/map-icons/classic.small/rendering/shield/trunk_shield8.png create mode 100644 Icons/map-icons/classic.small/rendering/station_small.png create mode 100644 Icons/map-icons/classic.small/rendering/track/arrow.png create mode 100644 Icons/map-icons/classic.small/rendering/track/arrow_back.png create mode 100644 Icons/map-icons/classic.small/rendering/track/mini_round.png create mode 100644 Icons/map-icons/classic.small/rendering/track/rail.png create mode 100644 Icons/map-icons/classic.small/rendering/track/station_small.png create mode 100644 Icons/map-icons/classic.small/shopping.png create mode 100644 Icons/map-icons/classic.small/shopping/beverages.png create mode 100644 Icons/map-icons/classic.small/shopping/chemist.png create mode 100644 Icons/map-icons/classic.small/shopping/clothes.png create mode 100644 Icons/map-icons/classic.small/shopping/computer.png create mode 100644 Icons/map-icons/classic.small/shopping/diy_store.png create mode 100644 Icons/map-icons/classic.small/shopping/electronics.png create mode 100644 Icons/map-icons/classic.small/shopping/florist.png create mode 100644 Icons/map-icons/classic.small/shopping/furniture.png create mode 100644 Icons/map-icons/classic.small/shopping/garden_centre.png create mode 100644 Icons/map-icons/classic.small/shopping/groceries/bakery.png create mode 100644 Icons/map-icons/classic.small/shopping/groceries/butcher.png create mode 100644 Icons/map-icons/classic.small/shopping/groceries/fruits.png create mode 100644 Icons/map-icons/classic.small/shopping/hairdresser.png create mode 100644 Icons/map-icons/classic.small/shopping/hifi.png create mode 100644 Icons/map-icons/classic.small/shopping/jewelry.png create mode 100644 Icons/map-icons/classic.small/shopping/kiosk.png create mode 100644 Icons/map-icons/classic.small/shopping/laundry.png create mode 100644 Icons/map-icons/classic.small/shopping/mall.png create mode 100644 Icons/map-icons/classic.small/shopping/optician.png create mode 100644 Icons/map-icons/classic.small/shopping/rental/library.png create mode 100644 Icons/map-icons/classic.small/shopping/shoes.png create mode 100644 Icons/map-icons/classic.small/shopping/sports/outdoor.png create mode 100644 Icons/map-icons/classic.small/shopping/supermarket.png create mode 100644 Icons/map-icons/classic.small/shopping/supermarket/aldi.png create mode 100644 Icons/map-icons/classic.small/shopping/supermarket/aldi_nord.png create mode 100644 Icons/map-icons/classic.small/shopping/supermarket/kaufland.png create mode 100644 Icons/map-icons/classic.small/shopping/supermarket/lidl.png create mode 100644 Icons/map-icons/classic.small/shopping/tailor.png create mode 100644 Icons/map-icons/classic.small/shopping/toys.png create mode 100644 Icons/map-icons/classic.small/shopping/video.png create mode 100644 Icons/map-icons/classic.small/sightseeing.png create mode 100644 Icons/map-icons/classic.small/sightseeing/archaeological.png create mode 100644 Icons/map-icons/classic.small/sightseeing/battlefield.png create mode 100644 Icons/map-icons/classic.small/sightseeing/castle.png create mode 100644 Icons/map-icons/classic.small/sightseeing/memorial.png create mode 100644 Icons/map-icons/classic.small/sightseeing/monument.png create mode 100644 Icons/map-icons/classic.small/sightseeing/museum.png create mode 100644 Icons/map-icons/classic.small/sightseeing/ruins.png create mode 100644 Icons/map-icons/classic.small/sightseeing/viewpoint.png create mode 100644 Icons/map-icons/classic.small/sports.png create mode 100644 Icons/map-icons/classic.small/sports/10pin.png create mode 100644 Icons/map-icons/classic.small/sports/archery.png create mode 100644 Icons/map-icons/classic.small/sports/baseball.png create mode 100644 Icons/map-icons/classic.small/sports/basketball.png create mode 100644 Icons/map-icons/classic.small/sports/bicycle.png create mode 100644 Icons/map-icons/classic.small/sports/boule.png create mode 100644 Icons/map-icons/classic.small/sports/centre.png create mode 100644 Icons/map-icons/classic.small/sports/cricket.png create mode 100644 Icons/map-icons/classic.small/sports/croquet.png create mode 100644 Icons/map-icons/classic.small/sports/cycling.png create mode 100644 Icons/map-icons/classic.small/sports/dart.png create mode 100644 Icons/map-icons/classic.small/sports/diving.png create mode 100644 Icons/map-icons/classic.small/sports/fishing.png create mode 100644 Icons/map-icons/classic.small/sports/football.png create mode 100644 Icons/map-icons/classic.small/sports/golf.png create mode 100644 Icons/map-icons/classic.small/sports/handball.png create mode 100644 Icons/map-icons/classic.small/sports/hockey.png create mode 100644 Icons/map-icons/classic.small/sports/indoor_pool.png create mode 100644 Icons/map-icons/classic.small/sports/kiteflying.png create mode 100644 Icons/map-icons/classic.small/sports/mountain_bike.png create mode 100644 Icons/map-icons/classic.small/sports/multi.png create mode 100644 Icons/map-icons/classic.small/sports/pitch.png create mode 100644 Icons/map-icons/classic.small/sports/pool.png create mode 100644 Icons/map-icons/classic.small/sports/racquetball.png create mode 100644 Icons/map-icons/classic.small/sports/riding.png create mode 100644 Icons/map-icons/classic.small/sports/skiing.png create mode 100644 Icons/map-icons/classic.small/sports/soccer.png create mode 100644 Icons/map-icons/classic.small/sports/stadium.png create mode 100644 Icons/map-icons/classic.small/sports/swimming.png create mode 100644 Icons/map-icons/classic.small/sports/table_tennis.png create mode 100644 Icons/map-icons/classic.small/sports/tennis.png create mode 100644 Icons/map-icons/classic.small/sports/track.png create mode 100644 Icons/map-icons/classic.small/sports/volleyball.png create mode 100644 Icons/map-icons/classic.small/transport.png create mode 100644 Icons/map-icons/classic.small/transport/aerialway.png create mode 100644 Icons/map-icons/classic.small/transport/aerialway/cable_car.png create mode 100644 Icons/map-icons/classic.small/transport/aerialway/chair_lift.png create mode 100644 Icons/map-icons/classic.small/transport/aerialway/drag_lift.png create mode 100644 Icons/map-icons/classic.small/transport/aerialway/station.png create mode 100644 Icons/map-icons/classic.small/transport/airport.png create mode 100644 Icons/map-icons/classic.small/transport/airport/airfield.png create mode 100644 Icons/map-icons/classic.small/transport/airport/helipad.png create mode 100644 Icons/map-icons/classic.small/transport/airport/terminal.png create mode 100644 Icons/map-icons/classic.small/transport/bridge.png create mode 100644 Icons/map-icons/classic.small/transport/bridge/bridge-car.png create mode 100644 Icons/map-icons/classic.small/transport/bridge/bridge-pedestrian.png create mode 100644 Icons/map-icons/classic.small/transport/bridge/drawbridge.png create mode 100644 Icons/map-icons/classic.small/transport/bus.png create mode 100644 Icons/map-icons/classic.small/transport/bus_small.png create mode 100644 Icons/map-icons/classic.small/transport/car.png create mode 100644 Icons/map-icons/classic.small/transport/ferry.png create mode 100644 Icons/map-icons/classic.small/transport/ferry/ferry-car.png create mode 100644 Icons/map-icons/classic.small/transport/ferry/ferry-pedestrian.png create mode 100644 Icons/map-icons/classic.small/transport/funicular.png create mode 100644 Icons/map-icons/classic.small/transport/handicapped.png create mode 100644 Icons/map-icons/classic.small/transport/harbour.png create mode 100644 Icons/map-icons/classic.small/transport/park_ride.png create mode 100644 Icons/map-icons/classic.small/transport/pedestrian.png create mode 100644 Icons/map-icons/classic.small/transport/railway.png create mode 100644 Icons/map-icons/classic.small/transport/railway_small.png create mode 100644 Icons/map-icons/classic.small/transport/rapid_train.png create mode 100644 Icons/map-icons/classic.small/transport/steps.png create mode 100644 Icons/map-icons/classic.small/transport/taxi.png create mode 100644 Icons/map-icons/classic.small/transport/ticket-machine.png create mode 100644 Icons/map-icons/classic.small/transport/track.png create mode 100644 Icons/map-icons/classic.small/transport/tram.png create mode 100644 Icons/map-icons/classic.small/transport/turntable.png create mode 100644 Icons/map-icons/classic.small/transport/underground.png create mode 100644 Icons/map-icons/classic.small/unknown.png create mode 100644 Icons/map-icons/classic.small/vehicle.png create mode 100644 Icons/map-icons/classic.small/vehicle/bicycle_rental.png create mode 100644 Icons/map-icons/classic.small/vehicle/car_rental.png create mode 100644 Icons/map-icons/classic.small/vehicle/car_rental/sixt.png create mode 100644 Icons/map-icons/classic.small/vehicle/car_sharing.png create mode 100644 Icons/map-icons/classic.small/vehicle/car_wash.png create mode 100644 Icons/map-icons/classic.small/vehicle/cattle_grid.png create mode 100644 Icons/map-icons/classic.small/vehicle/caution.png create mode 100644 Icons/map-icons/classic.small/vehicle/crossing.png create mode 100644 Icons/map-icons/classic.small/vehicle/crossing_small.png create mode 100644 Icons/map-icons/classic.small/vehicle/emergency_phone.png create mode 100644 Icons/map-icons/classic.small/vehicle/exit.png create mode 100644 Icons/map-icons/classic.small/vehicle/ford.png create mode 100644 Icons/map-icons/classic.small/vehicle/fuel_station.png create mode 100644 Icons/map-icons/classic.small/vehicle/fuel_station/agip.png create mode 100644 Icons/map-icons/classic.small/vehicle/fuel_station/aral.png create mode 100644 Icons/map-icons/classic.small/vehicle/fuel_station/elf.png create mode 100644 Icons/map-icons/classic.small/vehicle/fuel_station/esso.png create mode 100644 Icons/map-icons/classic.small/vehicle/fuel_station/jet.png create mode 100644 Icons/map-icons/classic.small/vehicle/fuel_station/omv.png create mode 100644 Icons/map-icons/classic.small/vehicle/fuel_station/shell.png create mode 100644 Icons/map-icons/classic.small/vehicle/fuel_station/texaco.png create mode 100644 Icons/map-icons/classic.small/vehicle/fuel_station/total.png create mode 100644 Icons/map-icons/classic.small/vehicle/gate.png create mode 100644 Icons/map-icons/classic.small/vehicle/motorbike.png create mode 100644 Icons/map-icons/classic.small/vehicle/parking.png create mode 100644 Icons/map-icons/classic.small/vehicle/parking/bike.png create mode 100644 Icons/map-icons/classic.small/vehicle/parking/car.png create mode 100644 Icons/map-icons/classic.small/vehicle/parking/garage.png create mode 100644 Icons/map-icons/classic.small/vehicle/parking/handicapped.png create mode 100644 Icons/map-icons/classic.small/vehicle/parking/hiking.png create mode 100644 Icons/map-icons/classic.small/vehicle/parking/motorbike.png create mode 100644 Icons/map-icons/classic.small/vehicle/parking/park_ride.png create mode 100644 Icons/map-icons/classic.small/vehicle/parking/restarea-toilets.png create mode 100644 Icons/map-icons/classic.small/vehicle/parking/restarea.png create mode 100644 Icons/map-icons/classic.small/vehicle/parking/underground.png create mode 100644 Icons/map-icons/classic.small/vehicle/repair_shop.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/access.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/bicycle-designated.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/bicycle.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/bollard-bw.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/bollard.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/citylimit.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/dead_end.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/foot-designated.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/foot.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/goods.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/horse-designated.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/horse.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/incline.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/maxheight.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/maxlength.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/maxweight.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/maxwidth.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/minspeed.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/motorbike.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/motorcar.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/parking.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/play_street.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/psv.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/right_of_way.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/road_works.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/roundabout_left.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/roundabout_right.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/speed.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/speed/30-end.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/speed_trap.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/stop.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/traffic-light.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/traffic_jam.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/ireland/no_left_turn.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/ireland/no_right_turn.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/ireland/no_straight_on.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/ireland/no_u_turn.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/no_left_turn.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/no_right_turn.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/no_straight_on.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/no_u_turn.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/only_left_turn.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/only_right_turn.png create mode 100644 Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/only_straight_on.png create mode 100644 Icons/map-icons/classic.small/vehicle/services.png create mode 100644 Icons/map-icons/classic.small/vehicle/stile.png create mode 100644 Icons/map-icons/classic.small/vehicle/tank.png create mode 100644 Icons/map-icons/classic.small/vehicle/toll_station.png create mode 100644 Icons/map-icons/classic.small/vehicle/towing.png create mode 100644 Icons/map-icons/classic.small/vehicle/tunnel.png create mode 100644 Icons/map-icons/classic.small/vehicle/turning_circle.png create mode 100644 Icons/map-icons/classic.small/vehicle/viaduct.png create mode 100644 Icons/map-icons/classic.small/vehicle/zebra_crossing.png create mode 100644 Icons/map-icons/classic.small/waypoint.png create mode 100644 Icons/map-icons/classic.small/waypoint/wpt1.png create mode 100644 Icons/map-icons/classic.small/waypoint/wpt2.png create mode 100644 Icons/map-icons/classic.small/waypoint/wpt3.png create mode 100644 Icons/map-icons/classic.small/waypoint/wpt4.png create mode 100644 Icons/map-icons/classic.small/waypoint/wpt5.png create mode 100644 Icons/map-icons/classic.small/waypoint/wpt6.png create mode 100644 Icons/map-icons/classic.small/waypoint/wpt7.png create mode 100644 Icons/map-icons/classic.small/waypoint/wpt8.png create mode 100644 Icons/map-icons/classic.small/waypoint/wpt9.png create mode 100644 Icons/map-icons/classic.small/waypoint/wptblue.png create mode 100644 Icons/map-icons/classic.small/waypoint/wptgreen.png create mode 100644 Icons/map-icons/classic.small/waypoint/wptorange.png create mode 100644 Icons/map-icons/classic.small/waypoint/wptred.png create mode 100644 Icons/map-icons/classic.small/waypoint/wpttemp.png create mode 100644 Icons/map-icons/classic.small/waypoint/wpttemp/wpttemp-green.png create mode 100644 Icons/map-icons/classic.small/waypoint/wpttemp/wpttemp-red.png create mode 100644 Icons/map-icons/classic.small/waypoint/wpttemp/wpttemp-yellow.png create mode 100644 Icons/map-icons/classic.small/waypoint/wptyellow.png create mode 100644 Icons/map-icons/classic.small/wlan.png create mode 100644 Icons/map-icons/classic.small/wlan/closed.png create mode 100644 Icons/map-icons/classic.small/wlan/open.png create mode 100644 Icons/map-icons/classic.small/wlan/pay.png create mode 100644 Icons/map-icons/classic.small/wlan/pay/fon.png create mode 100644 Icons/map-icons/classic.small/wlan/wep.png create mode 100644 Icons/map-icons/square.small/accommodation.png create mode 100644 Icons/map-icons/square.small/accommodation/camping.png create mode 100644 Icons/map-icons/square.small/accommodation/camping/caravan.png create mode 100644 Icons/map-icons/square.small/accommodation/camping/dump-station.png create mode 100644 Icons/map-icons/square.small/accommodation/camping/gas-refill.png create mode 100644 Icons/map-icons/square.small/accommodation/camping/hookup.png create mode 100644 Icons/map-icons/square.small/accommodation/camping/trash.png create mode 100644 Icons/map-icons/square.small/accommodation/camping/wastewater.png create mode 100644 Icons/map-icons/square.small/accommodation/camping/water.png create mode 100644 Icons/map-icons/square.small/accommodation/chalet.png create mode 100644 Icons/map-icons/square.small/accommodation/empty.png create mode 100644 Icons/map-icons/square.small/accommodation/guest_house.png create mode 100644 Icons/map-icons/square.small/accommodation/hostel.png create mode 100644 Icons/map-icons/square.small/accommodation/hotel.png create mode 100644 Icons/map-icons/square.small/accommodation/hotel/five_star.png create mode 100644 Icons/map-icons/square.small/accommodation/hotel/four_star.png create mode 100644 Icons/map-icons/square.small/accommodation/hotel/one_star.png create mode 100644 Icons/map-icons/square.small/accommodation/hotel/three_star.png create mode 100644 Icons/map-icons/square.small/accommodation/hotel/two_star.png create mode 100644 Icons/map-icons/square.small/accommodation/motel.png create mode 100644 Icons/map-icons/square.small/accommodation/shelter-bw.png create mode 100644 Icons/map-icons/square.small/accommodation/shelter.png create mode 100644 Icons/map-icons/square.small/accommodation/youth-hostel.png create mode 100644 Icons/map-icons/square.small/education.png create mode 100644 Icons/map-icons/square.small/education/empty.png create mode 100644 Icons/map-icons/square.small/education/kindergarten.png create mode 100644 Icons/map-icons/square.small/education/university.png create mode 100644 Icons/map-icons/square.small/food.png create mode 100644 Icons/map-icons/square.small/food/bacon_and_eggs.png create mode 100644 Icons/map-icons/square.small/food/bar.png create mode 100644 Icons/map-icons/square.small/food/biergarten.png create mode 100644 Icons/map-icons/square.small/food/cafe.png create mode 100644 Icons/map-icons/square.small/food/empty.png create mode 100644 Icons/map-icons/square.small/food/fastfood.png create mode 100644 Icons/map-icons/square.small/food/fastfood/burger-king.png create mode 100644 Icons/map-icons/square.small/food/fastfood/kfc.png create mode 100644 Icons/map-icons/square.small/food/fastfood/mc-donalds.png create mode 100644 Icons/map-icons/square.small/food/fastfood/subway.png create mode 100644 Icons/map-icons/square.small/food/icecream.png create mode 100644 Icons/map-icons/square.small/food/pizzahut.png create mode 100644 Icons/map-icons/square.small/food/pub.png create mode 100644 Icons/map-icons/square.small/food/restaurant.png create mode 100644 Icons/map-icons/square.small/food/snacks.png create mode 100644 Icons/map-icons/square.small/geocache.png create mode 100644 Icons/map-icons/square.small/geocache/empty.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_drivein.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_earth.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_event.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_found.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_math.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_multi.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_multi/multi_stage01.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_multi/multi_stage02.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_multi/multi_stage03.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_multi/multi_stage04.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_multi/multi_stage05.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_multi/multi_stage06.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_multi/multi_stage07.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_multi/multi_stage08.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_multi/multi_stage09.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_multi/multi_stage10.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_mystery.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_night.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_traditional.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_virtual.png create mode 100644 Icons/map-icons/square.small/geocache/geocache_webcam.png create mode 100644 Icons/map-icons/square.small/health.png create mode 100644 Icons/map-icons/square.small/health/doctor.png create mode 100644 Icons/map-icons/square.small/health/emergency.png create mode 100644 Icons/map-icons/square.small/health/empty.png create mode 100644 Icons/map-icons/square.small/health/hospital.png create mode 100644 Icons/map-icons/square.small/health/pharmacy.png create mode 100644 Icons/map-icons/square.small/health/veterinary.png create mode 100644 Icons/map-icons/square.small/incomming.png create mode 100644 Icons/map-icons/square.small/incomming/empty.png create mode 100644 Icons/map-icons/square.small/misc.png create mode 100644 Icons/map-icons/square.small/misc/bunny.png create mode 100644 Icons/map-icons/square.small/misc/butterfly.png create mode 100644 Icons/map-icons/square.small/misc/construction.png create mode 100644 Icons/map-icons/square.small/misc/danger.png create mode 100644 Icons/map-icons/square.small/misc/deprecated.png create mode 100644 Icons/map-icons/square.small/misc/door.png create mode 100644 Icons/map-icons/square.small/misc/empty.png create mode 100644 Icons/map-icons/square.small/misc/information.png create mode 100644 Icons/map-icons/square.small/misc/landmark.png create mode 100644 Icons/map-icons/square.small/misc/landmark/barn.png create mode 100644 Icons/map-icons/square.small/misc/landmark/bunker.png create mode 100644 Icons/map-icons/square.small/misc/landmark/chimney.png create mode 100644 Icons/map-icons/square.small/misc/landmark/crane.png create mode 100644 Icons/map-icons/square.small/misc/landmark/empty.png create mode 100644 Icons/map-icons/square.small/misc/landmark/farm.png create mode 100644 Icons/map-icons/square.small/misc/landmark/gasometer.png create mode 100644 Icons/map-icons/square.small/misc/landmark/lighthouse.png create mode 100644 Icons/map-icons/square.small/misc/landmark/mine.png create mode 100644 Icons/map-icons/square.small/misc/landmark/mountain_pass.png create mode 100644 Icons/map-icons/square.small/misc/landmark/peak.png create mode 100644 Icons/map-icons/square.small/misc/landmark/peak_small.png create mode 100644 Icons/map-icons/square.small/misc/landmark/pier.png create mode 100644 Icons/map-icons/square.small/misc/landmark/plant.png create mode 100644 Icons/map-icons/square.small/misc/landmark/power.png create mode 100644 Icons/map-icons/square.small/misc/landmark/power/fossil.png create mode 100644 Icons/map-icons/square.small/misc/landmark/power/hydro.png create mode 100644 Icons/map-icons/square.small/misc/landmark/power/nuclear.png create mode 100644 Icons/map-icons/square.small/misc/landmark/power/tower.png create mode 100644 Icons/map-icons/square.small/misc/landmark/power/wind.png create mode 100644 Icons/map-icons/square.small/misc/landmark/range.png create mode 100644 Icons/map-icons/square.small/misc/landmark/reservoir_covered.png create mode 100644 Icons/map-icons/square.small/misc/landmark/spring.png create mode 100644 Icons/map-icons/square.small/misc/landmark/survey_point.png create mode 100644 Icons/map-icons/square.small/misc/landmark/tower.png create mode 100644 Icons/map-icons/square.small/misc/landmark/trees.png create mode 100644 Icons/map-icons/square.small/misc/landmark/wastewater_plant.png create mode 100644 Icons/map-icons/square.small/misc/landmark/water_tower.png create mode 100644 Icons/map-icons/square.small/misc/landmark/windmill.png create mode 100644 Icons/map-icons/square.small/misc/landmark/works.png create mode 100644 Icons/map-icons/square.small/misc/lock_closed.png create mode 100644 Icons/map-icons/square.small/misc/lock_open.png create mode 100644 Icons/map-icons/square.small/misc/no_icon.png create mode 100644 Icons/map-icons/square.small/misc/no_smoking.png create mode 100644 Icons/map-icons/square.small/misc/proposed.png create mode 100644 Icons/map-icons/square.small/misc/tap_drinking.png create mode 100644 Icons/map-icons/square.small/money.png create mode 100644 Icons/map-icons/square.small/money/atm.png create mode 100644 Icons/map-icons/square.small/money/bank.png create mode 100644 Icons/map-icons/square.small/money/empty.png create mode 100644 Icons/map-icons/square.small/money/exchange.png create mode 100644 Icons/map-icons/square.small/nautical.png create mode 100644 Icons/map-icons/square.small/nautical/alpha_flag.png create mode 100644 Icons/map-icons/square.small/nautical/aqueduct.png create mode 100644 Icons/map-icons/square.small/nautical/empty.png create mode 100644 Icons/map-icons/square.small/nautical/lock_gate.png create mode 100644 Icons/map-icons/square.small/nautical/turning.png create mode 100644 Icons/map-icons/square.small/nautical/weir.png create mode 100644 Icons/map-icons/square.small/people.png create mode 100644 Icons/map-icons/square.small/people/developer/gpsdrive.png create mode 100644 Icons/map-icons/square.small/people/developer/openstreetmap.png create mode 100644 Icons/map-icons/square.small/people/empty.png create mode 100644 Icons/map-icons/square.small/people/friends.png create mode 100644 Icons/map-icons/square.small/people/friendsd.png create mode 100644 Icons/map-icons/square.small/people/friendsd/airplane.png create mode 100644 Icons/map-icons/square.small/people/friendsd/bike.png create mode 100644 Icons/map-icons/square.small/people/friendsd/boat.png create mode 100644 Icons/map-icons/square.small/people/friendsd/car.png create mode 100644 Icons/map-icons/square.small/people/friendsd/walk.png create mode 100644 Icons/map-icons/square.small/people/home.png create mode 100644 Icons/map-icons/square.small/people/work.png create mode 100644 Icons/map-icons/square.small/places.png create mode 100644 Icons/map-icons/square.small/places/empty.png create mode 100644 Icons/map-icons/square.small/places/settlement.png create mode 100644 Icons/map-icons/square.small/places/settlement/capital.png create mode 100644 Icons/map-icons/square.small/places/settlement/city.png create mode 100644 Icons/map-icons/square.small/places/settlement/hamlet.png create mode 100644 Icons/map-icons/square.small/places/settlement/town.png create mode 100644 Icons/map-icons/square.small/places/settlement/village.png create mode 100644 Icons/map-icons/square.small/public.png create mode 100644 Icons/map-icons/square.small/public/administration/court_of_law.png create mode 100644 Icons/map-icons/square.small/public/administration/prison.png create mode 100644 Icons/map-icons/square.small/public/arts_centre.png create mode 100644 Icons/map-icons/square.small/public/empty.png create mode 100644 Icons/map-icons/square.small/public/firebrigade.png create mode 100644 Icons/map-icons/square.small/public/police.png create mode 100644 Icons/map-icons/square.small/public/post_box.png create mode 100644 Icons/map-icons/square.small/public/post_office.png create mode 100644 Icons/map-icons/square.small/public/recycling.png create mode 100644 Icons/map-icons/square.small/public/recycling/trash-bin.png create mode 100644 Icons/map-icons/square.small/public/recycling_small.png create mode 100644 Icons/map-icons/square.small/public/telephone.png create mode 100644 Icons/map-icons/square.small/public/toilets.png create mode 100644 Icons/map-icons/square.small/recreation.png create mode 100644 Icons/map-icons/square.small/recreation/bicycling.png create mode 100644 Icons/map-icons/square.small/recreation/cinema.png create mode 100644 Icons/map-icons/square.small/recreation/common.png create mode 100644 Icons/map-icons/square.small/recreation/empty.png create mode 100644 Icons/map-icons/square.small/recreation/garden.png create mode 100644 Icons/map-icons/square.small/recreation/music.png create mode 100644 Icons/map-icons/square.small/recreation/nature_reserve.png create mode 100644 Icons/map-icons/square.small/recreation/nightclub.png create mode 100644 Icons/map-icons/square.small/recreation/park.png create mode 100644 Icons/map-icons/square.small/recreation/picnic.png create mode 100644 Icons/map-icons/square.small/recreation/playground.png create mode 100644 Icons/map-icons/square.small/recreation/shelter.png create mode 100644 Icons/map-icons/square.small/recreation/theater.png create mode 100644 Icons/map-icons/square.small/recreation/theme_park.png create mode 100644 Icons/map-icons/square.small/recreation/water_park.png create mode 100644 Icons/map-icons/square.small/recreation/zoo.png create mode 100644 Icons/map-icons/square.small/religion.png create mode 100644 Icons/map-icons/square.small/religion/cemetery.png create mode 100644 Icons/map-icons/square.small/religion/chapel.png create mode 100644 Icons/map-icons/square.small/religion/church.png create mode 100644 Icons/map-icons/square.small/religion/church/bahai.png create mode 100644 Icons/map-icons/square.small/religion/church/buddhism.png create mode 100644 Icons/map-icons/square.small/religion/church/catholic.png create mode 100644 Icons/map-icons/square.small/religion/church/hinduism.png create mode 100644 Icons/map-icons/square.small/religion/church/jainism.png create mode 100644 Icons/map-icons/square.small/religion/church/mormon.png create mode 100644 Icons/map-icons/square.small/religion/church/mosque.png create mode 100644 Icons/map-icons/square.small/religion/church/orthodox.png create mode 100644 Icons/map-icons/square.small/religion/church/protestant.png create mode 100644 Icons/map-icons/square.small/religion/church/shinto.png create mode 100644 Icons/map-icons/square.small/religion/church/sikhism.png create mode 100644 Icons/map-icons/square.small/religion/church/synagogue.png create mode 100644 Icons/map-icons/square.small/religion/church/taoism.png create mode 100644 Icons/map-icons/square.small/religion/empty.png create mode 100644 Icons/map-icons/square.small/rendering.png create mode 100644 Icons/map-icons/square.small/shopping.png create mode 100644 Icons/map-icons/square.small/shopping/beverages.png create mode 100644 Icons/map-icons/square.small/shopping/computers.png create mode 100644 Icons/map-icons/square.small/shopping/confectioner.png create mode 100644 Icons/map-icons/square.small/shopping/diy_store.png create mode 100644 Icons/map-icons/square.small/shopping/diy_store/hagebau.png create mode 100644 Icons/map-icons/square.small/shopping/diy_store/hornbach.png create mode 100644 Icons/map-icons/square.small/shopping/diy_store/obi.png create mode 100644 Icons/map-icons/square.small/shopping/diy_store/praktiker.png create mode 100644 Icons/map-icons/square.small/shopping/empty.png create mode 100644 Icons/map-icons/square.small/shopping/florist.png create mode 100644 Icons/map-icons/square.small/shopping/furniture.png create mode 100644 Icons/map-icons/square.small/shopping/groceries/bakery.png create mode 100644 Icons/map-icons/square.small/shopping/groceries/butcher.png create mode 100644 Icons/map-icons/square.small/shopping/groceries/fruits.png create mode 100644 Icons/map-icons/square.small/shopping/kaufhof.png create mode 100644 Icons/map-icons/square.small/shopping/kiosk.png create mode 100644 Icons/map-icons/square.small/shopping/laundry.png create mode 100644 Icons/map-icons/square.small/shopping/sports/outdoor.png create mode 100644 Icons/map-icons/square.small/shopping/supermarket.png create mode 100644 Icons/map-icons/square.small/shopping/supermarket/aldi.png create mode 100644 Icons/map-icons/square.small/shopping/supermarket/aldi_nord.png create mode 100644 Icons/map-icons/square.small/shopping/supermarket/kaufland.png create mode 100644 Icons/map-icons/square.small/shopping/supermarket/lidl.png create mode 100644 Icons/map-icons/square.small/shopping/supermarket/norma.png create mode 100644 Icons/map-icons/square.small/shopping/supermarket/real.png create mode 100644 Icons/map-icons/square.small/shopping/supermarket/rewe.png create mode 100644 Icons/map-icons/square.small/shopping/supermarket/tengelmann.png create mode 100644 Icons/map-icons/square.small/sightseeing.png create mode 100644 Icons/map-icons/square.small/sightseeing/archaeological.png create mode 100644 Icons/map-icons/square.small/sightseeing/battlefield.png create mode 100644 Icons/map-icons/square.small/sightseeing/castle.png create mode 100644 Icons/map-icons/square.small/sightseeing/empty.png create mode 100644 Icons/map-icons/square.small/sightseeing/memorial.png create mode 100644 Icons/map-icons/square.small/sightseeing/monument.png create mode 100644 Icons/map-icons/square.small/sightseeing/museum.png create mode 100644 Icons/map-icons/square.small/sightseeing/ruins.png create mode 100644 Icons/map-icons/square.small/sightseeing/viewpoint.png create mode 100644 Icons/map-icons/square.small/sports.png create mode 100644 Icons/map-icons/square.small/sports/basketball.png create mode 100644 Icons/map-icons/square.small/sports/bicycle.png create mode 100644 Icons/map-icons/square.small/sports/centre.png create mode 100644 Icons/map-icons/square.small/sports/cycling.png create mode 100644 Icons/map-icons/square.small/sports/dart.png create mode 100644 Icons/map-icons/square.small/sports/empty.png create mode 100644 Icons/map-icons/square.small/sports/football.png create mode 100644 Icons/map-icons/square.small/sports/golf.png create mode 100644 Icons/map-icons/square.small/sports/indoor_pool.png create mode 100644 Icons/map-icons/square.small/sports/kiteflying.png create mode 100644 Icons/map-icons/square.small/sports/mountain_bike.png create mode 100644 Icons/map-icons/square.small/sports/pitch.png create mode 100644 Icons/map-icons/square.small/sports/pool.png create mode 100644 Icons/map-icons/square.small/sports/racquetball.png create mode 100644 Icons/map-icons/square.small/sports/riding.png create mode 100644 Icons/map-icons/square.small/sports/skiing.png create mode 100644 Icons/map-icons/square.small/sports/soccer.png create mode 100644 Icons/map-icons/square.small/sports/swimming.png create mode 100644 Icons/map-icons/square.small/sports/table_tennis.png create mode 100644 Icons/map-icons/square.small/sports/tennis.png create mode 100644 Icons/map-icons/square.small/transport.png create mode 100644 Icons/map-icons/square.small/transport/airport.png create mode 100644 Icons/map-icons/square.small/transport/airport/airfield.png create mode 100644 Icons/map-icons/square.small/transport/airport/helipad.png create mode 100644 Icons/map-icons/square.small/transport/airport/terminal.png create mode 100644 Icons/map-icons/square.small/transport/bridge.png create mode 100644 Icons/map-icons/square.small/transport/bridge/bridge-car.png create mode 100644 Icons/map-icons/square.small/transport/bridge/bridge-pedestrian.png create mode 100644 Icons/map-icons/square.small/transport/bridge/drawbridge.png create mode 100644 Icons/map-icons/square.small/transport/bus.png create mode 100644 Icons/map-icons/square.small/transport/car.png create mode 100644 Icons/map-icons/square.small/transport/empty.png create mode 100644 Icons/map-icons/square.small/transport/ferry.png create mode 100644 Icons/map-icons/square.small/transport/ferry/ferry-car.png create mode 100644 Icons/map-icons/square.small/transport/ferry/ferry-pedestrian.png create mode 100644 Icons/map-icons/square.small/transport/handicapped.png create mode 100644 Icons/map-icons/square.small/transport/harbour.png create mode 100644 Icons/map-icons/square.small/transport/park_ride.png create mode 100644 Icons/map-icons/square.small/transport/pedestrian.png create mode 100644 Icons/map-icons/square.small/transport/railway.png create mode 100644 Icons/map-icons/square.small/transport/rapid_train.png create mode 100644 Icons/map-icons/square.small/transport/taxi.png create mode 100644 Icons/map-icons/square.small/transport/ticket-machine.png create mode 100644 Icons/map-icons/square.small/transport/tram.png create mode 100644 Icons/map-icons/square.small/transport/turntable.png create mode 100644 Icons/map-icons/square.small/transport/underground.png create mode 100644 Icons/map-icons/square.small/unknown.png create mode 100644 Icons/map-icons/square.small/vehicle.png create mode 100644 Icons/map-icons/square.small/vehicle/bicycle_rental.png create mode 100644 Icons/map-icons/square.small/vehicle/car_rental.png create mode 100644 Icons/map-icons/square.small/vehicle/car_rental/avis.png create mode 100644 Icons/map-icons/square.small/vehicle/car_rental/europcar.png create mode 100644 Icons/map-icons/square.small/vehicle/car_rental/hertz.png create mode 100644 Icons/map-icons/square.small/vehicle/car_rental/sixt.png create mode 100644 Icons/map-icons/square.small/vehicle/car_sharing.png create mode 100644 Icons/map-icons/square.small/vehicle/caution.png create mode 100644 Icons/map-icons/square.small/vehicle/crossing.png create mode 100644 Icons/map-icons/square.small/vehicle/crossing_small.png create mode 100644 Icons/map-icons/square.small/vehicle/emergency_phone.png create mode 100644 Icons/map-icons/square.small/vehicle/empty.png create mode 100644 Icons/map-icons/square.small/vehicle/exit.png create mode 100644 Icons/map-icons/square.small/vehicle/ford.png create mode 100644 Icons/map-icons/square.small/vehicle/fuel_station.png create mode 100644 Icons/map-icons/square.small/vehicle/fuel_station/agip.png create mode 100644 Icons/map-icons/square.small/vehicle/fuel_station/aral.png create mode 100644 Icons/map-icons/square.small/vehicle/fuel_station/elf.png create mode 100644 Icons/map-icons/square.small/vehicle/fuel_station/esso.png create mode 100644 Icons/map-icons/square.small/vehicle/fuel_station/jet.png create mode 100644 Icons/map-icons/square.small/vehicle/fuel_station/omv.png create mode 100644 Icons/map-icons/square.small/vehicle/fuel_station/shell.png create mode 100644 Icons/map-icons/square.small/vehicle/fuel_station/texaco.png create mode 100644 Icons/map-icons/square.small/vehicle/fuel_station/total.png create mode 100644 Icons/map-icons/square.small/vehicle/motorbike.png create mode 100644 Icons/map-icons/square.small/vehicle/parking.png create mode 100644 Icons/map-icons/square.small/vehicle/parking/bike.png create mode 100644 Icons/map-icons/square.small/vehicle/parking/car.png create mode 100644 Icons/map-icons/square.small/vehicle/parking/garage.png create mode 100644 Icons/map-icons/square.small/vehicle/parking/handicapped.png create mode 100644 Icons/map-icons/square.small/vehicle/parking/hiking.png create mode 100644 Icons/map-icons/square.small/vehicle/parking/motorbike.png create mode 100644 Icons/map-icons/square.small/vehicle/parking/park_ride.png create mode 100644 Icons/map-icons/square.small/vehicle/parking/restarea-toilets.png create mode 100644 Icons/map-icons/square.small/vehicle/parking/restarea.png create mode 100644 Icons/map-icons/square.small/vehicle/repair_shop.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/bollard-bw.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/bollard.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/dead_end.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/incline.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/motorbike.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/parking.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/play_street.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/right_of_way.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/road_works.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/roundabout_left.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/roundabout_right.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/stop.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/traffic-light.png create mode 100644 Icons/map-icons/square.small/vehicle/restrictions/traffic_jam.png create mode 100644 Icons/map-icons/square.small/vehicle/services.png create mode 100644 Icons/map-icons/square.small/vehicle/toll_station.png create mode 100644 Icons/map-icons/square.small/vehicle/tunnel.png create mode 100644 Icons/map-icons/square.small/vehicle/turning_circle.png create mode 100644 Icons/map-icons/square.small/vehicle/viaduct.png create mode 100644 Icons/map-icons/square.small/vehicle/zebra_crossing.png create mode 100644 Icons/map-icons/square.small/waypoint.png create mode 100644 Icons/map-icons/square.small/waypoint/empty.png create mode 100644 Icons/map-icons/square.small/waypoint/flag.png create mode 100644 Icons/map-icons/square.small/waypoint/flag/blue.png create mode 100644 Icons/map-icons/square.small/waypoint/flag/green.png create mode 100644 Icons/map-icons/square.small/waypoint/flag/orange.png create mode 100644 Icons/map-icons/square.small/waypoint/flag/red.png create mode 100644 Icons/map-icons/square.small/waypoint/flag/temp.png create mode 100644 Icons/map-icons/square.small/waypoint/flag/yellow.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/destination.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/left.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/left/exit.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/left/fork.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/left/hard.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/left/merge.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/left/soft.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/left/uturn.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/right.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/right/exit.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/right/fork.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/right/hard.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/right/merge.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/right/soft.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/right/uturn.png create mode 100644 Icons/map-icons/square.small/waypoint/routepoint/straight.png create mode 100644 Icons/map-icons/square.small/waypoint/wpt1.png create mode 100644 Icons/map-icons/square.small/waypoint/wpt2.png create mode 100644 Icons/map-icons/square.small/waypoint/wpt3.png create mode 100644 Icons/map-icons/square.small/waypoint/wpt4.png create mode 100644 Icons/map-icons/square.small/waypoint/wpt5.png create mode 100644 Icons/map-icons/square.small/waypoint/wpt6.png create mode 100644 Icons/map-icons/square.small/waypoint/wpt7.png create mode 100644 Icons/map-icons/square.small/waypoint/wpt8.png create mode 100644 Icons/map-icons/square.small/waypoint/wpt9.png create mode 100644 Icons/map-icons/square.small/waypoint/wpttemp/wpttemp-green.png create mode 100644 Icons/map-icons/square.small/waypoint/wpttemp/wpttemp-red.png create mode 100644 Icons/map-icons/square.small/waypoint/wpttemp/wpttemp-yellow.png create mode 100644 Icons/map-icons/square.small/wlan.png create mode 100644 Icons/map-icons/square.small/wlan/closed.png create mode 100644 Icons/map-icons/square.small/wlan/empty.png create mode 100644 Icons/map-icons/square.small/wlan/open.png create mode 100644 Icons/map-icons/square.small/wlan/pay.png create mode 100644 Icons/map-icons/square.small/wlan/pay/fon.png create mode 100644 Icons/map-icons/square.small/wlan/wep.png create mode 100644 Icons/merkaartor-win32.rc create mode 100644 Icons/merkaartor.icns create mode 100644 Icons/move.xpm create mode 100644 Icons/remove.xpm create mode 100644 Icons/reverse.xpm create mode 100644 Icons/rotate.png create mode 100644 Icons/rotate.svg create mode 100644 Icons/small-remove.xpm create mode 100644 Icons/src/actions/GPS.svg create mode 100644 Icons/src/actions/align_nodes.pspimage create mode 100644 Icons/src/actions/break_apart_roads.pspimage create mode 100644 Icons/src/actions/build_bridge.xcf create mode 100644 Icons/src/actions/camera.svg create mode 100644 Icons/src/actions/create_area.pspimage create mode 100644 Icons/src/actions/create_node.pspimage create mode 100644 Icons/src/actions/create_road.pspimage create mode 100644 Icons/src/actions/detach_node.pspimage create mode 100644 Icons/src/actions/join_roads.pspimage create mode 100644 Icons/src/actions/node_4.png create mode 100644 Icons/src/actions/node_5.png create mode 100644 Icons/src/actions/plus_11_oxygen.png create mode 100644 Icons/src/actions/reverse_road.pspimage create mode 100644 Icons/src/actions/shadow.xcf create mode 100644 Icons/src/actions/split_road.pspimage create mode 100644 Icons/src/actions/split_road_a.pspimage create mode 100644 Icons/src/actions/split_road_b.pspimage create mode 100644 Icons/toolselect.xpm create mode 100644 Icons/zoomico.xpm create mode 100644 LICENSE create mode 100644 Merkaartor.pro create mode 100644 README.md create mode 100644 Styles/Bicycle.mas create mode 100644 Styles/Classic.mas create mode 100644 Styles/Lighting.mas create mode 100644 Styles/Mapnik.mas create mode 100644 Styles/MapnikPlus.mas create mode 100644 Styles/Maxspeed.mas create mode 100644 Styles/Merkaartor.mas create mode 100644 Styles/Mobile.mas create mode 100644 Styles/None.mas create mode 100644 Styles/Styles.qrc create mode 100644 Styles/Validation.mas create mode 100644 Styles/Wireframe.mas create mode 100644 Templates/Brussels.mat create mode 100644 Templates/TagTemplate.xsd create mode 100644 Templates/Templates.qrc create mode 100644 Templates/default.mat create mode 100644 Templates/mine.mat create mode 100644 cmake/CMakeDMGBackground.tif create mode 100644 cmake/CMakeDMGSetup.scpt create mode 100644 cmake/DS_Store.bin create mode 100644 cmake/ModulesOverride/NSIS.template.in create mode 100644 cmake/deploy-osx.cmake.in create mode 100644 cmake/deploy-windows.cmake.in create mode 100755 cmake/upload-artifacts.sh.in create mode 100644 cmake/vcs-snapshot.cmake create mode 100644 cmake/vcs.cmake create mode 100644 include/RTree.h create mode 100644 interfaces/IBackend.h create mode 100644 interfaces/IDocument.h create mode 100644 interfaces/IFeature.h create mode 100644 interfaces/IImageManager.cpp create mode 100644 interfaces/IImageManager.h create mode 100644 interfaces/ILayer.h create mode 100644 interfaces/IMapAdapter.h create mode 100644 interfaces/IMapAdapterFactory.h create mode 100644 interfaces/IMapWatermark.h create mode 100644 interfaces/IMerkMainWindow.h create mode 100644 interfaces/IProgressWindow.h create mode 100644 interfaces/IProjection.h create mode 100644 interfaces/IRenderer.h create mode 100644 interfaces/Interfaces.pri create mode 100644 plugins/background/MCadastreFranceBackground/CadastreFrance.cpp create mode 100644 plugins/background/MCadastreFranceBackground/CadastreFrance.h create mode 100644 plugins/background/MCadastreFranceBackground/MCadastreFranceBackground.pro create mode 100644 plugins/background/MCadastreFranceBackground/qadastre.pri create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/COPYING.txt create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.cpp create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.h create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.h create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/city.cpp create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/city.h create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/main.cpp create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/qadastre.pro create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/searchdialog.h create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/tile.cpp create mode 100644 plugins/background/MCadastreFranceBackground/qadastre/tile.h create mode 100644 plugins/background/MGdalBackground/GdalAdapter.cpp create mode 100644 plugins/background/MGdalBackground/GdalAdapter.h create mode 100644 plugins/background/MGdalBackground/GdalAdapter.json create mode 100644 plugins/background/MGdalBackground/MGdalBackground.pro create mode 100644 plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp create mode 100644 plugins/background/MGeoTiffBackground/GeoTiffAdapter.h create mode 100644 plugins/background/MGeoTiffBackground/GeoTiffAdapter.json create mode 100644 plugins/background/MGeoTiffBackground/MGeoTiffBackground.pro create mode 100644 plugins/background/MMsBingMapBackground/MMsBingMapBackground.pro create mode 100644 plugins/background/MMsBingMapBackground/Resources.qrc create mode 100644 plugins/background/MMsBingMapBackground/images/logo_powered_by.png create mode 100644 plugins/background/MMsBingMapBackground/mapadapter.cpp create mode 100644 plugins/background/MMsBingMapBackground/mapadapter.h create mode 100644 plugins/background/MMsBingMapBackground/msbingmapadapter.cpp create mode 100644 plugins/background/MMsBingMapBackground/msbingmapadapter.h create mode 100644 plugins/background/MMsBingMapBackground/msbingmapadapter.json create mode 100644 plugins/background/MWalkingPapersBackground/MWalkingPapersBackground.pro create mode 100644 plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp create mode 100644 plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.h create mode 100644 plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.json create mode 100644 plugins/background/background.pro create mode 100644 plugins/background/common.pri create mode 100644 plugins/common.pri create mode 100644 plugins/plugins.cmake create mode 100644 plugins/plugins.pro create mode 100644 share/BookmarksList.xml create mode 100644 share/Projections.xml create mode 100644 share/TmsServersList.xml create mode 100644 share/WmsServersList.xml create mode 100644 share/share.qrc create mode 100644 src/Backend/Backend.pri create mode 100644 src/Backend/MemoryBackend.cpp create mode 100644 src/Backend/MemoryBackend.h create mode 100644 src/Commands/Command.cpp create mode 100644 src/Commands/Command.h create mode 100644 src/Commands/Commands.pri create mode 100644 src/Commands/DocumentCommands.cpp create mode 100644 src/Commands/DocumentCommands.h create mode 100644 src/Commands/FeatureCommands.cpp create mode 100644 src/Commands/FeatureCommands.h create mode 100644 src/Commands/NodeCommands.cpp create mode 100644 src/Commands/NodeCommands.h create mode 100644 src/Commands/RelationCommands.cpp create mode 100644 src/Commands/RelationCommands.h create mode 100644 src/Commands/TrackSegmentCommands.cpp create mode 100644 src/Commands/TrackSegmentCommands.h create mode 100644 src/Commands/WayCommands.cpp create mode 100644 src/Commands/WayCommands.h create mode 100644 src/Config.pri create mode 100644 src/Custom.pri create mode 100644 src/Docks/DirtyDock.cpp create mode 100644 src/Docks/DirtyDock.h create mode 100644 src/Docks/DirtyDock.ui create mode 100644 src/Docks/Docks.pri create mode 100644 src/Docks/FeaturesDock.cpp create mode 100644 src/Docks/FeaturesDock.h create mode 100644 src/Docks/FeaturesDock.ui create mode 100644 src/Docks/GeoImage.pri create mode 100644 src/Docks/GeoImageDock.cpp create mode 100644 src/Docks/GeoImageDock.h create mode 100644 src/Docks/InfoDock.cpp create mode 100644 src/Docks/InfoDock.h create mode 100644 src/Docks/LayerDock.cpp create mode 100644 src/Docks/LayerDock.h create mode 100644 src/Docks/MDockAncestor.cpp create mode 100644 src/Docks/MDockAncestor.h create mode 100644 src/Docks/MinimumRelationProperties.ui create mode 100644 src/Docks/MinimumRoadProperties.ui create mode 100644 src/Docks/MinimumTrackPointProperties.ui create mode 100644 src/Docks/PhotoLoadErrorDialog.ui create mode 100644 src/Docks/PropertiesDock.cpp create mode 100644 src/Docks/PropertiesDock.h create mode 100644 src/Docks/StyleDock.cpp create mode 100644 src/Docks/StyleDock.h create mode 100644 src/Docks/StyleDock.ui create mode 100644 src/Features/Feature.cpp create mode 100644 src/Features/Feature.h create mode 100644 src/Features/Features.h create mode 100644 src/Features/Features.pri create mode 100644 src/Features/Node.cpp create mode 100644 src/Features/Node.h create mode 100644 src/Features/Relation.cpp create mode 100644 src/Features/Relation.h create mode 100644 src/Features/TrackSegment.cpp create mode 100644 src/Features/TrackSegment.h create mode 100644 src/Features/Way.cpp create mode 100644 src/Features/Way.h create mode 100644 src/GPS/GPS.pri create mode 100644 src/GPS/GpsFix.cpp create mode 100644 src/GPS/GpsFix.h create mode 100644 src/GPS/SatelliteStrengthView.cpp create mode 100644 src/GPS/SatelliteStrengthView.h create mode 100644 src/GPS/qgps.cpp create mode 100644 src/GPS/qgps.h create mode 100644 src/GPS/qgpsdevice.cpp create mode 100644 src/GPS/qgpsdevice.h create mode 100644 src/GPS/qgpsmainwindowui.ui create mode 100644 src/GPS/qgpssatellitetracker.cpp create mode 100644 src/GPS/qgpssatellitetracker.h create mode 100644 src/ImportExport/ExportDialog.ui create mode 100644 src/ImportExport/ExportGPX.cpp create mode 100644 src/ImportExport/ExportGPX.h create mode 100644 src/ImportExport/ExportOSM.cpp create mode 100644 src/ImportExport/ExportOSM.h create mode 100644 src/ImportExport/IImportExport.cpp create mode 100644 src/ImportExport/IImportExport.h create mode 100644 src/ImportExport/ImportCSVDialog.cpp create mode 100644 src/ImportExport/ImportCSVDialog.h create mode 100644 src/ImportExport/ImportCSVDialog.ui create mode 100644 src/ImportExport/ImportExport.pri create mode 100644 src/ImportExport/ImportExportCSV.cpp create mode 100644 src/ImportExport/ImportExportCSV.h create mode 100644 src/ImportExport/ImportExportGdal.cpp create mode 100644 src/ImportExport/ImportExportGdal.h create mode 100644 src/ImportExport/ImportExportKML.cpp create mode 100644 src/ImportExport/ImportExportKML.h create mode 100644 src/ImportExport/ImportExportOSC.cpp create mode 100644 src/ImportExport/ImportExportOSC.h create mode 100644 src/ImportExport/ImportExportPBF.cpp create mode 100644 src/ImportExport/ImportExportPBF.h create mode 100644 src/ImportExport/ImportGPX.cpp create mode 100644 src/ImportExport/ImportGPX.h create mode 100644 src/ImportExport/ImportNGT.cpp create mode 100644 src/ImportExport/ImportNGT.h create mode 100644 src/ImportExport/ImportNMEA.cpp create mode 100644 src/ImportExport/ImportNMEA.h create mode 100644 src/ImportExport/ImportOSM.cpp create mode 100644 src/ImportExport/ImportOSM.h create mode 100644 src/ImportExport/fileformat.pb.cc create mode 100644 src/ImportExport/fileformat.pb.h create mode 100644 src/ImportExport/fileformat.proto create mode 100644 src/ImportExport/osmformat.pb.cc create mode 100644 src/ImportExport/osmformat.pb.h create mode 100644 src/ImportExport/osmformat.proto create mode 100644 src/Interactions/BuildBridgeInteraction.cpp create mode 100644 src/Interactions/BuildBridgeInteraction.h create mode 100644 src/Interactions/CreateAreaInteraction.cpp create mode 100644 src/Interactions/CreateAreaInteraction.h create mode 100644 src/Interactions/CreateDoubleWayDock.ui create mode 100644 src/Interactions/CreateDoubleWayInteraction.cpp create mode 100644 src/Interactions/CreateDoubleWayInteraction.h create mode 100644 src/Interactions/CreateNodeInteraction.cpp create mode 100644 src/Interactions/CreateNodeInteraction.h create mode 100644 src/Interactions/CreatePolygonInteraction.cpp create mode 100644 src/Interactions/CreatePolygonInteraction.h create mode 100644 src/Interactions/CreateRoundaboutDock.ui create mode 100644 src/Interactions/CreateRoundaboutInteraction.cpp create mode 100644 src/Interactions/CreateRoundaboutInteraction.h create mode 100644 src/Interactions/CreateSingleWayInteraction.cpp create mode 100644 src/Interactions/CreateSingleWayInteraction.h create mode 100644 src/Interactions/EditInteraction.cpp create mode 100644 src/Interactions/EditInteraction.h create mode 100644 src/Interactions/ExtrudeInteraction.cpp create mode 100644 src/Interactions/ExtrudeInteraction.h create mode 100644 src/Interactions/Interaction.cpp create mode 100644 src/Interactions/Interaction.h create mode 100644 src/Interactions/Interactions.pri create mode 100644 src/Interactions/MoveNodeInteraction.cpp create mode 100644 src/Interactions/MoveNodeInteraction.h create mode 100644 src/Interactions/RotateInteraction.cpp create mode 100644 src/Interactions/RotateInteraction.h create mode 100644 src/Interactions/ScaleInteraction.cpp create mode 100644 src/Interactions/ScaleInteraction.h create mode 100644 src/Interactions/ZoomInteraction.cpp create mode 100644 src/Interactions/ZoomInteraction.h create mode 100644 src/Layers/FilterEditDialog.ui create mode 100644 src/Layers/ImageMapLayer.cpp create mode 100644 src/Layers/ImageMapLayer.h create mode 100644 src/Layers/Layer.cpp create mode 100644 src/Layers/Layer.h create mode 100644 src/Layers/LayerIterator.h create mode 100644 src/Layers/LayerPrivate.h create mode 100644 src/Layers/LayerWidget.cpp create mode 100644 src/Layers/LayerWidget.h create mode 100644 src/Layers/LayerWidget.ui create mode 100644 src/Layers/Layers.pri create mode 100755 src/Layers/LicenseDisplayDialog.ui create mode 100644 src/Layers/OsmRenderLayer.cpp create mode 100644 src/Layers/OsmRenderLayer.h create mode 100644 src/Main.cpp create mode 100755 src/MainWindow.cpp create mode 100644 src/MainWindow.h create mode 100644 src/MainWindow.ui create mode 100644 src/NameFinder/NameFinder.pri create mode 100644 src/NameFinder/NameFinderResult.h create mode 100644 src/NameFinder/httpquery.cpp create mode 100644 src/NameFinder/httpquery.h create mode 100644 src/NameFinder/namefindertablemodel.cpp create mode 100644 src/NameFinder/namefindertablemodel.h create mode 100644 src/NameFinder/namefinderwidget.cpp create mode 100644 src/NameFinder/namefinderwidget.h create mode 100644 src/NameFinder/namefinderwidget.ui create mode 100644 src/NameFinder/xmlstreamreader.cpp create mode 100644 src/NameFinder/xmlstreamreader.h create mode 100644 src/PaintStyle/FeaturePainter.cpp create mode 100644 src/PaintStyle/FeaturePainter.h create mode 100644 src/PaintStyle/IPaintStyle.h create mode 100644 src/PaintStyle/MapCSSPaintstyle.cpp create mode 100644 src/PaintStyle/MapCSSPaintstyle.h create mode 100644 src/PaintStyle/MasPaintStyle.cpp create mode 100644 src/PaintStyle/MasPaintStyle.h create mode 100644 src/PaintStyle/PaintStyle.pri create mode 100644 src/PaintStyle/PaintStyleEditor.cpp create mode 100644 src/PaintStyle/PaintStyleEditor.h create mode 100644 src/PaintStyle/PaintStyleEditor.pri create mode 100644 src/PaintStyle/PaintStyleEditor.ui create mode 100644 src/PaintStyle/Painter.cpp create mode 100644 src/PaintStyle/Painter.h create mode 100644 src/PaintStyle/PrimitivePainter.cpp create mode 100644 src/PaintStyle/PrimitivePainter.h create mode 100644 src/Preferences/BookmarksList.cpp create mode 100644 src/Preferences/BookmarksList.h create mode 100644 src/Preferences/FilterList.cpp create mode 100644 src/Preferences/FilterList.h create mode 100644 src/Preferences/FilterPreferencesDialog.cpp create mode 100644 src/Preferences/FilterPreferencesDialog.h create mode 100644 src/Preferences/FilterPreferencesDialog.ui create mode 100644 src/Preferences/MerkaartorPreferences.cpp create mode 100644 src/Preferences/MerkaartorPreferences.h create mode 100644 src/Preferences/OsmServerWidget.ui create mode 100644 src/Preferences/Preferences.pri create mode 100644 src/Preferences/PreferencesDialog.cpp create mode 100644 src/Preferences/PreferencesDialog.h create mode 100644 src/Preferences/PreferencesDialog.ui create mode 100644 src/Preferences/ProjPreferencesDialog.cpp create mode 100644 src/Preferences/ProjPreferencesDialog.h create mode 100644 src/Preferences/ProjPreferencesDialog.ui create mode 100644 src/Preferences/ProjectionsList.cpp create mode 100644 src/Preferences/ProjectionsList.h create mode 100644 src/Preferences/TMSPreferencesDialog.cpp create mode 100644 src/Preferences/TMSPreferencesDialog.h create mode 100644 src/Preferences/TMSPreferencesDialog.ui create mode 100644 src/Preferences/TmsServersList.cpp create mode 100644 src/Preferences/TmsServersList.h create mode 100644 src/Preferences/WMSPreferencesDialog.cpp create mode 100644 src/Preferences/WMSPreferencesDialog.h create mode 100644 src/Preferences/WMSPreferencesDialog.ui create mode 100644 src/Preferences/WmsServersList.cpp create mode 100644 src/Preferences/WmsServersList.h create mode 100644 src/QMapControl.pri create mode 100644 src/QMapControl/WmscMapAdapter.cpp create mode 100644 src/QMapControl/WmscMapAdapter.h create mode 100644 src/QMapControl/browserimagemanager.cpp create mode 100644 src/QMapControl/browserimagemanager.h create mode 100644 src/QMapControl/imagemanager.cpp create mode 100644 src/QMapControl/imagemanager.h create mode 100644 src/QMapControl/imagepoint.cpp create mode 100644 src/QMapControl/imagepoint.h create mode 100644 src/QMapControl/mapadapter.cpp create mode 100644 src/QMapControl/mapadapter.h create mode 100644 src/QMapControl/mapcontrol.cpp create mode 100644 src/QMapControl/mapcontrol.h create mode 100644 src/QMapControl/mapnetwork.cpp create mode 100644 src/QMapControl/mapnetwork.h create mode 100644 src/QMapControl/tilemapadapter.cpp create mode 100644 src/QMapControl/tilemapadapter.h create mode 100644 src/QMapControl/wmsmapadapter.cpp create mode 100644 src/QMapControl/wmsmapadapter.h create mode 100644 src/QToolBarDialog/QToolBarDialog.pri create mode 100644 src/QToolBarDialog/qttoolbardialog.cpp create mode 100644 src/QToolBarDialog/qttoolbardialog.h create mode 100644 src/QToolBarDialog/qttoolbardialog.ui create mode 100644 src/Render/MapRenderer.cpp create mode 100644 src/Render/MapRenderer.h create mode 100644 src/Render/NativeRenderDialog.cpp create mode 100644 src/Render/NativeRenderDialog.h create mode 100644 src/Render/NativeRenderDialog.ui create mode 100644 src/Render/RENDERING.md create mode 100644 src/Render/Render.pri create mode 100644 src/Sync/DirtyList.cpp create mode 100644 src/Sync/DirtyList.h create mode 100644 src/Sync/DirtyListExecutorOSC.cpp create mode 100644 src/Sync/DirtyListExecutorOSC.h create mode 100644 src/Sync/DownloadOSM.cpp create mode 100644 src/Sync/DownloadOSM.h create mode 100644 src/Sync/Sync.pri create mode 100644 src/Sync/SyncListDialog.ui create mode 100644 src/TagTemplate/TagTemplate.cpp create mode 100644 src/TagTemplate/TagTemplate.h create mode 100644 src/TagTemplate/TagTemplate.pri create mode 100644 src/Tools/ActionsDialog.cpp create mode 100644 src/Tools/ActionsDialog.h create mode 100644 src/Tools/QFatFs/QFat.cpp create mode 100644 src/Tools/QFatFs/QFat.h create mode 100644 src/Tools/QFatFs/QFatFile.cpp create mode 100644 src/Tools/QFatFs/QFatFile.h create mode 100644 src/Tools/QFatFs/QFatFs.cpp create mode 100644 src/Tools/QFatFs/QFatFs.h create mode 100644 src/Tools/QFatFs/QFatFs.pri create mode 100644 src/Tools/RegionMapWidget.cpp create mode 100644 src/Tools/RegionMapWidget.h create mode 100644 src/Tools/Tools.pri create mode 100644 src/Utils/CheckBoxList.cpp create mode 100644 src/Utils/CheckBoxList.h create mode 100644 src/Utils/EditCompleterDelegate.cpp create mode 100644 src/Utils/EditCompleterDelegate.h create mode 100644 src/Utils/LineF.h create mode 100644 src/Utils/MDiscardableDialog.cpp create mode 100644 src/Utils/MDiscardableDialog.h create mode 100644 src/Utils/OsmLink.cpp create mode 100644 src/Utils/OsmLink.h create mode 100644 src/Utils/PictureViewerDialog.cpp create mode 100644 src/Utils/PictureViewerDialog.h create mode 100644 src/Utils/PictureViewerDialog.ui create mode 100644 src/Utils/PixmapWidget.cpp create mode 100644 src/Utils/PixmapWidget.h create mode 100644 src/Utils/ProjectionChooser.cpp create mode 100644 src/Utils/ProjectionChooser.h create mode 100644 src/Utils/ProjectionChooser.ui create mode 100644 src/Utils/RemoteControlServer.cpp create mode 100644 src/Utils/RemoteControlServer.hpp create mode 100644 src/Utils/SelectionDialog.cpp create mode 100644 src/Utils/SelectionDialog.h create mode 100644 src/Utils/SelectionDialog.ui create mode 100644 src/Utils/ShortcutOverrideFilter.cpp create mode 100644 src/Utils/ShortcutOverrideFilter.h create mode 100644 src/Utils/SlippyMapWidget.cpp create mode 100644 src/Utils/SlippyMapWidget.h create mode 100644 src/Utils/SvgCache.cpp create mode 100644 src/Utils/SvgCache.h create mode 100644 src/Utils/TagSelector.cpp create mode 100644 src/Utils/TagSelector.h create mode 100644 src/Utils/TagSelectorWidget.cpp create mode 100644 src/Utils/TagSelectorWidget.h create mode 100644 src/Utils/TagSelectorWidget.ui create mode 100644 src/Utils/Utils.cpp create mode 100644 src/Utils/Utils.h create mode 100644 src/Utils/Utils.pri create mode 100644 src/Utils/Utils.qrc create mode 100644 src/common/AboutDialog.ui create mode 100644 src/common/Coord.cpp create mode 100644 src/common/Coord.h create mode 100644 src/common/Document.cpp create mode 100644 src/common/Document.h create mode 100644 src/common/DownloadMapDialog.ui create mode 100644 src/common/FeatureManipulations.cpp create mode 100644 src/common/FeatureManipulations.h create mode 100644 src/common/Global.cpp create mode 100644 src/common/Global.h create mode 100644 src/common/GotoDialog.cpp create mode 100644 src/common/GotoDialog.h create mode 100644 src/common/GotoDialog.ui create mode 100644 src/common/MapTypedef.h create mode 100644 src/common/MapView.cpp create mode 100644 src/common/MapView.h create mode 100644 src/common/MultiProperties.ui create mode 100644 src/common/Painting.cpp create mode 100644 src/common/Painting.h create mode 100644 src/common/Projection.cpp create mode 100644 src/common/Projection.h create mode 100644 src/common/PropertiesDialog.ui create mode 100644 src/common/RelationProperties.ui create mode 100644 src/common/TagModel.cpp create mode 100644 src/common/TagModel.h create mode 100644 src/common/TerraceDialog.cpp create mode 100644 src/common/TerraceDialog.h create mode 100644 src/common/TerraceDialog.ui create mode 100644 src/common/UploadMapDialog.ui create mode 100644 src/common/common.pri create mode 100644 src/org.merkaartor.merkaartor.appdata.xml create mode 100644 src/org.merkaartor.merkaartor.desktop create mode 100644 src/qextserialport/posix_qextserialport.cpp create mode 100644 src/qextserialport/posix_qextserialport.h create mode 100644 src/qextserialport/qextserialbase.cpp create mode 100644 src/qextserialport/qextserialbase.h create mode 100644 src/qextserialport/qextserialport.cpp create mode 100644 src/qextserialport/qextserialport.h create mode 100644 src/qextserialport/qextserialport.pri create mode 100644 src/qextserialport/win_qextserialport.cpp create mode 100644 src/qextserialport/win_qextserialport.h create mode 100644 src/src.pro create mode 100644 tests/data/sample-shapefile/POINT.dbf create mode 100644 tests/data/sample-shapefile/POINT.prj create mode 100644 tests/data/sample-shapefile/POINT.shp create mode 100644 tests/data/sample-shapefile/POINT.shx create mode 100644 tests/data/sample-shapefile/POLYGON.dbf create mode 100644 tests/data/sample-shapefile/POLYGON.prj create mode 100644 tests/data/sample-shapefile/POLYGON.shp create mode 100644 tests/data/sample-shapefile/POLYGON.shx create mode 100644 tests/data/sample-shapefile/POLYLINE.dbf create mode 100644 tests/data/sample-shapefile/POLYLINE.prj create mode 100644 tests/data/sample-shapefile/POLYLINE.shp create mode 100644 tests/data/sample-shapefile/POLYLINE.shx create mode 100644 tests/data/sample.geojson create mode 100644 tests/test-projection.cpp create mode 100644 translations/README.md create mode 100644 translations/i18n.pl create mode 100644 translations/makefile create mode 100644 translations/maketar.pl create mode 100644 translations/merkaartor_cs.ts create mode 100644 translations/merkaartor_de.ts create mode 100644 translations/merkaartor_en.ts create mode 100644 translations/merkaartor_es.ts create mode 100644 translations/merkaartor_fi.ts create mode 100644 translations/merkaartor_fr.ts create mode 100644 translations/merkaartor_hr.ts create mode 100644 translations/merkaartor_hu.ts create mode 100644 translations/merkaartor_id_ID.ts create mode 100644 translations/merkaartor_it.ts create mode 100644 translations/merkaartor_ja.ts create mode 100644 translations/merkaartor_nl.ts create mode 100644 translations/merkaartor_pl.ts create mode 100644 translations/merkaartor_pt_BR.ts create mode 100644 translations/merkaartor_ru.ts create mode 100644 translations/merkaartor_sv.ts create mode 100644 translations/merkaartor_uk.ts create mode 100644 translations/merkaartor_zh_TW.ts diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/INSTALL.TXT b/3rdparty/qtsingleapplication-2.6_1-opensource/INSTALL.TXT new file mode 100644 index 0000000..bbb74a9 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/INSTALL.TXT @@ -0,0 +1,254 @@ +INSTALLATION INSTRUCTIONS + +These instructions refer to the package you are installing as +some-package.tar.gz or some-package.zip. The .zip file is intended for use +on Windows. + +The directory you choose for the installation will be referred to as +your-install-dir. + +Note to Qt Visual Studio Integration users: In the instructions below, +instead of building from command line with nmake, you can use the menu +command 'Qt->Open Solution from .pro file' on the .pro files in the +example and plugin directories, and then build from within Visual +Studio. + +Unpacking and installation +-------------------------- + +1. Unpacking the archive (if you have not done so already). + + On Unix and Mac OS X (in a terminal window): + + cd your-install-dir + gunzip some-package.tar.gz + tar xvf some-package.tar + + This creates the subdirectory some-package containing the files. + + On Windows: + + Unpack the .zip archive by right-clicking it in explorer and + choosing "Extract All...". If your version of Windows does not + have zip support, you can use the infozip tools available + from www.info-zip.org. + + If you are using the infozip tools (in a command prompt window): + cd your-install-dir + unzip some-package.zip + +2. Configuring the package. + + The configure script is called "configure" on unix/mac and + "configure.bat" on Windows. It should be run from a command line + after cd'ing to the package directory. + + You can choose whether you want to use the component by including + its source code directly into your project, or build the component + as a dynamic shared library (DLL) that is loaded into the + application at run-time. The latter may be preferable for + technical or licensing (LGPL) reasons. If you want to build a DLL, + run the configure script with the argument "-library". Also see + the note about usage below. + + (Components that are Qt plugins, e.g. styles and image formats, + are by default built as a plugin DLL.) + + The configure script will prompt you in some cases for further + information. Answer these questions and carefully read the license text + before accepting the license conditions. The package cannot be used if + you do not accept the license conditions. + +3. Building the component and examples (when required). + + If a DLL is to be built, or if you would like to build the + examples, next give the commands + + qmake + make [or nmake if your are using Microsoft Visual C++] + + The example program(s) can be found in the directory called + "examples" or "example". + + Components that are Qt plugins, e.g. styles and image formats, are + ready to be used as soon as they are built, so the rest of this + installation instruction can be skipped. + +4. Building the Qt Designer plugin (optional). + + Some of the widget components are provided with plugins for Qt + Designer. To build and install the plugin, cd into the + some-package/plugin directory and give the commands + + qmake + make [or nmake if your are using Microsoft Visual C++] + + Restart Qt Designer to make it load the new widget plugin. + + Note: If you are using the built-in Qt Designer from the Qt Visual + Studio Integration, you will need to manually copy the plugin DLL + file, i.e. copy + %QTDIR%\plugins\designer\some-component.dll + to the Qt Visual Studio Integration plugin path, typically: + C:\Program Files\Trolltech\Qt VS Integration\plugins + + Note: If you for some reason are using a Qt Designer that is built + in debug mode, you will need to build the plugin in debug mode + also. Edit the file plugin.pro in the plugin directory, changing + 'release' to 'debug' in the CONFIG line, before running qmake. + + + +Solutions components are intended to be used directly from the package +directory during development, so there is no 'make install' procedure. + + +Using a component in your project +--------------------------------- + +To use this component in your project, add the following line to the +project's .pro file (or do the equivalent in your IDE): + + include(your-install-dir/some-package/src/some-package.pri) + +This adds the package's sources and headers to the SOURCES and HEADERS +project variables respectively (or, if the component has been +configured as a DLL, it adds that library to the LIBS variable), and +updates INCLUDEPATH to contain the package's src +directory. Additionally, the .pri file may include some dependencies +needed by the package. + +To include a header file from the package in your sources, you can now +simply use: + + #include + +or alternatively, in pre-Qt 4 style: + + #include + +Refer to the documentation to see the classes and headers this +components provides. + + + +Install documentation (optional) +-------------------------------- + +The HTML documentation for the package's classes is located in the +your-install-dir/some-package/doc/html/index.html. You can open this +file and read the documentation with any web browser. + +To install the documentation into Qt Assistant (for Qt version 4.4 and +later): + +1. In Assistant, open the Edit->Preferences dialog and choose the + Documentation tab. Click the Add... button and select the file + your-install-dir/some-package/doc/html/some-package.qch + +For Qt versions prior to 4.4, do instead the following: + +1. The directory your-install-dir/some-package/doc/html contains a + file called some-package.dcf. Execute the following commands in a + shell, command prompt or terminal window: + + cd your-install-dir/some-package/doc/html/ + assistant -addContentFile some-package.dcf + +The next time you start Qt Assistant, you can access the package's +documentation. + + +Removing the documentation from assistant +----------------------------------------- + +If you have installed the documentation into Qt Assistant, and want to uninstall it, do as follows, for Qt version 4.4 and later: + +1. In Assistant, open the Edit->Preferences dialog and choose the + Documentation tab. In the list of Registered Documentation, select + the item com.nokia.qtsolutions.some-package_version, and click + the Remove button. + +For Qt versions prior to 4.4, do instead the following: + +1. The directory your-install-dir/some-package/doc/html contains a + file called some-package.dcf. Execute the following commands in a + shell, command prompt or terminal window: + + cd your-install-dir/some-package/doc/html/ + assistant -removeContentFile some-package.dcf + + + +Using the component as a DLL +---------------------------- + +1. Normal components + + The shared library (DLL) is built and placed in the + some-package/lib directory. It is intended to be used directly + from there during development. When appropriate, both debug and + release versions are built, since the run-time linker will in some + cases refuse to load a debug-built DLL into a release-built + application or vice versa. + + The following steps are taken by default to help the dynamic + linker to locate the DLL at run-time (during development): + + Unix: The some-package.pri file will add linker instructions to + add the some-package/lib directory to the rpath of the + executable. (When distributing, or if your system does not support + rpath, you can copy the shared library to another place that is + searched by the dynamic linker, e.g. the "lib" directory of your + Qt installation.) + + Mac: The full path to the library is hardcoded into the library + itself, from where it is copied into the executable at link time, + and ready by the dynamic linker at run-time. (When distributing, + you will want to edit these hardcoded paths in the same way as for + the Qt DLLs. Refer to the document "Deploying an Application on + Mac OS X" in the Qt Reference Documentation.) + + Windows: the .dll file(s) are copied into the "bin" directory of + your Qt installation. The Qt installation will already have set up + that directory to be searched by the dynamic linker. + + +2. Plugins + + For Qt Solutions plugins (e.g. image formats), both debug and + release versions of the plugin are built by default when + appropriate, since in some cases the release Qt library will not + load a debug plugin, and vice versa. The plugins are automatically + copied into the plugins directory of your Qt installation when + built, so no further setup is required. + + Plugins may also be built statically, i.e. as a library that will be + linked into your application executable, and so will not need to + be redistributed as a separate plugin DLL to end users. Static + building is required if Qt itself is built statically. To do it, + just add "static" to the CONFIG variable in the plugin/plugin.pro + file before building. Refer to the "Static Plugins" section in the + chapter "How to Create Qt Plugins" for explanation of how to use a + static plugin in your application. The source code of the example + program(s) will also typically contain the relevant instructions + as comments. + + + +Uninstalling +------------ + + The following command will remove any fils that have been + automatically placed outside the package directory itself during + installation and building + + make distclean [or nmake if your are using Microsoft Visual C++] + + If Qt Assistant documentation or Qt Designer plugins have been + installed, they can be uninstalled manually, ref. above. + + +Enjoy! :) + +- The Qt Solutions Team. diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/LGPL_EXCEPTION.txt b/3rdparty/qtsingleapplication-2.6_1-opensource/LGPL_EXCEPTION.txt new file mode 100644 index 0000000..238ade5 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/LGPL_EXCEPTION.txt @@ -0,0 +1,23 @@ +Nokia Qt LGPL Exception version 1.1 + +As an additional permission to the GNU Lesser General Public License +version 2.1, the object code form of a "work that uses the Library" +may incorporate material from a header file that is part of the +Library. You may distribute such object code under terms of your +choice, provided that: +(i) the header files of the Library have not been modified; and +(ii) the incorporated material is limited to numerical parameters, +data structure layouts, accessors, macros, inline functions and +templates; and +(iii) you comply with the terms of Section 6 of the GNU +Lesser General Public License version 2.1. + +Moreover, you may apply this exception to a modified version of the +Library, provided that such modification does not involve copying +material from the Library into the modified Library?s header files +unless such material is limited to (i) numerical parameters; (ii) data +structure layouts; (iii) accessors; and (iv) small macros, templates +and inline functions of five lines or less in length. + +Furthermore, you are not required to apply this additional permission +to a modified version of the Library. diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/LICENSE.GPL3 b/3rdparty/qtsingleapplication-2.6_1-opensource/LICENSE.GPL3 new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/LICENSE.GPL3 @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + 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 +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/LICENSE.LGPL b/3rdparty/qtsingleapplication-2.6_1-opensource/LICENSE.LGPL new file mode 100644 index 0000000..5ab7695 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/LICENSE.LGPL @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/README.TXT b/3rdparty/qtsingleapplication-2.6_1-opensource/README.TXT new file mode 100644 index 0000000..f12dc98 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/README.TXT @@ -0,0 +1,7 @@ +Single Application v2.6 + +The QtSingleApplication component provides support for +applications that can be only started once per user. + + + diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/buildlib/buildlib.pro b/3rdparty/qtsingleapplication-2.6_1-opensource/buildlib/buildlib.pro new file mode 100644 index 0000000..37dddcd --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/buildlib/buildlib.pro @@ -0,0 +1,13 @@ +TEMPLATE=lib +CONFIG += qt dll qtsingleapplication-buildlib +mac:CONFIG += absolute_library_soname +win32|mac:!wince*:!win32-msvc:!macx-xcode:CONFIG += debug_and_release build_all +include(../src/qtsingleapplication.pri) +TARGET = $$QTSINGLEAPPLICATION_LIBNAME +DESTDIR = $$QTSINGLEAPPLICATION_LIBDIR +win32 { + DLLDESTDIR = $$[QT_INSTALL_BINS] + QMAKE_DISTCLEAN += $$[QT_INSTALL_BINS]\\$${QTSINGLEAPPLICATION_LIBNAME}.dll +} +target.path = $$DESTDIR +INSTALLS += target diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/common.pri b/3rdparty/qtsingleapplication-2.6_1-opensource/common.pri new file mode 100644 index 0000000..b45a4fc --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/common.pri @@ -0,0 +1,6 @@ +infile(config.pri, SOLUTIONS_LIBRARY, yes): CONFIG += qtsingleapplication-uselib +TEMPLATE += fakelib +QTSINGLEAPPLICATION_LIBNAME = $$qtLibraryTarget(QtSolutions_SingleApplication-2.6) +TEMPLATE -= fakelib +QTSINGLEAPPLICATION_LIBDIR = $$PWD/lib +unix:qtsingleapplication-uselib:!qtsingleapplication-buildlib:QMAKE_RPATHDIR += $$QTSINGLEAPPLICATION_LIBDIR diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/config.pri b/3rdparty/qtsingleapplication-2.6_1-opensource/config.pri new file mode 100644 index 0000000..e69de29 diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/configure b/3rdparty/qtsingleapplication-2.6_1-opensource/configure new file mode 100644 index 0000000..099b08c --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/configure @@ -0,0 +1,112 @@ +#!/bin/sh + +if [ "x$1" != "x" -a "x$1" != "x-library" ]; then + echo "Usage: $0 [-library]" + echo + echo "-library: Build the component as a dynamic library (DLL). Default is to" + echo " include the component source code directly in the application." + echo " A DLL may be preferable for technical or licensing (LGPL) reasons." + echo + exit 0 +fi + + +# only ask to accept the license text once +if [ ! -f .licenseAccepted ]; then +# determine if opensource or commercial package + if [ -f LICENSE.LGPL ]; then + # opensource edition + while true; do + echo + echo "You are licensed to use this software under the terms of" + echo "the GNU General Public License (GPL) version 3, or" + echo "the GNU Lesser General Public License (LGPL) version 2.1" + echo "with certain additional extra rights as specified in the" + echo "Nokia Qt LGPL Exception version 1.1." + echo + echo "Type 'G' to view the GNU General Public License (GPL) version 3." + echo "Type 'L' to view the GNU Lesser General Public License (LGPL) version 2.1." + echo "Type 'E' to view the Nokia Qt LGPL Exception version 1.1." + echo "Type 'yes' to accept this license offer." + echo "Type 'no' to decline this license offer." + echo + echo "Do you accept the terms of this license? " + read answer + echo + + if [ "x$answer" = "xno" ]; then + echo "You are not licensed to use this software." + echo + exit 1 + elif [ "x$answer" = "xyes" ]; then + echo license accepted > .licenseAccepted + break + elif [ "x$answer" = "xe" -o "x$answer" = "xE" ]; then + more LGPL_EXCEPTION.txt + elif [ "x$answer" = "xl" -o "x$answer" = "xL" ]; then + more LICENSE.LGPL + elif [ "x$answer" = "xg" -o "x$answer" = "xG" ]; then + more LICENSE.GPL3 + fi + done + else + while true; do + echo + echo "Please choose your region." + echo + echo "Type 1 for North or South America." + echo "Type 2 for anywhere outside North and South America." + echo + echo "Select: " + read region + if [ "x$region" = "x1" ]; then + licenseFile=LICENSE.US + break; + elif [ "x$region" = "x2" ]; then + licenseFile=LICENSE.NO + break; + fi + done + while true; do + echo + echo "License Agreement" + echo + echo "Type '?' to view the Qt Solutions Commercial License." + echo "Type 'yes' to accept this license offer." + echo "Type 'no' to decline this license offer." + echo + echo "Do you accept the terms of this license? " + read answer + echo + + if [ "x$answer" = "xno" ]; then + echo "You are not licensed to use this software." + echo + exit 1 + elif [ "x$answer" = "xyes" ]; then + echo license accepted > .licenseAccepted + cp "$licenseFile" LICENSE + rm LICENSE.US + rm LICENSE.NO + break + elif [ "x$answer" = "x?" ]; then + more "$licenseFile" + fi + done + fi +fi + +rm -f config.pri +if [ "x$1" = "x-library" ]; then + echo "Configuring to build this component as a dynamic library." + echo "SOLUTIONS_LIBRARY = yes" > config.pri +fi + +echo +echo "This component is now configured." +echo +echo "To build the component library (if requested) and example(s)," +echo "run qmake and your make command." +echo +echo "To remove or reconfigure, run make distclean." +echo diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/classic.css b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/classic.css new file mode 100644 index 0000000..f22a77a --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/classic.css @@ -0,0 +1,139 @@ +h3.fn,span.fn +{ + margin-left: 1cm; + text-indent: -1cm; +} + +a:link +{ + color: #004faf; + text-decoration: none +} + +a:visited +{ + color: #672967; + text-decoration: none +} + +a.obsolete +{ + color: #661100; + text-decoration: none +} + +a.compat +{ + color: #661100; + text-decoration: none +} + +a.obsolete:visited +{ + color: #995500; + text-decoration: none +} + +a.compat:visited +{ + color: #995500; + text-decoration: none +} + +td.postheader +{ + font-family: sans-serif +} + +tr.address +{ + font-family: sans-serif +} + +body +{ + background: #ffffff; + color: black +} + +table tr.odd { + background: #f0f0f0; + color: black; +} + +table tr.even { + background: #e4e4e4; + color: black; +} + +table.annotated th { + padding: 3px; + text-align: left +} + +table.annotated td { + padding: 3px; +} + +table tr pre +{ + padding-top: 0px; + padding-bottom: 0px; + padding-left: 0px; + padding-right: 0px; + border: none; + background: none +} + +tr.qt-style +{ + background: #96E066; + color: black +} + +body pre +{ + padding: 0.2em; + border: #e7e7e7 1px solid; + background: #f1f1f1; + color: black +} + +table tr.qt-code pre +{ + padding: 0.2em; + border: #e7e7e7 1px solid; + background: #f1f1f1; + color: black +} + +span.preprocessor, span.preprocessor a +{ + color: darkblue; +} + +span.comment +{ + color: darkred; + font-style: italic +} + +span.string,span.char +{ + color: darkgreen; +} + +.title +{ + text-align: center +} + +.subtitle +{ + font-size: 0.8em +} + +.small-subtitle +{ + font-size: 0.65em +} diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/images/qt-logo.png b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/images/qt-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..794162f5af58e7b38beebf472842fc9703ede19b GIT binary patch literal 4075 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 literal 0 HcmV?d00001 diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/index.html b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/index.html new file mode 100644 index 0000000..d0bb38b --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/index.html @@ -0,0 +1,48 @@ + + + + + + Single Application + + + + + + + +
  Home

Single Application
+

+ +

Description

+

The QtSingleApplication component provides support for applications that can be only started once per user.

+

For some applications it is useful or even critical that they are started only once by any user. Future attempts to start the application should activate any already running instance, and possibly perform requested actions, e.g. loading a file, in that instance.

+

The QtSingleApplication class provides an interface to detect a running instance, and to send command strings to that instance. For console (non-GUI) applications, the QtSingleCoreApplication variant is provided, which avoids dependency on QtGui.

+ +

Classes

+ + +

Examples

+ + +

Tested platforms

+
    +
  • Qt 4.4, 4.5 / Windows XP / MSVC.NET 2005
  • +
  • Qt 4.4, 4.5 / Linux / gcc
  • +
  • Qt 4.4, 4.5 / MacOS X 10.5 / gcc
  • +
+


+ + + + +
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtlockedfile-members.html b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtlockedfile-members.html new file mode 100644 index 0000000..326c99b --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtlockedfile-members.html @@ -0,0 +1,166 @@ + + + + + + List of All Members for QtLockedFile + + + + + + + +
  Home

List of All Members for QtLockedFile

+

This is the complete list of members for QtLockedFile, including inherited members.

+

+ +
+

+


+ + + + +
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtlockedfile.html b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtlockedfile.html new file mode 100644 index 0000000..a121ef1 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtlockedfile.html @@ -0,0 +1,111 @@ + + + + + + QtLockedFile Class Reference + + + + + + + +
  Home

QtLockedFile Class Reference

+

The QtLockedFile class extends QFile with advisory locking functions. More...

+
 #include <QtLockedFile>

Inherits QFile.

+ + +

Public Types

+
    +
  • enum LockMode { ReadLock, WriteLock, NoLock }
  • +
+ +

Public Functions

+ +
    +
  • 24 public functions inherited from QFile
  • +
  • 33 public functions inherited from QIODevice
  • +
  • 29 public functions inherited from QObject
  • +
+

Additional Inherited Members

+
    +
  • 1 property inherited from QObject
  • +
  • 1 public slot inherited from QObject
  • +
  • 4 signals inherited from QIODevice
  • +
  • 1 signal inherited from QObject
  • +
  • 1 public type inherited from QObject
  • +
  • 14 static public members inherited from QFile
  • +
  • 4 static public members inherited from QObject
  • +
  • 5 protected functions inherited from QIODevice
  • +
  • 7 protected functions inherited from QObject
  • +
  • 2 protected variables inherited from QObject
  • +
+ +
+

Detailed Description

+

The QtLockedFile class extends QFile with advisory locking functions.

+

A file may be locked in read or write mode. Multiple instances of QtLockedFile, created in multiple processes running on the same machine, may have a file locked in read mode. Exactly one instance may have it locked in write mode. A read and a write lock cannot exist simultaneously on the same file.

+

The file locks are advisory. This means that nothing prevents another process from manipulating a locked file using QFile or file system functions offered by the OS. Serialization is only guaranteed if all processes that access the file use QLockedFile. Also, while holding a lock on a file, a process must not open the same file again (through any API), or locks can be unexpectedly lost.

+

The lock provided by an instance of QtLockedFile is released whenever the program terminates. This is true even when the program crashes and no destructors are called.

+
+

Member Type Documentation

+

enum QtLockedFile::LockMode

+

This enum describes the available lock modes.

+

+ + + + +
ConstantValueDescription
QtLockedFile::ReadLock1A read lock.
QtLockedFile::WriteLock2A write lock.
QtLockedFile::NoLock0Neither a read lock nor a write lock.

+
+

Member Function Documentation

+

QtLockedFile::QtLockedFile ()

+

Constructs an unlocked QtLockedFile object. This constructor behaves in the same way as QFile::QFile().

+

See also QFile::QFile().

+

QtLockedFile::QtLockedFile ( const QString & name )

+

Constructs an unlocked QtLockedFile object with file name. This constructor behaves in the same way as QFile::QFile(const QString&).

+

See also QFile::QFile().

+

QtLockedFile::~QtLockedFile ()

+

Destroys the QtLockedFile object. If any locks were held, they are released.

+

bool QtLockedFile::isLocked () const

+

Returns true if this object has a in read or write lock; otherwise returns false.

+

See also lockMode().

+

bool QtLockedFile::lock ( LockMode mode, bool block = true )

+

Obtains a lock of type mode. The file must be opened before it can be locked.

+

If block is true, this function will block until the lock is aquired. If block is false, this function returns false immediately if the lock cannot be aquired.

+

If this object already has a lock of type mode, this function returns true immediately. If this object has a lock of a different type than mode, the lock is first released and then a new lock is obtained.

+

This function returns true if, after it executes, the file is locked by this object, and false otherwise.

+

See also unlock(), isLocked(), and lockMode().

+

LockMode QtLockedFile::lockMode () const

+

Returns the type of lock currently held by this object, or QtLockedFile::NoLock.

+

See also isLocked().

+

bool QtLockedFile::open ( OpenMode mode )

+

Opens the file in OpenMode mode.

+

This is identical to QFile::open(), with the one exception that the Truncate mode flag is disallowed. Truncation would conflict with the advisory file locking, since the file would be modified before the write lock is obtained. If truncation is required, use resize(0) after obtaining the write lock.

+

Returns true if successful; otherwise false.

+

See also QFile::open() and QFile::resize().

+

bool QtLockedFile::unlock ()

+

Releases a lock.

+

If the object has no lock, this function returns immediately.

+

This function returns true if, after it executes, the file is not locked by this object, and false otherwise.

+

See also lock(), isLocked(), and lockMode().

+


+ + + + +
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-example-loader.html b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-example-loader.html new file mode 100644 index 0000000..2aac635 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-example-loader.html @@ -0,0 +1,184 @@ + + + + + + Loading Documents + + + + + + + +
  Home

Loading Documents
+

+

The application in this example loads or prints the documents passed as commandline parameters to further instances of this application.

+
 /****************************************************************************
+ **
+ ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ ** All rights reserved.
+ ** Contact: Nokia Corporation (qt-info@nokia.com)
+ **
+ ** This file is part of a Qt Solutions component.
+ **
+ ** Commercial Usage
+ ** Licensees holding valid Qt Commercial licenses may use this file in
+ ** accordance with the Qt Solutions Commercial License Agreement provided
+ ** with the Software or, alternatively, in accordance with the terms
+ ** contained in a written agreement between you and Nokia.
+ **
+ ** GNU Lesser General Public License Usage
+ ** Alternatively, this file may be used under the terms of the GNU Lesser
+ ** General Public License version 2.1 as published by the Free Software
+ ** Foundation and appearing in the file LICENSE.LGPL included in the
+ ** packaging of this file.  Please review the following information to
+ ** ensure the GNU Lesser General Public License version 2.1 requirements
+ ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ **
+ ** In addition, as a special exception, Nokia gives you certain
+ ** additional rights. These rights are described in the Nokia Qt LGPL
+ ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+ ** package.
+ **
+ ** GNU General Public License Usage
+ ** Alternatively, this file may be used under the terms of the GNU
+ ** General Public License version 3.0 as published by the Free Software
+ ** Foundation and appearing in the file LICENSE.GPL included in the
+ ** packaging of this file.  Please review the following information to
+ ** ensure the GNU General Public License version 3.0 requirements will be
+ ** met: http://www.gnu.org/copyleft/gpl.html.
+ **
+ ** Please note Third Party Software included with Qt Solutions may impose
+ ** additional restrictions and it is the user's responsibility to ensure
+ ** that they have met the licensing requirements of the GPL, LGPL, or Qt
+ ** Solutions Commercial license and the relevant license of the Third
+ ** Party Software they are using.
+ **
+ ** If you are unsure which license is appropriate for your use, please
+ ** contact Nokia at qt-info@nokia.com.
+ **
+ ****************************************************************************/
+
+ #include <qtsingleapplication.h>
+ #include <QtCore/QFile>
+ #include <QtGui/QMainWindow>
+ #include <QtGui/QPrinter>
+ #include <QtGui/QPainter>
+ #include <QtGui/QTextEdit>
+ #include <QtGui/QMdiArea>
+ #include <QtCore/QTextStream>
+
+ class MainWindow : public QMainWindow
+ {
+     Q_OBJECT
+ public:
+     MainWindow();
+
+ public slots:
+     void handleMessage(const QString& message);
+
+ signals:
+     void needToShow();
+
+ private:
+     QMdiArea *workspace;
+ };
+

The user interface in this application is a QMainWindow subclass with a QMdiArea as the central widget. It implements a slot handleMessage() that will be connected to the messageReceived() signal of the QtSingleApplication class.

+
 MainWindow::MainWindow()
+ {
+     workspace = new QMdiArea(this);
+
+     setCentralWidget(workspace);
+ }
+

The MainWindow constructor creates a minimal user interface.

+
 void MainWindow::handleMessage(const QString& message)
+ {
+     enum Action {
+         Nothing,
+         Open,
+         Print
+     } action;
+
+     action = Nothing;
+     QString filename = message;
+     if (message.toLower().startsWith("/print ")) {
+         filename = filename.mid(7);
+         action = Print;
+     } else if (!message.isEmpty()) {
+         action = Open;
+     }
+     if (action == Nothing) {
+         emit needToShow();
+         return;
+     }
+
+     QFile file(filename);
+     QString contents;
+     if (file.open(QIODevice::ReadOnly))
+         contents = file.readAll();
+     else
+         contents = "[[Error: Could not load file " + filename + "]]";
+
+     QTextEdit *view = new QTextEdit;
+     view->setPlainText(contents);
+
+     switch(action) {
+

The handleMessage() slot interprets the message passed in as a filename that can be prepended with /print to indicate that the file should just be printed rather than loaded.

+
     case Print:
+         {
+             QPrinter printer;
+             view->print(&printer);
+             delete view;
+         }
+         break;
+
+     case Open:
+         {
+             workspace->addSubWindow(view);
+             view->setWindowTitle(message);
+             view->show();
+             emit needToShow();
+         }
+         break;
+     default:
+         break;
+     };
+ }
+

Loading the file will also activate the window.

+
 #include "main.moc"
+
+ int main(int argc, char **argv)
+ {
+     QtSingleApplication instance("File loader QtSingleApplication example", argc, argv);
+     QString message;
+     for (int a = 1; a < argc; ++a) {
+         message += argv[a];
+         if (a < argc-1)
+             message += " ";
+     }
+
+     if (instance.sendMessage(message))
+         return 0;
+

The main entry point function creates a QtSingleApplication object, and creates a message to send to a running instance of the application. If the message was sent successfully the process exits immediately.

+
     MainWindow mw;
+     mw.handleMessage(message);
+     mw.show();
+
+     QObject::connect(&instance, SIGNAL(messageReceived(const QString&)),
+                      &mw, SLOT(handleMessage(const QString&)));
+
+     instance.setActivationWindow(&mw, false);
+     QObject::connect(&mw, SIGNAL(needToShow()), &instance, SLOT(activateWindow()));
+
+     return instance.exec();
+ }
+

If the message could not be sent the application starts up. Note that false is passed to the call to setActivationWindow() to prevent automatic activation for every message received, e.g. when the application should just print a file. Instead, the message handling function determines whether activation is requested, and signals that by emitting the needToShow() signal. This is then simply connected directly to QtSingleApplication's activateWindow() slot.

+


+ + + + +
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-example-trivial.html b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-example-trivial.html new file mode 100644 index 0000000..8499343 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-example-trivial.html @@ -0,0 +1,110 @@ + + + + + + A Trivial Example + + + + + + + +
  Home

A Trivial Example
+

+

The application in this example has a log-view that displays messages sent by further instances of the same application.

+

The example demonstrates the use of the QtSingleApplication class to detect and communicate with a running instance of the application using the sendMessage() API. The messageReceived() signal is used to display received messages in a QTextEdit log.

+
 /****************************************************************************
+ **
+ ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ ** All rights reserved.
+ ** Contact: Nokia Corporation (qt-info@nokia.com)
+ **
+ ** This file is part of a Qt Solutions component.
+ **
+ ** Commercial Usage
+ ** Licensees holding valid Qt Commercial licenses may use this file in
+ ** accordance with the Qt Solutions Commercial License Agreement provided
+ ** with the Software or, alternatively, in accordance with the terms
+ ** contained in a written agreement between you and Nokia.
+ **
+ ** GNU Lesser General Public License Usage
+ ** Alternatively, this file may be used under the terms of the GNU Lesser
+ ** General Public License version 2.1 as published by the Free Software
+ ** Foundation and appearing in the file LICENSE.LGPL included in the
+ ** packaging of this file.  Please review the following information to
+ ** ensure the GNU Lesser General Public License version 2.1 requirements
+ ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ **
+ ** In addition, as a special exception, Nokia gives you certain
+ ** additional rights. These rights are described in the Nokia Qt LGPL
+ ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+ ** package.
+ **
+ ** GNU General Public License Usage
+ ** Alternatively, this file may be used under the terms of the GNU
+ ** General Public License version 3.0 as published by the Free Software
+ ** Foundation and appearing in the file LICENSE.GPL included in the
+ ** packaging of this file.  Please review the following information to
+ ** ensure the GNU General Public License version 3.0 requirements will be
+ ** met: http://www.gnu.org/copyleft/gpl.html.
+ **
+ ** Please note Third Party Software included with Qt Solutions may impose
+ ** additional restrictions and it is the user's responsibility to ensure
+ ** that they have met the licensing requirements of the GPL, LGPL, or Qt
+ ** Solutions Commercial license and the relevant license of the Third
+ ** Party Software they are using.
+ **
+ ** If you are unsure which license is appropriate for your use, please
+ ** contact Nokia at qt-info@nokia.com.
+ **
+ ****************************************************************************/
+
+ #include <qtsingleapplication.h>
+ #include <QtGui/QTextEdit>
+
+ class TextEdit : public QTextEdit
+ {
+     Q_OBJECT
+ public:
+     TextEdit(QWidget *parent = 0)
+         : QTextEdit(parent)
+     {}
+ public slots:
+     void append(const QString &str)
+     {
+         QTextEdit::append(str);
+     }
+ };
+
+ #include "main.moc"
+
+ int main(int argc, char **argv)
+ {
+     QtSingleApplication instance(argc, argv);
+

The example has only the main entry point function. A QtSingleApplication object is created immediately.

+
     if (instance.sendMessage("Wake up!"))
+         return 0;
+

If another instance of this application is already running, sendMessage() will succeed, and this instance just exits immediately.

+
     TextEdit logview;
+     logview.setReadOnly(true);
+     logview.show();
+

Otherwise the instance continues as normal and creates the user interface.

+
     instance.setActivationWindow(&logview);
+
+     QObject::connect(&instance, SIGNAL(messageReceived(const QString&)),
+                      &logview, SLOT(append(const QString&)));
+
+     return instance.exec();
+

The logview object is also set as the application's activation window. Every time a message is received, the window will be raised and activated automatically.

+

The messageReceived() signal is also connected to the QTextEdit's append() slot. Every message received from further instances of this application will be displayed in the log.

+

Finally the event loop is entered.

+


+ + + + +
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-members.html b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-members.html new file mode 100644 index 0000000..17107ec --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-members.html @@ -0,0 +1,231 @@ + + + + + + List of All Members for QtSingleApplication + + + + + + + +
  Home

List of All Members for QtSingleApplication

+

This is the complete list of members for QtSingleApplication, including inherited members.

+

+ +
+

+


+ + + + +
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-obsolete.html b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-obsolete.html new file mode 100644 index 0000000..bfaa961 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication-obsolete.html @@ -0,0 +1,31 @@ + + + + + + Obsolete Members for QtSingleApplication + + + + + + + +
  Home

Obsolete Members for QtSingleApplication

+

The following class members are obsolete. They are provided to keep old source code working. We strongly advise against using them in new code.

+

+

Public Functions

+
    +
  • void initialize ( bool dummy = true )   (obsolete)
  • +
+
+

Member Function Documentation

+

void QtSingleApplication::initialize ( bool dummy = true )

+


+ + + + +
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.dcf b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.dcf new file mode 100644 index 0000000..4335ec6 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.dcf @@ -0,0 +1,53 @@ + + +
+
+ QtLockedFile + LockMode + QtLockedFile::WriteLock + QtLockedFile::NoLock + QtLockedFile::ReadLock + isLocked + lock + lockMode + open + unlock +
+
+
+ QtSingleApplication + activateWindow + activationWindow + id + isRunning + messageReceived + sendMessage + setActivationWindow +
+
+
+
+ QtSingleCoreApplication + id + isRunning + messageReceived + sendMessage +
+
+
+
+
+ A non-GUI example +
+
+ A Trivial Example +
+
+ Loading Documents +
+
+ Single Application +
+
+
+ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.html b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.html new file mode 100644 index 0000000..1c9bc87 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.html @@ -0,0 +1,160 @@ + + + + + + QtSingleApplication Class Reference + + + + + + + +
  Home

QtSingleApplication Class Reference

+

The QtSingleApplication class provides an API to detect and communicate with running instances of an application. More...

+
 #include <QtSingleApplication>

Inherits QApplication.

+ + +

Public Functions

+ + + +

Public Slots

+ + + +

Signals

+ + +

Additional Inherited Members

+ + +
+

Detailed Description

+

The QtSingleApplication class provides an API to detect and communicate with running instances of an application.

+

This class allows you to create applications where only one instance should be running at a time. I.e., if the user tries to launch another instance, the already running instance will be activated instead. Another usecase is a client-server system, where the first started instance will assume the role of server, and the later instances will act as clients of that server.

+

By default, the full path of the executable file is used to determine whether two processes are instances of the same application. You can also provide an explicit identifier string that will be compared instead.

+

The application should create the QtSingleApplication object early in the startup phase, and call isRunning() or sendMessage() to find out if another instance of this application is already running. Startup parameters (e.g. the name of the file the user wanted this new instance to open) can be passed to the running instance in the sendMessage() function.

+

If isRunning() or sendMessage() returns false, it means that no other instance is running, and this instance has assumed the role as the running instance. The application should continue with the initialization of the application user interface before entering the event loop with exec(), as normal. The messageReceived() signal will be emitted when the application receives messages from another instance of the same application.

+

If isRunning() or sendMessage() returns true, another instance is already running, and the application should terminate or enter client mode.

+

If a message is received it might be helpful to the user to raise the application so that it becomes visible. To facilitate this, QtSingleApplication provides the setActivationWindow() function and the activateWindow() slot.

+

Here's an example that shows how to convert an existing application to use QtSingleApplication. It is very simple and does not make use of all QtSingleApplication's functionality (see the examples for that).

+
 // Original
+ int main(int argc, char **argv)
+ {
+     QApplication app(argc, argv);
+
+     MyMainWidget mmw;
+
+     mmw.show();
+     return app.exec();
+ }
+
+ // Single instance
+ int main(int argc, char **argv)
+ {
+     QtSingleApplication app(argc, argv);
+
+     if (app.isRunning())
+         return 0;
+
+     MyMainWidget mmw;
+
+     app.setActivationWindow(&mmw);
+
+     mmw.show();
+     return app.exec();
+ }
+

Once this QtSingleApplication instance is destroyed(for example, when the user quits), when the user next attempts to run the application this instance will not, of course, be encountered. The next instance to call isRunning() or sendMessage() will assume the role as the new running instance.

+

For console (non-GUI) applications, QtSingleCoreApplication may be used instead of this class, to avoid the dependency on the QtGui library.

+

See also QtSingleCoreApplication.

+
+

Member Function Documentation

+

QtSingleApplication::QtSingleApplication ( int & argc, char ** argv, bool GUIenabled = true )

+

Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). argc, argv, and GUIenabled are passed on to the QAppliation constructor.

+

If you are creating a console application (i.e. setting GUIenabled to false), you may consider using QtSingleCoreApplication instead.

+

QtSingleApplication::QtSingleApplication ( const QString & appId, int & argc, char ** argv )

+

Creates a QtSingleApplication object with the application identifier appId. argc and argv are passed on to the QAppliation constructor.

+

QtSingleApplication::QtSingleApplication ( int & argc, char ** argv, Type type )

+

Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). argc, argv, and type are passed on to the QAppliation constructor.

+

QtSingleApplication::QtSingleApplication ( Display * dpy, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )

+

Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). dpy, visual, and cmap are passed on to the QApplication constructor.

+

QtSingleApplication::QtSingleApplication ( Display * dpy, int & argc, char ** argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )

+

Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). dpy, argc, argv, visual, and cmap are passed on to the QApplication constructor.

+

QtSingleApplication::QtSingleApplication ( Display * dpy, const QString & appId, int argc, char ** argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )

+

Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be appId. dpy, argc, argv, visual, and cmap are passed on to the QApplication constructor.

+

void QtSingleApplication::activateWindow ()   [slot]

+

De-minimizes, raises, and activates this application's activation window. This function does nothing if no activation window has been set.

+

This is a convenience function to show the user that this application instance has been activated when he has tried to start another instance.

+

This function should typically be called in response to the messageReceived() signal. By default, that will happen automatically, if an activation window has been set.

+

See also setActivationWindow(), messageReceived(), and initialize().

+

QWidget * QtSingleApplication::activationWindow () const

+

Returns the applications activation window if one has been set by calling setActivationWindow(), otherwise returns 0.

+

See also setActivationWindow().

+

QString QtSingleApplication::id () const

+

Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application.

+

bool QtSingleApplication::isRunning ()

+

Returns true if another instance of this application is running; otherwise false.

+

This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session).

+

See also sendMessage().

+

void QtSingleApplication::messageReceived ( const QString & message )   [signal]

+

This signal is emitted when the current instance receives a message from another instance of this application.

+

See also sendMessage(), setActivationWindow(), and activateWindow().

+

bool QtSingleApplication::sendMessage ( const QString & message, int timeout = 5000 )   [slot]

+

Tries to send the text message to the currently running instance. The QtSingleApplication object in the running instance will emit the messageReceived() signal when it receives the message.

+

This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within timeout milliseconds, this function return false.

+

See also isRunning() and messageReceived().

+

void QtSingleApplication::setActivationWindow ( QWidget * aw, bool activateOnMessage = true )

+

Sets the activation window of this application to aw. The activation window is the widget that will be activated by activateWindow(). This is typically the application's main window.

+

If activateOnMessage is true (the default), the window will be activated automatically every time a message is received, just prior to the messageReceived() signal being emitted.

+

See also activationWindow(), activateWindow(), and messageReceived().

+


+ + + + +
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.index b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.index new file mode 100644 index 0000000..9c73659 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.index @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.qch b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.qch new file mode 100644 index 0000000000000000000000000000000000000000..8dd3d5da2ad53e90560421d6627710d01a032a98 GIT binary patch literal 52224 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 z z{K4`#9wpAtMeHvoaC7Ufq;wL|87K)XVWfIEWAb&9(eYimaOQ&jkbQyl=JlkdO5Dec zE4Hem<>fAc1zC#4K9rO#HY2{IlMN;`G6*KbW&s_Q6CyU~&apC2%wFa0D~*Fr=4~>Z zfUxM)RlJSv=I&d53_YQ%gK%nH`Jx9*#rw=VX&3jQpIx-J7OpqLcXjwfAJ@iG-nxS^Hovs%X5QPjn3=#|qflz-)gd-rvD-;w zmXVR+Vr-as+QCkc@II^X97#;l>N!2E!bPUU4Yg67OZbJ9c&YWF4y9dF4?3!|Nj{5| z=XD87DP=9SRZ+s+@U8T5PLSGZ%8ZF=VwoVvtq_!2cZw`j|+lT{7 zL0i|Y)BE^$KTkM*6fM>%t%>N^TT?(dXy}l(vcy}xpssoShJ`=PsB-w}()32j(}?ewL%_w&`>tHk0S+^>t~$TtW~-t;F&i`E@WyJ1 za;30S2@BnUa^Xn^VD@kdmh&(_Us$1!m4l-(bpTlma zT>?8jc!Tj@p>NG(V_| z9C|ZD+F;k3K{uW*Xmlqrfp@*KsmyMqvr`%x?kp(#$ASQyzzWa|B!&;e^?`Q~a?(63 z9?JY5T_RWr*a=MlIB^7B^dpR-bI>o8AJG8tqdQGZ1dQDh0N8DyUn*Dl0#fh?`q9tW zd`kVy6pEk3I7NMS!~ z@wc=;t6UHb0TU4c0N9Th{wN=SD}o4^swz|zRUfK1{s5Dsg`NL08d05z>QofW+^;DB zgd+Su?0yX(_iG9OsR;auoyL~|>j6n<3YiiuOd5hKGKJ)Gfd2>`q(-J(qHj~3X#u0V35y5`R~ zZQn;xL%EOdl?J{5zkSP7j0gcEh3ucy2I|m%Qh@~w08wQENeGcJ#Xvd$P&9?m6i^a- zK)OBxWzha23kp=l^B=JP6(<1v6-6MD011La2pNji_wrFgrc2hn!_` z5imx`aWc9?YhjKZ)S{XI^xK%oF86ekS!14FEs7)5QMIym%zV z?|95_X}?ahN2O8rkA#i^AoNcV9tlhXJ^&Z2`OCS$S6dDwJC20OLU@jVEXwzxFggDK z_e9M>D7Z(IEucE&+dlm{h$Kp1Kj#Nv{QS8KB@)INND2U)sQF&)i}q3e1O@*2&t>^L z4*=uuc^4@lPXdj{?|PD7HyGthP;8;q0r?+Gl7A@aKWi6&5y*553DZS&o~|p@Np8@z z@W180evcmj{vMqN84@NKhzkIMD0&ojry}(Jb+CQg@E=bL-!K1%9DnB z=>D+)KOeOK`19wsB&bo1{#&E^$1?nVV8>HT_w`GNDp_sYLbOFt<1t1@O6NrI5heyEO0XtY3+!|1UB?63aZMeXX)%DF2 z7ElxT9i^P01ONytIo?*=u*M~xyn2`U1AUH{uai&cle!~le}p!7FHe_g;6 zpxXJZYQ8_g;8TMVz>k;KcmyCL@aM%ZE)IACI9kf$kbvyKw@XuO6va^{7K#GZi3e*FJU11OJd1BGCJ1aq#ivoL39aI$|1bgiI~cm|48QK1wT%Bz_}*`|<5xUadm!LlQt8U?FAQWqTv45}w z2JV9E;74#CoCe3hS71N*1j_vP`d0)0YT*C82GBvsjr67n(;c!$60I2vMgww#_H1JYT_y2rT{}u56tp);d2oQ9fyg=ZWgPK34Cnabq zN5x>WU-sxw6V}%|4d|KKmx+c$3fhmAhBg~Dpp+IOQG(9Tq+vSH{ofhT!jz$06cuWF z4#n~-BbNWBXN3i_5F+R#B!ECw)LP>Y%A*M2?_9rq@|7p&kA?fT&{vU;g#4D`E8D+_ kdXfl1C-{9)Wg*eO^8GPCu3wA!S606x;!$;|lB}@*0x3)D@c;k- literal 0 HcmV?d00001 diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.qhp b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.qhp new file mode 100644 index 0000000..5d70d3a --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsingleapplication.qhp @@ -0,0 +1,65 @@ + + + com.nokia.qtsolutions.qtsingleapplication_2.6 + qdoc + + qt + solutions + qtsingleapplication + + + qt + solutions + qtsingleapplication + +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + qtlockedfile.html + qtsingleapplication.html + index.html + qtsingleapplication-example-trivial.html + qtsinglecoreapplication.html + qtsingleapplication-example-loader.html + qtsinglecoreapplication-example-console.html + classic.css + images/qt-logo.png + + + diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsinglecoreapplication-example-console.html b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsinglecoreapplication-example-console.html new file mode 100644 index 0000000..9cb3efa --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsinglecoreapplication-example-console.html @@ -0,0 +1,127 @@ + + + + + + A non-GUI example + + + + + + + +
  Home

A non-GUI example
+

+

This example shows how to use the single-application functionality in a console application. It does not require the QtGui library at all.

+

The only differences from the GUI application usage demonstrated in the other examples are:

+

1) The .pro file should include qtsinglecoreapplication.pri instead of qtsingleapplication.pri

+

2) The class name is QtSingleCoreApplication instead of QtSingleApplication.

+

3) No calls are made regarding window activation, for obvious reasons.

+

console.pro:

+
 TEMPLATE   = app
+ CONFIG    += console
+ SOURCES   += main.cpp
+ include(../../src/qtsinglecoreapplication.pri)
+ QT -= gui
+

main.cpp:

+
 /****************************************************************************
+ **
+ ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ ** All rights reserved.
+ ** Contact: Nokia Corporation (qt-info@nokia.com)
+ **
+ ** This file is part of a Qt Solutions component.
+ **
+ ** Commercial Usage
+ ** Licensees holding valid Qt Commercial licenses may use this file in
+ ** accordance with the Qt Solutions Commercial License Agreement provided
+ ** with the Software or, alternatively, in accordance with the terms
+ ** contained in a written agreement between you and Nokia.
+ **
+ ** GNU Lesser General Public License Usage
+ ** Alternatively, this file may be used under the terms of the GNU Lesser
+ ** General Public License version 2.1 as published by the Free Software
+ ** Foundation and appearing in the file LICENSE.LGPL included in the
+ ** packaging of this file.  Please review the following information to
+ ** ensure the GNU Lesser General Public License version 2.1 requirements
+ ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ **
+ ** In addition, as a special exception, Nokia gives you certain
+ ** additional rights. These rights are described in the Nokia Qt LGPL
+ ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+ ** package.
+ **
+ ** GNU General Public License Usage
+ ** Alternatively, this file may be used under the terms of the GNU
+ ** General Public License version 3.0 as published by the Free Software
+ ** Foundation and appearing in the file LICENSE.GPL included in the
+ ** packaging of this file.  Please review the following information to
+ ** ensure the GNU General Public License version 3.0 requirements will be
+ ** met: http://www.gnu.org/copyleft/gpl.html.
+ **
+ ** Please note Third Party Software included with Qt Solutions may impose
+ ** additional restrictions and it is the user's responsibility to ensure
+ ** that they have met the licensing requirements of the GPL, LGPL, or Qt
+ ** Solutions Commercial license and the relevant license of the Third
+ ** Party Software they are using.
+ **
+ ** If you are unsure which license is appropriate for your use, please
+ ** contact Nokia at qt-info@nokia.com.
+ **
+ ****************************************************************************/
+
+ #include "qtsinglecoreapplication.h"
+ #include <QtCore/QDebug>
+
+ void report(const QString& msg)
+ {
+     qDebug("[%i] %s", (int)QCoreApplication::applicationPid(), qPrintable(msg));
+ }
+
+ class MainClass : public QObject
+ {
+     Q_OBJECT
+ public:
+     MainClass()
+         : QObject()
+         {}
+
+ public slots:
+     void handleMessage(const QString& message)
+         {
+             report( "Message received: \"" + message + "\"");
+         }
+ };
+
+ int main(int argc, char **argv)
+ {
+     report("Starting up");
+
+     QtSingleCoreApplication app(argc, argv);
+
+     if (app.isRunning()) {
+         QString msg(QString("Hi master, I am %1.").arg(QCoreApplication::applicationPid()));
+         bool sentok = app.sendMessage(msg);
+         QString rep("Another instance is running, so I will exit.");
+         rep += sentok ? " Message sent ok." : " Message sending failed.";
+         report(rep);
+         return 0;
+     } else {
+         report("No other instance is running; so I will.");
+         MainClass mainObj;
+         QObject::connect(&app, SIGNAL(messageReceived(const QString&)),
+                          &mainObj, SLOT(handleMessage(const QString&)));
+         return app.exec();
+     }
+ }
+
+ #include "main.moc"
+


+ + + + +
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsinglecoreapplication-members.html b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsinglecoreapplication-members.html new file mode 100644 index 0000000..0b63012 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsinglecoreapplication-members.html @@ -0,0 +1,126 @@ + + + + + + List of All Members for QtSingleCoreApplication + + + + + + + +
  Home

List of All Members for QtSingleCoreApplication

+

This is the complete list of members for QtSingleCoreApplication, including inherited members.

+

+ +
+

+


+ + + + +
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsinglecoreapplication.html b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsinglecoreapplication.html new file mode 100644 index 0000000..2105303 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/html/qtsinglecoreapplication.html @@ -0,0 +1,94 @@ + + + + + + QtSingleCoreApplication Class Reference + + + + + + + +
  Home

QtSingleCoreApplication Class Reference

+

A variant of the QtSingleApplication class for non-GUI applications. More...

+
 #include <QtSingleCoreApplication>

Inherits QCoreApplication.

+ + +

Public Functions

+ + + +

Public Slots

+
    +
  • bool sendMessage ( const QString & message, int timeout = 5000 )
  • +
+ + +

Signals

+ + +

Additional Inherited Members

+ + +
+

Detailed Description

+

A variant of the QtSingleApplication class for non-GUI applications.

+

This class is a variant of QtSingleApplication suited for use in console (non-GUI) applications. It is an extension of QCoreApplication (instead of QApplication). It does not require the QtGui library.

+

The API and usage is identical to QtSingleApplication, except that functions relating to the "activation window" are not present, for obvious reasons. Please refer to the QtSingleApplication documentation for explanation of the usage.

+

A QtSingleCoreApplication instance can communicate to a QtSingleApplication instance if they share the same application id. Hence, this class can be used to create a light-weight command-line tool that sends commands to a GUI application.

+

See also QtSingleApplication.

+
+

Member Function Documentation

+

QtSingleCoreApplication::QtSingleCoreApplication ( int & argc, char ** argv )

+

Creates a QtSingleCoreApplication object. The application identifier will be QCoreApplication::applicationFilePath(). argc and argv are passed on to the QCoreAppliation constructor.

+

QtSingleCoreApplication::QtSingleCoreApplication ( const QString & appId, int & argc, char ** argv )

+

Creates a QtSingleCoreApplication object with the application identifier appId. argc and argv are passed on to the QCoreAppliation constructor.

+

QString QtSingleCoreApplication::id () const

+

Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application.

+

bool QtSingleCoreApplication::isRunning ()

+

Returns true if another instance of this application is running; otherwise false.

+

This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session).

+

See also sendMessage().

+

void QtSingleCoreApplication::messageReceived ( const QString & message )   [signal]

+

This signal is emitted when the current instance receives a message from another instance of this application.

+

See also sendMessage().

+

bool QtSingleCoreApplication::sendMessage ( const QString & message, int timeout = 5000 )   [slot]

+

Tries to send the text message to the currently running instance. The QtSingleCoreApplication object in the running instance will emit the messageReceived() signal when it receives the message.

+

This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within timeout milliseconds, this function return false.

+

See also isRunning() and messageReceived().

+


+ + + + +
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/images/qt-logo.png b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/images/qt-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..794162f5af58e7b38beebf472842fc9703ede19b GIT binary patch literal 4075 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 literal 0 HcmV?d00001 diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/doc/index.qdoc b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/index.qdoc new file mode 100644 index 0000000..9c3308d --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/doc/index.qdoc @@ -0,0 +1,47 @@ +/*! + \page index.html + \title Single Application + + \section1 Description + + The QtSingleApplication component provides support + for applications that can be only started once per user. + + + + For some applications it is useful or even critical that they are started + only once by any user. Future attempts to start the application should + activate any already running instance, and possibly perform requested + actions, e.g. loading a file, in that instance. + + The QtSingleApplication class provides an interface to detect a running + instance, and to send command strings to that instance. + For console (non-GUI) applications, the QtSingleCoreApplication variant is provided, which avoids dependency on QtGui. + + + + + \section1 Classes + \list + \i QtSingleApplication \i QtSingleCoreApplication\endlist + + \section1 Examples + \list + \i \link qtsingleapplication-example-trivial.html A Trivial Example \endlink \i \link qtsingleapplication-example-loader.html Loading Documents \endlink \i \link qtsinglecoreapplication-example-console.html A Non-GUI Example \endlink \endlist + + + + + + + \section1 Tested platforms + \list + \i Qt 4.4, 4.5 / Windows XP / MSVC.NET 2005 + \i Qt 4.4, 4.5 / Linux / gcc + \i Qt 4.4, 4.5 / MacOS X 10.5 / gcc + \endlist + + + + + */ \ No newline at end of file diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/examples/console/console.pro b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/console/console.pro new file mode 100644 index 0000000..e0390e2 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/console/console.pro @@ -0,0 +1,5 @@ +TEMPLATE = app +CONFIG += console +SOURCES += main.cpp +include(../../src/qtsinglecoreapplication.pri) +QT -= gui diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/examples/console/console.qdoc b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/console/console.qdoc new file mode 100644 index 0000000..9fd6fae --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/console/console.qdoc @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + +/*! \page qtsinglecoreapplication-example-console.html + \title A non-GUI example + + This example shows how to use the single-application functionality + in a console application. It does not require the \c QtGui library + at all. + + The only differences from the GUI application usage demonstrated + in the other examples are: + + 1) The \c.pro file should include \c qtsinglecoreapplication.pri + instead of \c qtsingleapplication.pri + + 2) The class name is \c QtSingleCoreApplication instead of \c + QtSingleApplication. + + 3) No calls are made regarding window activation, for obvious reasons. + + console.pro: + \quotefile console/console.pro + + main.cpp: + \quotefile console/main.cpp + +*/ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/examples/console/main.cpp b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/console/main.cpp new file mode 100644 index 0000000..1db3d77 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/console/main.cpp @@ -0,0 +1,95 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + + +#include "qtsinglecoreapplication.h" +#include + + +void report(const QString& msg) +{ + qDebug("[%i] %s", (int)QCoreApplication::applicationPid(), qPrintable(msg)); +} + +class MainClass : public QObject +{ + Q_OBJECT +public: + MainClass() + : QObject() + {} + +public slots: + void handleMessage(const QString& message) + { + report( "Message received: \"" + message + "\""); + } +}; + +int main(int argc, char **argv) +{ + report("Starting up"); + + QtSingleCoreApplication app(argc, argv); + + if (app.isRunning()) { + QString msg(QString("Hi master, I am %1.").arg(QCoreApplication::applicationPid())); + bool sentok = app.sendMessage(msg); + QString rep("Another instance is running, so I will exit."); + rep += sentok ? " Message sent ok." : " Message sending failed."; + report(rep); + return 0; + } else { + report("No other instance is running; so I will."); + MainClass mainObj; + QObject::connect(&app, SIGNAL(messageReceived(const QString&)), + &mainObj, SLOT(handleMessage(const QString&))); + return app.exec(); + } +} + + +#include "main.moc" diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/examples/examples.pro b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/examples.pro new file mode 100644 index 0000000..36b8fd3 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/examples.pro @@ -0,0 +1,4 @@ +TEMPLATE = subdirs +SUBDIRS = trivial \ + loader \ + console diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/file1.qsl b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/file1.qsl new file mode 100644 index 0000000..50fcd26 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/file1.qsl @@ -0,0 +1 @@ +File 1 diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/file2.qsl b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/file2.qsl new file mode 100644 index 0000000..4475433 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/file2.qsl @@ -0,0 +1 @@ +File 2 diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/loader.pro b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/loader.pro new file mode 100644 index 0000000..673497a --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/loader.pro @@ -0,0 +1,5 @@ +TEMPLATE = app + +include(../../src/qtsingleapplication.pri) + +SOURCES += main.cpp diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/loader.qdoc b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/loader.qdoc new file mode 100644 index 0000000..1b5546c --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/loader.qdoc @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + +/*! \page qtsingleapplication-example-loader.html + \title Loading Documents + + The application in this example loads or prints the documents + passed as commandline parameters to further instances of this + application. + + \quotefromfile loader/main.cpp + \printuntil }; + The user interface in this application is a QMainWindow subclass + with a QMdiArea as the central widget. It implements a slot + \c handleMessage() that will be connected to the messageReceived() + signal of the QtSingleApplication class. + + \printuntil } + The MainWindow constructor creates a minimal user interface. + + \printto case Print: + The handleMessage() slot interprets the message passed in as a + filename that can be prepended with \e /print to indicate that + the file should just be printed rather than loaded. + + \printto #include + Loading the file will also activate the window. + + \printto mw + The \c main entry point function creates a QtSingleApplication + object, and creates a message to send to a running instance + of the application. If the message was sent successfully the + process exits immediately. + + \printuntil } + If the message could not be sent the application starts up. Note + that \c false is passed to the call to setActivationWindow() to + prevent automatic activation for every message received, e.g. when + the application should just print a file. Instead, the message + handling function determines whether activation is requested, and + signals that by emitting the needToShow() signal. This is then + simply connected directly to QtSingleApplication's + activateWindow() slot. +*/ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/main.cpp b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/main.cpp new file mode 100644 index 0000000..23e6fe0 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/loader/main.cpp @@ -0,0 +1,158 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +class MainWindow : public QMainWindow +{ + Q_OBJECT +public: + MainWindow(); + +public slots: + void handleMessage(const QString& message); + +signals: + void needToShow(); + +private: + QMdiArea *workspace; +}; + +MainWindow::MainWindow() +{ + workspace = new QMdiArea(this); + + setCentralWidget(workspace); +} + +void MainWindow::handleMessage(const QString& message) +{ + enum Action { + Nothing, + Open, + Print + } action; + + action = Nothing; + QString filename = message; + if (message.toLower().startsWith("/print ")) { + filename = filename.mid(7); + action = Print; + } else if (!message.isEmpty()) { + action = Open; + } + if (action == Nothing) { + emit needToShow(); + return; + } + + QFile file(filename); + QString contents; + if (file.open(QIODevice::ReadOnly)) + contents = file.readAll(); + else + contents = "[[Error: Could not load file " + filename + "]]"; + + QTextEdit *view = new QTextEdit; + view->setPlainText(contents); + + switch(action) { + case Print: + { + QPrinter printer; + view->print(&printer); + delete view; + } + break; + + case Open: + { + workspace->addSubWindow(view); + view->setWindowTitle(message); + view->show(); + emit needToShow(); + } + break; + default: + break; + }; +} + +#include "main.moc" + +int main(int argc, char **argv) +{ + QtSingleApplication instance("File loader QtSingleApplication example", argc, argv); + QString message; + for (int a = 1; a < argc; ++a) { + message += argv[a]; + if (a < argc-1) + message += " "; + } + + if (instance.sendMessage(message)) + return 0; + + MainWindow mw; + mw.handleMessage(message); + mw.show(); + + QObject::connect(&instance, SIGNAL(messageReceived(const QString&)), + &mw, SLOT(handleMessage(const QString&))); + + instance.setActivationWindow(&mw, false); + QObject::connect(&mw, SIGNAL(needToShow()), &instance, SLOT(activateWindow())); + + return instance.exec(); +} diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/examples/trivial/main.cpp b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/trivial/main.cpp new file mode 100644 index 0000000..727fab8 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/trivial/main.cpp @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + +#include +#include + +class TextEdit : public QTextEdit +{ + Q_OBJECT +public: + TextEdit(QWidget *parent = 0) + : QTextEdit(parent) + {} +public slots: + void append(const QString &str) + { + QTextEdit::append(str); + } +}; + +#include "main.moc" + + + +int main(int argc, char **argv) +{ + QtSingleApplication instance(argc, argv); + if (instance.sendMessage("Wake up!")) + return 0; + + TextEdit logview; + logview.setReadOnly(true); + logview.show(); + + instance.setActivationWindow(&logview); + + QObject::connect(&instance, SIGNAL(messageReceived(const QString&)), + &logview, SLOT(append(const QString&))); + + return instance.exec(); +} diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/examples/trivial/trivial.pro b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/trivial/trivial.pro new file mode 100644 index 0000000..673497a --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/trivial/trivial.pro @@ -0,0 +1,5 @@ +TEMPLATE = app + +include(../../src/qtsingleapplication.pri) + +SOURCES += main.cpp diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/examples/trivial/trivial.qdoc b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/trivial/trivial.qdoc new file mode 100644 index 0000000..d33a4c7 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/examples/trivial/trivial.qdoc @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + +/*! \page qtsingleapplication-example-trivial.html + \title A Trivial Example + + The application in this example has a log-view that displays + messages sent by further instances of the same application. + + The example demonstrates the use of the QtSingleApplication + class to detect and communicate with a running instance of + the application using the sendMessage() API. The messageReceived() + signal is used to display received messages in a QTextEdit log. + + \quotefromfile trivial/main.cpp + \printuntil instance + The example has only the \c main entry point function. + A QtSingleApplication object is created immediately. + + \printuntil return + If another instance of this application is already running, + sendMessage() will succeed, and this instance just exits + immediately. + + \printuntil show() + Otherwise the instance continues as normal and creates the + user interface. + + \printuntil return instance.exec(); + The \c logview object is also set as the application's activation + window. Every time a message is received, the window will be raised + and activated automatically. + + The messageReceived() signal is also connected to the QTextEdit's + append() slot. Every message received from further instances of + this application will be displayed in the log. + + Finally the event loop is entered. +*/ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/qtsingleapplication.pro b/3rdparty/qtsingleapplication-2.6_1-opensource/qtsingleapplication.pro new file mode 100644 index 0000000..cceb41f --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/qtsingleapplication.pro @@ -0,0 +1,6 @@ +TEMPLATE=subdirs +CONFIG += ordered +include(common.pri) +qtsingleapplication-uselib:SUBDIRS=buildlib +SUBDIRS+=examples +QT += widgets diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/QtLockedFile b/3rdparty/qtsingleapplication-2.6_1-opensource/src/QtLockedFile new file mode 100644 index 0000000..16b48ba --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/QtLockedFile @@ -0,0 +1 @@ +#include "qtlockedfile.h" diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/QtSingleApplication b/3rdparty/qtsingleapplication-2.6_1-opensource/src/QtSingleApplication new file mode 100644 index 0000000..d111bf7 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/QtSingleApplication @@ -0,0 +1 @@ +#include "qtsingleapplication.h" diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.cpp b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.cpp new file mode 100644 index 0000000..bff13f5 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.cpp @@ -0,0 +1,209 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + + +#include "qtlocalpeer.h" +#include +#include +#include + +#if defined(Q_OS_WIN) +#include +#include +typedef BOOL(WINAPI*PProcessIdToSessionId)(DWORD,DWORD*); +static PProcessIdToSessionId pProcessIdToSessionId = 0; +#endif +#if defined(Q_OS_UNIX) +#include +#include +#endif + +#include +#include + +namespace QtLP_Private { +#include "qtlockedfile.cpp" +#if defined(Q_OS_WIN) +#include "qtlockedfile_win.cpp" +#else +#include "qtlockedfile_unix.cpp" +#endif +} + + +const char* QtLocalPeer::ack = "ack"; + +QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId) + : QObject(parent), id(appId) +{ + QString prefix = id; + if (id.isEmpty()) { + id = QCoreApplication::applicationFilePath(); +#if defined(Q_OS_WIN) + id = id.toLower(); +#endif + prefix = id.section(QLatin1Char('/'), -1); + } + prefix.remove(QRegExp("[^a-zA-Z]")); + prefix.truncate(6); + + QByteArray idc = id.toUtf8(); + quint16 idNum = qChecksum(idc.constData(), idc.size()); + socketName = QLatin1String("qtsingleapp-") + prefix + + QLatin1Char('-') + QString::number(idNum, 16); + +#if defined(Q_OS_WIN) + if (!pProcessIdToSessionId) { + QLibrary lib("kernel32"); + pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve("ProcessIdToSessionId"); + } + if (pProcessIdToSessionId) { + DWORD sessionId = 0; + pProcessIdToSessionId(GetCurrentProcessId(), &sessionId); + socketName += QLatin1Char('-') + QString::number(sessionId, 16); + } +#else + socketName += QLatin1Char('-') + QString::number(getuid(), 16); +#endif + + server = new QLocalServer(this); + QString lockName = QDir(QDir::tempPath()).absolutePath() + + QLatin1Char('/') + socketName + + QLatin1String("-lockfile"); + lockFile.setFileName(lockName); + lockFile.open(QIODevice::ReadWrite); +} + + + +bool QtLocalPeer::isClient() +{ + if (lockFile.isLocked()) + return false; + + if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false)) + return true; + + bool res = server->listen(socketName); +#if defined(Q_OS_UNIX) && (QT_VERSION >= QT_VERSION_CHECK(4,5,0)) + // ### Workaround + if (!res && server->serverError() == QAbstractSocket::AddressInUseError) { + QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName); + res = server->listen(socketName); + } +#endif + if (!res) + qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString())); + QObject::connect(server, SIGNAL(newConnection()), SLOT(receiveConnection())); + return false; +} + + +bool QtLocalPeer::sendMessage(const QString &message, int timeout) +{ + if (!isClient()) + return false; + + QLocalSocket socket; + bool connOk = false; + for(int i = 0; i < 2; i++) { + // Try twice, in case the other instance is just starting up + socket.connectToServer(socketName); + connOk = socket.waitForConnected(timeout/2); + if (connOk || i) + break; + int ms = 250; +#if defined(Q_OS_WIN) + Sleep(DWORD(ms)); +#else + struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 }; + nanosleep(&ts, NULL); +#endif + } + if (!connOk) + return false; + + QByteArray uMsg(message.toUtf8()); + QDataStream ds(&socket); + ds.writeBytes(uMsg.constData(), uMsg.size()); + bool res = socket.waitForBytesWritten(timeout); + res &= socket.waitForReadyRead(timeout); // wait for ack + res &= (socket.read(qstrlen(ack)) == ack); + return res; +} + + +void QtLocalPeer::receiveConnection() +{ + QLocalSocket* socket = server->nextPendingConnection(); + if (!socket) + return; + + while (socket->bytesAvailable() < (int)sizeof(quint32)) + socket->waitForReadyRead(); + QDataStream ds(socket); + QByteArray uMsg; + quint32 remaining; + ds >> remaining; + uMsg.resize(remaining); + int got = 0; + char* uMsgBuf = uMsg.data(); + do { + got = ds.readRawData(uMsgBuf, remaining); + remaining -= got; + uMsgBuf += got; + } while (remaining && got >= 0 && socket->waitForReadyRead(2000)); + if (got < 0) { + qWarning() << "QtLocalPeer: Message reception failed" << socket->errorString(); + delete socket; + return; + } + QString message(QString::fromUtf8(uMsg)); + socket->write(ack, qstrlen(ack)); + socket->waitForBytesWritten(1000); + delete socket; + emit messageReceived(message); //### (might take a long time to return) +} diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.h b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.h new file mode 100644 index 0000000..8a54a9b --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.h @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + + +#include +#include +#include + +namespace QtLP_Private { +#include "qtlockedfile.h" +} + +class QtLocalPeer : public QObject +{ + Q_OBJECT + +public: + QtLocalPeer(QObject *parent = 0, const QString &appId = QString()); + bool isClient(); + bool sendMessage(const QString &message, int timeout); + QString applicationId() const + { return id; } + +Q_SIGNALS: + void messageReceived(const QString &message); + +protected Q_SLOTS: + void receiveConnection(); + +protected: + QString id; + QString socketName; + QLocalServer* server; + QtLP_Private::QtLockedFile lockFile; + +private: + static const char* ack; +}; diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile.cpp b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile.cpp new file mode 100644 index 0000000..2cf0805 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile.cpp @@ -0,0 +1,199 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + +#include "qtlockedfile.h" + +/*! + \class QtLockedFile + + \brief The QtLockedFile class extends QFile with advisory locking + functions. + + A file may be locked in read or write mode. Multiple instances of + \e QtLockedFile, created in multiple processes running on the same + machine, may have a file locked in read mode. Exactly one instance + may have it locked in write mode. A read and a write lock cannot + exist simultaneously on the same file. + + The file locks are advisory. This means that nothing prevents + another process from manipulating a locked file using QFile or + file system functions offered by the OS. Serialization is only + guaranteed if all processes that access the file use + QLockedFile. Also, while holding a lock on a file, a process + must not open the same file again (through any API), or locks + can be unexpectedly lost. + + The lock provided by an instance of \e QtLockedFile is released + whenever the program terminates. This is true even when the + program crashes and no destructors are called. +*/ + +/*! \enum QtLockedFile::LockMode + + This enum describes the available lock modes. + + \value ReadLock A read lock. + \value WriteLock A write lock. + \value NoLock Neither a read lock nor a write lock. +*/ + +/*! + Constructs an unlocked \e QtLockedFile object. This constructor + behaves in the same way as \e QFile::QFile(). + + \sa QFile::QFile() +*/ +QtLockedFile::QtLockedFile() + : QFile() +{ +#ifdef Q_OS_WIN + wmutex = 0; + rmutex = 0; +#endif + m_lock_mode = NoLock; +} + +/*! + Constructs an unlocked QtLockedFile object with file \a name. This + constructor behaves in the same way as \e QFile::QFile(const + QString&). + + \sa QFile::QFile() +*/ +QtLockedFile::QtLockedFile(const QString &name) + : QFile(name) +{ +#ifdef Q_OS_WIN + wmutex = 0; + rmutex = 0; +#endif + m_lock_mode = NoLock; +} + +/*! + Opens the file in OpenMode \a mode. + + This is identical to QFile::open(), with the one exception that the + Truncate mode flag is disallowed. Truncation would conflict with the + advisory file locking, since the file would be modified before the + write lock is obtained. If truncation is required, use resize(0) + after obtaining the write lock. + + Returns true if successful; otherwise false. + + \sa QFile::open(), QFile::resize() +*/ +bool QtLockedFile::open(OpenMode mode) +{ + if (mode & QIODevice::Truncate) { + qWarning("QtLockedFile::open(): Truncate mode not allowed."); + return false; + } + return QFile::open(mode); +} + +/*! + Returns \e true if this object has a in read or write lock; + otherwise returns \e false. + + \sa lockMode() +*/ +bool QtLockedFile::isLocked() const +{ + return m_lock_mode != NoLock; +} + +/*! + Returns the type of lock currently held by this object, or \e + QtLockedFile::NoLock. + + \sa isLocked() +*/ +QtLockedFile::LockMode QtLockedFile::lockMode() const +{ + return m_lock_mode; +} + +/*! + \fn bool QtLockedFile::lock(LockMode mode, bool block = true) + + Obtains a lock of type \a mode. The file must be opened before it + can be locked. + + If \a block is true, this function will block until the lock is + aquired. If \a block is false, this function returns \e false + immediately if the lock cannot be aquired. + + If this object already has a lock of type \a mode, this function + returns \e true immediately. If this object has a lock of a + different type than \a mode, the lock is first released and then a + new lock is obtained. + + This function returns \e true if, after it executes, the file is + locked by this object, and \e false otherwise. + + \sa unlock(), isLocked(), lockMode() +*/ + +/*! + \fn bool QtLockedFile::unlock() + + Releases a lock. + + If the object has no lock, this function returns immediately. + + This function returns \e true if, after it executes, the file is + not locked by this object, and \e false otherwise. + + \sa lock(), isLocked(), lockMode() +*/ + +/*! + \fn QtLockedFile::~QtLockedFile() + + Destroys the \e QtLockedFile object. If any locks were held, they + are released. +*/ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile.h b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile.h new file mode 100644 index 0000000..1d3b918 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile.h @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + +#ifndef QTLOCKEDFILE_H +#define QTLOCKEDFILE_H + +#include +#ifdef Q_OS_WIN +#include +#endif + +#if defined(Q_WS_WIN) +# if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT) +# define QT_QTLOCKEDFILE_EXPORT +# elif defined(QT_QTLOCKEDFILE_IMPORT) +# if defined(QT_QTLOCKEDFILE_EXPORT) +# undef QT_QTLOCKEDFILE_EXPORT +# endif +# define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport) +# elif defined(QT_QTLOCKEDFILE_EXPORT) +# undef QT_QTLOCKEDFILE_EXPORT +# define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport) +# endif +#else +# define QT_QTLOCKEDFILE_EXPORT +#endif + +class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile +{ +public: + enum LockMode { NoLock = 0, ReadLock, WriteLock }; + + QtLockedFile(); + QtLockedFile(const QString &name); + ~QtLockedFile(); + + bool open(OpenMode mode); + + bool lock(LockMode mode, bool block = true); + bool unlock(); + bool isLocked() const; + LockMode lockMode() const; + +private: +#ifdef Q_OS_WIN + Qt::HANDLE wmutex; + Qt::HANDLE rmutex; + QVector rmutexes; + QString mutexname; + + Qt::HANDLE getMutexHandle(int idx, bool doCreate); + bool waitMutex(Qt::HANDLE mutex, bool doBlock); + +#endif + LockMode m_lock_mode; +}; + +#endif diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile_unix.cpp b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile_unix.cpp new file mode 100644 index 0000000..2881bdd --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile_unix.cpp @@ -0,0 +1,121 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + +#include +#include +#include +#include + +#include "qtlockedfile.h" + +bool QtLockedFile::lock(LockMode mode, bool block) +{ + if (!isOpen()) { + qWarning("QtLockedFile::lock(): file is not opened"); + return false; + } + + if (mode == NoLock) + return unlock(); + + if (mode == m_lock_mode) + return true; + + if (m_lock_mode != NoLock) + unlock(); + + struct flock fl; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; + fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK; + int cmd = block ? F_SETLKW : F_SETLK; + int ret = fcntl(handle(), cmd, &fl); + + if (ret == -1) { + if (errno != EINTR && errno != EAGAIN) + qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); + return false; + } + + + m_lock_mode = mode; + return true; +} + + +bool QtLockedFile::unlock() +{ + if (!isOpen()) { + qWarning("QtLockedFile::unlock(): file is not opened"); + return false; + } + + if (!isLocked()) + return true; + + struct flock fl; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; + fl.l_type = F_UNLCK; + int ret = fcntl(handle(), F_SETLKW, &fl); + + if (ret == -1) { + qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); + return false; + } + + m_lock_mode = NoLock; + return true; +} + +QtLockedFile::~QtLockedFile() +{ + if (isOpen()) + unlock(); +} + diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile_win.cpp b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile_win.cpp new file mode 100644 index 0000000..1ac542b --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile_win.cpp @@ -0,0 +1,216 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + +#include "qtlockedfile.h" +#include +#include +#if QT_VERSION >= 0x050000 +#define QT_WA(unicode,ansi) unicode +#endif + +#define MUTEX_PREFIX "QtLockedFile mutex " +// Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS +#define MAX_READERS MAXIMUM_WAIT_OBJECTS + +Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate) +{ + if (mutexname.isEmpty()) { + QFileInfo fi(*this); + mutexname = QString::fromLatin1(MUTEX_PREFIX) + + fi.absoluteFilePath().toLower(); + } + QString mname(mutexname); + if (idx >= 0) + mname += QString::number(idx); + + Qt::HANDLE mutex; + if (doCreate) { + QT_WA( { mutex = CreateMutexW(NULL, FALSE, (LPCWSTR) mname.utf16()); }, + { mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } ); + if (!mutex) { + qErrnoWarning("QtLockedFile::lock(): CreateMutex failed"); + return 0; + } + } + else { + QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (LPCWSTR) mname.utf16()); }, + { mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } ); + if (!mutex) { + if (GetLastError() != ERROR_FILE_NOT_FOUND) + qErrnoWarning("QtLockedFile::lock(): OpenMutex failed"); + return 0; + } + } + return mutex; +} + +bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock) +{ + Q_ASSERT(mutex); + DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0); + switch (res) { + case WAIT_OBJECT_0: + case WAIT_ABANDONED: + return true; + break; + case WAIT_TIMEOUT: + break; + default: + qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed"); + } + return false; +} + + + +bool QtLockedFile::lock(LockMode mode, bool block) +{ + if (!isOpen()) { + qWarning("QtLockedFile::lock(): file is not opened"); + return false; + } + + if (mode == NoLock) + return unlock(); + + if (mode == m_lock_mode) + return true; + + if (m_lock_mode != NoLock) + unlock(); + + if (!wmutex && !(wmutex = getMutexHandle(-1, true))) + return false; + + if (!waitMutex(wmutex, block)) + return false; + + if (mode == ReadLock) { + int idx = 0; + for (; idx < MAX_READERS; idx++) { + rmutex = getMutexHandle(idx, false); + if (!rmutex || waitMutex(rmutex, false)) + break; + CloseHandle(rmutex); + } + bool ok = true; + if (idx >= MAX_READERS) { + qWarning("QtLockedFile::lock(): too many readers"); + rmutex = 0; + ok = false; + } + else if (!rmutex) { + rmutex = getMutexHandle(idx, true); + if (!rmutex || !waitMutex(rmutex, false)) + ok = false; + } + if (!ok && rmutex) { + CloseHandle(rmutex); + rmutex = 0; + } + ReleaseMutex(wmutex); + if (!ok) + return false; + } + else { + Q_ASSERT(rmutexes.isEmpty()); + for (int i = 0; i < MAX_READERS; i++) { + Qt::HANDLE mutex = getMutexHandle(i, false); + if (mutex) + rmutexes.append(mutex); + } + if (rmutexes.size()) { + DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(), + TRUE, block ? INFINITE : 0); + if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) { + if (res != WAIT_TIMEOUT) + qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed"); + m_lock_mode = WriteLock; // trick unlock() to clean up - semiyucky + unlock(); + return false; + } + } + } + + m_lock_mode = mode; + return true; +} + +bool QtLockedFile::unlock() +{ + if (!isOpen()) { + qWarning("QtLockedFile::unlock(): file is not opened"); + return false; + } + + if (!isLocked()) + return true; + + if (m_lock_mode == ReadLock) { + ReleaseMutex(rmutex); + CloseHandle(rmutex); + rmutex = 0; + } + else { + foreach(Qt::HANDLE mutex, rmutexes) { + ReleaseMutex(mutex); + CloseHandle(mutex); + } + rmutexes.clear(); + ReleaseMutex(wmutex); + } + + m_lock_mode = QtLockedFile::NoLock; + return true; +} + +QtLockedFile::~QtLockedFile() +{ + if (isOpen()) + unlock(); + if (wmutex) + CloseHandle(wmutex); +} diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.cpp b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.cpp new file mode 100644 index 0000000..cd5623e --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.cpp @@ -0,0 +1,354 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + + +#include "qtsingleapplication.h" +#include "qtlocalpeer.h" +#include + + +/*! + \class QtSingleApplication qtsingleapplication.h + \brief The QtSingleApplication class provides an API to detect and + communicate with running instances of an application. + + This class allows you to create applications where only one + instance should be running at a time. I.e., if the user tries to + launch another instance, the already running instance will be + activated instead. Another usecase is a client-server system, + where the first started instance will assume the role of server, + and the later instances will act as clients of that server. + + By default, the full path of the executable file is used to + determine whether two processes are instances of the same + application. You can also provide an explicit identifier string + that will be compared instead. + + The application should create the QtSingleApplication object early + in the startup phase, and call isRunning() or sendMessage() to + find out if another instance of this application is already + running. Startup parameters (e.g. the name of the file the user + wanted this new instance to open) can be passed to the running + instance in the sendMessage() function. + + If isRunning() or sendMessage() returns false, it means that no + other instance is running, and this instance has assumed the role + as the running instance. The application should continue with the + initialization of the application user interface before entering + the event loop with exec(), as normal. The messageReceived() + signal will be emitted when the application receives messages from + another instance of the same application. + + If isRunning() or sendMessage() returns true, another instance is + already running, and the application should terminate or enter + client mode. + + If a message is received it might be helpful to the user to raise + the application so that it becomes visible. To facilitate this, + QtSingleApplication provides the setActivationWindow() function + and the activateWindow() slot. + + Here's an example that shows how to convert an existing + application to use QtSingleApplication. It is very simple and does + not make use of all QtSingleApplication's functionality (see the + examples for that). + + \code + // Original + int main(int argc, char **argv) + { + QApplication app(argc, argv); + + MyMainWidget mmw; + + mmw.show(); + return app.exec(); + } + + // Single instance + int main(int argc, char **argv) + { + QtSingleApplication app(argc, argv); + + if (app.isRunning()) + return 0; + + MyMainWidget mmw; + + app.setActivationWindow(&mmw); + + mmw.show(); + return app.exec(); + } + \endcode + + Once this QtSingleApplication instance is destroyed(for example, + when the user quits), when the user next attempts to run the + application this instance will not, of course, be encountered. The + next instance to call isRunning() or sendMessage() will assume the + role as the new running instance. + + For console (non-GUI) applications, QtSingleCoreApplication may be + used instead of this class, to avoid the dependency on the QtGui + library. + + \sa QtSingleCoreApplication +*/ + + +void QtSingleApplication::sysInit(const QString &appId) +{ + actWin = 0; + peer = new QtLocalPeer(this, appId); + connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); +} + + +/*! + Creates a QtSingleApplication object. The application identifier + will be QCoreApplication::applicationFilePath(). \a argc, \a + argv, and \a GUIenabled are passed on to the QAppliation constructor. + + If you are creating a console application (i.e. setting \a + GUIenabled to false), you may consider using + QtSingleCoreApplication instead. +*/ + +QtSingleApplication::QtSingleApplication(int &argc, char **argv, bool GUIenabled) + : QApplication(argc, argv, GUIenabled) +{ + sysInit(); +} + + +/*! + Creates a QtSingleApplication object with the application + identifier \a appId. \a argc and \a argv are passed on to the + QAppliation constructor. +*/ + +QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char **argv) + : QApplication(argc, argv) +{ + sysInit(appId); +} + + +/*! + Creates a QtSingleApplication object. The application identifier + will be QCoreApplication::applicationFilePath(). \a argc, \a + argv, and \a type are passed on to the QAppliation constructor. +*/ +#if 0 +QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type) + : QApplication(argc, argv, type) +{ + sysInit(); +} +#endif + + +#if defined(Q_WS_X11) +/*! + Special constructor for X11, ref. the documentation of + QApplication's corresponding constructor. The application identifier + will be QCoreApplication::applicationFilePath(). \a dpy, \a visual, + and \a cmap are passed on to the QApplication constructor. +*/ +QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE cmap) + : QApplication(dpy, visual, cmap) +{ + sysInit(); +} + +/*! + Special constructor for X11, ref. the documentation of + QApplication's corresponding constructor. The application identifier + will be QCoreApplication::applicationFilePath(). \a dpy, \a argc, \a + argv, \a visual, and \a cmap are passed on to the QApplication + constructor. +*/ +QtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) + : QApplication(dpy, argc, argv, visual, cmap) +{ + sysInit(); +} + +/*! + Special constructor for X11, ref. the documentation of + QApplication's corresponding constructor. The application identifier + will be \a appId. \a dpy, \a argc, \a + argv, \a visual, and \a cmap are passed on to the QApplication + constructor. +*/ +QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) + : QApplication(dpy, argc, argv, visual, cmap) +{ + sysInit(appId); +} +#endif + + +/*! + Returns true if another instance of this application is running; + otherwise false. + + This function does not find instances of this application that are + being run by a different user (on Windows: that are running in + another session). + + \sa sendMessage() +*/ + +bool QtSingleApplication::isRunning() +{ + return peer->isClient(); +} + + +/*! + Tries to send the text \a message to the currently running + instance. The QtSingleApplication object in the running instance + will emit the messageReceived() signal when it receives the + message. + + This function returns true if the message has been sent to, and + processed by, the current instance. If there is no instance + currently running, or if the running instance fails to process the + message within \a timeout milliseconds, this function return false. + + \sa isRunning(), messageReceived() +*/ +bool QtSingleApplication::sendMessage(const QString &message, int timeout) +{ + return peer->sendMessage(message, timeout); +} + + +/*! + Returns the application identifier. Two processes with the same + identifier will be regarded as instances of the same application. +*/ +QString QtSingleApplication::id() const +{ + return peer->applicationId(); +} + + +/*! + Sets the activation window of this application to \a aw. The + activation window is the widget that will be activated by + activateWindow(). This is typically the application's main window. + + If \a activateOnMessage is true (the default), the window will be + activated automatically every time a message is received, just prior + to the messageReceived() signal being emitted. + + \sa activateWindow(), messageReceived() +*/ + +void QtSingleApplication::setActivationWindow(QWidget* aw, bool activateOnMessage) +{ + actWin = aw; + if (activateOnMessage) + connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); + else + disconnect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); +} + + +/*! + Returns the applications activation window if one has been set by + calling setActivationWindow(), otherwise returns 0. + + \sa setActivationWindow() +*/ +QWidget* QtSingleApplication::activationWindow() const +{ + return actWin; +} + + +/*! + De-minimizes, raises, and activates this application's activation window. + This function does nothing if no activation window has been set. + + This is a convenience function to show the user that this + application instance has been activated when he has tried to start + another instance. + + This function should typically be called in response to the + messageReceived() signal. By default, that will happen + automatically, if an activation window has been set. + + \sa setActivationWindow(), messageReceived(), initialize() +*/ +void QtSingleApplication::activateWindow() +{ + if (actWin) { + qDebug() << "QtSingleApplication::activateWindow"; + actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized); + actWin->raise(); + actWin->activateWindow(); + } +} + + +/*! + \fn void QtSingleApplication::messageReceived(const QString& message) + + This signal is emitted when the current instance receives a \a + message from another instance of this application. + + \sa sendMessage(), setActivationWindow(), activateWindow() +*/ + + +/*! + \fn void QtSingleApplication::initialize(bool dummy = true) + + \obsolete +*/ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.h b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.h new file mode 100644 index 0000000..ca2c118 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.h @@ -0,0 +1,105 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + + +#include + +class QtLocalPeer; + +#if defined(Q_WS_WIN) +# if !defined(QT_QTSINGLEAPPLICATION_EXPORT) && !defined(QT_QTSINGLEAPPLICATION_IMPORT) +# define QT_QTSINGLEAPPLICATION_EXPORT +# elif defined(QT_QTSINGLEAPPLICATION_IMPORT) +# if defined(QT_QTSINGLEAPPLICATION_EXPORT) +# undef QT_QTSINGLEAPPLICATION_EXPORT +# endif +# define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllimport) +# elif defined(QT_QTSINGLEAPPLICATION_EXPORT) +# undef QT_QTSINGLEAPPLICATION_EXPORT +# define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllexport) +# endif +#else +# define QT_QTSINGLEAPPLICATION_EXPORT +#endif + +class QT_QTSINGLEAPPLICATION_EXPORT QtSingleApplication : public QApplication +{ + Q_OBJECT + +public: + QtSingleApplication(int &argc, char **argv, bool GUIenabled = true); + QtSingleApplication(const QString &id, int &argc, char **argv); + //QtSingleApplication(int &argc, char **argv, Type type); +#if defined(Q_WS_X11) + QtSingleApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); + QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0); + QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); +#endif + + bool isRunning(); + QString id() const; + + void setActivationWindow(QWidget* aw, bool activateOnMessage = true); + QWidget* activationWindow() const; + + // Obsolete: + void initialize(bool dummy = true) + { isRunning(); Q_UNUSED(dummy) } + +public Q_SLOTS: + bool sendMessage(const QString &message, int timeout = 5000); + void activateWindow(); + + +Q_SIGNALS: + void messageReceived(const QString &message); + + +private: + void sysInit(const QString &appId = QString()); + QtLocalPeer *peer; + QWidget *actWin; +}; diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.pri b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.pri new file mode 100644 index 0000000..f306033 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.pri @@ -0,0 +1,16 @@ +include(../common.pri) +INCLUDEPATH += $$PWD +DEPENDPATH += $$PWD +QT *= network widgets + +qtsingleapplication-uselib:!qtsingleapplication-buildlib { + LIBS += -L$$QTSINGLEAPPLICATION_LIBDIR -l$$QTSINGLEAPPLICATION_LIBNAME +} else { + SOURCES += $$PWD/qtsingleapplication.cpp $$PWD/qtlocalpeer.cpp + HEADERS += $$PWD/qtsingleapplication.h $$PWD/qtlocalpeer.h +} + +win32 { + contains(TEMPLATE, lib):contains(CONFIG, shared):DEFINES += QT_QTSINGLEAPPLICATION_EXPORT + else:qtsingleapplication-uselib:DEFINES += QT_QTSINGLEAPPLICATION_IMPORT +} diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.cpp b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.cpp new file mode 100644 index 0000000..307e255 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.cpp @@ -0,0 +1,155 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + + +#include "qtsinglecoreapplication.h" +#include "qtlocalpeer.h" + +/*! + \class QtSingleCoreApplication qtsinglecoreapplication.h + \brief A variant of the QtSingleApplication class for non-GUI applications. + + This class is a variant of QtSingleApplication suited for use in + console (non-GUI) applications. It is an extension of + QCoreApplication (instead of QApplication). It does not require + the QtGui library. + + The API and usage is identical to QtSingleApplication, except that + functions relating to the "activation window" are not present, for + obvious reasons. Please refer to the QtSingleApplication + documentation for explanation of the usage. + + A QtSingleCoreApplication instance can communicate to a + QtSingleApplication instance if they share the same application + id. Hence, this class can be used to create a light-weight + command-line tool that sends commands to a GUI application. + + \sa QtSingleApplication +*/ + +/*! + Creates a QtSingleCoreApplication object. The application identifier + will be QCoreApplication::applicationFilePath(). \a argc and \a + argv are passed on to the QCoreAppliation constructor. +*/ + +QtSingleCoreApplication::QtSingleCoreApplication(int &argc, char **argv) + : QCoreApplication(argc, argv) +{ + peer = new QtLocalPeer(this); + connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); +} + + +/*! + Creates a QtSingleCoreApplication object with the application + identifier \a appId. \a argc and \a argv are passed on to the + QCoreAppliation constructor. +*/ +QtSingleCoreApplication::QtSingleCoreApplication(const QString &appId, int &argc, char **argv) + : QCoreApplication(argc, argv) +{ + peer = new QtLocalPeer(this, appId); + connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); +} + + +/*! + Returns true if another instance of this application is running; + otherwise false. + + This function does not find instances of this application that are + being run by a different user (on Windows: that are running in + another session). + + \sa sendMessage() +*/ + +bool QtSingleCoreApplication::isRunning() +{ + return peer->isClient(); +} + + +/*! + Tries to send the text \a message to the currently running + instance. The QtSingleCoreApplication object in the running instance + will emit the messageReceived() signal when it receives the + message. + + This function returns true if the message has been sent to, and + processed by, the current instance. If there is no instance + currently running, or if the running instance fails to process the + message within \a timeout milliseconds, this function return false. + + \sa isRunning(), messageReceived() +*/ + +bool QtSingleCoreApplication::sendMessage(const QString &message, int timeout) +{ + return peer->sendMessage(message, timeout); +} + + +/*! + Returns the application identifier. Two processes with the same + identifier will be regarded as instances of the same application. +*/ + +QString QtSingleCoreApplication::id() const +{ + return peer->applicationId(); +} + + +/*! + \fn void QtSingleCoreApplication::messageReceived(const QString& message) + + This signal is emitted when the current instance receives a \a + message from another instance of this application. + + \sa sendMessage() +*/ diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.h b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.h new file mode 100644 index 0000000..8e2fda6 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + + +#include + +class QtLocalPeer; + +class QtSingleCoreApplication : public QCoreApplication +{ + Q_OBJECT + +public: + QtSingleCoreApplication(int &argc, char **argv); + QtSingleCoreApplication(const QString &id, int &argc, char **argv); + + bool isRunning(); + QString id() const; + +public Q_SLOTS: + bool sendMessage(const QString &message, int timeout = 5000); + + +Q_SIGNALS: + void messageReceived(const QString &message); + + +private: + QtLocalPeer* peer; +}; diff --git a/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.pri b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.pri new file mode 100644 index 0000000..d2d6cc3 --- /dev/null +++ b/3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.pri @@ -0,0 +1,10 @@ +INCLUDEPATH += $$PWD +DEPENDPATH += $$PWD +HEADERS += $$PWD/qtsinglecoreapplication.h $$PWD/qtlocalpeer.h +SOURCES += $$PWD/qtsinglecoreapplication.cpp $$PWD/qtlocalpeer.cpp + +QT *= network + +win32:contains(TEMPLATE, lib):contains(CONFIG, shared) { + DEFINES += QT_QTSINGLECOREAPPLICATION_EXPORT=__declspec(dllexport) +} diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..58698ea --- /dev/null +++ b/AUTHORS @@ -0,0 +1,30 @@ +Copyright 2006-2016 Bart Vanhauwaert, Chris Browet, Ladislav Láska and others + +ACTIVE CONTRIBUTORS + +Ladislav Láska + +PAST CONTRIBUTORS + +Bart Vanhauwaert bvh-osm@irule.be +Chris "Koying" Browet +Elrond elrond+openstreetmap.org@samba-tng.org +Oliver Heesakkers +Patric Cameron +Geoff Richards +Raphael Studer +Matt Williams +Daniel van Gerpen +Colin Marquardt +Andreas Laas +Vincent Meurisse +Dirk Stöcker +Tomás Mika +Yves "LonelyPixel" Goergen +Toby Speight +James Hogan +Richard Brinkman +Balgofil + +Merkaartor uses icons from the Tango Desktop Project +(http://tango-freedesktop.org/) diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..190bf31 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,992 @@ +This is a shortened changelog. See the Git commits for a full list of changes. + +v0.19.0 + * FIX: Fixed various GDAL import issues on all platforms. + * CHG: Projection engine no longer enables coordinate wrapping by default. + * CHG: Projection no longer guesses some EPSG projections only based on string contained, but rather requires it being an exact match. + * CHG: Added support for newer Proj.4 versions. + * CHG: Improved logging output. + * CHG: Added support for gpsd 3.20 and newer + * CHG: Automated translation handling not to include less than 50% translated languages (PR #250). + * FIX: Fixed undo for join ways interaction (PR #239). + * FIX: Disabled virtual node selection to avoid crash when applying interactions to virtual nodes. (PR #254, original issue described in PR #240). + * FIX: Fixed undo for build bridge too. + +v0.18.4 + * FIX: Fixed "Create rectangular building" when panning (issue 125). + * FIX: Fixed wrong GPS track rendering of anonymized tracks (issue 181). + * FIX: Fixed a few bugs in gpsd handling. + * FIX: Fixed remote control not to trigger multiple downloads (issue 147). + * FIX: Fixed parsing of some OSM links. + * FIX: Fixed import of some GPX files. + * FIX: Updated GDAL, Proj.4 and Exiv2 code to support newer versions. + * FIX: Fixed wrong DPI when printing and exporting map. + * FIX: Fixed OSM renderer caching mechanism. + * FIX: Fixed wheel zooming speeds. + * FIX: Various stability issues. + * FIX: Various typos. + * DEL: Removed broken plugins: gosmore, NavigBackground, Yahoo imagery. + * DEL: Removed mobilemerk (unused and unusable build profile). + * DEL: Spatialite backend (unused and unusable data backend). + +v0.18.3 + * ADD : Updated slippy map to allow selection. + * ADD : Implemented relation filter, based on current selection. + * ADD : Implement /add_node command in JOSM Remote control. + * ADD : Tuned the "Create roundabout" tool. + * ADD : Added support for mapy.cz address parser. + * CHG : Reworked upload dialog to include some statistics and encourage description. + * CHG : Changed semantics of Open and Import, separated GDAL Import. + * CHG : Increased max zoom in slippy map to 19. + * FIX : Various crash fixes and code cleanup. + * FIX : Fixed drawing of transparent background imagery. + * FIX : Fix qDebug() output on Windows. + * FIX : Fixed screen update while panning with keys. + * FIX : Fixed segfault on loading non-existent file. + * FIX : Fixed import of some NMEA formats (Garmin GLO). + * FIX : Fix gpsdata handling for gpsd >= 3.12 + * FIX : Partially fixed printing. + * FIX : Fixed GDAL imports for GDAL 2.0. + * DEL : Removed OpenStreetBugs references (service no longer exists). + +v0.18.2 + * CHG : Updated spatialite API to 4.1.0 version using spatialite_init_ex(). + * FIX : Updated the INSTALL file with current instructions both for Linux and Windows. + * FIX : Fixed version info on Linux, and added 32/64bit information to the version string. + * CHG : Migrated GDAL to 2.0 API. + * ADD : Improved Windows Installer splash image. + * FIX : Fixed a lot of the Windows build system. + * DEL : Remove semperMerk + * FIX : Fix bug #44: infinite loop in network code when password is wrong. + * FIX : Use proper capitalization for the Qt framework + * FIX : Fix build failure with Qt 5.5 snapshot + * FIX : Plugin path and debug builds fixed. + * DEL : Removed reference to qWinMsgHandler. + * CHG : Updated install instructions to reflect debug/release. + * FIX : Removed the Win32 assembly in Layers/OsmRenderLayer.cpp + * FIX : Fixed some plugin interfaces for Qt 5. + * DEL : Removed plugins/qtstyle. + * FIX : Fixed file saving. + * CHG : Clean up DownloadOSM a bit. + * FIX : Update after upload. + * CHG : Remove all remaining references to Boost, incl. translations + * CHG : Remove built-in GGL copy + * CHG : Keep Symbian #ifndef's for busy cursors in one place only + * CHG : Move single file importing into separate method + * ChG : Merge uselessly explicit management of MapAdapter implementations + * CHG : Factor together some instances of preference file localization + * CHG : Better name for MerkaartorPreferences::loadBookmark + * CHG : Factor together loading of QSettings + * FIX : Fixed Wireframe.mas style. + * ADD : Support for address sanitizer. + * FIX : Fixed random crashes while changing styles. + * CHG : Removed the use of IDocument in OsmRenderLayer and MapView. + * FIX : Segfault in QRegExp. + * ADD : travis-ci automated builds. + * ADD : Qt 5 support. + * FIX : A potential deadlock in Realtion/Way. + * FIX : Replace bashism in Config.pri + * ADD : Support for building with system qtsingleapplication and quazip + * FIX : Fixed crash on moving virtual node. + * CHG : Added debug_and_release CONFIG option. + * FIX : Fixed loading of plugins (at least for some cases). + * FIX : Moved the QToolBarDialog into src/. + * FIX : Removed the inline assembler in OsmRenderLayer.cpp + * FIX : Added locking to Feature::updatePainters. + * ADD : The openstreetmap.org/#map= URL parsing. + * FIX : Re-enable virtual node movement. + * FIX : After layer is closed, all of its features are deleted. + * FIX : Define QT_WA macro on Qt 5 to always use unicode. + * FIX : Conflict sometimes create Nodes without layers. + * FIX : Fix building markaartor on arm. + * FIX : Fix building with gcc 4.7 and later. + * FIX : Merkaartor needs to link libsqlite3. + * FIX : Replaced the static version of quazip with a new one. + * CHG : Updated Authors. + * FIX : Removed 3 memory leaks + * FIX : Splitting of roads containing duplicate nodes + * FIX : Fixed SlippyMap (bad requests caused by a typo). + * FIX : Minor fixes in the Qt 4/Qt 5 usage. + * DEL : Removed the qtstyle plugins from compilation. + * FIX : Updated the plugin interface for Qt 5. + * FIX : Removed deprecated call to ::translate. + * FIX : Added locking to Way::add and Way::remove. + * ADD : Implemented jOSM-like load_objects feature. + * FIX : Don't try GET … /full on nodes, as API does not support it. + * FIX : GDAL crash + * FIX : Virtual nodes not highlighted on hover (fixes #3333) + * FIX : French cadastre parsing issue (fixes #3334) + * FIX : openSUSE build + * FIX : libgps20 build fix (from Dirk Stocker) + * FIX : Secondary road simple color + * FIX : Assert "width > 0" with wireframe with style + +v0.18 + * ADD : Self-contained style packages (*.msz) + * FIX : Mutex deadlock (refs #3319) + * FIX : Protect updatemeta (fixes #3317) + * ADD : Allow showing/hiding the toolbars labels (toolbar context menu) + * ADD : "Select parent(s)" & "Download missing children" to the Feature menu (refs #3314) + * FIX : Force redrawing the osm map when zooming (fixes #3316) + * FIX : Mutex-lock update of the painters (fixes #3315) + * ADD : Preferences regarding rendering during edition + Wireframe view + * CHG : Switch to wireframe while editing + * FIX : Clipboard crash at launch + * FIX : Crash in merge nodes when merging last node (fixes #3309) + * FIX : Crash when loading images + * ADD : Support for MapDust + * CHG : Deprecate Yahoo background + * FIX : Set Content-type to 'text/xml' for OSM uploads (fixes #3307) + * FIX : Handle more multipolygon cases (closes #3295) + * FIX : Problem parsing WMS layer value in editor (fixes #3301) + * FIX : Stylizing "natural=coastline" in Mapnik* styles only (fixes #3283) + * FIX : Improve rendering of multipolygon buildings + * FIX : Properly cascade to relation a way deletion (fixes #3300) + * FIX : Solve moving nested relations (fixes #3290) + * FIX : Set minimal size on "Key" column to avoid 0 width (fixes #3289) + * FIX : url.port(80) returns P instead of port number (fixes #3296) + * ADD : Added Denmark - Fugro Aerial Imagery to TmsServerList + * ADD : Preference to disable Antialiasing + disable while panning (closes #3284) + * FIX : "Fixed" Lat/Lon grid (fixes #3282) + * FIX : Export 'speed' attribute in GPX (fixes #3280) + * ADD : Press 'c' in the geoimage dock to center the map on the image coordinates (closes #3271) + * CHG : Replace all links in the Info dock by a single one pointing to the "browse" interface on OSM + * ADD : Add support for "https://www.openstreetmap.org/browse/…" type of URL in the download dialog + * FIX : Shortcuts not restored if default exists (fixes #3277) + * ADD : New "Wireframe" style + * FIX : Handle negative id numbers in tag selector (fixes #3269) + * FIX : Crash with tag selector without value (fixes #3276) + * ADD : "Rebuild history" tool, for when history got corrupted + * ADD : Scale tool: If one and only one node is selected besides ways, scale around this node rather than around the geometrical center + * ADD : Rotate tool: If one and only one node is selected besides ways, rotate around this node rather than around the geometrical center + * ADD : Implement Bing Road Detect api (closes #3252) + * FIX : Crash when creating a tag template based upon an empty one (fixes #3250) + * FIX : Crash with --ignore-preferences + * FIX : Unblock indexing after an aborted download, too (fixes #3248) + * FIX : Harden Filter Editor (fixes #3247) + * FIX : Do not simplify (i.e. remove) nodes outside the downloaded area (fixes #3246) + * FIX : Issue when creating nodes when active layer is closed (fixes #3244) + * ADD : Rebuild an uploadable history if it gets corrupted (refs #3233) + * ADD : Allow full regexp in tag selector (enclosed with '/') (closes #3218) + * FIX : Background cache size not limited (fixes #3227) + * FIX : Do not save local to registry in portable mode + * FIX : Do not create ~/.merkaartor in portable mode + * FIX : Handle UTF8 in GDAL fields + * CHG : When doing GDAL imports, always confirm input projection + * ADD : Allow using projection chooser in projection editor + * ADD : Allow entering WKT in projection chooser + * ADD : Goto dialog: Allow showing/editing coordinates in projected units + * FIX : Only check styles for POI nodes + * FIX : Feature dock: Relations not shown in "All' tab + * FIX : log2 not available on FreeBSD (fixes #3211) + * FIX : Make sure new id's are unique (fixes #3223) + * FIX : Background image refresh issue when going to tiled from direct (e.g. GeoTIFF) + * DEL : Remove unmaintained own OSM Binary format + * FIX : Import all GDAL layers + * ADD : Import PBF +v0.17 + * FIX : Problem importing OSM comprising new features + * ADD : Move "validation" style rules to a new "Validation.mas" style + * ADD : Allow aligning background image with +pan + * CHG : Rename "Create rectangle" to "Create rectangular building" and automatically add "building=yes" + * ADD : Remember "Create polygon" last number of sides + * ADD : "Relation->Add to Multipolygon"; allows creating or adding to a multipolygon relation (closes 2889) + * ADD : Network timeout preference + * CHG : Paste Tags : Allow any<->any pasting but only takes top level features into account (fixes #3174) + * FIX : When loading history from MDC, do not import the command if the layer is not found + save layers dirty level in MDC (fixes #3176) + * FIX : Locked zoom was bugged since passage to real pixel per Meter (fixes #3175) + * FIX : Allow creating a way in non-separate move mode with a virtual node selected (fixes #3172) + * FIX : Revert to custom icon for move interaction on MAC (fixes #3170) + * FIX : GeoTIFF + GDAL backgrounds: Allow specifying an automatic "source" tag via the plugin menu + * ADD : Bing map plugin + * FIX : GDAL + GeoTIFF: If a ESRI World File (.tfw, *.wld) is present, override file geotransform + * FIX : GDAL + GeoTIFF: If the projection cannot be determined, ask for it rather than fail + * ADD : Printing: Add option to show/hide unstyled features + * FIX : Cannot access TMS servers that Min-zoom equals Max-zoom (fixes #3157) + * ADD : GDAL raster background plugin + * FIX : WMS Editor - Handle Styles properly + * ADD : Explicitly add GML to the list of supported format (via GDAL) + * ADD : Bicycle style by Markus Straub + * ADD : Styles : allow texturing areas with an icon + * CHG : When opening/importing, always fallback to GDAL if available. Allows opening most GDAL supported geomtery files. + * ADD : Vector map layers + * ADD : Allow "[*] is xxx" (or "*=xxx") construct in tag selection. Means a feature match if any of its tags has xxx as a value (fixes #3146) + * ADD : Do not allow deleting OSM nodes in non-downloaded areas (refs #3083) + * ADD : Save the downloaded areas in the MDC. Expired after 12h. + * ADD : Allow specifying the Nominatim URL in preferences + * ADD : French Cadastre plugin + * FIX : Infloop on next/previous image when none visible (fixes #3135) + * CHG : Do not wait for "CLOSE changeset" response + * ADD : Provision for a license term url to be agreed for map backgrounds + * ADD : Proper User-Agent for network requests + * ADD : Auto-add "source" tag when drawing over a background map; define the value in the WMS and TMS editors + * FIX : Filter out invalid value for first Tag list column width (fixes #3129) + * FIX : Remove tags from autocomplete suggestions when cleared from features (fixes #3113) + * ADD : Allow starting merkaartor with a document template specified in preferences + * CHG : Layers & View settings are now saved in a $HOME/Startup.mdc document rather than thru QSettings + * ADD : New CL options: "--ignore-preferences" && "--reset-preferences" + * FIX : Re-enable PgUp/PgDown in Geoimage dock (dock must be focused) (fixes #3126); coincidentaly, PgUp/PgDown for zooming only works when the map view is focused. + * FIX : If a document cannot be saved (e.g. is readonly), propose the "Save as…" dialog (fixes #3125) + * CHG : Split Rotation interaction between pure rotation and scale + * ADD : When creating a way or area, press "P" to snap the current segment as a parallel of the closest existing segment with the same general direction + * ADD : Extrude interaction for ways (JOSM style) + * ADD : When creating a way or area, press "C" to close the current way + * FIX : Remove dependency on GDAL data files when importing OSGB36 shapefiles + correct projection (closes #3119) + * ADD : New preference: "Allow node/way creation in select mode". When checked, allows double-click to create a node and double-click on a node to start a way in select mode. + * ADD : When drawing ways, double-clicking finishes the current way (Potlach/JOSM style) + * ADD : Way segments: Keeping ALT depressed allows moving a way segment + * ADD : In Road creation mode, double-click creates a new node + * ADD : Hardcoded PgUp/PgDown for Zoom in/Zoom out (Potlach style) + * ADD : Snap to angle functionality when creating way: keeping "o" pressed snap to 45° angles, "h" snap to 30° angles + * ADD : Ability to enter and select multiple OSM servers in preferences (closes #3107) + * ADD : "--importag-tags-as-is" command-line switch to prevent adding underscores to imported tags (closes #3102) + * CHG : Use Nominatim (https://nominatim.openstreetmap.org/) for place name lookup due to gazetteer closure + * ADD : Cut functionality + * ADD : Double-clicking a feature selects the feature and its children + * CHG : Style update + * ADD : Style Editor: allow filtering the style list + * FIX : Styles: draw icons for ways, too + * FIX : Allow shrinking properties dock + * ADD : Support for XAPI + * ADD : ":dirty" and ":uploaded" pseudo tags for finding/filtering + * CHG : Remove builtin "Dirty" and "Uploaded" layers. Those are now managed at feature level. + * ADD : Allow renaming a layer by double-clicking on its name + * FIX : Initial viewport issue + * ADD : View menu item allowing to highlight "dirty" features, i.e., features ready for upload + * FIX : Do not export incomplete features + * FIX : CSV import bugs + * ADD : Display tags in info dock + * FIX : Use "GPX track width" setting even when not in "Simple track appearance" (fixes #3095) + * ADD : If a shapefile do not provide its projection, ask the user for it and do not crash (fixes #3087) + * ADD : "Set view projection to layer's" action added to image layers; set the main projection to the one of the layer + * ADD : "Close" action to image layers + * ADD : Allow plugins to save parameters in a .mdc document; allows, e.g.; to save the filename of a GeoTIFF + * ADD : Add a "Properties" dialog to display various info about the current document + * ADD : Save projection in .MDC files + * CHG : Do not save the projection in preferences unless the projection is specified thru the menu + * ADD : Re-introduce PROJ4 as a build-time optional dependency for projections. It is probably needed for exotic projections... + * FIX : Implement new ID's as global incremented 64-bits integer (fixes #3082) + * FIX : Lat/lon grid fixes for non-othogonal projections + * FIX : For non-rthogonal projections, maximize the viewport in lat/lon + * FIX : Handle empty style list in editor (fixes #3079) + * FIX : Fix scale bar to take latitude into account. + * ADD : Tool to align edges to regularly spaced angles (can orthogonalise buildings) + * FIX : Do not tag-match relation's children unless the type is "multippolygon" (fixes #2916) + * ADD : Support for potlach-style TMS URL (with "!") and "%x", "%y", "%z" in addition to "%1", "%2", "%3" + * ADD : Join areas tool + * FIX : Problem with "Bottom-left standard" TMS + * ADD : Printing + * ADD : Hungarian translation by Peter Sulyok + * CHG : Allow panning with middle mouse button + * ADD : Toolbar editor (create/modify tollbars) + * FIX : OSX fix + * FIX : Draw relations children dashed to avoid multiple parent drawing + * FIX : Fix several issues with features dock. + * FIX : Fix reappearance of deleted features. + * FIX : Fix WayRemoveNodeCommand reversibility. + * ADD : Allow moving complete relations + * FIX : WMS'es in EPSG:4326 not showing + * FIX : Don't overzoom on layer zoom (and don't allow if the bbox is null). fixes #3046 + * ADD : Add a "portable" mode to Merkaartor via command-line ("-p") or build setting ("PORTABLE=1") + * ADD : Add a "Find" button to the Feature dock. Press "Reset" to revert to list current features. + * CHG : Use TagSelector for "Edit-Find" + * ADD : Pseudo-tag key :id, :user, :version, :time to TagSelector + * ADD : Added subdivide, area split, spread nodes, and terracing tools (by James Hogan) + * ADD : Read-only filter system +v0.16 + * CHG : Split the view menu into a new "Show" menu + * CHG : Move Merkaartor's config from ~/.config/BartVanhauwaert to ~/.config/Merkaartor (or platform specific equivalent) + * FIX : For consistency, when deleting the end-node of a polygon, don't break it (fixes #2983) + * ADD : Ramer-Douglas-Peucker simplification of ways (in Roads menu) + * CHG : Only allows one instance of Merkaartor (override with "-n") + * ADD : Support for JOSM remote protocol on port 8111 + * FIX : Reduce browserimagemanger timeout, improving Yahoo responsiveness + * FIX : Do not overwrite local lists with the ones from OSM user preferences + * FIX : Check menu status whene resetting properties dock (fixes #2930) + * CHG : Don't autocomplete pure numeric values (fixes #2951) + * ADD : Support for "standard" (as in http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification) TMS servers + * FIX : Make JOSM happy about our .osm export (fixes #2952) + * ADD : Preliminary support for OpenStreetBugs (Refs #983) + * ADD : POC of a Gosmore map adapter + * FIX : Allow one to "Force Upload" relations, too (fixes #2926) + * FIX : Update Feature dock when document content changes (fixes #2923) + * CHG : Change way the virtual nodes are handled + * CHG : Allow tag pasting between different classes of features + * CHG : Use a different spatial index provider + * ADD : Allow deleting features from the context menu of the Features dock + * ADD : Accept mlon/mlat URLs as emitted by mkgmap logging + * ADD : Walking Papers backgound plugin + load WP scans as geotagged images + * ADD : Import from OSC (osmChange format) + * ADD : Feature-Force Delete action (deletes the feature without entry in the undo nor upload list) + * CHG : Switch to transactional diff uploads to OSM to harden the process + * ADD : Export to OSC (osmChange format) + * ADD : CSV POI import + * FIX : Crash when closing layer with virtual nodes (fixes #2858) + * ADD : OSGB36 to the default list of projections + * CHG : Allow adding images to a GeoTIFF layer + * ADD : Add SHP feature attributes as not uploadable OSM Feature tags + * FIX : Allow loading OS VectorMap District shapefiles + * ADD : Allow saving geotagged images + * CHG : Enhanced support for geotagged images drag&drop + * CHG : Geotag support enhancements + * FIX : Use gpsd API and implement gpsd-ng + * FIX : Do not take closed layers into account when choosing photo layer (fixes #2823) + * ADD : Show geotagged photos on the map (disable via 'view-Show Photos on map') + * FIX : Crash when closing layers containing photos (fixes #2828) + * CHG : Allow importing geotagged photos when no track layer is present (closes #2827) + * ADD : Templates xsd (by Jonathan Bennett) (closes #2809; closes #2707) + * ADD : Allow re-ordering relation members (closes #2759) + * FIX : Solves a problem when hovering large relations + * ADD : Add a projection editor + * ADD : Allow google maps links in goto and download dialogs + * FIX : Abort tile downloading when zooming + * ADD : Allow tiling (and caching) arbitrary WMS'es (only EPSG:4326 and google projection supported) + * CHG : Rework "Zoom lock" and move it to the view menu + * ADD : Support for WMS-C servers (see http://wiki.openstreetmap.org/wiki/Merkaartor/Documentation#WMS-C_Servers) (closes #2598) + * FIX : Problem when joining ways + * CHG : Hardcode "lat/long", i.e. EPSG:4326, projection + * CHG : Hardcode "Google" projection. + * CHG : Adapt TMS code to allow for non-google projections + * ADD : Add the possibility to show a lat/lon grid + * FIX : Delete a way when its second to last node is deleted (fixes #2786) + * FIX : Make sure polygons are at least 1 pixel wide when drawing them at creation time + * FIX : Do not count deleted parents when removing children nodes (fixes #2785) + * FIX : Make sure not to write to the log after it has been closed (fixes #2783) + * FIX : OSX Qt system translations location (by Aleksandar) + * FIX : Update language of language combo after language change (by Alaeksandar) + * FIX : Only allow virtual node updates after relations resolution (by Trav)(closes #2782) + * ADD : Allow zooming on the location of a GeoTIFF image + * FIX : Do not updateindex() if the feature is deleted + * FIX : Roads not always refreshed when changing type or properties (fixes #2773) + * FIX : Cannot cleanly copy tags from one relation to another (fixes #2746) + * FIX : When merging contiguous nodes in the same way, check that we don't add the same node twice (fixes #2771) + * ADD : Brazilian Portuguese translation (by Marcio Moraes) + * FIX : OSX enhacements (by Aleksandar Topuzovic) (closes #2774) + * FIX : When nodes are hidden,do not put them in the way of selecting roads + * FIX : Avoid multiple updateVirtuals() at download time by disabling it and doing them all when the download is done + * FIX : Speedup node moving by disabling virtual nodes and index updates during drag + * FIX : Crash when coming from "Separate move mode" and a feature is selected. + * CHG : Move the "File-Render" menu to "File-Export-Raster/SVG" +v0.15 + * FIX : In about box, the changelog is now properly resized + * ADD : Support for OSM short link as input + * ADD : Show distance measurement during area creation (closes #1640) + * ADD : Add language to changeset created_by (closes #2369) + * FIX : Add support for HTTP auth to TMS (by Trav) (closes #2473) + * FIX : Crash in tag selection with invalid "not" expression (fixes #2722) + * FIX : Joining 2 ways to create an area doesn't create a polygon if the 2 ways have opposite directions (fixes #2718) + * FIX : Improve tag completion behaviour (by Trav) (closes #2716) + * ADD : Add GlobeXplorer (DigitalGlobe) to default WMS list (by sim6) (closes #2714) + * FIX : Handle case of selection being reset during tag editing (fixes #2646) + * ADD : Make the point where nodes are not displayed configurable + * FIX : Do not allow node interaction when they are not displayed (closes #2674) + * FIX : 100% CPU usage and Crash on creating roundabout (fixes #2659) + * FIX : No name in for gpx track layer in Layers menu after File -> Import. Patch by Trav (closes #2661) + * CHG : Keep directional arrows blue for oneway roads in "Show directional arrows - Always" mode. + * ADD : GeoTIFF background plugin (closes #1025) + * ADD : Grabbing hand icon in single mouse mode + * FIX : Layers menu entry for background layer is wrong at startup. Patch by Trav (closes #2641) + * ADD : When in "single mouse button" mode, allow canceling most operation with a right-click + * ADD : "Zoom lock" mode. Zoom steps are locked to TMS ones and projection is locked to Mercator + * FIX : Get sharper Yahoo images (closes #2623) + * FIX : Rag value "Fast food" should be "fast_food" (closes #2625) + * ADD : Add a preference disallowing selection of relations when hidden + * ADD : Add japanese and ukrainian languages to Windows installer (fixes #2619) + * ADD : Automatic SVN revision number in about dialog and elsewhere (closes #2208) + * FIX : URL's in about dialog (fixes #2606) + * FIX : Export trackpoints time when exporting GPX (fixes #2594) + * ADD : Virtual nodes allow fast creation of intermediary nodes (closes #821) + * ADD : Allow moving node in Node creation mode (closes #1910) + * CHG : Only generate log files on request (--log) on release builds + * FIX : Speedup epsg:4326 projection + * FIX : WMS projection related bugfixes + * ADD : Re-added tiled Yahoo! imagery as a plugin + * ADD : NearMap Austalian TMS to the default list + * FIX : Corrected issues in image downloading + * FIX : Set "yes" as default to request for saving .mdc file after upload + * FIX : Crash with self-intersecting polygons (fixes #2317) + * FIX : Assert when drawing scale (fixes #2347) + * FIX : Do not add the "oneway" tag on roundabouts (implied) + * FIX : Crashes on editing style None.mas by Stefan (Konink?) (fixes #2200) + * FIX : Tiles network patch by Tom Verbeure (refs #2316) + * FIX : Align nodes patch by Chris Baird (closes #2296) + * ADD : Mac OS X icon (closes #2254) + * FIX : Force custom Qt style if Qt runtime version < 4.5.1 (fixes #2204) + * ADD : Allow all platforms to connect to a gpsd backend + * FIX : Set gpsd output to NMEA; allow saving log + * FIX : Do not draw background if saved pixmap is null as a copy of a null pixmap seems to crash on Mac (fixes #2262) + * FIX : Fixes MacOSX plugin dir (fixes #2253) + * FIX : Handle latlong projection in SHP files (fixes #2183) + * FIX : Remove s60 extensions (fixes #2185) + * FIX : Allow non-uploadable nodes to be uploaded when they are part of of a created road (fixes #2175) + * FIX : Fixes building Merkaartor 0.14 with the -Werror=format-security CFLAG, which is used by default in Mandriva + * FIX : Remove Yahoo when NOUSEWEBKIT is enabled +v0.14 + * FIX : Optimize painter/style update + * FIX : XML encode the changeset comments (fixes #2115) + * ADD : Ability to create house numbers "Karlsruhe" style + * FIX : Avoid infinite loop with imbricated relations + * CHG : Remove API 0.5 option + * ADD : Alternative way of drawing tracks + * FIX : Don't fail importing lower-cased filenames + * ADD : Select a relation member by contextual menu + * CHG : Do not select a relation member when doing a "Center…" + * ADD : Clicking on a relation member highlights it + * ADD : Add a Features dock displaying the features in the current viewport + * ADD : Add a case-sensitiveness option to the search + search by ID (closes #1509) + * CHG : Remove support for osmarender (fixes #1966) + * ADD : Allow multi-selection of layers; allow one to show/hide or readonly several layers at once (closes #1798) + * ADD : Also export routes in GPX + * ADD : Paste features as a whole (closes #1807) + * ADD : Spatial indexing of features for faster display with large downloaded areas. + * ADD : Built-in list of epsg projections (from proj4) + * CHG : Replaced "Commit…" command by "Force Upload". Allows forcing update of existing features or to upload imported features (such as SHP, KML, ...) + * FIX : User preferences thru OSM preferences system works again + * FIX : Support projections when importing SHP files + * ADD : Drag & drop re-ordering of the layers + * ADD : Support for multiple image layers (closes #1400) + * CHG : Load Yahoo background as a whole rather than in pseudo-tile + * FIX : Take layer tag into account for drawing priority (fixes #1792) + * FIX : Relations were no more drawn according to style + * ADD : Interactions help in the info dock + * ADD : Generic polygons creation (closes #1808) + * FIX : Never loose selection when Ctrl- or Shift-clicking (fixes #1793) + * FIX : Allow move of multiple selected features + * ADD : Rotate function + * FIX : Give title to progress dialogs (fixes #1512) + * ADD : WMS Editor: Display user-friendly layers/projection list based on capabilities + * ADD : Display plain trackpoint description/comment in infodock if found (closes #1788) + * FIX : First node of a new way not connected to existing way after upload (fixes #1774; fixes #1780) + * CHG : Changed way to handle WMS. Should allow exotic projections and eliminate problems. + * ADD : Create road junction function (closes #1661) + * FIX : Force the addition of children of imported features (might solve some "prerequisites" errors) + * FIX : Import & export JOSM compatible .osm (fixes #1163) + * ADD : Log file for debugging output + * ADD : Standard command-line arguments (-h, -v, …) (fixes #1712) + * FIX : Use application-wide proxy (fixes #1763) + * ADD : Allow specifying a user/password for the proxy (untested by me) + * FIX : Photo localization patch from Toby Speight. + * FIX : Set version of newly uploaded objects at 1. + * FIX : Graphical corruption on Intel chipsets when "Show downloaded areas" was enabled + * FIX : API 0.6: Add features version number in MDC'es + * FIX : API 0.6: Fix info dock links + * FIX : Problem with "center" & "center & zoom" from the properties dock + * FIX : API 0.6: Error when deleting a road with no nodes (fixes #1732) + * FIX : Correctly handle plural forms in MapLayer information + * FIX : API 0.6: Do not add "created_by" to changed features (fixes #1728) + * FIX : API 0.6: Allow defining a comment on a changeset (fixes #1731) + * FIX : API 0.6 fixes + * FIX : Nodes fetched by relations are incomplete and not completed by "download more" (fixes #1715) + * ADD : Initial support for Symbian S60v5 + * ADD : Support for discardable dialogs/messageboxes (fixes #1487) + * FIX : Do not automerge GPX nodes (fixes #1486) + * FIX : Proper clipping via Boost's geometry template library + * FIX : Do not use guarded pointers (too slow) (closes #1674) + * FIX : Styles tag selection speed optimisation (by Trav) + * FIX : OSM/GPX import optimisations (by Trav) + * FIX : in Name property inspector causes AV (fixes #1672) + * CHG : Move vector background from SHP to OSB + * CHG : Preferences are uploaded to OSM in binary, base-64 encoded, 254 char slice. Allow bypassing the 255 char per preference limitation. + * CHG : Preferences lists (Bookmarks, WMS servers, …) are now distributed and saved as XML in ~/.merkaartor. Allow proper merging (fixes #1401) + * ADD : Allow choosing which Qt style to use via a combobox + * CHG : Implement the custom styles as plugins + * FIX : English language warning + * ADD : Switch to template-based projection handling; remove dependency on libproj + * FIX : Proper handling of the "Don't connect GPX nodes…" disabling. + * FIX : Fit the style editor in 1024x600 resolution (fixes #1609) + * FIX : Reflect in dirty dock the fact that multiple objects were changed together (fixes #1507) + * ADD : Threaded browser-based background image grabbing. (fixes #1312) + * FIX : Handle redirection for TMS/WMS servers (fixes #1639) + * FIX : Clear "hover" state when mouse leave the map widget + * FIX : WMS has now the proper projection + * ADD : Projections are specified in a "Projections.xml" file + * ADD : Move WMS/TMS configuration out of the preferences dialog to their own tools menu items. + * ADD : Switch to plugin-based image backgrounds + * ADD : Prioritize tile loading starting from center (by Arvin Schnell) +v0.13 + * FIX : Workaround for a crash with templates on Qt 4.5 + * FIX : Crash after TMS/WMS server renaming (fixes #1634) + * FIX : Download opaqueness applied to relations (fixes #1637) + * FIX : Do not zoom out after a viewport download in background projection (fixes #1638) + * FIX : Remove layer from "downloaded areas" on close (fixes #1636) + * FIX : Crash on layer close + * FIX : Hardening upload process + * FIX : Remove the deleted road from parent when joining + * FIX : allow spliting/joining roads belonging to not-completely-downloaded relations + * FIX : Avert crashes by using guarded pointers + * FIX : In case of a failed "Download more", do not delete layer if it was a previously existing one. + * FIX : GeoTagged images are drawn to the full size of GeoImageDock + * FIX : Background images with a too long hash filename were not cached. + * FIX : Tracklayers are (after asking the user) made writeable when opening geotagged images to it + * ADD : Images can be dropped on TrackPoints to add the coordinates from the trackpoint to the image and then load it as geotagged image (see #1602) + * FIX : trackpoints which are associated with an image are highlighted according to the Style's settings (but not by painting an reactangle in paintEvent manually) + * FIX : Much better zoom (and image-moving) for ImageView in GeoImageDock + * FIX : Long image filenames are cutted to fit the GeoImageDock (fixes #1452) + * FIX : ImageView in GeoImageDock draws images using an antialiasing painter and images are not copied when displaying them which results in faster drawing. (fixes #1452) + * FIX : If there is only one opened layer, GeoImage uses it automatically (without asking the user) (fixes #1450) + * FIX : Loading images with non-ascii filenames is now supported by GeoImage (fixes #1359) + * FIX : Handle Undoes while creating single/double roads (fixes #1621) + * FIX : Re-apply custom shortcuts after retranslateUI (fixes #1620) + * FIX : Insufficent precision for WMS bbox requests at high zoom (fixes #1618) + * ADD : Allow forcing the custom Qt style thru Config.pri + * FIX : Do not remove incomplete downloaded relation; make them readonly and display them in red (temporary) + * FIX : Painting slowdowns (+ memory consumption) when relations are involved (fixes #1528) + * FIX : Split roads not added to Relation (fixes #1586) + * FIX : Tweaked windows menu to be "standard" + * ADD : Splash screen + * ADD : Styles dock + list of styles in "Tools-Styles" for quick style switching. As a consequence, a directory must be defined in the preferences where all custom styles will be stored. + * ADD : Add a button to the Slippy map allowing to go to the current viewport. + * ADD : Outline coastlines + * ADD : Include build of translations during make + * ADD : Use a builtin shapefile of the world as a background + * ADD : Support for ESRI shapefile import (and, potentially, every GDAL supported file formats) via the GDAL library + * FIX : Bugs when loading MDC history (fixes #1546) + * ADD : Readonly layers + Preferences to default track layers to readonly (fixes #1460) + * FIX : Make upload dialog modal + * ADD : Initial support for multiple projections via proj4. Enable in Config.pri with PROJ=1 + * FIX : Crash during OSM import (fixes #1536) + * ADD : Option (in Manager) to autoload/autoshow the World + * FIX : Implement dynamic UI translation (fixes #1432) + * ADD : Generalize the concept of download progress window + * FIX : If one of the translation composant (Qt or Merkaartor) is missing, allow the other to be loaded. + * FIX : Add missing tr() calls in render dialogs. + * FIX : Messagebox-cancel after deleting a line did not work (fixes #1392) + * ADD : Native SVG renderer + * ADD : Allow breaking roads (and areas) with a single node (fixes #1505) + * ADD : Relation member context menu for center and zoom on the properties dock + * ADD : Allow removing a member from a relation thru the properties dock. + * FIX : Switch to skulpture 2.2 custom style by default + * FIX : Don't allow templates combo to grow depending on content (fixes #1482) + * FIX : Allow disabling "Don't connect GPX nodes separated more than.." by setting it to 0. (fixes #1488) + * FIX : getDefaultLanguage() returns an invalid value with 2-parts language definition (like en_GB) (by Lukasz Jernas) (closes #1417) + * ADD : Single-node splitting of roads even with a connection to the extremity of another road (by Yves Goergen) (closes #1419) + * FIX : Declutter - move translations to a separate directory. + * ADD : Custom Qt style (skulpture by Christoph Feck) to bypass Qt expanding dock problem on Linux. Enable via preferences-visual. (fixes #1482) + * FIX : Allow port number in WMS/TMS server address (fixes #1479) + * ADD : Save relative icon filenames in map styles if not builtin (closes #1463) + * FIX : Don't loose selection(s) on "download more" (fixes #1470) + * FIX : Make at least docks translated after a restart (refs #1432) + * FIX : Do not re-sort features when zooming or when latitude changes. + * FIX : Make "Resolve Relations" work as intended (fixes #1449) + * FIX : Don't snap to the road being moved (by Yves Goergen) + * ADD : Merge multiple nodes when dragging one node onto another (by Yves Goergen) + * FIX : Don't jump around on Download More + * FIX : Remember last selected preferences tab page (not stored over an application restart) (by Yves Goergen) + * FIX : Look into application directory for translations by default (by Yves Goergen; fixes #1297) + * FIX : Don't draw the node dot if there is an icon (by Yves Goergen) + * FIX : Make sure areas are rendered before anything else. + * FIX : Add NVIDIA_HACK in Config.pri to (hopefully) help with Nvidia slowdowns. + * FIX : Cache preferences values for quicker access. + * FIX : Crash wen reloading MDC when no layer specified in the command XML (fixes #1434) + * ADD : "Offline" mode switch. + * ADD : Add a "Separate Move Mode" preference to remove "Move" mode. Moving features will be done from the "Edit" mode if deactivated. + * ADD : "Node" - "Detach" to remove a node from a road. Works the same way as "Split" + * FIX : Make Osmarender work again + * ADD : Area transparency + * ADD : Allow on-the-fly language change + * ADD : Remember tag view first column size + * FIX : Allow up to 999Mb for background image cache + * FIX : The API doesn't like some zoom levels return from the name finder service, so fall back to a default in that case. + * ADD : Allow canvas background to be set from a style. Background color is still overridable in the global preferences. (closes #1333) + * FIX : Change URL in about dialog to merkaartor.org. + * FIX : Connection error reporting in name finder service. (sponsored by today's power outage;) + * FIX : Ugly way to ensure ways with duplicate consecutive node will not be uploaded/exported/saved + * ADD : Do not auto-complete "name" tag + make "created_by" read-only + * FIX : Selecting elements with Find do not update the menus (closes #1375) + * FIX : Tag values inputed during session not added to auto-completion (refs #1373) + * ADD : "View" - "Show directional Arrows" menu. "Never" obviously never shows the arrows, "Always" obviously always shows them, even for non-roads. "Oneway" is the equivalent of the existing and is the default. (closes #1316) + * FIX : If a style was selected for a node but no icon was defined, nothing was drawn + * ADD : Possibility to add/remove members from Relations (closes #1265) + * ADD : Automatically save/restore bookmarks, TMS servers & WMS servers to OSM user preferences (closes #1362) + * ADD : Add Name Finder service to "Go to" dialog. + * FIX : If TRANSDIR_SYSTEM isn't set use QLibraryInfo::TranslationsPath. (closes #1358) + * FIX : Plural/paucal forms in DownloadOSM.cpp (closes #1306) + * FIX : World OSM manager now uses standard API rather than the not quite stable XAPI service + * FIX : GPS dock coordinates display wrong (fixes #1303) + * FIX : Background Image: show warning about Yahoo non-cacheable (closes #1310) + * ADD : Single mouse button preference (closes #1314) + * ADD : Tag Templates (closes #1031) + * ADD : "Area" type to tag selector (matches closed roads); Use as "Type is area". + * ADD : Context menu to the slippy map to reset viewport to default (as a side effect, disable right mouse click for zoomout) + * ADD : "Locked selection". Pressing "Tab" enters lock mode. In this mode, only the features around last click can be selected. Repeatedly press "Tab" to select them in cycle. + * ADD : When hovering/focussing a feature, its parents appear in dotted lines + * FIX : Initial viewport is really the one from previous session + * FIX : Verify selection is in layer before accessing (closes #1250) + * FIX : After coming out of fullscreen, revert to previous state rather than showing all docks + * FIX : Do not unselect newly created features + * FIX : Make moving images to start of track work + * ADD : GPX tracks are split if trkpts are more than a certain distance apart (configurable) + * ADD : Update info dock on hover + * ADD : KML import + * ADD : Display layer name in node info + * ADD : Shortcut editor + * FIX : Crash after undo roundabout (closes #1218) + * ADD : Enhanced goto dialog + * ADD : Add "Area" label option to the style editor (handle road label as trackpoints, with anchor at the center of the bounding box) + * ADD : Add support for MTK-based GPSes + * ADD : Add "Halo" label option to the style editor + * ADD : Make focus and hover size configurable + * FIX : Windows crash when resaving changed scene truncates save file (closes #1164) + * ADD : Move to the next field on enter in properties dock tags - part 2 (by Travers Carter) (closes #1137) +v0.12 + * FIX : Upload of nodes coming from tracks + * FIX : Full zoom drawing bug yahoo images don't scale (fixes #1173) + * FIX : Scroll redraw bug yahoo images don't redraw (fixes #1172) + * FIX : Scroll redraw bug streetnames left behind (fixes #1171) + * FIX : Limit max zoom to a scale of ~2m to avoid overflow + * ADD : SlippyMap remembers last used view + * FIX : Remove support for internal webkit. As of now, Qt 4.4+ is required for Yahoo! imagery. + * ADD : Let the use choose between translating standard OSM tags + * ADD : Ability to set language explicitly + * FIX : Make "About" dialog more useful + * FIX : Show correct progress when downloading maps + * FIX : Make yahoo maps line up for large views (sync from r10585 by Petr Dlouhy) + * FIX : GPX track timestamps are in UTC (see gpx 1.1 schema) + * FIX : Change serial port GPS readout from busy looping to signal wakeup + * FIX : Nake the heading appear in the satellite tracker + * ADD : Nice satellite strength view widget + * FIX : OSM export doesn't handle quotes well (Fixes #1139) + * ADD : Allow osm API url in the "Use OSM link" text box + * FIX : 'Download more' should work without prior 'Download from web' (Closes #1028) + * FIX : Joining roads by moving a node from one road on top of another road gives incorrect node sequence (Fixes #1149) + * ADD : Preliminary gpsd supprt + * FIX : Upload of a modified single GPX track node was not working anymore (fixes #1141) + * ADD : Support for GeoTagged images. qmake GEOIMAGE=1 to activate. requires exiv2 (by Timo Schlüßler) + * ADD : Move to the next field on enter in properties dock tags (by Travers Carter) (Refs #1137) + * ADD : Revised OSB format. Allows using large map files directly from disk with low memory footprint. + * FIX : Native render doesn't render anything at high lat/long values(by Travers Carter) (Closes #1135) + * FIX : Expand tables in the properties dock to the available width by default (by Travers Carter) (Closes #1136) + * FIX : Make download dialog a less cluttered + * FIX : Update the "created_by" tag at each update, not only add. + * ADD : Check if there are empty roads/relations during a download and propose to mark them for deletion + * ADD : "Visible" action in layers menu + * FIX : Properly detect if roads are breakable/joinable and update menus accordingly + * FIX : Handle "NotYetDownloaded" for Relations + * ADD : Scalable POI icons in styles + * ADD : +/- buttons on zooming slippy map so single button devices can use it too + * FIX : Only activate upload menu when there is something to upload + * ADD : Ability to use svg for node icons + * ADD : Tab filtering and color code to Layer dock + * FIX : Manage road conflicts from downloads + * ADD : Continue road if selected node belongs to only 1 road and is at one end + * ADD : MRU for opened and imported files + * ADD : Menu option to show/hide a selectable relation bounding box + * ADD : Preference option for focus/hover/relations colors + * ADD : Create one layer per track during GPX import + * ADD : Info dock for layers + * ADD : Menu option to show/hide scale + * ADD : "Duplicate", "Apply", "Up", "Down" functionality to the style editor + * FIX : Another try at solving the "long-ways-at-high-zoom-makes-Merkaartor-unusable" problem (closes #1110) + * ADD : Names rendering in styles + * ADD : Save last download layer to MDCs + * ADD : Switch to integer internal coordinates. Coordinates now vary from -INT_MAX to +INT_MAX rather than -M_PI / +M_PI + * FIX : 412 when uploading joined/split roads + * ADD : Layer menu in menubar + * ADD : Display viewport coordinates in status bar + * ADD : (Almost) generalize progress dialogs + * ADD : Support (initial) of GPS devices / NMEA log replay + * ADD : Option to show/hide track segments + * ADD : Option to show/hide non-stylized trackpoints + * ADD : Option to show/hide street names on the map + * ADD : Render to bitmap via native engine. + * ADD : Render to SVG via Osmarender (requires libxml2/libxslt; inkscape required to generate bitmap). Closes #694 +v0.11 + * ADD : Export to KML + * ADD : Export to GPX + proper waypoint saving in MDC documents + * ADD : Shift-Right button to drag-zoom + * FIX : Qt slows to a crawl when drawing lines offscreen to a large virtual canvas, clipping enabled or not (Qt bug?). Try to optimize roads/track segments drawing to cope with this. + * FIX : Save also the redo history in a MDC document + * FIX : Allow deletion of a node from a track without deleting the whole segment + * FIX : Add a preference option to disable styling for Track layers + re-inject default waypoint painting from dantje + * ADD : Non-uplodable tags; tags with key beginnig and ending with an underscore ("_") won't be uploaded + * ADD : Ability to commit features from non-uplodable layers to the dirty layer, i.e. make them uploadable + * FIX : Bump MDC documents to version 1.1 due to bug-fixes in history saving; history from version 1.0 MDC won't be imported. + * ADD : Basic support for waypoints/logpoints from gpx files + * ADD : Altitude and velocity to NMEA import + * FIX : Background image cache: delete older images from cache first + * ADD : Context menu functionality to the map + * FIX : Show tracksegment even if it only intersects the viewport + * ADD : Encode speed and slope in track segments + * FIX : Handle relative paths when loading files + * FIX : Clip track segments on viewport + * ADD : Show length of selected way in info dock + * ADD : Display distance in CreateSingleWay + * FIX : "Dynamically" display all built-in styles in the preferences dialog rather than pre-defined ones + * ADD : Special value "_NULL_" to TagSelector; matches non-existent or empty tag + * FIX : Allow punctuation in tag selector + * ADD : "Not", "true", "false", "[Default]" keywords to the Tag Selector; "[Default]" specifies the style for features not having a specific (i.e. non-default) style selected. Together with "Type Is", allows for "bug-fixing" styles "a la Maplint" + * ADD : Implementation of a binary OSM file format targeted to mobile devices (*.osb); so far, is ~3x smaller and loads ~5x faster; format subject to changes and documentation + * FIX : Pixmap from background images were not freed, leading to ever growing memory consumption + * FIX : Problem with map adapters having limited zoom range (e.g. Maplint 12-16) + * ADD : Style tag selector by type (e.g "Type is TrackPoint") and presence of tags (e.g. "HasTags"). Allows: 1) To show a generic icon for POI; 2) To display an icon for "lost" points with no roads nor tags. + * ADD : Clipboard-copy-paste support (Tags only for now). Clipboard format is XML OSM. + * ADD : "Export selected to OSM" + * ADD : Proxy support to SlippyMapWidget + change the kind of download only when interacting with the slippy map + * ADD : when deleting roads, ask if nodes should be deleted also + * ADD : "View downloaded area": "dot" the areas not downloaded from OSM during the current session + * ADD : Save position of last edit session on exit + * ADD : Split a road by selecting only the node + * ADD : Arrow keys move the map (by Rainer Keller) + * FIX : When cascade removing, not all children are deleted if they are present multiple times + avoid having twice the same node contiguous in the a road/relation + * FIX : Segfault with MDC containing history where a feature is created and deleted + * ADD : "Dirty" layer where all modified features go + * ADD : "Undo" dock with all undo actions + * FIX : Start new road from selected node + * FIX : German translation + * ADD : Czech translation (Tom Mika) + * FIX : History window now displays UTF8 + * FIX : Bookmark created from "Download from web" immediately added to bookmarks menu (by rullzer) + * FIX : Tags undo was pretty much broken + * FIX : Update undo button state after upload + * ADD : Make URL in about window selectable (by Max Vasilev) + * FIX : Style definitions can now use *,? and [abc] + * ADD : Open/Import multiple files + * ADD : Draw scale + * FIX : Upload order when merging nodes + * FIX : Warn when using wrong credentials + * ADD : Drag the map around with control key for poor Mac owners + * FIX : We can now select the move tool every time + * FIX : Reverse on an area doesn't open it anymore + * FIX : Select dialog : fix the size of elements + * FIX : Roundabout creation. Add tag junction=roundabout + * FIX : Autoselect source in download dialog + * ADD : Align nodes function + * ADD : Living_street as a predefined highway tag + * FIX : Use CoordBox method to zoom a little instead of calling zoom + * ADD : Caching mechanism for painters + * ADD : Draw nodes of hovered/selected roads (by Vincent Meurisse) + * FIX : Make the shortcuts for creating a new road and way less interfering + * ADD : Support for OSM links in download dialog (Refs #812) (by Timo Schlüßler) + * ADD : Shortcuts for zoom-in(+) and zoom-out(-) (by Timo Schlüßler) + * FIX : Keyboard modifiers: Ctrl-click toggle; Shift-click add; Ctrl-add-click prevents road selection; Shift-drag selects features which intersects + * ADD : Information dock + * ADD : Dock menu / shortcuts + * ADD : Different colors for focus and hover + * ADD : Merkaartor icon + * FIX : Unified version handling + * ADD : OpenTopoMap WMS server to list of defaults; OpenAerialMap as TMS (existed as WMS already) + * ADD : "Download more" command. Adds to last download layer + * ADD : Per-layer "zoom all" + * ADD : Delete layer command + * ADD : French translation + * ADD : Merkaartor document (*.mdc) + * FIX : Apply button in Preferences now updates the main window immediately + * FIX : If a feature contains a node more than once, if the node is deleted, only the first occurrence is removed + * ADD : Merge nodes function + * FIX : Don't ignore "width" tags on export + * ADD : Translation capabilities + * FIX : Misaligned background after view resize + * FIX : Clipping problem with selected features during resize + * FIX : NMEA import timestamps + * FIX : Don't force to enter an u/p for download + * FIX : Right background column not drawn in large resolution +v0.10 + * ADD : Warn for older versions of Qt + * ADD : Save mainwindow layout status (by Daniel van Gerpen) + * ADD : Improved tag selection mechanism + * ADD : Per-layer transparency + * ADD : Background color chooser + * FIX : Redraw view when joining roads + * ADD : Generalization of Tile servers (OSM is now part of that group) + * ADD : Shift-click also prevents roads from selected (previously only alt-click) + * ADD : Configurable projection type (allow custom zoom in "Merkaartor" projection, for background also) + * ADD : Configurable zoom factors + * ADD : Background tiles caching + * ADD : Initial track to road + * ADD : Initial osmarender rendering + * FIX : Decrease memory usage when importing OSM + * FIX : Increase snap update speed + * ADD : Ability to load tracks from the command line (by Daniel van Gerpen) + * ADD : Mapnik-lookalike style (by Colin Marquardt and Andreas Laas) + * ADD : Ability to set default style at startup + * FIX : Remove compile warnings and C-style casts (by Daniel van Gerpen) + * ADD : "created_by" to new features + * ADD : Navigation: View -> bookmark + add/remove + * FIX : Warn when OSM userid/password not set + * ADD : Export viewport to OSM + * FIX : Crash when splitting roads (by Daniel van Gerpen) + * FIX : Various memory leaks and clean ups (by Daniel van Gerpen) + * ADD : Provide navigation for the slippy map with right and left mouse button (by Daniel van Gerpen) + * FIX : Zoom around cursor position + * ADD : Import NMEA logs (crude) (by Chris Browet) + * FIX : Proper handling of dirty documents (by Chris Browet) + * ADD : Search on name/tags (by Chris Browet) + * FIX : Don't crash while createing a roundabout (by Tommi Vainikiainen) + * ADD : Curved road support + * FIX : Enhance somewhat visibility of selected items (by Chris Browet) + * ADD : Export OSM files (by Chris Browet) + * ADD : Support for OSM backgrounds (by Chris Browet) + * ADD : Centralized preferences dialog (by Chris Browet) + * ADD : Support for WMS maps (by Chris Browet) + * FIX : Remove yahoo maps support (not "legal" way to access tiles) (by Chris Browet) + * ADD : Support for Yahoo maps backgrounds (by Chris Browet; QMapControl widget by Kai Winter) + * ADD : Tags autocompletion in related widgets + * ADD : Paint style editor + +v0.09 + * ADD : Support for Noni GPSPlot tracks + * ADD : Draw natural=wood areas (by Raphael Studer) + * FIX : Also draw trackpoints that have an icon + * FIX : Draw unconnected trackpoints + * ADD : Multiple remove + * ADD : Save last current directory + * ADD : Draw landuse=forest area (by Raphael Studer) + * ADD : Move trackpoints onto a road inserts the point in the road + * ADD : Draw a lot of more things in merkaartor (by Matt Williams) + * ADD : Draw hospital area and node + * ADD : Nice amenity selector for nodes + * FIX : Use the standard system for predefined tags for highway + * ADD : Nice landuse selector for roads (areas) + * ADD : More amenities (by Matt Williams) + * ADD : Ability to easily draw an area + * ADD : Landuse selector for relations + * ADD : Upload relations to OSM + * FIX : Compile fixes for gcc 3.x (by Thomas Wood) + +v0.08 + * FIX : Work with 0.5 API + * ADD : Move can now work on a complete way + * ADD : Non-transparant proxy support + * ADD : Change cursor when in move mode + * FIX : Recognize 1 in oneway key + * FIX : Slightly change default way width + * FIX : Undo/redo handling for manipulating tags + * ADD : Ability to draw icons on specific trackpoints + * ADD : Draw parking symbol from mapnik + * ADD : Tertiary highway type + * FIX : Tweak color scheme + * ADD : Cache road bounding box + * FIX : Draw parking surface + * FIX : Tab order of various widgets + * ADD : Slippy map coordinates selector + * FIX : Reuse slippy map cache between different invocations + * FIX : Improve download handling + * ADD : Join/split/break road actions + * ADD : Caching algorithm for editstylepainters + * FIX : Improve rendering on higher zoomed-out levels + * ADD : Drag box to select a group of elements + * ADD : Selection box when multiple features are selected + * FIX : Zoom with wheelbox as in Google maps + * FIX : Remove irrelevant menu item + * ADD : Import relations + * ADD : View relations in the propertiesdock + * ADD : Track back to which features a feature belongs + * FIX : Compile warnings (by Elrond) + * ADD : Rendering according to correct priority + * ADD : Create relationships + * FIX : Also render relations where tags are on the individual + roads + * FIX : Clean up code and compile warnings (by Elrond) + +v0.07 18 aug 2007 + * ADD : Nice mappaint mechanism + * FIX : Downloading same area twice doesn't create upload conflicts + anymore + * FIX : Keep tag content when editing them in the tag table + * FIX : Correctly keep track of the tag table size + * FIX : Remove 0.3 API support + * ADD : Gzipped downloading + * ADD : Nice painting for water + * ADD : File->new menu option to start a new map + * FIX : Change current directory when opening a file + * FIX : Suppress drawing artefact when creating a new segment + * FIX : Avoid Qt to have to process download notifications recursively + * ADD : Scripts to create the windows installation package + * ADD : Create way from selected segments tool + * FIX : Don't systematically add width tags to segments + * FIX : Streamline changing the width of a segment + * FIX : Bring back drawing of traffic direction indicators + * FIX : Show more segments on greater zoom levels + * FIX : Make user interface work with Qt 4.2 again + +v0.06 5 dec 2006 + * FIX : Also recognize true/false for oneway tag + * FIX : Correctly update roads when downloading the same road twice + * ADD : Type combobox to set highway tag + * FIX : No busy waiting for OSM download + * ADD : Progress dialog while downloading from OSM + * FIX : Refresh view immediately after download + * FIX : Download segments outside original bounding box for roads + * FIX : Don't call QStatusbar methods from a paintEvent + * FIX : Speed up drawing of roads when zoomed out + * ADD : Undo/redo icons + actions added to toolbar + * FIX : Improve speed with a double buffer for static content + * ADD : Change tags on multiple elements at the same time + * ADD : Delete tag tool + * ADD : Download with 0.4 API + * ADD : Upload with 0.4 API + * ADD : Draw arrows on GPX tracks + * ADD : Optionally download trackpoints from OSM + * ADD : Ability to contact OSM at a different port + * ADD : Allow panning with right mouse button from all interactions + * FIX : Keep correct startpoint when changing view during segment drawing + * ADD : Debugging mode + * FIX : Create node bad URL + * ADD : Double carriageway tool + * FIX : Upload segments before roads and nodes before segments + * ADD : Draw roundabout tool + * ADD : Easy single way creation + * FIX : Improve speed with large number of trackpoints + +v0.05 15 nov 2006 + * ADD : Connection roads by dragging end points + * FIX : Don't crash after undoing deletion and doing something else + * ADD : Go to selection interaction after upload/import/open/download + * FIX : Make the Cancel button work in the import OSM progress dialog + * FIX : Add an ID hash map to speed up importing OSM file + * ADD : Bookmark system for downloading from OSM + * FIX : Don't jump when zooming after panning + * FIX : Use the same step to zoom in and out + * FIX : Calculate correct bounding box + * FIX : Always update tagview and fix memory leak + * FIX : Performance improvements + * ADD : Oneway markers + * ADD : Reverse way/road action + * ADD : Traffic direction combobox in road properties + * ADD : Load tags for nodes + * ADD : Rendering of parks pitches and water reservoirs + * ADD : Set view to coordinates dialog box + * FIX : After downloading from web focus on downloaded area + +v0.04 29 oct 2006 + * FIX : Reset brush when drawing zoom window + * FIX : Include way id when sending updates to Openstreetmap + * FIX : Always prefer to select a road + * ADD : Delete nodes,segments,roads on server + * ADD : Ability to remove segments from roads, and influence order + * ADD : User recognizable names in upload window + * FIX : Use a dotted line for GPX track segments + * ADD : Split roads by adding a node + * ADD : Zoom in/out with the scrollwheel + * ADD : Debian package + +v0.03 25 oct 2006 + * FIX : Compilation fixes for Linux + * ADD : Pan view by dragging + * ADD : Create node + * FIX : Don't draw nodes when zoomed out + * FIX : Draw segments stronger when zoomed out + * FIX : Make roads easier to select, segments harder + +v0.02 24 oct 2006 + * ADD : Update/commit style merging and conflict resolution + with openstreetmap + * ADD : Delete node/segment + * FIX : Move trackpoints accessible from editor toolbar + * ADD : Layers + * ADD : Support for OSM ways + +v0.01 20 oct 2006 + * ADD : Upload node/segments to OSM + * ADD : Download segment tags + * ADD : Edit node properties (long,lat) + * ADD : Edit segment properties (width,tags) + +v0.00 17 oct 2006 + * ADD : Download node/segments from OSM + * ADD : Display node/segments/tracks + * ADD : Add segments + * ADD : Move nodes + + + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..37bb47a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,705 @@ +cmake_minimum_required(VERSION 3.19.0) + +set(VCS_FALLBACK_VERSION 0.19.0) +include(cmake/vcs.cmake) +message(STATUS "Configuring Merkaartor ${VCS_VERSION}, commit: ${VCS_COMMIT}, dirty: ${VCS_DIRTY}.") + +# Set a default build type if none was specified +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(MERK_DEFAULT_BUILD_TYPE "Debug") + message(STATUS "Setting build type to '${MERK_DEFAULT_BUILD_TYPE}' as none was specified.") + set(CMAKE_BUILD_TYPE "${MERK_DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE) + # Set the possible values of build type for cmake-gui + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") +endif() + + +project(merkaartor VERSION ${VCS_VERSION}) +# TODO: Use configure_file() instead of definitions when qmake is deprecated. +# Using definitions causes unnecessary rebuilds, as with each commit the hash +# changes compile flags for each and every file. However, it is kept for qmake +# compatibility. +# Using configure_file() allows us to store the metadata in a .cpp file, thus +# only rebuilding that one and linking. +add_definitions(-DVERSION=${PROJECT_VERSION} -DREVISION=${VCS_DESCRIBE}) +add_definitions(-DPRODUCT=Merkaartor) +add_definitions(-DSHARE_DIR=${CMAKE_INSTALL_PREFIX}/share/merkaartor) +add_definitions(-DTRANSDIR_MERKAARTOR=${CMAKE_INSTALL_PREFIX}/share/merkaartor) + +enable_testing() + +# TODO: Add support for sanitizers + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +# Find includes in corresponding build directories +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +# Instruct CMake to run moc automatically when needed +set(CMAKE_AUTOMOC ON) + +# Create code from a list of Qt designer ui files +set(CMAKE_AUTOUIC ON) + +set(CMAKE_AUTORCC ON) + +set(CMAKE_AUTOUIC_SEARCH_PATHS +${CMAKE_CURRENT_SOURCE_DIR}/src +${CMAKE_CURRENT_SOURCE_DIR}/src/GPS +${CMAKE_CURRENT_SOURCE_DIR}/src/Preferences +${CMAKE_CURRENT_SOURCE_DIR}/src/Render +${CMAKE_CURRENT_SOURCE_DIR}/src/PaintStyle +${CMAKE_CURRENT_SOURCE_DIR}/src/ImportExport +${CMAKE_CURRENT_SOURCE_DIR}/src/common +${CMAKE_CURRENT_SOURCE_DIR}/src/Layers +${CMAKE_CURRENT_SOURCE_DIR}/src/Utils +${CMAKE_CURRENT_SOURCE_DIR}/src/QToolBarDialog +${CMAKE_CURRENT_SOURCE_DIR}/src/NameFinder +${CMAKE_CURRENT_SOURCE_DIR}/src/Interactions +${CMAKE_CURRENT_SOURCE_DIR}/src/Sync +${CMAKE_CURRENT_SOURCE_DIR}/src/Docks +) + +# starting with Qt5.15 we have a lot of deprecation warnings, +# likely to make porting to Qt6 easier. +# as long as we require linking to older Qt versions those warnings +# are clutter. Remove this define when we start porting to Qt6. +add_definitions(-DQT_NO_DEPRECATED_WARNINGS) + +if (UNIX) + set(merkaartor_SRCS_PLATFORM + src/qextserialport/posix_qextserialport.cpp + 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile_unix.cpp + ) +elseif (WIN32) + set(merkaartor_SRCS_PLATFORM + src/qextserialport/win_qextserialport.cpp + 3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile_win.cpp + ) +endif() + + +# Populate a CMake variable with the sources +set(merkaartor_SRCS +${merkaartor_SRCS_PLATFORM} +src/Backend/MemoryBackend.cpp +src/Backend/MemoryBackend.h +src/GPS/qgps.h +#src/GPS/GpsFix.cpp +src/GPS/qgpsdevice.cpp +src/GPS/qgpssatellitetracker.h +src/GPS/SatelliteStrengthView.cpp +src/GPS/qgpssatellitetracker.cpp +src/GPS/SatelliteStrengthView.h +#src/GPS/GpsFix.h +src/GPS/qgpsdevice.h +src/GPS/qgps.cpp +src/GPS/qgpsmainwindowui.ui +src/MainWindow.ui +src/Features/Way.h +src/Features/TrackSegment.cpp +src/Features/Node.cpp +src/Features/Feature.cpp +src/Features/Relation.h +src/Features/Way.cpp +src/Features/TrackSegment.h +src/Features/Features.h +src/Features/Node.h +src/Features/Feature.h +src/Features/Relation.cpp +src/Preferences/TMSPreferencesDialog.cpp +src/Preferences/WMSPreferencesDialog.h +src/Preferences/FilterList.cpp +src/Preferences/MerkaartorPreferences.cpp +src/Preferences/MerkaartorPreferences.h +src/Preferences/BookmarksList.h +src/Preferences/FilterPreferencesDialog.ui +src/Preferences/PreferencesDialog.h +src/Preferences/WmsServersList.cpp +src/Preferences/FilterList.h +src/Preferences/WMSPreferencesDialog.ui +src/Preferences/WMSPreferencesDialog.cpp +src/Preferences/FilterPreferencesDialog.cpp +src/Preferences/ProjPreferencesDialog.ui +src/Preferences/TmsServersList.h +src/Preferences/TmsServersList.cpp +src/Preferences/OsmServerWidget.ui +src/Preferences/TMSPreferencesDialog.h +src/Preferences/BookmarksList.cpp +src/Preferences/FilterPreferencesDialog.h +src/Preferences/TMSPreferencesDialog.ui +src/Preferences/ProjectionsList.cpp +src/Preferences/ProjPreferencesDialog.cpp +src/Preferences/PreferencesDialog.ui +src/Preferences/ProjPreferencesDialog.h +src/Preferences/WmsServersList.h +src/Preferences/ProjectionsList.h +src/Preferences/PreferencesDialog.cpp +src/Render/MapRenderer.h +src/Render/NativeRenderDialog.ui +src/Render/NativeRenderDialog.h +src/Render/NativeRenderDialog.cpp +src/Render/MapRenderer.cpp +src/PaintStyle/Painter.cpp +src/PaintStyle/MapCSSPaintstyle.cpp +src/PaintStyle/MasPaintStyle.h +src/PaintStyle/Painter.h +src/PaintStyle/MapCSSPaintstyle.h +src/PaintStyle/PaintStyleEditor.ui +src/PaintStyle/PrimitivePainter.cpp +src/PaintStyle/PrimitivePainter.h +src/PaintStyle/PaintStyleEditor.h +src/PaintStyle/MasPaintStyle.cpp +src/PaintStyle/FeaturePainter.cpp +src/PaintStyle/FeaturePainter.h +src/PaintStyle/PaintStyleEditor.cpp +src/PaintStyle/IPaintStyle.h +src/MainWindow.cpp +src/Commands/TrackSegmentCommands.cpp +src/Commands/WayCommands.cpp +src/Commands/NodeCommands.cpp +src/Commands/TrackSegmentCommands.h +src/Commands/NodeCommands.h +src/Commands/FeatureCommands.cpp +src/Commands/FeatureCommands.h +src/Commands/RelationCommands.cpp +src/Commands/DocumentCommands.cpp +src/Commands/DocumentCommands.h +src/Commands/WayCommands.h +src/Commands/Command.cpp +src/Commands/Command.h +src/Commands/RelationCommands.h +#src/Tools/QFatFs/QFatFs.h +#src/Tools/QFatFs/QFat.cpp +#src/Tools/QFatFs/QFatFile.cpp +#src/Tools/QFatFs/QFatFs.cpp +#src/Tools/QFatFs/QFat.h +#src/Tools/QFatFs/QFatFile.h +src/Tools/ActionsDialog.cpp +#src/Tools/RegionMapWidget.cpp +#src/Tools/RegionMapWidget.h +src/Tools/ActionsDialog.h +src/qextserialport/qextserialport.cpp +src/qextserialport/qextserialport.h +src/qextserialport/qextserialbase.cpp +src/qextserialport/qextserialbase.h +src/ImportExport/ImportNMEA.cpp +#src/ImportExport/ImportExportPBF.h +src/ImportExport/ImportNMEA.h +src/ImportExport/ImportExportGdal.h +src/ImportExport/IImportExport.cpp +src/ImportExport/ImportExportOSC.h +src/ImportExport/ImportOSM.h +src/ImportExport/ExportOSM.cpp +src/ImportExport/ExportDialog.ui +src/ImportExport/ImportNGT.cpp +src/ImportExport/ImportExportCSV.cpp +src/ImportExport/ImportGPX.h +src/ImportExport/ImportExportKML.h +src/ImportExport/ImportExportKML.cpp +src/ImportExport/ImportExportOSC.cpp +src/ImportExport/ExportGPX.h +src/ImportExport/ImportCSVDialog.cpp +src/ImportExport/ImportCSVDialog.ui +#src/ImportExport/fileformat.pb.h +#src/ImportExport/osmformat.pb.cc +#src/ImportExport/osmformat.pb.h +#src/ImportExport/fileformat.pb.cc +src/ImportExport/ImportNGT.h +src/ImportExport/ImportCSVDialog.h +src/ImportExport/ExportOSM.h +src/ImportExport/ImportOSM.cpp +src/ImportExport/ImportExportCSV.h +#src/ImportExport/ImportExportPBF.cpp +src/ImportExport/IImportExport.h +src/ImportExport/ExportGPX.cpp +src/ImportExport/ImportGPX.cpp +src/ImportExport/ImportExportGdal.cpp +src/MainWindow.h +src/common/UploadMapDialog.ui +src/common/GotoDialog.ui +src/common/PropertiesDialog.ui +src/common/GotoDialog.h +src/common/MapTypedef.h +src/common/RelationProperties.ui +src/common/MapView.h +src/common/GotoDialog.cpp +src/common/TerraceDialog.h +src/common/TerraceDialog.cpp +src/common/TagModel.cpp +src/common/Document.h +src/common/Coord.h +src/common/Painting.h +src/common/FeatureManipulations.h +src/common/MultiProperties.ui +src/common/TerraceDialog.ui +src/common/Document.cpp +src/common/DownloadMapDialog.ui +src/common/FeatureManipulations.cpp +src/common/AboutDialog.ui +src/common/MapView.cpp +src/common/TagModel.h +src/common/Coord.cpp +src/common/Global.h +src/common/Global.cpp +src/common/Painting.cpp +src/common/Projection.h +src/common/Projection.cpp +src/Layers/OsmRenderLayer.cpp +src/Layers/LayerWidget.cpp +src/Layers/ImageMapLayer.h +src/Layers/OsmRenderLayer.h +src/Layers/Layer.cpp +src/Layers/LicenseDisplayDialog.ui +src/Layers/ImageMapLayer.cpp +src/Layers/LayerIterator.h +src/Layers/Layer.h +src/Layers/LayerWidget.h +src/Layers/LayerWidget.ui +src/Layers/FilterEditDialog.ui +src/Layers/LayerPrivate.h +src/Utils/ShortcutOverrideFilter.h +src/Utils/SelectionDialog.cpp +src/Utils/ProjectionChooser.h +src/Utils/TagSelectorWidget.ui +src/Utils/CheckBoxList.cpp +src/Utils/SlippyMapWidget.cpp +src/Utils/TagSelectorWidget.h +src/Utils/CheckBoxList.h +src/Utils/SlippyMapWidget.h +src/Utils/Utils.h +src/Utils/OsmLink.cpp +src/Utils/ShortcutOverrideFilter.cpp +src/Utils/TagSelectorWidget.cpp +src/Utils/LineF.h +src/Utils/SelectionDialog.ui +src/Utils/TagSelector.h +src/Utils/Utils.cpp +src/Utils/PictureViewerDialog.h +src/Utils/EditCompleterDelegate.cpp +src/Utils/ProjectionChooser.cpp +src/Utils/SvgCache.cpp +src/Utils/MDiscardableDialog.cpp +src/Utils/ProjectionChooser.ui +src/Utils/PictureViewerDialog.ui +src/Utils/PixmapWidget.h +src/Utils/OsmLink.h +src/Utils/EditCompleterDelegate.h +src/Utils/PictureViewerDialog.cpp +src/Utils/MDiscardableDialog.h +src/Utils/SelectionDialog.h +src/Utils/PixmapWidget.cpp +src/Utils/TagSelector.cpp +src/Utils/SvgCache.h +src/Utils/RemoteControlServer.cpp +src/QToolBarDialog/qttoolbardialog.h +src/QToolBarDialog/qttoolbardialog.cpp +src/QToolBarDialog/qttoolbardialog.ui +src/NameFinder/namefinderwidget.ui +src/NameFinder/httpquery.h +src/NameFinder/namefindertablemodel.cpp +src/NameFinder/xmlstreamreader.cpp +src/NameFinder/NameFinderResult.h +src/NameFinder/namefindertablemodel.h +src/NameFinder/httpquery.cpp +src/NameFinder/namefinderwidget.h +src/NameFinder/xmlstreamreader.h +src/NameFinder/namefinderwidget.cpp +src/TagTemplate/TagTemplate.cpp +src/TagTemplate/TagTemplate.h +src/Interactions/ScaleInteraction.h +src/Interactions/CreateAreaInteraction.cpp +src/Interactions/Interaction.h +src/Interactions/CreateAreaInteraction.h +src/Interactions/EditInteraction.h +src/Interactions/ScaleInteraction.cpp +src/Interactions/CreateDoubleWayInteraction.cpp +src/Interactions/EditInteraction.cpp +src/Interactions/CreateDoubleWayInteraction.h +src/Interactions/RotateInteraction.h +src/Interactions/ZoomInteraction.h +src/Interactions/CreateSingleWayInteraction.cpp +src/Interactions/Interaction.cpp +src/Interactions/ExtrudeInteraction.cpp +src/Interactions/ZoomInteraction.cpp +src/Interactions/RotateInteraction.cpp +src/Interactions/CreateDoubleWayDock.ui +src/Interactions/CreatePolygonInteraction.cpp +src/Interactions/MoveNodeInteraction.h +src/Interactions/MoveNodeInteraction.cpp +src/Interactions/CreatePolygonInteraction.h +src/Interactions/CreateNodeInteraction.cpp +src/Interactions/CreateRoundaboutDock.ui +src/Interactions/CreateRoundaboutInteraction.h +src/Interactions/ExtrudeInteraction.h +src/Interactions/BuildBridgeInteraction.h +src/Interactions/CreateRoundaboutInteraction.cpp +src/Interactions/CreateNodeInteraction.h +src/Interactions/CreateSingleWayInteraction.h +src/Interactions/BuildBridgeInteraction.cpp +src/Sync/SyncListDialog.ui +src/Sync/DirtyList.cpp +src/Sync/DownloadOSM.h +src/Sync/DirtyListExecutorOSC.cpp +src/Sync/DirtyListExecutorOSC.h +src/Sync/DownloadOSM.cpp +src/Sync/DirtyList.h +#src/QMapControl/mapcontrol.cpp +src/QMapControl/WmscMapAdapter.cpp +src/QMapControl/mapnetwork.cpp +src/QMapControl/wmsmapadapter.h +src/QMapControl/tilemapadapter.cpp +src/QMapControl/wmsmapadapter.cpp +#src/QMapControl/imagepoint.h +src/QMapControl/imagemanager.cpp +src/QMapControl/WmscMapAdapter.h +src/QMapControl/tilemapadapter.h +src/QMapControl/imagemanager.h +#src/QMapControl/mapcontrol.h +src/QMapControl/mapadapter.h +src/QMapControl/mapadapter.cpp +#src/QMapControl/imagepoint.cpp +src/QMapControl/mapnetwork.h +src/Docks/PropertiesDock.cpp +src/Docks/FeaturesDock.h +src/Docks/StyleDock.ui +src/Docks/MinimumRoadProperties.ui +src/Docks/InfoDock.h +src/Docks/FeaturesDock.ui +src/Docks/MinimumRelationProperties.ui +src/Docks/PropertiesDock.h +src/Docks/DirtyDock.h +src/Docks/StyleDock.cpp +src/Docks/GeoImageDock.cpp +src/Docks/DirtyDock.ui +src/Docks/GeoImageDock.h +src/Docks/MDockAncestor.cpp +src/Docks/MinimumTrackPointProperties.ui +src/Docks/StyleDock.h +src/Docks/PhotoLoadErrorDialog.ui +src/Docks/DirtyDock.cpp +src/Docks/InfoDock.cpp +src/Docks/FeaturesDock.cpp +src/Docks/LayerDock.cpp +src/Docks/MDockAncestor.h +src/Docks/LayerDock.h +interfaces/IImageManager.cpp +interfaces/IImageManager.h +interfaces/IMerkMainWindow.h +interfaces/IProjection.h +interfaces/IProgressWindow.h +interfaces/ILayer.h +interfaces/IMapAdapterFactory.h +interfaces/IFeature.h +interfaces/IMapWatermark.h +interfaces/IImageManager.cpp +interfaces/IRenderer.h +interfaces/IDocument.h +interfaces/Interfaces.pri +interfaces/IBackend.h +interfaces/IMapAdapter.h +3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile.cpp +3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.cpp +3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.cpp +3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.cpp +3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlocalpeer.h +3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.h +3rdparty/qtsingleapplication-2.6_1-opensource/src/qtlockedfile.h +3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsinglecoreapplication.h +./src/Utils/Utils.qrc +./Icons/AllIcons.qrc +./Icons/QToolBarDialog/qttoolbardialog.qrc +./Templates/Templates.qrc +./Styles/Styles.qrc + +) + +if (NOT APPLE) +install( FILES ${CMAKE_SOURCE_DIR}/src/org.merkaartor.merkaartor.desktop DESTINATION share/applications ) +install( FILES ${CMAKE_SOURCE_DIR}/src/org.merkaartor.merkaartor.appdata.xml DESTINATION share/metainfo ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/8x8/merkaartor.png DESTINATION share/icons/hicolor/8x8/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/16x16/merkaartor.png DESTINATION share/icons/hicolor/16x16/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/22x22/merkaartor.png DESTINATION share/icons/hicolor/22x22/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/24x24/merkaartor.png DESTINATION share/icons/hicolor/24x24/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/32x32/merkaartor.png DESTINATION share/icons/hicolor/32x32/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/36x36/merkaartor.png DESTINATION share/icons/hicolor/36x36/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/40x40/merkaartor.png DESTINATION share/icons/hicolor/40x40/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/42x42/merkaartor.png DESTINATION share/icons/hicolor/42x42/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/48x48/merkaartor.png DESTINATION share/icons/hicolor/48x48/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/64x64/merkaartor.png DESTINATION share/icons/hicolor/64x64/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/72x72/merkaartor.png DESTINATION share/icons/hicolor/72x72/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/80x80/merkaartor.png DESTINATION share/icons/hicolor/80x80/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/96x96/merkaartor.png DESTINATION share/icons/hicolor/96x96/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/128x128/merkaartor.png DESTINATION share/icons/hicolor/128x128/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/192x192/merkaartor.png DESTINATION share/icons/hicolor/192x192/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/256x256/merkaartor.png DESTINATION share/icons/hicolor/256x256/apps ) +install( FILES ${CMAKE_SOURCE_DIR}/Icons/512x512/merkaartor.png DESTINATION share/icons/hicolor/512x512/apps ) +endif() + +set(MERKAARTOR_SHARE_FILES + ${CMAKE_SOURCE_DIR}/share/BookmarksList.xml + ${CMAKE_SOURCE_DIR}/share/Projections.xml + ${CMAKE_SOURCE_DIR}/share/TmsServersList.xml + ${CMAKE_SOURCE_DIR}/share/WmsServersList.xml +) + +install( FILES ${MERKAARTOR_SHARE_FILES} DESTINATION share/merkaartor) +set_source_files_properties(${MEKAARTOR_SHARE_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") + +find_package(Qt5LinguistTools) +set(TS_FILES + ${CMAKE_SOURCE_DIR}/translations/merkaartor_cs.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_de.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_en.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_es.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_fi.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_fr.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_hr.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_hu.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_id_ID.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_it.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_ja.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_nl.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_pl.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_pt_BR.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_ru.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_sv.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_uk.ts + ${CMAKE_SOURCE_DIR}/translations/merkaartor_zh_TW.ts +) +qt5_add_translation(QM_FILES + ${TS_FILES} +) +install( FILES ${QM_FILES} DESTINATION share/merkaartor/translations ) + +find_program(LUPDATE lupdate) +add_custom_target(update-translations COMMAND ${LUPDATE} ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/plugins -source-language en -target-language en -ts ${CMAKE_SOURCE_DIR}/translations/merkaartor_en.ts) + + +############################################## +# Find 3rd party libraries, depending on options provided +############################################## + +# We need GDAL and proj for core functionality +set(PKGCONFIG_REQUIRED_LIBS gdal proj) + +option(ZBAR "Enable ZBar usage in MWalkingPapersBackground and Geoimage." OFF) +option(GEOIMAGE "Enable Geoimage Dock (requires exiv2 library)." ON ) +option(GPSD "Enable GPS Dock (requires gpsd library)." OFF) +option(WEBENGINE "Enable the use of QtWeb engine (not supported on all platforms)" OFF) +option(EXTRA_TESTS "Enable extra tests that cannot be run automatically on CI build." ON ) + +message(STATUS "Build options (use -DOPT=ON/OFF to enable/disable):") +message(STATUS " * ZBAR ${ZBAR}") +message(STATUS " * GEOIMAGE ${GEOIMAGE}") +message(STATUS " * GPSD ${GPSD}") +message(STATUS " * WEBENGINE ${WEBENGINE}") +message(STATUS " * EXTRA_TESTS ${EXTRA_TESTS}") +message(STATUS "") + +if (ZBAR) + list(APPEND PKGCONFIG_REQUIRED_LIBS zbar) + add_definitions(-DUSE_ZBAR=1) # MWalkingPapersBackground, Geoimage; actual macro is USE_ZBAR +endif() + +if (GEOIMAGE) + list(APPEND PKGCONFIG_REQUIRED_LIBS exiv2) + add_definitions(-DGEOIMAGE=1) +endif() + +if (GPSD) + list(APPEND PKGCONFIG_REQUIRED_LIBS gpsd) + add_definitions(-DUSE_GPS=1) +endif() + +if (WEBENGINE) + add_definitions(-DUSEWEBENGINE=1) # Actual macro is USE_WEBKIT + # add_definitions(-DTHREADED_BROWSERIMAGEMANAGER=1) # TODO: Check if that even does something/works +endif() + + +# TODO: Check and remove or implement defines from code: PORTABLE, FRISIUS, NVIDIA_HACK, MOBILE, LIBPROXY, SYSTEM_QTSA +find_package(PkgConfig REQUIRED) +pkg_check_modules(PKGCONFIG_DEPS REQUIRED ${PKGCONFIG_REQUIRED_LIBS}) +message(STATUS "pkg-config dependencies require the following flags:") +message(STATUS " * LDFLAGS: ${PKGCONFIG_DEPS_LDFLAGS}") +message(STATUS " * LDFLAGS_OTHER: ${PKGCONFIG_DEPS_LDFLAGS_OTHER}") +message(STATUS " * CFLAGS: ${PKGCONFIG_DEPS_CFLAGS}") +message(STATUS " * CFLAGS_OTHER: ${PKGCONFIG_DEPS_CFLAGS_OTHER}") +message(STATUS " * LINK DIRECTORIES: ${PKGCONFIG_DEPS_LIBRARY_DIRS}") +message(STATUS "") + + +link_directories(${PKGCONFIG_DEPS_LIBRARY_DIRS}) + + + +############################################## +# Find Qt dependencies +############################################## +find_package(Qt5 COMPONENTS Svg Network Xml Core Gui Concurrent PrintSupport Widgets Test CONFIG REQUIRED) +set(MERKAARTOR_LINK_LIBS Qt5::Svg Qt5::Network Qt5::Xml Qt5::Core Qt5::Gui Qt5::Concurrent Qt5::PrintSupport Qt5::Widgets ${PKGCONFIG_DEPS_LIBRARIES}) + +############################################## +# Create the Merkaartor binary +############################################## +if (APPLE) + set(MERKAARTOR_ICON_FILE "${CMAKE_SOURCE_DIR}/Icons/merkaartor.icns") + set_source_files_properties(${MERKAARTOR_ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") +endif() + +if (WIN32) + set(MERKAARTOR_ICON_FILE "${CMAKE_SOURCE_DIR}/Icons/merkaartor-win32.rc") +endif() + +add_executable(${PROJECT_NAME} WIN32 MACOSX_BUNDLE ${merkaartor_SRCS} src/Main.cpp ${MERKAARTOR_ICON_FILE} ${QM_FILES}) +target_link_libraries(merkaartor ${MERKAARTOR_LINK_LIBS} ) +target_compile_options(merkaartor PUBLIC ${PKGCONFIG_DEPS_CFLAGS}) +install( TARGETS merkaartor RUNTIME DESTINATION bin BUNDLE DESTINATION .) + +if (APPLE) + # Additionally, we need to find libssh and add that include, as exiv2 depends on it. + # Caused by: https://gitlab.kitware.com/cmake/cmake/-/issues/19120 (not fixed and probably won't be anytime soon) + #find_path(LIBSSH_INCLUDE_DIR NAMES libssh.h) + set(LIBSSH_INCLUDE_DIR "/usr/local/include") +endif() + +set(MERKAARTOR_INCLUDE_DIRECTORIES + ${PKGCONFIG_DEPS_INCLUDE_DIRS} + ${LIBSSH_INCLUDE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/interfaces + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src + ${CMAKE_CURRENT_SOURCE_DIR}/src/GPS + ${CMAKE_CURRENT_SOURCE_DIR}/src/Backend + ${CMAKE_CURRENT_SOURCE_DIR}/src/Preferences + ${CMAKE_CURRENT_SOURCE_DIR}/src/Render + ${CMAKE_CURRENT_SOURCE_DIR}/src/PaintStyle + ${CMAKE_CURRENT_SOURCE_DIR}/src/ImportExport + ${CMAKE_CURRENT_SOURCE_DIR}/src/common + ${CMAKE_CURRENT_SOURCE_DIR}/src/Layers + ${CMAKE_CURRENT_SOURCE_DIR}/src/Utils + ${CMAKE_CURRENT_SOURCE_DIR}/src/QToolBarDialog + ${CMAKE_CURRENT_SOURCE_DIR}/src/NameFinder + ${CMAKE_CURRENT_SOURCE_DIR}/src/Interactions + ${CMAKE_CURRENT_SOURCE_DIR}/src/Sync + ${CMAKE_CURRENT_SOURCE_DIR}/src/Docks + ${CMAKE_CURRENT_SOURCE_DIR}/src/Features + ${CMAKE_CURRENT_SOURCE_DIR}/src/Commands + ${CMAKE_CURRENT_SOURCE_DIR}/src/qextserialport + ${CMAKE_CURRENT_SOURCE_DIR}/src/QMapControl + ${CMAKE_CURRENT_SOURCE_DIR}/src/TagTemplate + ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qtsingleapplication-2.6_1-opensource/src +) +target_include_directories( merkaartor PUBLIC ${MERKAARTOR_INCLUDE_DIRECTORIES}) + + +############################################## +# Build plugins +############################################## +include(plugins/plugins.cmake) + +############################################## +# Setup packaging +############################################## +set (CPACK_PACKAGE_NAME "merkaartor") +set (CPACK_PACKAGE_VENDOR "merkaartor.org") +set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Merkaartor, OpenStreetMap editor.") +set (CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}") +set (CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}") +set (CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}") +set (CPACK_PACKAGE_VERSION "${VCS_DESCRIBE}") +set (CPACK_PACKAGE_INSTALL_DIRECTORY "Merkaartor") +set (CPACK_PACKAGE_EXECUTABLES "merkaartor;Merkaartor") +set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") + +############################################## +# Prepare deployment script +############################################## +configure_file("${PROJECT_SOURCE_DIR}/cmake/upload-artifacts.sh.in" "${PROJECT_BINARY_DIR}/upload-artifacts.sh" @ONLY) + +############################################## +# Mac OS X specific deploy scripts +############################################## +if (APPLE) + find_program(MACDEPLOYQT macdeployqt) + message("Found macdeployqt: ${MACDEPLOYQT}") + configure_file("${PROJECT_SOURCE_DIR}/cmake/deploy-osx.cmake.in" "${PROJECT_BINARY_DIR}/deploy-osx.cmake" @ONLY) + set (CPACK_PRE_BUILD_SCRIPTS "${PROJECT_BINARY_DIR}/deploy-osx.cmake") + set (CPACK_GENERATOR "DragNDrop") + set (CPACK_DMG_BACKGROUND_IMAGE "${PROJECT_SOURCE_DIR}/cmake/CMakeDMGBackground.tif") + set (CPACK_DMG_DS_STORE "${PROJECT_SOURCE_DIR}/cmake/DS_Store.bin") + #set (CPACK_DMG_DS_STORE_SETUP_SCRIPT "${PROJECT_SOURCE_DIR}/cmake/CMakeDMGSetup.scpt") + set (MACOSX_BUNDLE_BUNDLE_NAME "merkaartor") + set (MACOSX_BUNDLE_BUNDLE_VERSION "${VCS_DESCRIBE}") + set (MACOSX_BUNDLE_COPYRIGHT 2021) + set (MACOSX_BUNDLE_GUI_IDENTIFIER "be.merkaartor") + set (MACOSX_BUNDLE_ICON_FILE "merkaartor.icns") + set (MACOSX_BUNDLE_INFO_STRING "Merkaartor, OpenStreetMap editor.") + set (MACOSX_BUNDLE_LONG_VERSION_STRING "${VCS_DESCRIBE} (${VCS_COMMIT})") + set (MACOSX_BUNDLE_SHORT_VERSION_STRING "${VCS_DESCRIBE} (short)") +endif() + +############################################## +# Windows specific deploy scripts +############################################## +if (WIN32) + set (CPACK_VERBATIM_VARIABLES ON) + set (CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/Icons/Merkaartor_48x48.ico") + set (CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP "${CMAKE_SOURCE_DIR}/Icons/Merkaartor_installer.bmp") + string(REGEX REPLACE "/" "\\\\" CPACK_NSIS_MUI_ICON "${CPACK_NSIS_MUI_ICON}") + string(REGEX REPLACE "/" "\\\\" CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP "${CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP}") + set (CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) + set (CPACK_NSIS_URL_INFO_ABOUT "http://merkaartor.be") + + # Workaround for NSIS bug in CMake that creates and checks only 32bit keys even for 64bit installers. + # https://gitlab.kitware.com/cmake/cmake/-/issues/21960 + # Will be fixed by PR: + # https://gitlab.kitware.com/cmake/cmake/-/merge_requests/5952 + set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/ModulesOverride") + set(CPACK_NSIS_REGISTRY_VIEW 64) + set(CPACK_NSIS_ENABLE_UNINSTALL_DONT_CHECK_32 ON) + # End of workaround + + find_program(WINDEPLOYQT windeployqt) + find_program(CYGCHECK cygcheck) + configure_file("${PROJECT_SOURCE_DIR}/cmake/deploy-windows.cmake.in" "${CMAKE_BINARY_DIR}/deploy-windows.cmake" @ONLY) + set (CPACK_PRE_BUILD_SCRIPTS "${CMAKE_BINARY_DIR}/deploy-windows.cmake") + + set (CPACK_GENERATOR "ZIP;NSIS") +endif() + +include(CPack) + +############################################## +# Tests +############################################## + +# The test shall be placed in file "tests/.cpp" file, followed by required includes +function(MERK_ADD_TEST test_name) + add_executable(${test_name} tests/${test_name}.cpp ${ARGN}) + target_link_libraries(${test_name} ${MERKAARTOR_LINK_LIBS} Qt5::Test ) + add_test(${test_name} ${test_name}) + target_include_directories(${test_name} PUBLIC ${MERKAARTOR_INCLUDE_DIRECTORIES}) +endfunction() + +MERK_ADD_TEST(test-projection src/common/Projection.cpp src/common/Coord.cpp) + +# Additional tests that use the main executable +if (EXTRA_TESTS) +add_test(NAME "import-geojson" COMMAND ${PROJECT_NAME} --test-import ${CMAKE_SOURCE_DIR}/tests/data/sample.geojson) +add_test(NAME "import-shapefile-point" COMMAND ${PROJECT_NAME} --test-import ${CMAKE_SOURCE_DIR}/tests/data/sample-shapefile/POINT.shp) +add_test(NAME "import-shapefile-polygon" COMMAND ${PROJECT_NAME} --test-import ${CMAKE_SOURCE_DIR}/tests/data/sample-shapefile/POLYGON.shp) +add_test(NAME "import-shapefile-polyline" COMMAND ${PROJECT_NAME} --test-import ${CMAKE_SOURCE_DIR}/tests/data/sample-shapefile/POLYLINE.shp) + +if (CMAKE_SYSTEM_NAME MATCHES "Linux") +# Use the offscreen platform for tests with GUI to avoid opening/closing the windows. However, the platform is only supported by Qt on Linux +set_tests_properties( + import-geojson + import-shapefile-point + import-shapefile-polygon + import-shapefile-polyline + PROPERTIES ENVIRONMENT QT_QPA_PLATFORM=offscreen + ) +endif() +endif() diff --git a/COMPILE.md b/COMPILE.md new file mode 100644 index 0000000..ea71127 --- /dev/null +++ b/COMPILE.md @@ -0,0 +1,207 @@ +# Compiling Merkaartor + +These are the instructions for compiling Merkaartor from git source. Here is the +short version, given you have all the dependencies and are familiar with your +build environment: + +``` +$ git clone https://github.com/openstreetmap/merkaartor.git && cd merkaartor +$ mkdir build && cd build && cmake .. +$ make -j8 +``` + +And run it using: + +``` +$ ./merkaartor +``` + +If this is not enough, here are more detailed instructions: + +## Prerequisites + +You will need the following packages installed: + + - Working C++ compiler + - Qt 5.9 or newer + - Proj 6.x or newer + - GDAL (2.0.0 or newer for GDAL exports) + - Exiv2 (for geoimage support) + - (For Windows Installer) NSIS-3 + - CMake 3.19.0 or newer + +The OS specifics will be explained further down. + +### Linux + +Install the above packages using your package manager. For Debian/Ubuntu, this would +look like this: + +``` + $ sudo apt-get install build-essential libgdal-dev libproj-dev libexiv2-dev cmake +``` + +Or for Qt5: + +``` + $ sudo apt-get install qt5-default libqt5xml5* libqt5network5* libqt5gui5* libqt5svg5* libqt5webkit5* libqt5quick5* qtdeclarative5-dev qttools5-dev qtbase5-dev qtchooser +``` + +### Windows (32bit/64bit) + +In both cases, you will need to download MSYS2 for your architecture, and +install some packages from msys shell (msys2_shell.bat). + +For 32bit, they are (the w64 is not a bug!): + +``` +$ pacman -S base-devel \ + msys/git \ + mingw32/mingw-w64-i686-gcc \ + mingw32/mingw-w64-i686-qt5 \ + mingw32/mingw-w64-i686-gdal \ + mingw32/mingw-w64-i686-proj \ + mingw32/mingw-w64-i686-openjpeg2 \ + mingw32/mingw-w64-i686-json-c \ + mingw64/mingw-w64-i686-exiv2 \ + mingw64/mingw-w64-i686-cmake +``` + +For 64bit, they are: + +``` +$ pacman -S base-devel \ + msys/git \ + mingw64/mingw-w64-x86_64-gcc \ + mingw64/mingw-w64-x86_64-qt5 \ + mingw64/mingw-w64-x86_64-gdal \ + mingw64/mingw-w64-x86_64-proj \ + mingw64/mingw-w64-x86_64-openjpeg2 \ + mingw64/mingw-w64-x86_64-json-c \ + mingw64/mingw-w64-x86_64-exiv2 \ + mingw64/mingw-w64-x86_64-cmake +``` + +Done? Continue to the next step, but run a different msys shell, the mingw32 or +mingw64, based on your architecture. Note that if you'll run mingw32 shell from +64bit msys installtion, strange stuff will happen, so don't do it. + +### Mac OS X + +You will need functional xcode (or other c++ compiler), and libraries installed +from [homebrew](http://brew.sh). + +``` +brew install gdal proj qt +``` + +If you want to use qt5, you need to force link it, as homebrew guys consider Qt4 +the default: + +``` +brew install qt5 gdal proj exiv2 cmake +brew link --force qt5 +``` + +You can do without linking, but you will need to manually supply some paths to +the build environment. + +## Compilation + +### Clone the repository + +``` +$ git clone https://github.com/openstreetmap/merkaartor.git && cd merkaartor +``` + +> By default, this is the latest development version. If you want to use an older +> one, you have to checkout the commit/tag: +> +> $ git checkout 0.17.0 +> +> Please, use this only for testing (for example, if some feature does not +> work, but it did in older release and you want to check which one), never +> report bugs for older versions. + +### Run cmake + +``` +$ mkdir build && cd build && cmake .. +$ make -jX +``` + +There are a few build options that can be passed to cmake to configure features +compiled-in. See the cmake output for a full list (or use CMake GUI to +configure it): + +``` +-- Build options (use -DOPT=ON/OFF to enable/disable): +-- * ZBAR OFF +-- * GEOIMAGE ON +-- * GPSD OFF +-- * WEBENGINE OFF +``` + +For example, compiling in support for GPSD would be: + +``` +cmake .. -DGPSD=ON +``` + +### Run qmake + +Note: qmake support is deprecatd and will be removed in the next release. Please use cmake instructions above whenever possible. + +``` +$ qmake -r +``` + +Note that you need the Qt4 or Qt5 version of qmake - running the Qt3 version +will generate incorrect makefiles. If both are installed, take care to run the +correct version. For example, on Fedora/Debian run + +``` +$ qmake-qt4 +``` + +and on (K)ubuntu run + +``` +$ /usr/share/qt4/bin/qmake +``` + +There are some parameters you can pass to qmake to customize build: + +| Parameter | Meaning | +| --- | --- +| PREFIX= | base prefix for installation (unix only) | +| TRANSDIR_MERKAARTOR= | where will the Merkaartor translations be installed | +| TRANSDIR_SYSTEM= | where your global Qt translation directory is | +| NODEBUG=1 | release target | +| USEWEBENGINE=1 | enable use of WebEngine (required for some external plugins) | +| SYSTEM_QTSA | use system copy of qtsingleapplication instead of internal | + + +### Run make + +On Windows: $ make release +On other platforms: $ make +Debug build: $ make debug + +On most Windows installations, debug is the default and we need to specify +the release manually. Sorry about that. + +### Done! + +If you are lucky, you'll find an executable in the binaries subdirectory. +Otherwise, check our [github page](http://github.com/openstreetmap/merkaartor), especially check the issues and possibly +report yours. + +## Packaging + +The project uses CPack to generate binary packages. In the build directory, invoke the `package` build target: + +``` +$ make package +``` + diff --git a/CREDITS b/CREDITS new file mode 100644 index 0000000..b328a12 --- /dev/null +++ b/CREDITS @@ -0,0 +1,5 @@ +Merkaartor is re-using part of these great projects: + +Tango Desktop Project (http://tango.freedesktop.org/Tango_Desktop_Project) fir icons +QMapControl by Kai Winter (http://medieninf.de/qmapcontrol/) for the original background map layers +Qadastre by Pierre Ducroquet (http://gitorious.org/qadastre) for the frenc cadastre background diff --git a/HACKING.md b/HACKING.md new file mode 100644 index 0000000..1c77ff1 --- /dev/null +++ b/HACKING.md @@ -0,0 +1,92 @@ +# Hacking Merkaartor + +Here are some tips if you want to hack or debug Merkaartor. + +## Tag templates + +Tag templates are XML files under the ''Templates'' directory. See ''default.mat'' as a +reference. Basically a `widget` tag specifies a choice in the ''Properties'' dialog, +and `value` tags choices for the value. It's not pretty or easy to use. + +Before you start hacking, drop an email to the list. I think it's worth adopting +JOSM presets instead, as we gain a pretty exhaustive database and people will have +an easier time switching between Merkaartor and JOSM, which is always good! + +## Translations + +There is more information in the translations/README.md. However, if you just want to +contribute to translations, either by translating an existing language or adding a +new one, visit our Transifex page and start there. There are a few words on our +web, http://merkaartor.be/p/docs/localization, together with a link to the +Transifex page. + +## Rendering styles + +Rendering styles are stored in the ''Styles/'' directory, but they are not to be edited by hand. Use Merkaartor's +style editor instead, and let it save for you. + +If you want to add a new style, do so freely. Keep changes to existing files to +a minimum, so the overall look, feel, and rendering speed won't change much. + +I would be very happy if someone made a comprehensive style suited for editing +POIs, yet easy to navigate. + +## Sanitizers + +Sanitizers can be enabled by the SANITIZE option: + +``` +qmake -r SANITIZE=1 +qmake -r SANITIZE=2 +qmake -r SANITIZE=custom_sanitizer +``` + +The option =1 enables the address and undefined sanitizers. The option =2 +enables the thread sanitizer. Enything else will be just passed to the compiler, so +you can specify your own. It might be useful to run a compile with Clang instead +of GCC for different options/implementations. + +It might complain about some stuff in other libraries (gdal, Qt), so keep in +mind these are not our responsibilities for the most case. Usually all the bugs +detected are severe and should be reported. Even running Merkaartor with +a sanitizer enabled and reporting bugs is a huge benefit, though there is a severe +performance hit involved. + +## Compiling with Clang + +You can compile Merkaartor with Clang, using standard Qt approach: + +``` +qmake -spec linux-clang +``` + +## Variable naming convention + +You might have noticed the strange naming convention for variables. They are +often prefixed with a definite or indefinite article, like aLayer and theLayer. +It's been in Merkaartor since the very beginning of the Git history. + +The exact meaning in Merkaartor is still a bit cloudy, and I don't expect +anyone to keep this notation in new code, but it might be a good idea in some +cases. However, I will not accept commits that try to change this notation just +for the sake of changing. + +A possible representation was given by @PeterMortensen (see [issue #184 on github](https://github.com/openstreetmap/merkaartor/issues/184) for a bit more details) + +One example was in the commercial C++ framework Think Class Library (TCL), +bundled with the THINK C compiler. TCL was similar to Qt, for creating +GUI-based applications, etc. This was in the early 1990s for MacOS (before both +Mac OS X and PowerPC). + +It used the definite or indefinite article prefix, the indefinite for parameter +names of a function and the definite for scalar member variables (not class +instances). It also used the "its" prefix for members that were class instances +(this was before references in C++, so all access to class instances were +through pointers). If I remember correctly, this was to indicate ownership +(responsibility for destruction, etc.). + +The TCL framework also had the convention of "I" for second-level +initialisation of objects after creation (possibly due to limitations in the +compiler support of C++ features - I don't remember). + + diff --git a/Icons/128x128/merkaartor.png b/Icons/128x128/merkaartor.png new file mode 100644 index 0000000000000000000000000000000000000000..c85f7ea8f267fcf60e574c20c4931087cda600ed GIT binary patch literal 33958 zcmV*FKx)5004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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
  • U 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 RO$KUU@O1TaS?83{1OVF)4>kY* literal 0 HcmV?d00001 diff --git a/Icons/16x16/merkaartor.png b/Icons/16x16/merkaartor.png new file mode 100644 index 0000000000000000000000000000000000000000..446f0e44e34e7d7115f3db940b0cd0e6a1587387 GIT binary patch literal 1030 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG?e4Wg}9~D-YJMQOxtZRd`foivc$wq08?gVeu%)x*DgoRs72R1FiF_+MKHw zEqc|oC~g7!B?TeDX5Tj!ejYjL9qD^iH`mwl+wG{|61aZb?gL*h79EVLe9z;0@b2v3 zo|8YzvwuFCCiBXE#m|-p3p-R>-9MbzaArej#O8mIH>RupI&8lA`g5br#=_gUCq;1- zeE4+r+N(BMmURv}UapUJyn7UsUMhS{`N6T6sA((+Y<%i6`vJGJ$7X(UNImRvrA#tgehM! zuwKNVAsn?fZtq3z(-%Jfy#N2!W67TV`)X}CnwCCIGBcNz58*jnQX3U#{zdJ;iAM+j zi3e*o?z&(9JJlvh+9nO2EggMD5YC@V5}y85}Sb4q9e0HuGzPXGV_ literal 0 HcmV?d00001 diff --git a/Icons/192x192/merkaartor.png b/Icons/192x192/merkaartor.png new file mode 100644 index 0000000000000000000000000000000000000000..2df1b9ab970acf2d0f9f60f6479616ccf253c497 GIT binary patch literal 68817 zcmV*QKwrO!P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/Icons/22x22/merkaartor.png b/Icons/22x22/merkaartor.png new file mode 100644 index 0000000000000000000000000000000000000000..83bfb54467802208bb383ccd3ccca3f51019b786 GIT binary patch literal 1624 zcmV-e2B-OnP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~Vp*SARHNC@cm6>llpVNK7UF`fsOH2|K!XZ~*=I{Rv9wYNcMS)d&$0=HEB~zVF#C zNhLzZ)^qu3uD?(8oR+52wQ6^{V*UNDQKk*#w9u`eM#4A-u#bIV5GLql__{rs=zrHLi`O0xIo90ckOX3mr39C=Z=|IPd|!gyzoH9HWvOcY>j80E9VR^5D9fSFT1?igIT3X~$(2QA8#H=)@I zbA1s}N?@8ed*NDsD7(HD0-#J1O9G@4G~KJnqL$92^{b^W?#iK~1(#jA@$<+TX_wWaD87io`_(KCXge+oWya zat$OA(n+c)636kBr^OeG-xl_wvPdcZ=j{iUsdr4fSgL<`E!EL2Ns@Hkzz8A&QlkRd zZZOLRMF!Ug%QAWDu5a15?^Y-k1W_rM?`C?#W(U42dDnlMk4h%6fEPsSxCmH8B)o%h zx;Gk&0_7kXmt*miBu6Xj^|lTl%pSk^?(oJ=SXlDPRXF)p{_^YzhNX7bvn?ws3%<`R z+iQ1RtaokO1yyD-l?UbpzLV||E==>DYdkM*Ytb+Wxyly&X!fw_gcy@AZtmXrTdUp* zWeH)76otne7jay8@61FZ*|WA`yjX@zI@Z50y1lg~a;qd1O zUabY6eOX^x!#w3M_*m7VAOG%$Kbt$5NFP~P+$ya$2(Rk89*aUU&V_Ch0URCe*Hncu z*xv2BJ}45nKDu$U{ouJTMJPEvwLc6j)AEYnuaA%I>r2UB-6~8^rh9v||2;3qRRLqz zYZ+TRZH{@bS6cg1*!9AMO8gM*G`-5E$NlQcnBzENM1K10=^LZt6BFYY+ReRgF5CNX zVKb9t#pQr-tiHQx>bq~B939wCP0Rn}qpQ;=l7+<;DhR~&31a~;zwolvGFFcs%FUcU zd;dT8s_QFW$UQ2!rzR4Y&K~R^IAmGYk;8|Iiw`bdx-1HGIG;N;@noq&$jWLplVokG zJ}tJBy*|P?2)xP3Q=k6+FXavI=X1w@arHc41rX9y<>8~JMhA}`>ut64M!lv=zTOS7 zW!cR=y|T6%_>e!KVoVw1;&FxY;`q_budmNqHVeWKSXe5RZr-|`NNB##L{Y4+uQZyS z(UIi;0n5#vN}7iZ82|tPC3HntbYx+4WjbSWWnpw>05UK!HZ3qTEipG#F*!OkH99aj zD=;!TFfdLt?k@lU03~!qSaf7zbY(hiZ)9m^c>ppnF*YqQG%YbVR53X^G&MRfI4dwR WIxsLlZdQ{30000 zE4{%Kd;B zod$!!zl@GTWiOhTTWFg{#hB$5hpXac&)+eeMSIwE$v^0XPQG8?X4W(6BiD7;kA5BG z)zp0Ou-DmeK&hM${5V+G@*TP$IZAAAa{7MoOfe>a`;}czwxZyy-IW_j0`P}43%w!I zR!Jf^u zy|49R)b_7algdK|_2g9+baNBL-p$PiorUl^ItoT7f840BDQi6S?|%0EyIZ$S^OYs> zRK*cL7>L{d_g16C&O{-xt~l1_tU#}u1ndn4;%yU;U_l=}snczmtNT)=K*GpT^%ebt z=tbr|nqzYud?W!`8!J>3g>Rwow&rd>>wu+YRZ1yuN7veTiH{I68P=8Ajo9)ONzWk0 zvK5QPcE*F5Jz-sm9+X(3LKiZO9$OKZgBnIT(MqBn|32*gHWK_CNlJ!#nUKVxCXJka z`DY~;h>QF*2+VD)dIT^8@G|G*{;;Psadqh_C9<@wctBydRp5}b&!|F*+PBXw(N)`c zNMP&NMFt+l5-O*U)Tf6&B*Ma$v`TnG*`Ke~6a(Om^_-nn!aHNxFO5LgM^ePsgQ(6E z<)+auLv|O!ySrlzO3W%hA~ffavjaMPOT<1J+Wt$q&Lrsq&l*8X74*72K zqH{b$s5>~T@Lvf=xS70G+p$U)p`wmL`f|hd7nXqGCz~we4iLBMk7UUSwIvS-EKR== z)FR(g{E(k#(QA7x!#YbU0V^WF6L9p@dX=VY`Yhq7u^Fx4-8XZ=Id#JATuhW6M;J#6 zR4n6$L>R|hovnKO;M=^=kj<5m!cFgBW-jnx({gfIggiD$6 z5|?HMixvmV5;}CXrN-2FIKfmd@i&tCEwz@9u=6Zj$a@D3zafn;ld@b|Gw|Tx=DbC} zf+qsAy@I&zDz{F*oPo{;q5$VNqQ(nLWFmOMy-5WbBX3-p(ydLfm~a=e-?2Nj;K)5l zk8)t+Pql0owFh!>YIIX!qw_g0BDnDJyjpLK2QPw3%u4q;f01f2NYR$Pwa9m_32^1# z^GZ>+Xp}m6yi9RGefy>{WLJv$F63vH4i+kkbF&tuVyS!MWm5+($n4gPz7giWl3NFr9?Y6srLBSvW#K7@cYL{t{O)h&vwysGG1Src8_aheNP5erQH z@mNRg&e31Oe@Ti6Cl=&pr~UmEeknIuS{!=oMqVqv=1~&d7nUu|uT%J0%A-L>^VS)t zk%Dk$(vbya*7oAnZ7y|30*QAwq2PVjYP{JDBCSC<|&oqbyK z<52PD_ zzUq1ZMR*og-JiTWQ!7sD-iv)-c^u*#M6gBrHYv2RInNewrESpr?Gn)3s`F#GO@V zNw*VbkKd~qo|@gJ3$}5xy=0-;!VfUM%K^OaHzS;>us-|Vt7Xk>-v!mcLqNLs8iTx@ zs_bi5vVSzN`X5M9`^MpMja>54v+^MkeH<|M6o+F1t{{+V$_Q0uB+49l4WoJ$gFq`G lu3!)dBb7Dy{}|joNzP>d|8LOrusmrmz);T!SEged_7D2-Sc(7u literal 0 HcmV?d00001 diff --git a/Icons/256x256/merkaartor.png b/Icons/256x256/merkaartor.png new file mode 100644 index 0000000000000000000000000000000000000000..ca8de9493ccedb0adbbcf4b80f5b9399f4eb3450 GIT binary patch literal 113391 zcmV*cKvTboP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 SZdQ{30000S|jX^fGXRZxWOqu`)4vz z6?x5sq6}{khs0~I@ZK@N_Hr8fL1q{-YimDYSj}0IGuH##R@bI>gM+7C@{c2z1gfL- z$~2npRb$ouV&rUnnS=+);yOjK$vcCe2g5uai_|>oDgHz*({644&5;lS*N2baZCWNb zw4_BIZ*=i=A%@sb?5|ybhaDw&qI}KXPI)Ej-Fm8W(^pt?PuZbzRP$q<#G|gp6UX3) zPWbZ=XvvT7C+(>UNTY!|IyV>u#97GmU^WG9`bw1p~Kn^(P8)o;k&HB7~T6W9stQMg)muV3@;p`zJK z&FdNyzNPbcG;8vvyFzobbJ$j8e$;I8L@Y~*h;((A$CVfQ!W>GmWz0>o7uR`nagC0n z?lG*dF%JSVoYb#{>`m=@K@TZuS@@7*jy+`d3QCIkg-BY&&Q-JkzlgxUFISq=PAGmV zNOfc)Df3@HX%s%PQPrA@6H3S@5RUf`Rq5`%0}JxM`=>@&f^z)H$-JC-f^VXlsee@> z^sshd7w;YVT|3DKE?vb0`LrtjaUT)9?Ki#D#ZBJDIm+PW95`jhVxRBOY^b3tudY_% zoE%h|9FbMG+8gWaUoe%}{El1;CJ^$n)@5w18SIgF?~iBRDWoI_Jc-4^wOOIx1HFQ{ zKTQP*BAD&t<{~$OI@4%&CcR@q`C@T0WV{3>8>0rh2}{`sV(C!GhKsvlvPoQV9@~$r zT`ETgv*@)+U0mM+ZSap6+Fp7{)g|>4dk=-``R0c4@!s&ROIobkZ~Opr+k&D`3obRb zn_-sQUE!y*W&1h2@ulOR@0bGy$^h?M`@Wqgo?30)M&}jt{Gb}#d5}2=TnQ1?T;4)Z zw1#C`C3=g=p09h&;`o3_2f#KklQSXG`5ii;LBYyPg8@S>OKSI)wO$WT)WXzn) zrOf-Zq}alg`4L_cu#IRg#&ZqI`dU!vIcnoflMPxY96TM)-744mzNvno>yFTrVKyN64#0XTbb0^ZsKeeWyUMyjYxG71O{q+lCG6M z^2drSjt(_!eRkQG9wmgNH;ZH=t@9Aq2XYcDD!=zazxb}=1@_i_Pv_Nyox_jNa&p!0 z+fT-zm^istu2!Am&d`V!qXu6*~%_ z=c4bVmuD=4T!d;}I@u%~*NC%Mx4L70|I7=P%Eb%Ztfc14wC~5qP|_xCCLYvui@ACQ zHP~GIBPa$638l?T4y0;{>1#mGll4h<$mF|hydg{dx?c4YdL)o`A<0sHX}RFttL?X1 zk`q)K7vp+Ik=r6Pr}Ub0I{nUFxrhV$-of=OhYxyL>$Hi9mEHLcGtH^J+1{&P4VI7n z(|e^DuoEg68@M0}vjVS|9-olBZI4pCgc$AB6~VHouw@o)nvOX*I`R+MeoVNEH%rdl;PDAwjgyE_ZKLtV&abdn=WZ4j zn%L1mKkdlEF~vX;d?{RH?OKGj&xOm@5)=y}YZeEA zlO47Gem81SF3`HG$)wgRs-I>;)+V=fj0Z)~VQZqZ9xH9%+tEWCd zg)Sr-OI_gUGOdt(q%h>KJ<~AhqBQXSpG2;u{AbISq0(G;y~=3GGU>!blClf4sC9oA^vwDv&<&ZEHet2TG ztl9F`#%RTa$WEH$w(&;Q5AuKc*HlE!?(PG~rE~#}A)*sVbihIvl$M}V2MG1fqF!qX z#@2MHLn*oExbhA40CR&3m2^Jx;XHLcEeu;~=0d~zZ>CUNJ~p9-J{^sqtD=JiQV~(MU*Xzee`tXW)sYy3Jr(%AV>KHY}ejk z(PDK_u3luIPQCD(Qbd$^8dE25Uvb74Jp`h-iHgfGJ!xzMJh633Btw z%=nWSJh~R=oE1lr!Bw2&PHq~jmgGu4ncpO zHFiTnZXkekV5oE6@i6$7)uVs<#AislJYhjA7u%zbyYDRI$x!Y`5EjRf7ZZDCnzxdo zeVRuQudqfSdNd`LY&#~YU3B84z?{XvQp{Ex^3J{*b^$*UXiT+Uq*M ziU=5+9*u>Euq9Q3)$`#b8CZ)l4l z-cKpZfwrk8sK{9QQ`VhCQey-R=4f zRBC`|Pq=es;yxy1F7R}zU+%{BqYddP8jAo=nXzb|?h9WZ+bSIP#hLdhHhInm}|1Soh_^;|5g%_*C{DBM(A&)fPVW93%J{32DBmcj*43j<78Lw2}hwovqv|t zGQ?XW^N=R@{8sJYdG}lQP`Wbb$3Xc3PA8-gETX#Y-b6*ic*mu9_B$ni7u2Aw+gR6d zm4l9I4MPiR_!{l%``GsVdN~g8g5VsF<=T;^G|bM)O=5EGTh=ju1O;-1ae=3~{B zuD$gxE)IG;F!(OFp=D3NBY7))KfHU?_&BjW*!@8OY3HGPko#@;qH2Qo_2M#}g2f{+ zKQp-Tf`$1%sE1ELv&(9B}^v``!aEnwCnvl6)6=WU;7&Iu&q~)3hcONxO6j)zd8yg*Je+wpuUdVx z@7IB6#m^4}kDQN-S~H?u>b56e+FQM;AEnXU9nu@lW93;{N|j{wS6r|eH^!>+qjH~R z+UL>HAZun(MuzyL6(&ZjRLOZpvcgeVhP2j=e9b^V2Sq`&q$nQ%(9P;@?6jXGjya^A zq%1zby@2tVo6hJc6u)k0ShEqZpdY%Wx_zpBA}G`M*ZnL+0ha^y>;m0g13gsT0zA$L zP(a8dWe`d-^4F~8ud6C4t0GjcA{0~+2vfy%x&LFp`MP_1hW`HsO}x#2;SDgWu$gXZs zrkLCnfUzh&6aajPqdv30e)Wc9w2butAW#qhLc;;zDJA z(w}Opp-jwM1%@YmOvj!9bF-E%vxiEjQ@%J{3V;V*)_t`@wzu0+Y<|&S|DudU6zfEsY>IwU;Z_&}sS-Y znK&kE?<#JbHimwmrbyo6=~zr67h{nx2y1VUb+Kob6NM9*C>dzToFb^ivU6lY&Kz_) zUQ!u5z6#3q=$GBKc6Vkv8-Gysy zZ6TYdUQlsK0W+bh9NTd^zKP0#5i49>GizAp_kJ$C^sLP8*|(JLXCTt=&fg1)O_RMV z6w~@Iyyn;PUMJBW9rw@jfiL$nY;TN^=^Y*4aMo1zx1L#7DFKb`44}>4NiS~rBMM3# zRawoKl3s>Y@04wL@7jqc3oQBClUf#8sVr~{lz)@@Uxmz9_0z{~cc{$?|N4|X_)FK| zsX|iMKY{Nbd5|6q#{O_EPWF6CCQKs6T`M(e@x^wXOH@q=?;W!TmQ;vTw*>b}e;H$TYIshV)&zg*j+ zMaLJi`A}~-=`ot-n}TB=+)L+QiC$osfiedbVRDs{ZT%+i-l z-|>BUFX%NM`2EnwGQRO98Ko0T?x7+qgwP~v&w1D91|M=ubeTxwr`4>Q?`cHXWx41v z@9xPuB4VGSQA|JP70(79wGJ%*q9|jR6popfZmQUveG#|CcY6qGe7hj^;VAddjJput z0aHWAO2wbG$Ddnh<6D-b7E#vpB(Q=*`rUKWuYoKCnHp{9o z`^oKejps{%&Pk6?T}$p_?W2xY`KflztT3*1a%444+$cOIZ~Q8A?RcNB5CEP)Xu!02 zfz)*%E4MkJo)y$dg=iLf8dUZ7nLHhGb2o8P&DW{JiLU)U`F^~K0$}D~Bx3?KMZhcxL zTRjUi$Yc>?CA*2M=th8aY7i<+VJf+)>T2=if%bu-u9JweKR?i(dqy-XnxQ z=3DqB4&q0fy$8&dmFvas{y`YFeHov>&tCcEW_g*1e0d7LLYWUflo!tr?^xty35P=p z5J=xjYX~2!XjpN&0_V1KhLadZ8dL@HV)+KHpX6tV3RBYxY zyPxQi6aFq4b`zW^08{}ph+a6-KlA5+*6lbbp~_7QA!Wsh8ZznN<9JuB8VLeql$@!K zLQ*8=iwlm&N#yOG`zK-J+#-(xoPHns7@X~v+18&AMW&myHw2 zYR-NDPrQ0AP3^UJ5-{Nm2!b@d?-l`g(T&uK0P&yiM1`MRYonB!@N_0S-0#eM5fZNy z67UXF_ouu0@{!Awg&iSP&fjV0)#ScLf{$AF)0tV2%Oo^>v)$(513NeNkAiKK-U>() z_c|{*0ZEx!_zi!9!X)x*aDX^U%fc zYsGOBUW~`%LxA*SbF-)VVx1^hW0a^clUqww+mgXqxG}i=FASI{6&6vdEbMHspa{i#BoKH#ui2O7~=g^7sFTP|tU{rGneD$2TfgcR4b@oRqk7iIlhjp}u>tOgs!2s?yhrE=0b3`d zaWluiS{Bx|no{pm+b0TF$b$qt<*n>l!T1b`Uj95UCW$`Bw57rPt>2BjrKSF0?a_^! z#lv~*yo8$Kgva{Vz{QEp2$C>^+K3OVCU~bRZd+7%BxL_$Dj`zHBlx(!JVrTq11ssX zg*DI`xhY9|COz9gfC@S0R!Fn7|NM|1lTVrdwphCeb1QKJrvEF|Yho;eaUs0I^bG=U zoeqlpCye~Vl$D8f2ictV8zw5pZn|>oQ(Q+bZp(73n2+?}0qF8btSR7Nvl)GJKV`RU zoIl0_EpDe^9PuD>7=aV%mh6?n>LxqTOzmS{!?pPnHL~edL2RzRXR$YeZ0ue%k z^2uAeStVDxJFphy^J7qN)S%#U#2aCId?=y|EjM`w3RQ>jdw?-hT$|(Vg!L6VgB$q8}<w05` zVLCr0)`aN=Tmxc{_7v4)N%;rOlLK30wv(R++}Ir`2Y-D+6sKpaM+Lc0yC220iBO1U z-N||$*xzLtv=eY)dwJfh+)yU~k--wU(G9&htPd|2Hu_Dgxv1ON*hK@~B^_Z#4nZNp z(Y!qQ!h>6ulN-MS*(=xVyS=TYwGmNZKf0EsFX7^Lyc%At>a7?Lw$m6Do?eHGl#hai$ttAc9vq&zB#lT{mmNK$5YH~eaUe4uQ4JY}t zu^(wDM;pi_p{P7h$Qv&vTx%wF6S8|i253Jx(1RC z$2=-MDTB=~rPO0jcbi#5aO94ZF8_I49m%GNyIm?y_= zQYtUE#N6;xJpx_QYrxfexy+6oB)15}b@`tfiru6GNo(66X z8R$iKhFrF?X@gY&j#%#X0;z*cax|-|RCT5a4B@tmxTa2sxZZRI{Z_9i&d3JSW`uzm zoDep}%^MZE!H1J#%)bRSPZ~kD9)3>BIqx6TNb)e-G=5rX-eb1D*S_)@ZYK@hioM%Z zxp|C#ufpVmw)1pmiVu%A7m6D<6NmzMvJF*$tD;vEe}1TV+R+s2N*_q=>G@oHH*@_e zLjA=t)~ZYpqibaBwOLU*nynan7V5KL&s(c>|A_*o%V^kUl4@?HWf*V$+@Rjrp564( zHUk9(g`8R0$T|&8l2C?AtbxO8K_&>f1tFYl6_G_q5*hsz&;Paemr$Q$;%W|;Z>BpV zMgBYI^k5IaAeWMRHPx3(AH2FhUK|89SzG%O;%{3P8gjf*mr;<7@7@38wn7nQ#L6Y? zq$dn%>6_LpZO>nPAPr?^`zXi?L&hRCLQ*stw0Pg*Diz^`2-!LKQes5@JEVsASrK@8h>L-Df8& zZIXW|RzG;Y*Ak7@Kk#t1sKye;9?9&&LOAf561EC$4#nGIi~%dhb8I4)5+Vsmuy^b)(R zLRy;=5L=*P^a{CK9wK!)8JDq$8Rsk@!66F>4$esn52-T0g7_pkztf9?x1&_sy*?Ja zMRAV4%mS1R!M_%2{_Tj+^moyqCm}EAS~=_JLJmkQVAMNTrDO-~c!^rV=vc~4v!6dy z3tG-=wyKuL6ErpX1w^z5v(lFLg}@BMuvkPFz=cN8v|#(QLN>~h4BW*`|LNSycgk4x zUh!|-PqS_eujJRUM8AFuBQWs@hv!jfX_0Upuhg_t9Q2Ha@UyXe@|gE}^5rJ!0goT^ z9^9+5$$@-?L!@`46u5u0t%<-Az0hD@t;Dda))cFMesOOqT@}1{9z->Jez1)0hdSoN z(});4CZ0BwR>pe6X*c)OC&@I9RjJss;C=|nh%s`bZkMYkRSw1V>6%0M`S=l;CTTZTH2!eA1|q~D6_6ZmXnil zTGwO4cxSJCd<#kjd@+JU#o+4l(-A-+Tn(mdU`cWSDOI=oVq#A!5-%*hw*m20zd*Oeoq7` zB_b|uA}%W@byp54a|bCQheYa2Zj1dNft!cJ6Q`&Dzd+gD?7xKspslX2R*tqK{14xN B6dwQp literal 0 HcmV?d00001 diff --git a/Icons/42x42/merkaartor.png b/Icons/42x42/merkaartor.png new file mode 100644 index 0000000000000000000000000000000000000000..b2dfaa280a2d0f926797a5ea54f0c3b20b9ed65d GIT binary patch literal 4746 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 N002ovPDHLkV1niY{HOo` literal 0 HcmV?d00001 diff --git a/Icons/512x512/merkaartor.png b/Icons/512x512/merkaartor.png new file mode 100644 index 0000000000000000000000000000000000000000..dde4fe7fda90d91bd6b02277d2f4fcd7ed117ac6 GIT binary patch literal 384401 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�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

    ZJF3=i~jo!$&Ggv7@~ij`*9wUORO^)pB&! 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�MS+-iQ>slv~`1I=r4kriLmKY9T3??H;fkBMdZez8@y<75hW_=9eqcgkQ5Jbqg zR*%Mb@14)Wy$tUBuL zG7^AWi^&kq;qEc27SAs6N0!1;Bat*thwA`Q@}U~hD}aR zv_3+v_bBu$hwU}l{6Lj)Oh*{RWN2FFyUXz_m%$5O=zi1RMSXQB*8O3n+w&gYxG{iK z7`Ki{8`CEMR<*I#G>z7(WpK{fBoaafd7=A!F=OBuqJSFIJ}iWD+&+?{(L@Nrxv1+h z3`4N6D4I}$an!X7BN<1mtkkw}#yY}HGFwzmTLKRUf!h?=7Svs-87%Dr+oEj< z+f+0=u`^L*9Z{V8WY__DiK4>oBl4uw3R;tq)!(W_cYgThsT9~2q@uMJNpz#c(+0xr zWH9?n$Zzg_=8OxPN|)NCGH=K#Yc&%i!Q1K1knvGx&f1dj0SJ zF8lav=YZ#P2!T-wDRA#r{O%hW&_jXJ{cWZx~Mpgi}OGokebie!DJw{bi_4=}bpwBCPx&PqY?hN2vv?}X%c?$cpdxS1W z-itwsNFs|VGQ>aTt)@e|s#_^A%9H~iWl0p;;~9zy^ECjxemBTVy~&;bah{NIdcg1A zeNfl6F{UUs)>!ucG4^J^mSy*S-*-)W-e*2{uDQC|BgL7PVoR2j*iHo7iUU8`Fp&5m zk&-}mWGGe)|226J5F}8HL`oFEa%jntNTErJWKY#K-ucXXTvHy_+UML`-6Yd!kOi{4 z>fUqrUh6k}zn?FGF)inaV{VLIH&#j+g(3`C)u=S#Fj{L91R_sN6tbeyO^a5dsH|(F zo#)HV1KosH8zd3Z2$Q~DZ|bL~)|In_c%(7sK10S`a?WZV1irkBLci);tbGp}2n>53 z?ckR7t}UqQpDNIBhqL>M1Pu4@KYH)0zra{(t%=j2F-8P2``zF9&1(JX;^m(&uRm?; zb*IvE8f`-e6G3c@(Q@@ie|q-hr7mi(593{c`}UdUUD9tDf>FeQ7rnZ+wCp-}*QnC2 zf!(H~xnE1|KTWfZUA>{Gea+o)%cN>|$QM`2IZ~3;2t`+MbeD}2Wgk!M;nbJvLIimh zWodMB5Lb2a;3S+a_4yoai>krBL;Uq`^|CaQQYj^kRmSKy?x&+%JBdy|!#CcB);bKu zY`$_iCUq^9w$tfelJ?7Tm1Kka_l}KT5vwKx5=Sfug6A)0{hSkmVzXQ?W?7yaB^eL2 zY5}`mU0{- zjkfNl{KVRu$Z_&I8w{{kzkK=^zxRLq$;C_)ia3O^UWnzs5=(A*%(hRUHeZZJu{Xj- zcE~deWgr!*8m&YccR)Z2#*nAT6T~6Wib&-dfq$OPBi7- zaQ6jU>-F*u#zJsI@3{2|+a37VPbvVwj{+P{v2Ib-Uwr$zN-QaG%j#wYXaN zF`#42-DJnRmHdvyZ##lTH(c_vE8>|*f_s1RAjhx=!BJMXG3m~+myXA*UAX)l_Pb7qbaHe z(@|`U;X)X#Ev!bW2YOdqfnHUCIssO+8~X+X5SdE zmvtBITlXOt#zS1ru`29*Y2B!2Q=)DFg0|f?i=2Zq@NN(9&PlDYDsQFnIE<(hL~RG) zZUpT&pr3m}T4*RRJKvjE4W#r>7$LXhRzUzpKq=xFN+FFsN2O}fwEj7cLl2O#7Fp_5 zeWruKZoPBcN5S6qzTS+Z`~0$dOCoerQO8tqK{4CfYWue_$YN|tjE5o$tq>9Cf>JJJ zTUV=oFVC`Qf0`Oq{_Ve-eD&?*!JT|G90JUN02vd#JT$Tngk7xd8+S48IjO5Xy{HB~ zR@KI-GRjJ?*URH<5VSwp$nkI2s7A~Q5Q)1Bt&pLL6gKy7Q?%RaXxR~Q; z4`G1$8k`}Eu`bZGsA?1y$_Cd9TrFUMZKlfhRNZ#*KO^YFod{ZEzG}bxrKC4F?DQp; zG7s3ZMiCb#^Toqtt95IP{a^m~zigy;m3yL=-c^x$*G}9T?`*XY+d9;koy&AP<=8qW zO&9V!TVb_9D{(m49ZycxPP>_86e5i{p=Pzg(=!iJHh|V>8vj~uDpWPf8UPk+7~`Xp z?2TRPb~d#=bDbd7?MPj231_%o;(7@S%vWAu`h^27&XC6b&1zdP=CMLW<=tTf-A8wO zdFvqoboUCA8*0w&8<(e@!2$?5j77jP%rRSgwIZcELdi`#$ZJqMLU-T(cEZExt^)u8 zXCSoun}879-G>ku^|3Ax3iPs_-d8Ea(assp83nO~m{8DA*hV?Wj~)%eb*WDdg6W7& zhrDU@@qVVYwAKn9Xe~ilSylwLsIAsmmpX~L;8e=CDC;;9vQ?b(D2gd%j0G=Ft2p#m zJ}jCRRg0>Dv0wzPL?9r9AJo9&-ciV?esB^TOlTCcR~N?B3U1Y5x6V85Q99dC+ffK< z$93o2PcNn1ZIYa40-foKU>7>gI>Ir4UW%{3n>~8;D9-jMm8T;qI^$)LJ zeV|ljv{JHxHSRrycSjq>0@Z9j{K*e~_;J%pA7i~W@w!XTnbX`jl~IiPUfk+HT21S> z1$Bcgfzo(z>^avCr{!)uH?zCx4}6Uy7>HX*)7w6JtFhzMYuB2sK7CN*!5S$@b3uw_>qw zTQytZ%?DAQMWN7A={O3c)Gj;I7+Y34ibKJvl#N#M(c?GjVje|t7>1PKjW^$_>&?l% zcZ3M@!9FEaww1A(5Gq7aRqI|pxSUnjOEu|Zkb@B9S)i0$uh*`5Dk@C+NFpCKo+Zdr z@2pV@{S?+BiLowF);PPu#SCvh#HTO4M`^ai<)RBnP^cRpXzRiW z?v0-xpFD2r6(v*zX;oZVquXXz;7sXc_zl(ME;e(!^yT+LxD7{{vUhW@t80i~ZK zAlh9_(Dv8cyTRU|WZT=}FiuG4e*aKl&_ka1bam%1b2Wt9jRU4A!8yMFF`^K47mn(0D5zGYH#T6{1m>E$y0(X#$x3yhpocdl^4bk^7@5o43zPBVb^mw zLb%)3D(yR9*NeE&XM)c${z#|CBd=$>yDtXTQ&pULCyM}r`MT2qQjcKSf_>ch+u{o# zB3o6yz2OYl8TDD05Z)zW#Q`Y8{s^35GQ_Cg>Djk&iE1Z1)XEM9y+@DU+1uN{oY(7h z?e3~1BE3umf-RO!l5k3Nzdty?m>DfEu9jz4&1&6hgR-`PfK*s*P}U}3l2Rf#{mGMd zG7@<{P)ZU)q-tSx96=jg%u&|h%-c{r(XZQhCy~npML*+#ph8f_cwIH?(uacr5Z&m{ zO+g6r+n}wd#O<8?*pv9f)@ehBJ@isk4f-jDeV=~Z%h1X$)V`aqj0bq{5wdV|a`$oG z+q2fdDQ#Tr001BWNklo@+cY}ZQGMoXh*=h63XJ7Yqtwknt7QTl@) zUw!giw_P0k&hk!n?lp&SibKz;R2or)aUV+gj%hO3Ej?x{Xw@x4OedZGT+qZVw$Y9H z!rtr&;KhPjiZt|G3a6D!Lcf>SUAD5DZ#qEA;}d-Jw3&>;VtpOQDPuxwSrx@*vjQw3 z7!3EKIFFLNZAt(RJR3zZXZ&iu84d=$UN4D7o@fF~2-Ql7KrC0SLuLX91q}nT*%Zb| zW7LDkU(530V6=C9=bbPNDP@3}9^6}8pK2|wQPvvSR?FF0Qx|dCpYA_c%r7HR_YyfB zhXJ>Y*&qRd6IRvKV_KTSv6)c)tIKSPmaf>Zuema8q^SR{Pf5izar3Ngr#8+enh=f=8gaMXo z064qG=_SGt^A*|_l%bVqS}5y1Q(KvT-Q1Aq-CkMkO8DCo4-0QfcfYN>b(}n$(4AS` zU3gxYL_9XKRT%aC;k#IaP=o=N8z|#Xs9jRy?Foz{eG1lvty+&HbK`jTfIoIy9l)Q#;^-tJgVKgD4e6!3D4L~j|IGjkPr-WjQc*$%z;{OHBtmoxuxfs3~=W#nvC+*dXvPF5TVv)xt8;_&yyeo zwrhhec4WY2S50e4_Y@bc4C_? z;Ay)FaNDO=p^^R}NMqD3HU(x&ob3A$gVDhMEAFz|HppN20)Kw=d2MAL9of)sqpEZCO=CUDZE)qNT#YG!4TTKon&n zi0W#yn4Qh%OU{EdO;69ShW+?E-@SPD;`(qe<(!p8SvM^uw5-*57#m|Zr40nMv0B^F zFyV|I96lV34x_l=R7)vq0C{gB+d7OA%D8OnFv;q2yXed0NARys>-=Fn)84VLI`tl!A7_L z?;rk8|JxrtIlbz_H0&<^cS||l&TTAi%?6!Q_va8p$<5f>jzZHNUW{T@U|k{(ee-mF z?XAcTM%GBI3cS4V;ym}4lbpHFfii@`4`dzY#KD@Z`FWqGy|vG9s%2L;xwWBEJ1LZ> zH+O&|r_YH31RO_GT+aQl*!{S*xuu5M24`;5xVD3}?HxUcKC` z*Nl-~Ci2AeQdnzGj`uc2`PQ5FqByDRQfs|fwWDDc1e|fP*+{7%CCUm(M5TmO=Fz<& zWA^(W)o(sL?)8UB(yPi1rBrJP(6cKy7)2ELOWGJzZFh?#um;C_I6gXR+ln)4t(C2e z;+T_WIs|}=IRcI-^n4dVL7A`meF-J~?H+}@Nv8XF1MY=b4s?3F=Ocwzg;(F~Cf?{o zVjSC5aEXLjtr!yGixzMlG`>vJ#Jlp!UD56{W z65Vy@mg7+bN-@ka?0F!>&6iDEyaX80Xd+0&pJm276(Y#c{q|Ue@Jm zy_#2L8HUl`{xKJ#C^xPrWsGgg##n%a!+w4}FZZWCOQX|^#+7yM#AFPO!hDH;#tmL2wA|F{1_gn3&p31vZ;x_~e#E2Cw( zxeCKvgsC+~sd{<+?BgH((eMAkAAa~$zBu<-U~AB{h&s8dTPbbXf7>On`=htQlAoqe zeeGbn}F1BrAR1m-d!yE?_FoJdA^-C^N)N~0*+n|o^vUiuC z{5gRDK0(30?=I4VdBULE2464W9&)31jiALB{0=|o8s6?d*e-I?`HkJSD2!zLO;RojVUK>|%ZyhEdzL)5)-I z+SR&>LL!ykRK9*K8|xrZ-#q*DS+Q9ApHmV;a5S=WMRIRZa|uc=qWWNjFu?IX$_k;tro{0SDpxXK5q-0*DC$bcl0+Eiq5MUM-UA64!nfXflbVfAXB#ka2Y*$0z&Zp zkIeoAafne5bqi}y)EM>g#~;Y+CGH)ls$4yJ**rbPy1@B0UR|NAaWv(7BU`t4cqe{# zrrb~Q&4+oC^owFm3CUB=7`tBR!=r;w;{@1a#33=61PoYwB`i6L53PXaL(i5{_Qw&hD!A`giRLJ>$9Aq3}hI+tF>= zIHoJBoqBD{yZ^$%|7M%(Ee^_8PNY-6xH|EskaW8PBS0w7OF=0H8D=XVXYDotMYYSN z*)sANy=6%LymX3o02#(S61A$aEISK5|87yvX*MDyLu#Gu%x8rsh;3Tm944iu0 zRucO^#i@Fno{-#l{Ins1TvT-%2=2CbK@d*%?nH5>l}fX|wKnTbv}y^VSC_8{VdKfZ zHHHui=ylPyZ5Lfhd?%O2=;h+<#Y-%L)R zDJ32pBaM+JLdvGtY?`{gUQ|DNVxFDhVurc}2qLi~4mgaM^C$H(tV+a@U!&eE4t6p& z_eMy6zPGzUk<~t-2`m41a6%hhd7v^l^FNI8BQ;qX#&#$niiWH z$5UJ{Fk6CBZ}{55V9BkD{y;080S}bc#Ma~G>L54V3?twp>D~j&w7da?vI)$r(TliJol8MtjxhAEGjcwNJjK_jwVK0XFx=xJE{jbP2fbb|PKJzfrCI`T5xVJz>$HT3lx(7;=MaY%(#fi(73iMsLF7B{bGHaj>7+Zhwjfy7%~VYX(g^%D)3$z==)64Zs(Yd+ z!qB_ZT>`fI9cVX-bsvr+oqS%pcFPWCJ5oYd_qe6*HigaJz<_T#C7dHqAq0xj+cTXk zwQ4<+=cdNr=>p6R3d`$SYV0zoIYXX$^}TbOyM2IbcWzLfUe6K$`T4CtAi(KvY)A>l zeT@1z7^9bBZ{!s|j0Ri?J{qtzlGf-f8&F08YOSS= zwM|u2ZBZImoBI$B;v;4`$DKWJfjpsMl&5LB*{q+PoB7HQYUXPM98!AWklUGOF_gmI z2;)8`1FY6w%Eh{<*DXTdJzY-pwLkVh;>$Ut!n#5jKuT}eHg*?I7Y6v{uZwSf{jK5N zo0JA&(icG_!c@ze{qFDlrjo_Q%kL2oYqSNdxdoP{jIY;=akl>RA2#luaeIk??|z(K ztnL1Hfkk?X_QIHbK0M@^y=QEsL!5EYc?jE3(xO;%A#;UOW40(!1;xC`zZ~m3w z?s5LXhxO&$%Sn?EQHU&w-?&4jV?LcssojkF^yDClB7V3(xcB&5l#JBl+PVs(L~BJnPv0`ewU(C`mt2UwQPfIft-X8T8Fs@Su2%q1mJk8H{22QqT+FdI z@&V|1in8v?2Ltl+MnG<6lBY-_^fOS3H}63!v=o`7|6W)%Jv_>yQ5_K_0o%Co^K`>P9 z&PXd>ZY;3PAZrzP=VK?-?@qUGN+{4OCLE*MD5%orFQ?70)`Vg3-4C9A@5k*n z2G)bLxR)Gh(+QiHj|;C`T+V$@Fd1Mv#HIx2Fxsy#T= zHnf!kQs&WbN$4p+W#w1%(tr^Jfqy@pFwT|mZm0d^1@0Ysx!X3>;>k;V=^oB!x|Qwe zm91*z3538P!?=fE`o(v~qh1(9K^SVK2&IR|kNW*Qiu;@8`Tp@+X_7T{5elTSWmHV| z?%I~icy z$MXv$F#?XSeF=`a|KJ3J9`Y1*>pizWLjtrNB98{hQ}hx90!57^+ClIcL$$de<)4kF z_Xwq{>rd8;r?T0|rj%_-2x*&5UCuAhKRdfvuS?HS@#IbdV;~Kr^xHq#g-kJm{jtkH zXaDSo>}VUkX!d&hym_y6+Z2cP=Z_=}eTxV5@8H|(!Y{OV|2N$kH2 z7k%ow)wcC(lI`zix@&_n-yJ$rkFz4W&4EkryQ!eXPw}<5s?EhSxbs>FFoL>E5!tdj z&?PlGp@@@+I5piafYACR(Jc#)+!n?96%qCNOCgZOFczWkm!Faz*6X%*I# z{o-Hyd-ooFJLw%#$|+@x@upl*9wUyqI77*yvWP#z``))z%uuIAy|UX>|R^ z-+lSfv(|Kuc1KtY0`KQ;x-58iP1Oy`+RJ;U15oDCNG^n0ciN#=d8V;r#yJE^)$D4M z?b-^r6aHA2BkDc{A<#>~Df+q3N?sQb%qKoNowC-rvyVLWbN^uusUbD$8d~FG2Fh?W z#nUriFV9!FSUBFgHQH0v0uIh072*hK625%#oDlT-18sEP8&&0Iy!W7KHbyr|Ha>s( z5eQ9^?BM9(c<b5}t+ii!o5vwL+2;on98LM1eO5Qt33Ht$`X+7a<~-d+kPmyf zvyV{Ve1?2n70>Keimb^5zcxwdKLq*mctYyp3{m`U~gO;oaZv zj}`)1ia79}p(`c5ckG5^ISwHNvIIqG++T4NP)4(?m&A#bG7O`pt*UC1Wqm1|x-PXg z#`vH^YwWr(PKD{%JB*>Iy-hU`2m^#%1pzHKDKJc29&qga+$Zag4J-N5RF;VwICZwRF^8F++#ATZ4E z@)Bp)-JnH#(7lTdAONR+L$37>@w-LRMge~1TiM_Ld;j6y(Obplf`CNn#9Hn1AbG@_ zYX0=Y-)AfYA&duv5Tlhbj^M%=6A!e(6rz1V-?!*xSTJ3}it|3ih-{E@mC-u&C!Li(U1!SIL zI`otqMm_jGi^q&J^kFvhI0bzN&?=JWYv z!i5MOL6b8vnNH%g*ETid2@{dh^qb%Ks+5w8P#JcxKjeJ5H|gKML*|PjjTxcT7?Y*c z{ju*pmP%FQz6}C=@Da{u9yje~+*>UEAV(5mGQeyFYp_4Y{tzEN!`0kxM3q86$Gv?U zr(^f8IUEongi;O*V^vcxm)D>DrKF zhwoWSR9htZ{%ZD=^H8Z)w#}%ARV4(I@4SUplAk=a?qnxsm*wJmIs+tkDEDBKPz-7K_KNFp!>YrNpf9b_Tf(Qy4<_x1t09jdsmISA0U zzS8uL4eM=L4%M*BezK@rZ))?4bn5w9s)LWZE5RjTS1sZMgB)p$L54Kp!`!@ipFca* zWsT(qapbcripn<`JB~lTKq+vuAt1ybOzz=viWj#!V%_}5z0m=~!4wyBw5{J^5(+{6 zvU+=+ILd_!VKxSXoD{WnUr!Vzz5b{y)`UQ*))7?m=3A7_W5ZcI7X0ZBI>G`t!$R8@_f8pTrAeOUV84gkF!+}0w6RHv~B=P zoB?~eLEYkDg!$U5c#kId@y4&0c5+AROKJzUa>0Kt7ihV`(G;hbpcHWcr7>IHaNTQ< zWALC0gD~`I^3+j}tfx9QW^X>9SM|S@O?7bR7vgLxf{YLrMuX+`Cw#MbmZTFUYiqT& zgb)fs385~~)$IecR#IB$$lvO|l|#{5Nad-4{zt`uF8a=?xzDZuVAunrs9H#g>!lA) zS*)?xfDz1B=;vPF76slLOo=CY2h`gFt;L{+=Vv~2-pxtf_vtzy*ZB&DqX~)%y%dWL z(%5ax$aKUwQ$PO9e)_^ga<)(H*){S6X^hWa;$Vuey&F|kv)t&XXB}410zlK?jR%9W zC}gXq(_w#bq*Sq7%%Zs0Hl+p1%~GkhZ7LCjZCgii)-)TfWwDuGpMM6}ILY(jQ5dC7 zT}WD4YebNg#jM=Sf*?uqQQMT|;#{hBIltgs)O8`-TFRDyL{U#T)m?!6Yav_2~=!rAG(^PA`24cy)@rfs^%gFl(iZllyLy6t&LFx_G&>Kw<}LTD4>02r$eK(%0CQ_fHur=IL70L z2XDXo^(3267N}}f7c&51l-Ki@N!puC^xl3F$IUn14dyGu{>{Z_uhhEqu~zP($}&GQ z%_5x7y?W2hf|3w-_B}k^73|wcsn_BV?2Z50u4JRYhca%_RZf{#0cq6L-JNyT?f3YN zd&PF#a<}ks(HBnG7Y05C!+Fi5+D%t1AQ-{`urSz(K5ZAGDTo(pJCo)+kJw}wE;pv1 z>L4K2;_f~f4trAR^?LpI4*8?Muv&Yuiqhclr~emXxLz|S(;Jc=XD-_+KHZ1!GZ?le z42E$ZfxzY5j|vVlxR51pErRb7+z7>ebX8+RK?osX7{zg_wQ(0muBm@?q$eg5RgFFB*H)tXE%ugQdYLCP}gOihs3H+p4odxIK8+Sxfn!?qTcyc z-3ab_p*gihWf((0#pyM!mpGb0X;0`wNDrn_KbPP63;Ed@q5!s2;+2iRfgDo^1ow|X zI_&^s{wMC{kX|5XAteHVDD+58Lj16F*E&1hRDgf~-A}20_RTNv<-M^rx?G<|$%ygD z8qGw+K?r36vbJ^?&rK*{JTO|hMxZP=RbyC}7va2A%=-8`|072y0C3M=$9Hq{(4vH~ z`0SN`8X^I~adri3z=+>^x%nW<-Eeaoe5?&deOxU;3Fb?`X>bb=MzKHIDX#??|OK>*e8{_W~il_h2$Lj_ zlSFH+jNO~=2Vtm`;z1BbXoSP4AV|1~DP_aSovN4*hDX{+B^#w$ zLRgYybzL$h080p`R9j1igH$O+iB6;T+wUWZ!~gjYn!^cBuWbEi1El;ODSucm9@4k=SsC%KFYFzHtIjU6SfDk zO#lEO07*naR2VBJ(>4n1AO5@Z?|)=ARkxLe4~ozlgA8$m`3ma_ae#h~N5_alT+E=l z3y+f9G~*kd=dBCD9aX}G3WP|ajud2IEuz3n3|-CPHU8!nnabySYgix(kR^TrUe>;; za%(fvk=k4ilI_wQ9Xh{hZxNi_N2)a90D@yv0~V7Z?jG0&Cp-+f?5+_)1!xpT)EE+n z^QN`33!8J*4+xaO&+~_Lvc zf^ZI{ZQUS_z!_u2fU;1qAPl1@bq{b5M1T##giQ;C=57($Szj5G6>pV@xu zhj^0#t`^uI)A1;`Mt$Sm^<>Zzf+w$##aI?7YTt;Ez)O(p2IB#G45wFEmp)5?G9Rg{ zJ8+I`XKk0YFzVrQ;oFNXm%-(!eeXvqjW56X)!}mfJjwU!Vn!&VlohK}_8b4jufRgd z${+oNxc{V-Tced~t<_;bfAZ<|t8?X^Lf1Mm2BV?uPO|BZ<7QX;yElY(`LzDdC+Ou^ zti2hP(H*=c47{*uOI>&4E!TDw6#{{SF&M+q6es(*yN~ez#-N{J*hAf7Q$cW~G5R@l z#~S+aXAlC9j!{d?85#Gfwbqqsc>)7S zV3cNq;b@=pV6(cszI?^Gql$-&GGjDjOv%<-JDMD6t=hJ{I)7f4D?*61dc1ePsn$t0 zs)`xsL9xDMOjPC4)hu$5kv`N+-01KFlI~;0zw#L90cX&no_Qmq?E#1YmG6+T4Rg`AcD|?ItdK} zJss%DfMhYg`gS-S5<<+k-owFOmL-ukgfrDNa=u1cqo}Yh{ji=AY&K=g*T49y|2P}m zsmm*8J26^1bh_K8Ev}!Pz5HmgEY7ZMKSL7vA|Q<*gnvu(#E(Y>$HNmmxI1~{?Qadn z_Xy(zAcV9{L4ft@e7(G&lo_LqHIy=?9CMnci7>h>tG1Dd0;Cb9Lxchk4)OK(vVPJY zO)(w%TI|s=zWfGO1CCaM#S0C-?)R5 zeWVe38Pdo@Vx~h3GS<&n9FagEPe`89D5Ta}#*ijVFi=K0r&=4vm>X0u%EBmZnu;>U zC~MmWutl*kMiD}^(v+d9t@}LV2$KO%Vp`S4!PF>4FC|K2xwh-l2imj}S&Xs1t(Qw0^tjPmoKX|D5JxEPMAm{M1j6un4&^I^LMr@ zAQ(j);oc!yiR%T@1nUCx70zc}0=B+|U7+1@>hAF{z`F3Is!yJv-UU)iSZzYSUeBIP z4<2b4b~M-_VE5=D1-S5lwf~^`-hkg zu~_@q-Zb_%jic$h3G(#Ru#a`+MID@BQ-U!ZPrquywW3M#XWK zq%iN=ez)QIytAC1sT68l%gy+?1wOXj-_OIMQj%Pxf&% zQIFqvU(3pAeyq{m64(OP8bv89HrJO|GgzA^eqH8L$)dokXnc$hL!QDKySIPv#+&al z9s$G{X|xQY?CSi(&HBoH3jmB!j%Z6M<07c)a<#bVrTXq6HU;)aIN8US9)u?cd^!xL zlWaOp?jFSvuim&T9^Z@lIjd?_wL1U{qdy04;O4N-!IX6iDkr3&UCO5G*0|Gzs|rVbq!Fw|nqbsND6l`qx8CnfhR8Fj zlo|Hea1a@*0V1Vjj74$6I0FzT{W#QhRsF&nxU-L{!EEIT5U)?b?5&I-_iGnz=tc$G z6~&JEP5lKh?qihuUkoy2F`@`jK;n>aMn%90rD4e9kSV1pV~jImE$3i_SZgVzZL44{ zp~PCNR7)vs+gi%DsY`7%XS}W}&UsO)x@p3YzPd00w`t6hh{D>*cyPU_kN3i+)#q~< zgCxdk;}d#4Xis~Xm@$|PP&a5KT7|<2xWKwZ79)*3C@_ggXI!wZ%dA>29O$KJS_C0Y zVpdnR5ae=JpI+KVV!paY7E1oz(2KtNmne=&wAf|6JlJ3O9~IV%EKR5hZ&zbdBlKtiFiJ`8d@QX~{gAqo)_ zjQS`leEi%;fkz=W73#)slHG3SaEd6vVvQ*9SAucSJCTVVssp}%|4G1MhD_9do*=D^QO%7mDZ03ZCFv_jf=zy->8>_j9jnP+^ z&!lXJ<3nN{e+|}J#s%ksF~)gFDN{;@VaA!Hj26Y3Qf3UfcbvMrq$ta#kx@VeCs%Vj zU+>s+6i~p6bNuQz?PmG1E@zB~PD6dOkS3IK5mL$oM?dqT^-&K+<=;9A7=xnrhoF;V zQle#BQ67sRVN7VO+M&z4{v5^=jobVDIVJfuBOFdm?n0>GVpJUc^C zlfU&VkFqq(^1_(&bE_uf7%;|IfJ9NqC?k|GCc-F9v%%v>G|%E*#utk@>@rXA>=Xok z6@ky;gY33eb22IhDG`St1XBB9m%9<2rQpkNAPSJiNFp>XCPOzuVU!Rb4^63$45bJo z;RbMwQ%)ExT+?b@7iq0h5@f+%4^UDe4xh4bm8S!k(Y&<2@uH2%(dKVV#bAkYL#7 z>q6I!(HfH>HP*POmZK^1ObiA|u~}bU7riWa`eLP&>E~D#aHookQ>7@ZeY4CD7=N!cB7uHjTzSK_ioakNQaqQtnid!G+1fXHuaiN#(5}Z!T#BQ^PgL* zn|f)C8wgSmXw?{_K}aCNk3amucmC{^Gn;*W|3f?9iU$v=-AcgqwoVS@Y6Pc84ul^~ zx=-*X&&RsWmG%5D_dUC2wwK`5C0<>js$l`r^+BhX-GZ)jLy#_H6$BSEM4_j;JIuX{ z@GdKCDl`g8`Ejr%$P;}1ZA1a`l-B0e7)}BaMd@I( zys$7~lyVUfO53Ka>q0BVxNuU0s@`ZN!zg8pM@gR&CW4qUURO)X1T3mzF5A-hX`AID zaBr9hBEZ&lSrqH4s;o7PG1)ds$>nmfw|`72lWim0M#|RDsJ%2!2T?*P11#f$P|BEa zudQQ%{JZb`$;GTam_&>PO;Z9yYeis#Fky^Szd$pDkRbh4V7q* zahsg`IHX4>^zq|I!^trhQ4scEjWrsuS~mowsn_n#BZT@47(ysxNje;jk0~YA+FmL+ zGf5mz_U;ivI2YRkEeu0ziLo{e{Q!nkK0UR56@QZk*a10wj6sT4;qC#nL7pK?@cv^29DzX5rN{iuUyL3cnQ_nd zGDwNZ5Q2jd2+lwV=bUtZb;k?YW=K;?UCD2Zp_CYFl`#a?XhWz=_tnN4V{{lsjIr5# z8Ast{vUheqht(HzyIA9JKe1L_T&^~yT^D8x>uy^=e{*ZgL5BUYZ$r}ry*#v5?Tr&- zBxP(gOa#+)YrS|>AP{7}#=5Xo0}C66s2ao(@&xMwTIqlrrR;K}B4K7roLz%ajC$T> zO@Ji!!RC%%;F@4J)!5XY)Z!FtY19QLbnK9=@xoY0eFGX{cLCsKgZUc0#PpJqGZF-e z>&V$Z|E+&imov^o9>k0Vbu}|e5=yPLT1mmlpMLM-AN+V#Hb0B&L`Vk_b09;7R(85+ z18uNBMp0orK+}SA^m8bUy1wP-+Cs@)EUGs6>X!iP<2BkAWdkWaiNO`@O$%+YSb;MX zH5%!iZ?0gJ%HK3efPRiN#_=9LJH@6%Bf&ZD9e8e{drOlDvnAengt|d5qy2u~wsO8Q zZi+hUlStTu!#l?(_qh=L(FrB2Eaw1%FmcalSuB)n)2tswX%NJeGGi1MVm`ab`uo%U z2X4Z%UYupUy|S3+gM-cb(im-wYU(mhde$c(qbwFpQ!3eLr(`yoF$R#ft&fi%tykC9 z+P1A3<1VFu^B~OzWwDClysbBFQ-o1U2o)k)FVCX5PbhDj&GPz1uNQOLo}OJZ(h3nO z)f#Kkv`;Celxy9BkRXV{I17S!y`FQ5f0M0n)&VQ%7 z){0nI0&o$;aUO+17RxNE;s7W6^mvaYk-c1?sC^IPvFsY0B8$NVto2hz2eWhl5}&k1 zcVqFblZ)|NaRsdVXT0Iop*2E3RBuF(m8$D{ymu{_JOgdOdL zT2-ICxB-5+F%EJlX(2G_Zi(tkT8k>%em-27JrMoqNH1rYsQ$?T4^J=`&kplnbAgTt&J8!L}A=<%*>{!>bl6% zK(_6xD?B`=l-SQ+R-4iU9Ib-Z{+4wl{ia16VSkK%j>Q_YC5{i`FrZZ>rLs!urnSSK zpe)!FRTR=VL>iMg4g*0i=Q@p$CH}OvfRwnHqnB7h%-J=vgr*4>0>+BjQag$8y7ZAp zLLiM$)_8b~tA!sGIz_wE*p$1lBdNVj#|g%4*N5GrXLkBv=c#rfE|g$X!OGRchj-I_ z=-Mpyum0t47ps?q&}wsOjRv8zEn%%OiZS-`=?DMMcb;4>c5y87w!I$pgqi23#qTRXaeF+$ zk)@na0$9#$7$#XhuF9oL2kX)ejo=}nB+Z9|;bB=W7K@7{=^3N7ZnJz$DWQ}{@xWMJ z7S~BSRBa_?CEMCs8%3$niW16s*fu30gfZqu^OTaoaBn!=BS5b|l(MO+!lfDoL13*3 zqcqC~VU&eYEJV=M<^RXnoBddprPqCHk7vGPjG2{FRdo%`YBrlq%H5nK(V|4yhAGQ{ zZ5XgYz=mZ(F!W#>GUWfq_LBiW+6DxOfNYUXk)nF49xE%WGBYA0?tJc<_T-0e-y2cY zB;iJ)ySg$fEAqxUdw;`PzhzA?gtWFt@Ioe^fAZ(So1v?%HPiX!dhw}{{AST;X}iAT zj4P!>@U&7>N*CpnbM8Y(blP?Mq8K;(o#1S_3A+|jpzCq7#->Kyf(2NIZosd-kALtV z{jO3n)iTXW3Vz{SfHQ_K_W|A+)2~1N@r&KQ&k|SWpbDL!*C^8&dpr zqV7OIO2&tiNJrvehNAzgB_ZA3L%bYGI~C_;NE-Zz2IC(LBAj{J|0iBPSUIh!LL^9w(FH( z-Z{?0YU@6DXL>T9b$z?qSkmlncClW3bio>Oi( zGvt}jiO%yZO?9HVQZmu9Y0O~#YKz$z)3KyLK;q?4I@{$5@?2+G%7D7*7HbSPA_cP~ zrdpoO;eGTO>^qQM>2{6fHe$V_2{*(QG&!Q~?`EWokHirlO-5b1u!$o6t*__Lo;?#n zGtL=f;-CJH|9H3lWVd=j3$&r%1@B0*J@otA>rXy?S>LXr`;p%Rst`Rx9xhU2?;MOr zGYjn>oJEmgRA4s7>)ZH?!xtU-H1wpuo2OA}D|o~bI1j-fF*d!^kvYi!hn5; zNrg#;e!yajeG9>HI>przU5_-0D2Ou0%^I^&{7NoQ@ay?B{sqpTP^Gf)JW_s$HhR5~vwUAwEdE9)$UrKD-0bka22u4_i)*>F=95|jYQ$;1?E#+o}kEZyNb9pk~7^U z?lL$Z)tPjl)1JfJQ*<0JgDOXsqU#R892U!e8u-k|aqpKT2PQs);3%`mV1M=?JbZ9I znaql!bY^((qrX{JXZ!6N&Ux_88Ux06o7;QaTQ3D;41M27A^8Eq?rq<-^>TS#R^xhK zfA@zsKYba2LPwSboo*!6BRK}W!qW=t9d1@wY*1wQ%2RbdmqPNg$g_;{w>@XvI_sRz zi^4gpv?BQ-?Hx&v&bg41?gKbyz4uBf?*jm9Ekf`CQZOdC;G}R12qDV~r4wt6lvu9a zo25HH8+UD+XS}LP&Sjcp<5JXh*Y-G>qRP>9U_6{oxe}}&0x|llT%;<@riIq}cCpIy zwC#s(z-%mZl5)=JW>QKfNpidFytk8*CmK@17=N>lo?ZYhKuUgoT5NZ{me|$(tD87} z$Wv&Asz9oNfQu9K0}>sB*vcFyV{G?WY|!!M%`sId3!F|d9ieW}4fx6)m3#yxP~B5WI7) zZ5r#$Zo3NJ=0$aVeVu4E482l{a~^_s&UEdbahB$l;9|AB+HDp>aPORR!%sf`*Vk`u zKY!hR`2OSN;_AU$@51k^A_}EWPUfd)kIpXN=3ErjTqjw*TO>(NCK{^9w%Y~CPqjeT z2Wm@+IZXJ0(uzAQAdJD<(-+ z(Z+>y!G#PVD4hzab(#wR)(+k~DP^9eA-J;4=VMmoZd@VN`1`;2;B20p zpN`8S8CUA*TLpZZrH}%rQ*e&9j}cLv-Bo1Pp*uLoaf>4XIPaLy^EhoP5B8Z&t38Dm-}-g_aWluC$bM5QK}riDUC z=WLWU_&{29AA(kjRsvG0EXz5UecxF-FvixKzRH6!ol<-{oeLqX9fXj1F*5xs)oA+| zqC#Yz%d;c|EY?0zkTL++?)ufbZMx9)LqA|rvB_lOoIT1<0cNeuQkmxoVNRUGVuMi; zV}%lp!JGm@UFphge<|Nf{5Ea;Sz5yc28#$_ahkT!=(ry~tzQV}&LOv*4neJrF7!Ha+PKmC)eJg+yOw)IWl z)%3Z?62ZH^U48$@tHnCpVb^%{Yut5${Epc`Uh{CscckUmVDan$z#>j-T*j!1eRC%i zb1sq&$A?72eHXz&N<=_aZy*@bLwuE12m$Q?Fenwbg=K*v!@fn`Mhyx5)ae9TLCI*W zHx|1ZbqnjE1TIeS@C;`&2xbKjoQ3Np^&&wl!3AfGhY++*hGAfg8`B488DqCMpD~6c z$<5FSsha&}I)5;pK3KeY0R*ixgpilhYH}f^PO^z}-Sy``n4Ubldieu0v(3Wb-mfuZN1+Yc`k$q2x*#2DMJW--C)^t*(Dk%`WlrfOV2j@Mdr-gvvoN>0-x{y*0L#uQqrRH4fBy?^Y6qF7VWwNFdIc_#(0ED15 zaW;!awkpTvsUB4sJqAK3I*5%K07xYT&2fZ00tk+YC7eqsHRry&V*mgk07*naROiR$ zAdpXq3vP_{0p3~wJ_Mz;6e`Oqr4q_u(aI$WPt&9-$4QzM#l)CCFUHM&JDHw8|7=Ba z^V@Zl%4Dgia)jWGy{mNlAyWHKrffPH6IdbykkuxH;2Z%?xDZka|8IWeH#Gtz1fln$~Rq1?;ed}J|Vla5`ag@>TJDg51DzMvQQsHERs$d_zD~<6VKaU{T zyY0&%?K~P18D=Bo32p<$c_ zNAc0%LbmnQ|Mq`;{N0}nQhq@Jc6>jnHc!-@p^^HO=u_Y*vltIx94JtJLHiBh>Ly+i zG(08FHDxR)iCuG7AJNlh>|Lr6g&LmCBMpMmeU-qtLcK@bA}5RqASEUR5{2HvdA$Dw z`<8UO7!2wT)}qL<-Q#QTGGlSIz=QL2wXyF%&GOWG&(f4E5$=HCaPyM~)9LvzG|mmq z*|M7JByILou5Dau&I}Qx7*jN zp>5I_Q?5JHwD0FzQ_tyk+cUCwR0Cu|%&jtKtr>@p2WQ)6 zr<5vkzN?4L&KnzpL9D~sjLpaR&ENX%ue|?}bN=8q;FS7uyaNC*CZaKj@esVVof+Eo z;(JTZ|RHNEMIXhq)vrQl+F->kclykvxBq! zkA3pvl z&8pGlvZzjr>P)Fz>RfO^6O3YXT9otY{Gu%KX1`Fv24GYif>{EzjC@TReMdDB!!X2Z zNgupLsMsk=ISiOCiATt&!W#e)z%L46feZCRtHb=KzG%&i2dO=gtn+ z*}C4;jj=9B$)pfn?_b}BeT(N;=$qC5{r{|=zrxuRKYD?)DgN~j4-t%r9MExr!D3RO z%8;k{mG|(?4^dU4q2E7!=U4Z;>j$Uq>c*YVR3kU)eI6Cx=vHp(14evbydc<~zh4nAPDg>g|45h?II3O{J1KrEoU5J!Iq@8$@I!NO$d&y(mU zIGv(tvDm^n?7P^1agI$BnO_f1&~zB=VYdb}9ohk1kIPf+_W1k_oJT*{BE#*9CXKAf ziIl*FPy`g*ZWiQ0S2|NF+1D#$x+E$0^=9astE-nqQE)E24?+lM4HXATI`Pgl_04wm znse^#uwGrIS)p`NZx_}K)o9-Cw_FIocfDP%tq|PXZntkIvy;(ivfXZnp-Ym~3}&-4 zS;B=>&))f3SVw21}|TIo^Bc;oteafA8$#k#ml7 zaTv?s*a6%aw6zqV#;zC7XQd(Byi!`e^6I{sA_^cYA z%uk=rPM>DwRH-a0CRuqRxROau%#Yw5$<~ASG{<9%=jBWaY`4o)1?K{JGL1RJQ?p1a zjEZL;QDZG%?9d9M{CP-XCVy@==C%?eL0@q0!7z@GQ`|5B1FaPWR{;hBSjiKA0jE6GEY8!s}{p4#O%tvL);_IO3aFI$I zV~7h9Ih`R;nRR?@!ktY$IOm*mhuODq&RS!w4_a^`xY8;j3^*5Dc<-(0tu>4>&Y3av z7t)x{IaiHlyX`W|s+-%IF?{|8c@}wjZ&ty%kR{QONFj72awSUf%WIeCsGE>y9AG4u zIz$C{=Um^L`6z7m7)+Rrk!LD+KdurmmL_bs_oq`b%DJ|;U5_G*gYJD7vC_t(>+#7e zR5^seqiHD4Oc^8(Km6I^m897)^it}!>7Dca5PZOFT8yg6ZoA~1ZFa-H>D$)NriwGc z7*EqY%_^mI*VfkdWK7#`mx%!RKnA}~rn9pLk3N)A2l%1iGscz5=ynHVX+Gv$CRwGE zf^$U@AR)C7$_L*yYc2$BfSoe{7#CGFnT*o1P#0(A#o6fLMRtDqaCY|WAmZZqtAk_? zQy_X_#C~_(HOoKy{_bXJD0Yg1O-SI2zsz|{4W&|yb6!?sVw$IEnH4jH;QSCH(gU0~ zj0t}5v~!^t;tYz;7a`@YBoTs_B1zIxsgw%|ur!-+t_k-< zrC-#jLvYTc&?$ZzVs`q-bnB+sTH|O~pC%yF9I2CWfMp%G!9pO=jWFXp8aZG%o!J4NTHHpXn*+Ke|fX)gb2L}t6i+I zjEjfPVhhf2wSX}g6?lA!@BbX$V^c@oSIiU>ag?ehMg^8zoK1#{%SX+AStQNlXWuxz ze7mehRXJJQUX{5{(wy2p#yH@m(%xBTEdXN%&bf0oNiydg5UBS55^aw@w@=je@VJ7=s)&6v5jtVf2ufL0LepOo2=Xpwfzxc!d*y*6O5@E%6W@D}e>NX^rgE8-&u^wOujx#yt(=$&r9d*dU<87S*_kwquFM?2mwvI58kJ#7);VbEa!|N~colx?ZMPDTD$T z=aSZOd37RXLd6&7oO1=nR8o+^N-6ry%Pb!$m0Z5{!Gp(N%k$Cf+W5F=SgjCjayVc9jpZ}?M zL!#N6h1s{T4q8HR)GZbpoKBIYF%b0P1WkvV6$Fo%7I7epMO#m}i!857{*|Yd8CtEA zC(nMlsaK5gqMC1a+aG-VlJQXFoB~y(lu|0C63zwZyxH%hl-63M6ah{SPM28wfAQ{* z|2eh=N~;h8{r4~oQcB{l5N_)jvmvA$Os`a;lxCdm_gluKF`W>y8cm$X%j=F9oa8Pd zN6V3LpQ|Dzaom||VnN}2>2|ZMo54DixhRUnSqI?q;WO{7P|6G)dBLPq!F%VevqRst zL*JF7nGhm)mlxBhtdNQ^o}{JsmT^wiE8~(87Z!0c?!8qyt0tG_=wdQ^IG#U6KvA8S zqw|xCcfGS*D5df*j(YBL*EyGm*Z45n<$?j;JMV_R-&bWiFSl=Q>bi}7QRh(PcfQ%X zv}X|`R=h`^vJiaNTLzybX_l8tr#dO_jhg&H&mJP!j&6kz=mep*fJXoPFtehMC4|7h z?;q}*M>;x9dvNHVe(_Ho7e&D{E*O&t!FwY(TQ08PEh#bf9Ry`B4;XBGJDi8}us%*i z6OEGze29k;3BdR5VLrz0uyoWVM{=UPGll+VzpsDz-9KF|USK?h2Qp$uX%cj|t)mTccwWe=}wFAYE9Io*2rS|dY z1MuE+&KcuE@DM;mSkBon479yJZl0(J&^qzX8q*Jb%Q=7X`Au1j+yB^_T{u{04}aO1FV1Bn|+SAB$vQ`%CMLkiR_oWtwe@agM#e>ey0 zF8@;ef;Mi?{3%T2>)^Jj$)W+aX?n2P$DWdokwnwXbc8@4tG-x#wAXt zP%63sNWehO_y8mc0z;bM!6~%DAAb+qIzD!kL`uE}e$PCdsAzzuC=4p#*n%NV_-HiUZI@EXB9q?RlX;#bX(yUy-|XvkK)AX3 z^y0xgjIp6>jOmT(rPNYt##*JcH63G&GU%Nh0>C)ax}bqf@D2=MBJy3l4*`_em82CI zOOi^eoLXs>6j9b0pb~D)o;Dn`sXLsQl8(b;tA0exa;f4;Y#b0&k~=Sp9FHWNhm;5& zEX4Z2*t-xF&LJciL!L4z1!E9Agb

    8%-|ra!$uO02Zrt=A3nQAUH%M7cfTkI~S59 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 z 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%0DN$tJo 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

    xbU1Ifoh0uT;L6d7Vft&rQzA)s#1coZ2d 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 F_J99Z&a40c literal 0 HcmV?d00001 diff --git a/Icons/80x80/merkaartor.png b/Icons/80x80/merkaartor.png new file mode 100644 index 0000000000000000000000000000000000000000..9ddcec0c3b444e2a94c76db4f853296661036af0 GIT binary patch literal 14910 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 Z1OERL6kYZIcZ3t5_FPl7OvNJX{{UoBydMAn literal 0 HcmV?d00001 diff --git a/Icons/8x8/merkaartor.png b/Icons/8x8/merkaartor.png new file mode 100644 index 0000000000000000000000000000000000000000..b68f5eea6f4dd53ba80a41b72534e7ced8b51a6e GIT binary patch literal 555 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP~vcaPl#((x`dYvtGlge zN2TrLW*0YW0b4`X(j*BVdp==4hNMu%o+`62Pf2qA_@ik9)R<*G~P@poi5(dMa17jDW|%7{|&vFEAD zl$+lymL9?t<*(dYs8EqC6yd=g=%LhBX09y75bn;oXJy>P2AlR`l_(FED1XJ)Qd37u zDMt&@IbF^b*%n(DM@4u`Y+IJTet!JYhkrL?ZU8x) z1s;*b3=G`DAk4@xYmNj^kiEpy*OmPNi=d#P^1kdD^MOJEo-U3d9M_W*5>k@V5>u1Y zA3S*S=-I=kkJAMNM1;fyMTOHROqeoh+Qg}o(*puRg2DnrgVQfuxN_;*#jBUo4Gc_- z%nVJ9(>H9`vT57Kt((~ycK=|1*t2f70?=&L64!{5l*E!$tK_0oAjM#0U}&amV4`bi y9%5)|WnyY&V4-bbWMyFBXZ%hdMMG|WN@iLmZVmQ%VUvLx7(8A5T-G@yGywn!@1{=x literal 0 HcmV?d00001 diff --git a/Icons/96x96/merkaartor.png b/Icons/96x96/merkaartor.png new file mode 100644 index 0000000000000000000000000000000000000000..268b7bfa9a56b85b59f446a0d6f2d9e0ac70f4ad GIT binary patch literal 20628 zcmV*LKxDs(P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~2t=V}d20kl%dFOC)xaZuQ>sGE}B~r|!NQrDwv0HAryMJ^T zw`Y1h@W2Bb7y~x!F=obq?G_B!J%UHwlI)QzkyMMBERvP0Zmt{8xhIF6!D& zXv%MXdR-p#D4T= zzb`Fk&^y@QzU{h&B#Dk%gAecYN1^`xzjLA6?ZwfsTCIAX*KW6N-|w$1FAybUOsg|K zcY3x~tw!NUtIQbH?)2_F&b8s)f%$k7wk;&5cHb}#!N3>{fd~K?0DuU#1=|8+U_cmQ zX^ws7)zf>2;ZNS$i&G{z83Qg*EuvPjdqcfCk4CL<)G?(%&DC^okadSRu~IvEqH%v? zR4b}lF)jwubv+?P636{v76gUfAbjuU$aDGPeD%t?`e-ytl^l(dBnbf>_`%Y=r&Ug* z(li#r%JWnkap9>ieD>G=bD3wcF)9v+Q8#vFxvat7aMa6C+^+5bN4~3Srt1+*f}y`48{;98h~pvV@Mk)1Op1(Bccfa}N&2~>)wtM6D=J$WLb#Sb@!;Aq* zijVFMh9MedJbfOyV%;I_zSsThpLCN9mPECL7cXP383mqI@cHAdQ5cV;#7vD3$9i+C z-Rrb71=mIxqZq)k(H|ty7>t842+qb)G+UQDd&$X5UQldGV>H+L{=+AoR=ZvnPX^@J z_{*-}pxQo$vh3n{RI}%<|c)**;{Cc3}+Nd5r#;q<|$E5es}$8tp#by@OGtq{yE+ z4q(onJfe z`}RjSx1VeerQnZtjM8jvrI@9uF`9^tBGw6h&wg;>!f9!j9oK*EnM?Ea_@kTqHy-gMr8k~|ZK2bLEn(Y;6QmiXIgFV; zo56^{kfewb2o52j4TfXH83rSqT;?xa@dA&u!P;`MRzjXD*I~X30wraK|mYbqnFY{N8``AAHSnO8u0sJ^L&7HuHD>=%(ZH$Gc`2BG<4j zXoE@-!w_i(WuRij32YnnGSVE{AdK%hbb24i#w;G8$g?DE+nLRB}KLD z1YUmWwAk9$Z+@h*9BWH*G}sgW@b^BIWy!lAK1ow81TLQ~*^*T%6|Gcmxa-LNNUtnb z1JCqE^2zSNl5AmyDTOdL{SgLZq&Yw^gi(ZHh+M(4;5leku{w`~HrjoRL)aEd0X!G8 zRlINsU;gZwFMjchg<^d?8bqVxpisA*!03EZ%L~5P-+TPMpLJ|@^!#(z3~{Z^(@&jS zTg-QNcB7O@0b3%?(CT3n!I){KXADHs+rYNKI7T751DdU|$v;?~$6!n!Z)Bc>^QW3j z1g%!LS@%n&05EB)I|JH1GLD67mu9a%`#JI3UpreaIs5xZw;zl=m-%)Y$FbIG{p1;d z4+i7IR$TP;=1%x;zT0n9nI(xcEX|kOeLUP!y%BPSOd(E@DOeI~3lJP>4k@rSgT*F$ z>MXwenG=8TJ1@Tc%)Bs%FF(Kb@~fX)T)k}BUK|a2?X6yWduHK+v^;<&AJcW5UT5d_ z{Z6YpYL7R<<|JG9s z`qAUfy@T;=of$(H&(1MsbvkV!u)MrduR0rBo%e3*b8Ecd@jH)6X?pK=c6URMW6Cv% zpa~!_hDs4c7{@RMg@9dJ#}_|+^4X`azWDN|o3qQsQn0>uVsYt|7c{w$drxi-dVArx z>v+ZH{24NaU_b;SFmAE%7w>Gg`dsRxlGm>_PFR)`$MMR_Lcg

    )yCh;^hJ@&BAj~ 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 + + actions/build_bridge.png + actions/GPS.png + actions/camera.png + Merkaartor.xpm + Frisius.xpm + add.xpm + empty.xpm + eye.xpm + move.xpm + rotate.png + small-remove.xpm + remove.xpm + toolselect.xpm + zoomico.xpm + reverse.xpm + edit-undo.xpm + edit-redo.xpm + edit-copy.png + edit-cut.png + edit-paste.png + emblem-readonly.png + actions/align_nodes.png + actions/axisalign.png + actions/break_apart_roads.png + actions/create_area.png + actions/create_node.png + actions/create_road.png + actions/detach_node.png + actions/download.png + actions/download_more.png + actions/edit_copy.png + actions/edit_delete.png + actions/edit_move.png + actions/edit_rotate.png + actions/edit_paste.png + actions/edit_paste_tags.png + actions/join_areas.png + actions/join_roads.png + actions/redo.png + actions/reverse_road.png + actions/save.png + actions/select.png + actions/split_area.png + actions/split_road.png + actions/spread_nodes.png + actions/subdivide_road.png + actions/terrace_building.png + actions/undo.png + actions/upload.png + actions/document_import.png + actions/document_new.png + actions/document_open.png + actions/find.png + actions/goto.png + actions/offline.png + actions/preferences.png + actions/zoom_fit_best.png + actions/zoom_in.png + actions/zoom_out.png + actions/emblem-unreadable.png + actions/emblem-important.png + actions/software-update-available.png + actions/list-add.png + actions/list-remove.png + geotagged.png + Grab.png + grabbing.png + actions/edit-cut.png + actions/transform-move.png + actions/transform-rotate.png + actions/transform-scale.png + dialog-error.png + dialog-warning.png + + + Mapnik/airport.png + Mapnik/arrow_back.png + Mapnik/arrow.png + Mapnik/beach.png + Mapnik/bus_stop.png + Mapnik/forest.png + Mapnik/grave_yard.png + Mapnik/hospital.png + Mapnik/level_crossing2.png + Mapnik/level_crossing.png + Mapnik/london-tube-24.png + Mapnik/mini_round.png + Mapnik/nature_reserve2.png + Mapnik/nature_reserve.png + Mapnik/parking.png + Mapnik/peak.png + Mapnik/pint.png + Mapnik/place_of_worship.png + Mapnik/post_box.png + Mapnik/post_office.png + Mapnik/postoffice.png + Mapnik/power_tower.png + Mapnik/pub.png + Mapnik/recycle.png + Mapnik/recycling.png + Mapnik/station.png + Mapnik/station_small.png + Mapnik/tower.png + Places/place_hamlet.png + Places/place_village.png + Places/place_town.png + Mapnik/bus_stop.p.12.png + + + map-icons/square.small/accommodation.png + map-icons/square.small/education.png + map-icons/square.small/food.png + map-icons/square.small/geocache.png + map-icons/square.small/health.png + map-icons/square.small/incomming.png + map-icons/square.small/misc.png + map-icons/square.small/money.png + map-icons/square.small/nautical.png + map-icons/square.small/people.png + map-icons/square.small/places.png + map-icons/square.small/public.png + map-icons/square.small/recreation.png + map-icons/square.small/religion.png + map-icons/square.small/rendering.png + map-icons/square.small/shopping.png + map-icons/square.small/sightseeing.png + map-icons/square.small/sports.png + map-icons/square.small/transport.png + map-icons/square.small/unknown.png + map-icons/square.small/vehicle.png + map-icons/square.small/waypoint.png + map-icons/square.small/wlan.png + map-icons/square.small/accommodation/camping.png + map-icons/square.small/accommodation/chalet.png + map-icons/square.small/accommodation/empty.png + map-icons/square.small/accommodation/guest_house.png + map-icons/square.small/accommodation/hostel.png + map-icons/square.small/accommodation/hotel.png + map-icons/square.small/accommodation/motel.png + map-icons/square.small/accommodation/shelter-bw.png + map-icons/square.small/accommodation/shelter.png + map-icons/square.small/accommodation/youth-hostel.png + map-icons/square.small/education/empty.png + map-icons/square.small/education/university.png + map-icons/square.small/food/bacon_and_eggs.png + map-icons/square.small/food/bar.png + map-icons/square.small/food/biergarten.png + map-icons/square.small/food/cafe.png + map-icons/square.small/food/empty.png + map-icons/square.small/food/fastfood.png + map-icons/square.small/food/icecream.png + map-icons/square.small/food/pizzahut.png + map-icons/square.small/food/pub.png + map-icons/square.small/food/restaurant.png + map-icons/square.small/food/snacks.png + map-icons/square.small/geocache/empty.png + map-icons/square.small/geocache/geocache_drivein.png + map-icons/square.small/geocache/geocache_earth.png + map-icons/square.small/geocache/geocache_event.png + map-icons/square.small/geocache/geocache_found.png + map-icons/square.small/geocache/geocache_math.png + map-icons/square.small/geocache/geocache_multi.png + map-icons/square.small/geocache/geocache_mystery.png + map-icons/square.small/geocache/geocache_night.png + map-icons/square.small/geocache/geocache_traditional.png + map-icons/square.small/geocache/geocache_virtual.png + map-icons/square.small/geocache/geocache_webcam.png + map-icons/square.small/health/doctor.png + map-icons/square.small/health/emergency.png + map-icons/square.small/health/empty.png + map-icons/square.small/health/hospital.png + map-icons/square.small/health/pharmacy.png + map-icons/square.small/health/veterinary.png + map-icons/square.small/incomming/empty.png + map-icons/square.small/misc/bunny.png + map-icons/square.small/misc/butterfly.png + map-icons/square.small/misc/construction.png + map-icons/square.small/misc/danger.png + map-icons/square.small/misc/deprecated.png + map-icons/square.small/misc/door.png + map-icons/square.small/misc/empty.png + map-icons/square.small/misc/information.png + map-icons/square.small/misc/landmark.png + map-icons/square.small/misc/landmark/barn.png + map-icons/square.small/misc/landmark/bunker.png + map-icons/square.small/misc/landmark/chimney.png + map-icons/square.small/misc/landmark/crane.png + map-icons/square.small/misc/landmark/empty.png + map-icons/square.small/misc/landmark/farm.png + map-icons/square.small/misc/landmark/gasometer.png + map-icons/square.small/misc/landmark/lighthouse.png + map-icons/square.small/misc/landmark/mine.png + map-icons/square.small/misc/landmark/mountain_pass.png + map-icons/square.small/misc/landmark/peak.png + map-icons/square.small/misc/landmark/peak_small.png + map-icons/square.small/misc/landmark/pier.png + map-icons/square.small/misc/landmark/plant.png + map-icons/square.small/misc/landmark/power.png + map-icons/square.small/misc/landmark/range.png + map-icons/square.small/misc/landmark/reservoir_covered.png + map-icons/square.small/misc/landmark/spring.png + map-icons/square.small/misc/landmark/survey_point.png + map-icons/square.small/misc/landmark/tower.png + map-icons/square.small/misc/landmark/trees.png + map-icons/square.small/misc/landmark/wastewater_plant.png + map-icons/square.small/misc/landmark/water_tower.png + map-icons/square.small/misc/landmark/windmill.png + map-icons/square.small/misc/landmark/works.png + map-icons/square.small/misc/lock_closed.png + map-icons/square.small/misc/lock_open.png + map-icons/square.small/misc/no_icon.png + map-icons/square.small/misc/no_smoking.png + map-icons/square.small/misc/proposed.png + map-icons/square.small/misc/tap_drinking.png + map-icons/square.small/money/atm.png + map-icons/square.small/money/bank.png + map-icons/square.small/money/empty.png + map-icons/square.small/money/exchange.png + map-icons/square.small/nautical/alpha_flag.png + map-icons/square.small/nautical/aqueduct.png + map-icons/square.small/nautical/empty.png + map-icons/square.small/nautical/lock_gate.png + map-icons/square.small/nautical/turning.png + map-icons/square.small/nautical/weir.png + map-icons/square.small/people/empty.png + map-icons/square.small/people/friendsd.png + map-icons/square.small/people/friends.png + map-icons/square.small/people/home.png + map-icons/square.small/people/work.png + map-icons/square.small/places/empty.png + map-icons/square.small/places/settlement.png + map-icons/square.small/public/empty.png + map-icons/square.small/recreation/bicycling.png + map-icons/square.small/recreation/cinema.png + map-icons/square.small/recreation/empty.png + map-icons/square.small/recreation/music.png + map-icons/square.small/recreation/nightclub.png + map-icons/square.small/recreation/shelter.png + map-icons/square.small/recreation/theme_park.png + map-icons/square.small/recreation/zoo.png + map-icons/square.small/recreation/theater.png + map-icons/square.small/recreation/park.png + map-icons/square.small/recreation/water_park.png + map-icons/square.small/recreation/garden.png + map-icons/square.small/recreation/picnic.png + map-icons/square.small/recreation/playground.png + map-icons/square.small/recreation/common.png + map-icons/square.small/recreation/nature_reserve.png + map-icons/square.small/religion/cemetery.png + map-icons/square.small/religion/chapel.png + map-icons/square.small/religion/church.png + map-icons/square.small/religion/empty.png + map-icons/square.small/shopping/diy_store.png + map-icons/square.small/shopping/empty.png + map-icons/square.small/shopping/kaufhof.png + map-icons/square.small/shopping/kiosk.png + map-icons/square.small/shopping/laundry.png + map-icons/square.small/sightseeing/archaeological.png + map-icons/square.small/sightseeing/battlefield.png + map-icons/square.small/sightseeing/castle.png + map-icons/square.small/sightseeing/empty.png + map-icons/square.small/sightseeing/memorial.png + map-icons/square.small/sightseeing/monument.png + map-icons/square.small/sightseeing/museum.png + map-icons/square.small/sightseeing/ruins.png + map-icons/square.small/sightseeing/viewpoint.png + map-icons/square.small/sports/basketball.png + map-icons/square.small/sports/bicycle.png + map-icons/square.small/sports/centre.png + map-icons/square.small/sports/cycling.png + map-icons/square.small/sports/dart.png + map-icons/square.small/sports/empty.png + map-icons/square.small/sports/football.png + map-icons/square.small/sports/golf.png + map-icons/square.small/sports/indoor_pool.png + map-icons/square.small/sports/kiteflying.png + map-icons/square.small/sports/mountain_bike.png + map-icons/square.small/sports/pitch.png + map-icons/square.small/sports/pool.png + map-icons/square.small/sports/racquetball.png + map-icons/square.small/sports/riding.png + map-icons/square.small/sports/skiing.png + map-icons/square.small/sports/soccer.png + map-icons/square.small/sports/swimming.png + map-icons/square.small/sports/tennis.png + map-icons/square.small/transport/airport.png + map-icons/square.small/transport/bridge.png + map-icons/square.small/transport/bus.png + map-icons/square.small/transport/car.png + map-icons/square.small/transport/empty.png + map-icons/square.small/transport/ferry.png + map-icons/square.small/transport/handicapped.png + map-icons/square.small/transport/harbour.png + map-icons/square.small/transport/park_ride.png + map-icons/square.small/transport/pedestrian.png + map-icons/square.small/transport/railway.png + map-icons/square.small/transport/rapid_train.png + map-icons/square.small/transport/taxi.png + map-icons/square.small/transport/ticket-machine.png + map-icons/square.small/transport/tram.png + map-icons/square.small/transport/turntable.png + map-icons/square.small/transport/underground.png + map-icons/square.small/vehicle/bicycle_rental.png + map-icons/square.small/vehicle/car_rental.png + map-icons/square.small/vehicle/car_sharing.png + map-icons/square.small/vehicle/caution.png + map-icons/square.small/vehicle/crossing.png + map-icons/square.small/vehicle/crossing_small.png + map-icons/square.small/vehicle/emergency_phone.png + map-icons/square.small/vehicle/empty.png + map-icons/square.small/vehicle/exit.png + map-icons/square.small/vehicle/ford.png + map-icons/square.small/vehicle/fuel_station.png + map-icons/square.small/vehicle/motorbike.png + map-icons/square.small/vehicle/parking.png + map-icons/square.small/vehicle/repair_shop.png + map-icons/square.small/vehicle/restrictions.png + map-icons/square.small/vehicle/restrictions/bollard-bw.png + map-icons/square.small/vehicle/restrictions/bollard.png + map-icons/square.small/vehicle/restrictions/dead_end.png + map-icons/square.small/vehicle/restrictions/incline.png + map-icons/square.small/vehicle/restrictions/motorbike.png + map-icons/square.small/vehicle/restrictions/parking.png + map-icons/square.small/vehicle/restrictions/play_street.png + map-icons/square.small/vehicle/restrictions/right_of_way.png + map-icons/square.small/vehicle/restrictions/road_works.png + map-icons/square.small/vehicle/restrictions/roundabout_left.png + map-icons/square.small/vehicle/restrictions/roundabout_right.png + map-icons/square.small/vehicle/restrictions/stop.png + map-icons/square.small/vehicle/restrictions/traffic_jam.png + map-icons/square.small/vehicle/restrictions/traffic-light.png + map-icons/square.small/vehicle/services.png + map-icons/square.small/vehicle/toll_station.png + map-icons/square.small/vehicle/tunnel.png + map-icons/square.small/vehicle/turning_circle.png + map-icons/square.small/vehicle/viaduct.png + map-icons/square.small/vehicle/zebra_crossing.png + map-icons/square.small/waypoint/empty.png + map-icons/square.small/waypoint/flag.png + map-icons/square.small/waypoint/routepoint.png + map-icons/square.small/waypoint/wpt1.png + map-icons/square.small/waypoint/wpt2.png + map-icons/square.small/waypoint/wpt3.png + map-icons/square.small/waypoint/wpt4.png + map-icons/square.small/waypoint/wpt5.png + map-icons/square.small/waypoint/wpt6.png + map-icons/square.small/waypoint/wpt7.png + map-icons/square.small/waypoint/wpt8.png + map-icons/square.small/waypoint/wpt9.png + map-icons/square.small/wlan/closed.png + map-icons/square.small/wlan/empty.png + map-icons/square.small/wlan/open.png + map-icons/square.small/wlan/pay.png + map-icons/square.small/wlan/wep.png + map-icons/square.small/shopping/confectioner.png + map-icons/square.small/shopping/groceries/butcher.png + map-icons/square.small/shopping/groceries/fruits.png + map-icons/square.small/shopping/groceries/bakery.png + map-icons/square.small/shopping/computers.png + map-icons/square.small/shopping/supermarket.png + map-icons/square.small/public/recycling/trash-bin.png + map-icons/square.small/public/post_box.png + map-icons/square.small/public/recycling.png + map-icons/square.small/public/post_office.png + map-icons/square.small/public/administration/court_of_law.png + map-icons/square.small/public/administration/prison.png + map-icons/square.small/public/firebrigade.png + map-icons/square.small/public/telephone.png + map-icons/square.small/public/toilets.png + map-icons/square.small/public/recycling_small.png + map-icons/square.small/public/arts_centre.png + map-icons/square.small/public/police.png + map-icons/classic.small/vehicle/restrictions/maxheight.png + map-icons/classic.small/vehicle/restrictions/maxlength.png + map-icons/classic.small/vehicle/restrictions/maxweight.png + map-icons/classic.small/vehicle/restrictions/maxwidth.png + + + Tiles/000.png + Tiles/100.png + Tiles/101.png + Tiles/110.png + Tiles/111.png + + + Gps_Marker.svg + + + Merkaartor_100x100.png + Frisius_100x100.png + + + Merkaartor_splash.png + Frisius_splash.png + + diff --git a/Icons/Frisius.xpm b/Icons/Frisius.xpm new file mode 100644 index 0000000..d2bf1b6 --- /dev/null +++ b/Icons/Frisius.xpm @@ -0,0 +1,503 @@ +/* XPM */ +static char * Frisius_xpm[] = { +"24 24 476 2", +" c #897A6D", +". c #82766B", +"+ c #766C61", +"@ c #776C62", +"# c #776B60", +"$ c #756A60", +"% c #766C60", +"& c #71695D", +"* c #7B7066", +"= c #736A5F", +"- c #6D635A", +"; c #706459", +"> c #6F6458", +", c #73695D", +"' c #72685D", +") c #70665D", +"! c #6E635A", +"~ c #6D6359", +"{ c #6E645A", +"] c #6C6259", +"^ c #6F655C", +"/ c #71675E", +"( c #746A61", +"_ c #8A7E73", +": c #7E7366", +"< c #786E62", +"[ c #796D61", +"} c #746A5E", +"| c #71685C", +"1 c #786D61", +"2 c #6C6459", +"3 c #615A52", +"4 c #6F645B", +"5 c #6C635A", +"6 c #5A524C", +"7 c #5A524B", +"8 c #645A52", +"9 c #625950", +"0 c #6A6058", +"a c #6C6257", +"b c #6F655B", +"c c #71665D", +"d c #6C6158", +"e c #70655D", +"f c #84796E", +"g c #776D62", +"h c #7E7468", +"i c #746A5F", +"j c #807569", +"k c #655D53", +"l c #524D48", +"m c #615C55", +"n c #7D7369", +"o c #87796F", +"p c #9C8C7E", +"q c #B7A594", +"r c #B2A18E", +"s c #B9A592", +"t c #A29382", +"u c #8C8073", +"v c #8B7E72", +"w c #776B62", +"x c #72665D", +"y c #7A6C62", +"z c #786A61", +"A c #7E7167", +"B c #887D72", +"C c #7D7266", +"D c #7F7469", +"E c #776C60", +"F c #84796D", +"G c #736960", +"H c #746962", +"I c #847A6E", +"J c #82776B", +"K c #8A7D71", +"L c #B5A493", +"M c #BEAB98", +"N c #AF9F8D", +"O c #A69686", +"P c #A89787", +"Q c #B7A493", +"R c #BFAC9A", +"S c #B5A394", +"T c #9B8B7F", +"U c #7B6E63", +"V c #7D7267", +"W c #7B6F66", +"X c #7D7268", +"Y c #84776D", +"Z c #847B6F", +"` c #7E7469", +" . c #7A6F63", +".. c #786D62", +"+. c #9E9081", +"@. c #908477", +"#. c #6B6259", +"$. c #72695E", +"%. c #8D8074", +"&. c #9F9082", +"*. c #AFA08F", +"=. c #BAA797", +"-. c #B9A696", +";. c #B8A795", +">. c #B3A292", +",. c #AC9A8C", +"'. c #A49587", +"). c #7E7166", +"!. c #7C6F64", +"~. c #7A6F65", +"{. c #7F746A", +"]. c #85756A", +"^. c #8C8276", +"/. c #72685C", +"(. c #7B7064", +"_. c #BFAC9B", +":. c #D1BDAA", +"<. c #C1B09C", +"[. c #B8A596", +"}. c #AF9F91", +"|. c #A99A8B", +"1. c #A59689", +"2. c #AC9C8B", +"3. c #A79688", +"4. c #A9988A", +"5. c #AD9B8C", +"6. c #AA9A8B", +"7. c #85796C", +"8. c #83756C", +"9. c #7B6D62", +"0. c #7D7166", +"a. c #837368", +"b. c #87786D", +"c. c #87786E", +"d. c #86766D", +"e. c #8C8074", +"f. c #756B60", +"g. c #70675C", +"h. c #6F665C", +"i. c #665D53", +"j. c #6A6158", +"k. c #665D54", +"l. c #635A53", +"m. c #5C534F", +"n. c #59514B", +"o. c #7A6D63", +"p. c #948679", +"q. c #AD9D8C", +"r. c #B4A291", +"s. c #817468", +"t. c #85796B", +"u. c #7B6C61", +"v. c #807167", +"w. c #7C6D64", +"x. c #7A6960", +"y. c #82736A", +"z. c #8A7D6F", +"A. c #857A6E", +"B. c #7C7265", +"C. c #7F7569", +"D. c #81766A", +"E. c #7C7266", +"F. c #4F4844", +"G. c #514944", +"H. c #534A45", +"I. c #625951", +"J. c #83776B", +"K. c #BAA897", +"L. c #BDA998", +"M. c #C2B09D", +"N. c #B7A593", +"O. c #B8A694", +"P. c #86796D", +"Q. c #817469", +"R. c #7C6D61", +"S. c #7B6F64", +"T. c #75695E", +"U. c #71655B", +"V. c #776C61", +"W. c #776E64", +"X. c #7A7166", +"Y. c #8B7F75", +"Z. c #7F7367", +"`. c #887D70", +" + c #83796C", +".+ c #4A4640", +"++ c #4D4842", +"@+ c #564F48", +"#+ c #74695E", +"$+ c #686056", +"%+ c #938578", +"&+ c #988A7B", +"*+ c #97887A", +"=+ c #B9A695", +"-+ c #B3A192", +";+ c #85786C", +">+ c #86796E", +",+ c #8E8072", +"'+ c #76695F", +")+ c #6B6158", +"!+ c #74675E", +"~+ c #7E7168", +"{+ c #756B62", +"]+ c #6E645C", +"^+ c #7D7468", +"/+ c #776F63", +"(+ c #5B534C", +"_+ c #786C63", +":+ c #7E7369", +"<+ c #998C7D", +"[+ c #988A7E", +"}+ c #86796F", +"|+ c #9F9183", +"1+ c #928377", +"2+ c #8D7F74", +"3+ c #8F8175", +"4+ c #83756A", +"5+ c #796D63", +"6+ c #786E64", +"7+ c #71685E", +"8+ c #776B61", +"9+ c #71685F", +"0+ c #7E746A", +"a+ c #7D7365", +"b+ c #82766A", +"c+ c #746A60", +"d+ c #6F655D", +"e+ c #AC9C8C", +"f+ c #CAB7A3", +"g+ c #C6B4A1", +"h+ c #B8A697", +"i+ c #877B6E", +"j+ c #B7A595", +"k+ c #96857B", +"l+ c #7A6C63", +"m+ c #74695F", +"n+ c #796C61", +"o+ c #7C6F66", +"p+ c #7F7268", +"q+ c #756D63", +"r+ c #72695F", +"s+ c #776D63", +"t+ c #776E61", +"u+ c #7B7166", +"v+ c #645B53", +"w+ c #6B625A", +"x+ c #665D55", +"y+ c #82766C", +"z+ c #B19F90", +"A+ c #BCAA98", +"B+ c #766C62", +"C+ c #B3A190", +"D+ c #887A6E", +"E+ c #85786D", +"F+ c #7B6E65", +"G+ c #796B62", +"H+ c #7E7066", +"I+ c #8A7C71", +"J+ c #726860", +"K+ c #6C645A", +"L+ c #71675F", +"M+ c #716860", +"N+ c #796F64", +"O+ c #57524A", +"P+ c #5F5751", +"Q+ c #7F766C", +"R+ c #83776D", +"S+ c #B4A394", +"T+ c #B2A191", +"U+ c #B1A091", +"V+ c #A29082", +"W+ c #7E7267", +"X+ c #7E7065", +"Y+ c #7E7266", +"Z+ c #807369", +"`+ c #796C60", +" @ c #87796E", +".@ c #8C7E72", +"+@ c #786F67", +"@@ c #7A7168", +"#@ c #6E655C", +"$@ c #6B6257", +"%@ c #6B6359", +"&@ c #625A52", +"*@ c #4E4A43", +"=@ c #5B534E", +"-@ c #5F5750", +";@ c #625B54", +">@ c #776D64", +",@ c #9E8F82", +"'@ c #938478", +")@ c #8C7E74", +"!@ c #968579", +"~@ c #938376", +"{@ c #7E7368", +"]@ c #8A7E71", +"^@ c #7F7168", +"/@ c #85766C", +"(@ c #7D7066", +"_@ c #83756B", +":@ c #6F665E", +"<@ c #786E65", +"[@ c #70685E", +"}@ c #6D655C", +"|@ c #665F54", +"1@ c #635C55", +"2@ c #58534A", +"3@ c #544F49", +"4@ c #625952", +"5@ c #5C524E", +"6@ c #635A54", +"7@ c #73675F", +"8@ c #908577", +"9@ c #9A8B7D", +"0@ c #938579", +"a@ c #7A6F66", +"b@ c #887B70", +"c@ c #84766B", +"d@ c #807368", +"e@ c #83736A", +"f@ c #98897E", +"g@ c #796F67", +"h@ c #766B62", +"i@ c #70675D", +"j@ c #675E56", +"k@ c #665E54", +"l@ c #5A544D", +"m@ c #6B635A", +"n@ c #625C53", +"o@ c #605751", +"p@ c #58514B", +"q@ c #5D564E", +"r@ c #98897B", +"s@ c #C3B09D", +"t@ c #8A7D70", +"u@ c #524C48", +"v@ c #8D7E73", +"w@ c #84766A", +"x@ c #837469", +"y@ c #7D7065", +"z@ c #88786E", +"A@ c #7A7065", +"B@ c #766D63", +"C@ c #80766C", +"D@ c #776D65", +"E@ c #686258", +"F@ c #59534B", +"G@ c #5D564F", +"H@ c #5A544E", +"I@ c #807568", +"J@ c #645C56", +"K@ c #5D5650", +"L@ c #5F564E", +"M@ c #72675D", +"N@ c #524C46", +"O@ c #504943", +"P@ c #59524B", +"Q@ c #73695E", +"R@ c #7C7269", +"S@ c #5D554F", +"T@ c #5E564F", +"U@ c #958779", +"V@ c #746A62", +"W@ c #84776B", +"X@ c #524C47", +"Y@ c #534D47", +"Z@ c #4F4A45", +"`@ c #665D56", +" # c #85776C", +".# c #7A6E64", +"+# c #796E64", +"@# c #786D64", +"## c #766C63", +"$# c #A6988A", +"%# c #AB9D8F", +"&# c #685E56", +"*# c #6F675B", +"=# c #635C54", +"-# c #756961", +";# c #7D7569", +"># c #645A51", +",# c #564F49", +"'# c #504A46", +")# c #786F66", +"!# c #665C55", +"~# c #6E625B", +"{# c #8B8075", +"]# c #8C8076", +"^# c #978C7F", +"/# c #BFB0A0", +"(# c #BAA99A", +"_# c #988C7F", +":# c #9A8E80", +"<# c #655D54", +"[# c #8B8072", +"}# c #7C7167", +"|# c #756B61", +"1# c #6C6258", +"2# c #554F4A", +"3# c #94877B", +"4# c #746960", +"5# c #73685E", +"6# c #766960", +"7# c #82756A", +"8# c #81756B", +"9# c #8B7F74", +"0# c #B6A799", +"a# c #B9AA9A", +"b# c #A59889", +"c# c #AFA093", +"d# c #BEAD9D", +"e# c #AFA090", +"f# c #8B8073", +"g# c #8F8274", +"h# c #8D7F73", +"i# c #998B7D", +"j# c #867A6E", +"k# c #615951", +"l# c #97897D", +"m# c #97887B", +"n# c #766961", +"o# c #82746A", +"p# c #C3B3A2", +"q# c #B9A998", +"r# c #B8A898", +"s# c #B9A999", +"t# c #BDAD9C", +"u# c #B0A090", +"v# c #655C53", +"w# c #7E736A", +"x# c #786E63", +"y# c #6D645A", +"z# c #877C6F", +"A# c #5C534B", +"B# c #685F58", +"C# c #897C72", +"D# c #A39385", +"E# c #B4A292", +"F# c #B6A493", +"G# c #7C6E65", +"H# c #81726A", +"I# c #B6A797", +"J# c #BEAF9F", +"K# c #A59688", +"L# c #B6A695", +"M# c #BAAA99", +"N# c #AA9C8C", +"O# c #A8998A", +"P# c #84776C", +"Q# c #867C71", +"R# c #908377", +"S# c #A49485", +"T# c #BBA99A", +"U# c #8A7C72", +"V# c #A09082", +"W# c #746861", +"X# c #C6B6A7", +"Y# c #B7A999", +"Z# c #AD9F91", +"`# c #8A7F74", +" $ c #AC9D90", +".$ c #AB9C8D", +"+$ c #AB9C8E", +"@$ c #9B8D7F", +"#$ c #58514A", +"$$ c #96877C", +"%$ c #696057", +"&$ c #A59488", +"*$ c #756A5F", +"=$ c #5E554E", +"-$ c #918579", +";$ c #B0A091", +">$ c #C9B6A6", +",$ c #A69789", +"'$ c #6A6057", +")$ c #998A7D", +" . + @ # $ % & * = - ; > , ' + ) ! ~ { ] ^ / ( ", +"_ : < [ } | 1 2 3 4 5 6 7 8 9 0 a ^ b ) c - d e ", +"f g h i h j k l m n o p q r s t u v w @ x y z A ", +"B C D E F G H I J K L M N O P Q R S T U V W X Y ", +"Z ` ...+.@.#.$.%.&.*.q =.-.;.>.,.'.).!.~.{.!.].", +"^.X /.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.", +"e.v j f.g.h.i.j.k.l.m.n.j.o.p.q.r.s.t.u.v.w.x.y.", +"z.A.B.C.D.E.F.G.H.0 I.J.K.L.M.N.O.P.Q.R.S.T.U.V.", +"W.X.Y.Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+Q.'+)+!+~+", +"{+^ ]+* ^+/+(+l._+:+<+[+}+|+. 1+2+3+4+5+6+7+8+# ", +"9+G #.0+a+b+c+d+D...e+f+g+h+i+j+R k+l+..m+n+o+p+", +"7+q+r+s+{.t+u+v+w+x+y+z+j+A+B+C+N.D+E+S.F+G+H+I+", +"7+J+K+L+M+N+i O+P+v+Q+R+S+T+P+U+V+W+X+Y+Z+`+ @.@", +"+@9+@@#@$@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@_@", +":@<@[@}@|@v+1@2@3@4@5@6@7@8@9@0@a@b@J.c@d@o e@f@", +"g@h@i@5 j@k@l@m@n@o@p@p@q@r@s@t@u@v@w@x@b+y@ @z@", +"A@B@C@D@E@F@G@H@I@[@J@l@K@L@M@N@O@P@P.V V Q@o+n ", +"<@R@W.h.S@n.q@T@q@U@V@m@d@W@$ X@Y@Z@`@ #s..#Z++#", +"@###5 >@$#%#&#*#%@=#^ q@-#;#>#,#'#)#!#~#y@d@Q.(@", +"a@{#]#^#/#(#_#:#<#b ( [#}#|#1#2#V.3#4#W 5#6#7#8#", +"9#0#a#b#c#d#e#f#g#h#|#i#j#1 %+6 k###l#P.m#(@n#o#", +"$#p#q#r#s#t#u#U@v#w#k x#y#z#b@A#B#}#C#D#E#F#G#H#", +"I#J#K#L#M#N#t#O#b+P#Q#R#S#B+9@-@w u+S+T#-+U#V#W#", +"X#Y#Z#`# $.$+$.$@$#$$$%$&$*$. =$%$-$;$>$,$'$5+)$"}; diff --git a/Icons/Frisius_100x100.png b/Icons/Frisius_100x100.png new file mode 100644 index 0000000000000000000000000000000000000000..b86929a5830c685713cd300eb0108e3dda03efc6 GIT binary patch literal 21845 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 @e14f<+W!0DF8Zz~ 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%0DE@cg5m|CJ}*^ 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%0A4UD5a@Do6;j~R`nkP~#*)%ErhtRsoqExGvVv$T5 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%0D~2o4mmydkSLeO7S=~+ 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 literal 0 HcmV?d00001 diff --git a/Icons/Frisius_splash.png b/Icons/Frisius_splash.png new file mode 100644 index 0000000000000000000000000000000000000000..3663030bc20931359f385c96ac0eac6371a45344 GIT binary patch literal 185308 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 z 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

    1R6Q{EItR8(Ene{t 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 Ls!W}fdD#C4Y%l#l literal 0 HcmV?d00001 diff --git a/Icons/Frisius_splash.xcf b/Icons/Frisius_splash.xcf new file mode 100644 index 0000000000000000000000000000000000000000..0db95411cbf27d8a9d64a31bcd8b9d431c9d7c39 GIT binary patch literal 277427 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


    ^Q~gM6pdEhVrHHw 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

    -G2e8GEW!B5R2aAnn}?+CN(xH_B7UP z=xPNqCeQrXEMWfIIH+|0?_a^Me&7F}sKWyUPJd*0czD-FEs;{X67cuo%iZsJe3oP# zVRPe^G)-ZVI&|p3fde1jJ?3XyIBQk*lB~M#UzdxVnGkya|3CifUoYDkX7WX{GVE4T WEMI$W#R;Gb7(8A5T-G@yGywoFNk%FF literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/primary_shield2.png b/Icons/Mapnik/primary_shield2.png new file mode 100644 index 0000000000000000000000000000000000000000..520f8f48e696b2d4ca6a1c03d39c04d17430ccfb GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^5+YD)uy* zC5Un}GdoMD8$V`O%=?yp#pLJR>+^%||NqCIoS2Z1An@pULPAEy)kVu#op`Ux&)fI= z+yNI~=Z%el+-|xOTNAD@DKP*IU_QLN-(I36Yt_2I%MZ%q>%9)@M11}G{{M#M^XoVQ eE;DIFurlZ~Dwdy$?FTx8fx*+&&t;ucLK6VtIzb)) literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/primary_shield3.png b/Icons/Mapnik/primary_shield3.png new file mode 100644 index 0000000000000000000000000000000000000000..d4dd8e35d4498fe527e6d0fe34d5c8a4eb07cc6f GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^@<1%e!3HE%my~+~sTxlg#}JRsw`VumAvOwWNhWqK&_qHFHzGeF+Mww507-Q-@s;aH_ zExl&o<2pw?o#BmT^RLROr*i+k*e&3>^pNhX>~%Yz&3b=`q2+wX+IRXZO?ZMop0AxF he!cd1cgVlT;fpRRmWxi4i3GZX!PC{xWt~$(699laOJ@K8 literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/primary_shield4.png b/Icons/Mapnik/primary_shield4.png new file mode 100644 index 0000000000000000000000000000000000000000..378e737e4e978cc118f253dc18f285c48e30e3c0 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT=!3HEZI^Ek1q)e3$N6K7v)$r1DwG?h5AV&#nbCiVJ{7W48P65?FhTh4CE zsNGqWmCbPJ_vZ75C1e`zuUoiJZc8A;zIC_MQpIjfsF(Dab#MukxRsO0r?9u`&(oUg r#}1T;8yrlMJ9eSuuiwot(SMl4HYk>>Z19r;x{JZn)z4*}Q$iB}t+h+s literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/primary_shield5.png b/Icons/Mapnik/primary_shield5.png new file mode 100644 index 0000000000000000000000000000000000000000..dc59c400bb9d2bbdebf93b2ed09f1fc04028713b GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^xY@8I?mPS&6L=S-V)IjAVg%g_5{rsifJ>4p#Q xHeUbiY&}_M*TRc9V!d{={FxdU(4N}#(KJYD@<);T3K0RUE@Nw5F_ literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/primary_shield6.png b/Icons/Mapnik/primary_shield6.png new file mode 100644 index 0000000000000000000000000000000000000000..606fc123860d85790b08e7a8ef62c6b3adcc70aa GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^CO|C6!3HEJN%rRfsXk8^#}JRsx92zV9x@PNxX2yB zT|1;VIbKBq;N;-nCBnj_CW(PdP279h5%s_L^(* z_u2g=zFil1Q)SfC8QvsvUwy11JM~c5_GNq%rbP0l+XkK_0UXy literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/primary_shield7.png b/Icons/Mapnik/primary_shield7.png new file mode 100644 index 0000000000000000000000000000000000000000..9282fc025ea5fe5534fe87c666050933e411c74e GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^)<7)C!3HFgg|0jXQhlB-jv*eMZ_jV!J!BxlaFIKr zse|c>k+Q*r?F$z0ieyT#@gHGnxx_V5N!?Y1E6pJO*AL%k+Q*r?F$z0ieyT#@gHGnxx_V5N!?Y1E3aL?^S4?>)zQx-`duc)IJw zpS;hT)@_{7w(`_xAsL1rf5kHL++S;O@7r0DdnzKb{SQ~K0yfCb@Y42B{Ok78o>mhd o(GRkMpZBzEljlF?JM9ts)BlR)_4fLk-ctHK@f$%GxuIQaun>O zfevCvX(Pgmz)Pf#lqL-nlt_qz&JVx?pa@E;R1p$=lxxQY5(+{>cH;PNhK7jb+7}m@ zZFY|4e0z2m?pZ1d`_CJVWPDwBk)$4)ngSqmjmd_;-+ZLM5U}@*Z0+I7PvF7-&x~(x zKaHN=bau08e`ONTkBC7~Sfc0fCE!@-*KJ&S7f#oiy&{rbLydr*n4OF#lOF&TtG@75 zJEZ^Hx6eCw#sgwh$k}Tr2s)LtQ6qEHbJKpfU6TmvkV}q zIf|q_fv0pNwilUG%N_y#{`26X6!7k7_+7!q1XhcHK%0W|qHc3@(5qRsH5cD#IXYVg zK%xWlKcUcL;dxO{i$a8QOL$#LRu2A|0b(8Taw#B5hlf+o+D2L<;_q9iKf|x;m*dmo b{JrZBS`~W&*1nU-00000NkvXXu0mjf{SCSg literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/pub.png b/Icons/Mapnik/pub.png new file mode 100644 index 0000000000000000000000000000000000000000..3ac26f3f2edbf00cd160e18f9a4b17e08c28f7fc GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ z@c4l+V|{s#GEh*m#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWIYao-U3d z7QJix47mU}Ex9@@9$!t4&|v*_fyw1#x9NG}wNo5tdJ=S5hx zf${cZ@|UayF6YLuh{&ckC^2o4XPSBQjQio^XWt&=FIl(q%dd|&D&9x>KTuT5_2BR0prEOz zi(^Q|oMej~_4d62hgV!&?A9-_czx{NChm);t^zqywpk`C-Gt}6wg-PS$@;S5qVw$x ZhV-{@(sFaP9DxQfc)I$ztaD0e0sz_1DkA^@ literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/quarry2.png b/Icons/Mapnik/quarry2.png new file mode 100644 index 0000000000000000000000000000000000000000..38dcfac9a4287c5eaa252bee7ffc0b1432b91c9a GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1SGcvS$+jloCO|{#S9GGLLkg|>2BR0prEa% zi(^Q|oMelt9|pYwhgV!&?A9-3n`I(#cV8j1WZ=z=HE#kJX9`_QIih0O+3#_g-6|F& g|7FF+5(6oQ##N$A+4`g$fCe#my85}Sb4q9e0OK4gga7~l literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/recycle.png b/Icons/Mapnik/recycle.png new file mode 100644 index 0000000000000000000000000000000000000000..4cf43a130a40486dc929b36ee8ad19747a8952f9 GIT binary patch literal 1118 zcmV-k1flzhP)amLU$d;3RXyWP{+s zg41Zirt?7!YL*yc_OdL~IUba3{)uszn1$er54sTkY-DC^W}A_x|oZzwbHUbI-X~RF!xlA_c%2APj_zabZ5Ks<-3)Z&?A{ z&MvO-IGKb98yX^n5+ckGctoT^<3t(P0Y#kPWpYUcW`Q=w2ovI2oMa&6vy~a%1Ww%# z!W1X^b(HWVsm8)tZqUP4F0qL-{02ZFi8weYBFU?EKru}`g9CsWz|BQf{YzDYjPd#U zsrB;!yuc$A^5Lo+h=`3%>?Xxn=wcKPM;8seG~4=Y*XuUaVa>2Y8Ba^1 z1%MxLb3s-83)`w19=Zctl^fb{=F=X1#;3^?97|}XO^^-G+YjsWvFH7vX1LlF&U^TSSYA^x5{^X z@VKUTq$^vv5G!({?90gE6`Y(jmzcl6#Z}4~z`?O4cF`Z!E!OtKR}X9Tx7A83%A-tU zXZ!t}EP^=c=Y8gAL#e?H*cSE{4_Ok#S+T!jmp|;M*VhZ}j4;6w;GLL-up|w9PcjJr zJkP^yvl9{%8%5y0Gv1XKfza~d}R0QQoLi%-DlgXEIr4<*@EINa3`B0Y-RzJ|sWOR3=Dp&3<(|8qh~YWhjL^6$@CXa#CU4V6q#?_(lg>*f zRhXa);H%{&T$s_g&tL%g6J1*lqNda$6oSd<(B}Ud^g-PoH1EBneF@202f0sxO6eX z2yZQ>E&4f?hvX^D6airrT{g~fQS4IhbUN!t2S?vSFd>*RVK(L_Lj0uT`pqKfN?jVG kYfY@9^Fi&GF!(>@UvI-ZHHcqdWdHyG07*qoM6N<$f{T;>sQ>@~ literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/recycling.p.16.png b/Icons/Mapnik/recycling.p.16.png new file mode 100644 index 0000000000000000000000000000000000000000..59eb331aaa16521883dab2d046af93a384335d90 GIT binary patch literal 562 zcmV-20?qx2P)rkuhsiQ5c4w@1#lYjR{VQ zDCkftLKP9B77=lhdZi8yA}&rM2uj;T6f88jh}L9LP=A09793jBEDk}7lN7{)Sbu;n z4o%wLd(-B84rwlF+QCk~(>Wi{`*Obb!2gzPH5|Q|yd-KKf_(|{0zgHcm&*R_ZZ_6E zxOI+nJRYwAeW)yn@EzzE$e!-&iJv)~Sp2-O`m4>G?tql*+z0jnsF8QXxCewSR*y_f zugrDwn*vm13Gfv@mCF7kO*tVjB`|4}{FWUQhDZf=XA&SxEe46e-L=}ZPH84w*wD=d zcR)mk8yZ}HRv`rF0jQHnp}{MV%Vyb`cUS!5kE^V8nsc6W7PJaT0(TDlC(#PU>G~g# zz3Xg$EtS04{nX6KU>0cYFZv*VKD|2%7#?&E00RK3j0^IOjbALwUy{8>7y%T>sA(Re z6Uuq+l%mHBas|;$YifT#EjQ-#o_o#0DTG;r9#zYaVkLMTbpT+D%~@qo;R8wjIO$Xk358KmSZ^xc(oBl07*qoM6N<$f(bzF AVE_OC literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/recycling.png b/Icons/Mapnik/recycling.png new file mode 100644 index 0000000000000000000000000000000000000000..5381898213b06bbe8a80defccf1f499e0a938eb7 GIT binary patch literal 645 zcmV;00($+4P)5 z)JtexRTReY-@XkxuqL3=f)J<%3)Kt^;-sSvx*>FIAv!Jrkhw*d{Plse|wFa*@8n4ZP79yNZ`0$IZIf*=CPpH5lwK?s|>B zM{qh-X*5-7tQDB5vZ^p66vDylZ96w+j z@8F*zpNSklmG3Vau!YF6SQmy;l@4NWfhVj+jt^3mKF6%G1*u9;;2w_DdcQ8U7jZjs ztR!6{Sj0qaqE{lv)t2Qw6sby&<9!@0E15~Up295**Lr(+A#$t@fE~tpJYA%}@k|Hr zHem1^rU$^D#Ah`aJcc(rc&%m3r+AR6G}H!+9KYjSOKGZu9~vbM2EdjvPkDOfzP&XF zh+nbokV?EAIUZ~QOI*T2KU(DI;X+I4BDP*t+YfdEW7t`P&6nCPe1i{d99R!GBG(`h f@xM~nV0$k*;nierEy00000NkvXXu0mjfiUSs> literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/restaurant.p.16.png b/Icons/Mapnik/restaurant.p.16.png new file mode 100644 index 0000000000000000000000000000000000000000..5c410087be8006b1fa242ad6184297ea1145110b GIT binary patch literal 502 zcmVLkiTyeK@f$%*|qQN^Vw9? zlmR*fNI(HdG)^KqBpT>aAt4YyLK{&=0vCvaesrlGdsXwt#4! ziCf#*XZ~9sF;2LkA&O#attDzy{EKaw(#A8Y~a>i_@%07*qoM6N<$g0Je|?*IS* literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/scrub.png b/Icons/Mapnik/scrub.png new file mode 100644 index 0000000000000000000000000000000000000000..7668027f1e7e19b6ee1dd51a76cab80e79bfae8a GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1SGcvS$+jloCO|{#S9GGLLkg|>2BR0pkRcj zi(^Q|oa7t7DztkA4zIX)MB;AAzDy5EUPF#=9?Tm)bNKvG2+C8WRrSj@-G2e8d`}n05R2aAKfCSgRhgNcC76FE zh;oA%!rG77*#y6(t7O-I4t{n2{r^NA9uT-B!^6Y%HcCbMP~6YPhX>2q)FzoGF)nWF zkuqZ9ZA>|^++ISWE-Xel^84)hK?crYe}DhA?|Jx>pV3Hm6Bk3NoJ?nMR{Jxc)eN4l KelF{r5}E)@oHb(r literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/secondary_shield2.png b/Icons/Mapnik/secondary_shield2.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7ebd665c95e4fa6ae1851a97ed3b10a27c5e6e GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^5s6VVoh6ua z4`_+8v9%efg&pJPQF?QJMb?+u^Mn4^{pU|kOaOuj&k_;>GOjOL#rkHdyo6j$dcvYr z3nLD!U|lTM6J?OaD98|W!}jmN10Oa&k_z>$`y9-bc5qew{{QWUHvbhJLb(+ZL>Ue~ Wlj;1mWVIL20Sun5elF{r5}E*zc|N}Y literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/secondary_shield3.png b/Icons/Mapnik/secondary_shield3.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c995af81598d7667c967ef790d7f9d30be53ad GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^@<1%e!3HE%my~+~sd7&j#}JRss6VVoh6w6 z9@G+JV{0=|3p>Woqx9zdi?p}1=Lh|-`_G@8m;eM5o+Ts%WL#e~`{|ph@)B}2=?RNw zw?-UT@pSRD{wTYwpDUi4Fiz-t`jVfmZNBLB7iq77x(!Z;|NZ^fzUSdje#Tvqe2l9Z Y`1ZFVdQ&MBb@05$hR4*&oF literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/secondary_shield4.png b/Icons/Mapnik/secondary_shield4.png new file mode 100644 index 0000000000000000000000000000000000000000..dd9131758da53aa3421fd19c5bf2158c5f7c66bc GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT=!3HEZI^Ek1q}n`P978-h-(FP|YjO~AxX8}V z@7B!OJ(KmU*_sVZ*B<2@ik+dGrFbFXoXi1(qfS3w3jd2fn5#cqe!KO98{zvHV(Lz? zoqOsY&Fmn*N_E{jh6hD0+2PuggHo+ONS)j&8!hQG>);Y7aVsw|^U-@wr_UkVmi!8E kZ2GCXuJ3(GklNqp_0g>|o%pn?7xa52( z@QHk`?-sKumkoCFG<+7+yBa!EM8CddPu-GReY%oSTF&0787p~or!HK2OSMXJSvmj1 te<9nBWIJ9pQ{yC3K%22WQ%mvv4FO#tq%OA7!1 literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/secondary_shield6.png b/Icons/Mapnik/secondary_shield6.png new file mode 100644 index 0000000000000000000000000000000000000000..e3dcb460ad6f68354c372131b9ac94da85e54da2 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^CO|C6!3HEJN%rRfscugf#}JRsx7YRxHaUp6K4flY zR%{ehJ0`LvcS08HwMS-&;>XmooE+G!dF&Zgb&TKhe%{CR?qr_P-dXAoEZF8V>e;Hw zKL4Y>SItX$Rb@;J+kvGGuNRBW6H(t^UQ-qHQnq@t!do2=YwkYVXTGihkT>n*6rt{YMl^21|V(@hJb6Mw<&;$V3wMU}> literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/secondary_shield7.png b/Icons/Mapnik/secondary_shield7.png new file mode 100644 index 0000000000000000000000000000000000000000..a90b58736dd449972b53dc8c1ceb414ea81adf70 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^)<7)C!3HFgg|0jXQeB=djv*eMZ?A6@Y;q8By~xeX zys%MF<(Sx(+zDB%*B+TAiXT%;aB@(y=ILfMT~q(;w?FIqHvMS%yRro@o^u~~nrc?K zhV7;4$)1Isr=M{#+>-L!zWKwFl2xydymr>x`*^xen0EKoQ%PGlMXc2cTfM*QZoh-Q v^A4NV?MsZ?*uF)`Pe1!{9{-`qL7(Ft-^g?>C{u3+x{ATm)z4*}Q$iB}1e{I& literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/secondary_shield8.png b/Icons/Mapnik/secondary_shield8.png new file mode 100644 index 0000000000000000000000000000000000000000..71feabff008addda83ac7ac0094d9defcfe2e8ec GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^PCzWk!3HEV{i-$ssfnI0jv*1PZ?A9UZAy@6c_`j= z@X{eJ>1_62*Ed|{oZ~vJfIC}y>%s-XP7K_6?dOkFtL@lxH}&z`3Ra>2YxNqYtlu;( z_h(m}@S>NiGiL-d9?0YUeOj?1sOQt2Pd_HOzyBf1r-%)nepyv^Vg9>=(Mcw?tlk|} jQqPX;zRlv_6;jXGw?(EiE&UTC&~Xf&u6{1-oD!MP000^Y1^@s6LVfqm00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOA? z3o{C`iS0E2000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000DRNkllH*fxa_3BkwD#V(qVP|LOZ%2+C`E_=77C??3J*raOt5V5{h~RWO zC24E1SO|y1DkCG~$HFx`JIlz(2!>%$RaGTZQ&a!AZ?#fUQ6U2Z0|WvAK7IPMbja}V zFnjmzmFekeyk4((yg(%eXlN*PNGKFy`}Xb9+}!-j zg9i`9>-BQ@@L`pgmuK2I91iyE*`tmfJ4SnZyR@{lsLIMp35Ua}LC%~xBTlCix7+>4 z#fukdZf;h|@Fiu{s#O3~S68c^o*oJc3fQ!16W6X?TlD2w=H}+iK_Zc$tE-DGTek52 z{d;US8#bE_fSH+@dHG6u;L>;V`F8ox(5-wAPfAln5YpyIn$|5a-XI zm%_qADJ?A(Kmc*MTvAk2Bu!0CqP1q*wrv7PT3VV!qfxZh^Ar)`_U+rWx3{CU=E8*w z=3#Ypb)vP#=kt-7nQ6{jEEc(Q=gtPLH78D-Fz0J(YUE3R35msGw6(S2_xl+g9i^b4 zz}$G?zyXOwA`})DnsZL4Q^v-|<^l5Z@+24x@>Ph4;Pd%7ckUb?K78Q$^XFt|XPXDO z-EJ8i9AxX(tx{4_BEevgg9i_q>o%KBd_Lcz0IfAjM9d<1>Cz?g^Yhucb0_`%{dhbc ziN#_7tX;bnhr_|-D#6)vKkowN;c-0!U+Hqc|K6v0AOt(b2KtYaS$ZURhbQW(_Wvi~INQ15i;>!S(Cc zf4X(+mh$<0D5bDiEIfPmjE;^Db>+&HKRq7LUrR3a)z#GmgF&LvC;)c5{l&h0`=q?Q zoZ8x2cJJQJu3fwEcsyda+kgJ9ev*}yMR9R4y}i8v^!E13*w`3#b#=;WwUU;WMngk` znwpy8;lqb1wPG{z|CUH3!sW}CIdtd{D^{%F&6_vm=H^mXRwgquGx+^}l}IGW%E}@= zJ^lMSV@^&En>TOf(W6H!Tegh#>(?_eF~R8QDDU3ABNPgeo12>w;G6At$BrGmdi9Fe zuU{u~Lw9$#^85X&sHkX3zm-M9m6Y!8ZVbbqp`qc2{#}0qSc7{G18|r&00000NkvXX Hu0mjfCs1?O literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/sikh3.p.16.png b/Icons/Mapnik/sikh3.p.16.png new file mode 100644 index 0000000000000000000000000000000000000000..9e8906e6e4d1a4cf36399f83012236f96a5bfa3b GIT binary patch literal 400 zcmV;B0dM|^P)!`yrBIcH{Qjt6&~ zH^nnl(BG`6rODYBTp@=duCt1Ab^9??@eXr1!yxkb9_yoYLu+b1jF)(gAxLAHi< zj6?>VSr$IxToUALOh1s^L@}B#v4W>r1O-XzKhcYQd<~Kke&7_Z(33>~OQ_*Do?{b> zVXuZyc;WW--yj#0{^2uruoe4nm=1L}$k!2EVWmMHrAtI;_x46dOwC+V-*Ad00001SIo6Pjm-y3Opi<85p>QK$!8;-MT+OK|xO! n$B>FS$t!a1G;ka86k9TQ-ETY1C^4T6D9PaI>gTe~DWM4fdi54v literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/station_small.png b/Icons/Mapnik/station_small.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e75f5d662b205c9ed403a2e5510833197aaad9 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|R1SIpEak- z(Yy7Ep_j9x2 zR3;-m_4sK#lGn8q)=QgOTO3foclw@P*@w3ErJwZV3i_;V9&ZuZad6cSMZHtM9@%O1j^0^~R5xmyccRy|QoW|I`^#{hwz|vbUd-Z`ai9=o|my R7%%`BJYD@<);T3K0RZ)llX3t6 literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/telephone.p.16.png b/Icons/Mapnik/telephone.p.16.png new file mode 100644 index 0000000000000000000000000000000000000000..29378e44b97b329311faae2874863c633dcabf50 GIT binary patch literal 444 zcmV;t0Ymb%8UP(kjR5*>Tkv%L!Q5462_j#?>S3(-G zFc9KnHPyf%O-f>7FHlf)!3N!nnciOtaVRbKBgcuh#F zt#GDubN;_y?ztEKSgM*(c-%9JFe%`6Db_b))MsUJQ8K#kAuHJpdT$PPFs^&4|7) zl|U;xomS9XYVyg&aj(C6fnj{^D@GK9IUr}&sHdt0=~VVsAx9|P0knuxp{?W0OC>?k mH)`8+AdrfjS~Hd4f2j}axOVjyCk_Vy0000-G2e8a!(h>5R2aAIhMuGyx7><4A?#$ z)Di6$I`tv>?xgG`S#|#&wu_vZ5W4^0AMWZO&t@~szopr03wD%^Z)<= literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/tertiary_shield2.png b/Icons/Mapnik/tertiary_shield2.png new file mode 100644 index 0000000000000000000000000000000000000000..4952fe73b454d41a023cdd168ab4a578222324b8 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^5rk zHH7N$@bDz&==jL1uv*Luy!_<3e4WSNU!V1RS{oZ19Rqu2AH1g?)ICc~=FX-+htH);C3#bP~C4lD_Y2?+^1{=d>b++XUwF7WaLkO>EMBEG&pzkfq}{yxrt e%S;*(tPDoil^Zf2dzAwn!rr! zHHYf(@bDz&==jL1uv*N!c>3CN`8tokzdq~tv^F+2ItKR4K6p<(s5@?&{GCmI4xde* zFFE5ys-l@e*3T7B7f|Lj+%&uYADp?;ey)nI|JQ0; i^Vzo{ZkqE!Ert|F<%TF;o=~7u7(8A5T-G@yGywpiLqi$> literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/tertiary_shield4.png b/Icons/Mapnik/tertiary_shield4.png new file mode 100644 index 0000000000000000000000000000000000000000..b5ddee2e06d782fea82db072d19b2992d41df73e GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT=!3HEZI^Ek1q$Yd1IEHw1zP)D1b;v=$;bMM- z%LY%?Bj>JpS1`V2?ccUn;pU-J+!dS$y>gUTx>*CAI1VcH_8twHob-<~?x(t9i_nLj z)h`(AOCz;DMJ`>-Sg|DSX4&3yhSf*soGsga&5d!6e|yQ=xRhHH>Lq<<9b5t>Ze=9$ zJqX*M+4sBKjIC{V1EbjOb>F`~R}VM)E4F{?YUPHB%7Udp=P`J?`njxgN@xNAOz%-% literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/tertiary_shield5.png b/Icons/Mapnik/tertiary_shield5.png new file mode 100644 index 0000000000000000000000000000000000000000..1c161767702b1fd6acd934ea3f4985c7d0e79553 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^xzopr E0BAu`ApigX literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/tertiary_shield6.png b/Icons/Mapnik/tertiary_shield6.png new file mode 100644 index 0000000000000000000000000000000000000000..87b8dad90d6789a18195062035e672096e7c88f2 GIT binary patch literal 206 zcmV;<05SiGP)%R}1bA?@;z zc6ms{`5~V6SLv7(O^6lzhkV=h_VN0b!c9Z)KlpzmfJUcb0000007*qo IM6N<$f?0N1IsgCw literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/tertiary_shield7.png b/Icons/Mapnik/tertiary_shield7.png new file mode 100644 index 0000000000000000000000000000000000000000..8f3c4c54b2b72cd6fcfa60a5f74128ce6b16dff6 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^)<7)C!3HFgg|0jXQd2!$978-h-<~(*I%FW>@GzZI zX-A3Bn`f_7_cRnASez<;gvT%LfH#NVqf1Q|EK5|U1j*Pq^ZfaDpYz^qi|2g}u6Fqh z)~2oz(>7a``)c`igxdF9V^||rY_)r wF8|AtOmdKI;Vst0LSA|p8x;= literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/toilets.p.20.png b/Icons/Mapnik/toilets.p.20.png new file mode 100644 index 0000000000000000000000000000000000000000..80cf3aff379dc4b93c005034b239c2c0a68e4a84 GIT binary patch literal 586 zcmV-Q0=4~#P)`6pHR5*>@kUwZsVHCxG_iJok6LoMB z2a!5-5)oX~pB6;BTedY!p*)~F>J7}DG&qFgQdDmOS}it* zm@(sKd~fONuVSUsI9d1lPW)W^`W}?AqBxbS??p1N$CPAAzk#BHNHN<`D-PJ4K&i&#Sd?VB??MxLo=SouDIv zRiGm>I~bw`GnZ-)I7`(@r;+VjH;W^;0?IVYS~0V7D@tErEwVDj$}^1PE!!Nuxq|;P zs%7*3^<2T929Pui_6;Cc@OuDa0KBJE&m%Z*3^YzQI1ua`(V!AH1tiuiUn>qYBggDX#sI7w4nH>5Bq!d Y6UuG1x}@<>&kwGiGy87Nmy|6O`wo$iEBiObAE1aYF-J0b5UwyNotBh zd1gt5LP$ocg1e`0!21-{JfOnWo-U3d6}R3_kL7Am5NMfe>zMxHU-_IkA*U;US5C-i zm1|o2bI!%B4x4mjq{Wy;G`roIYM2=uGL}Zo6F%+jp~U1MB-K)JRCn{PYZ(HMM7Qs_ z*mX|f$mDc?8HU$Sx7Kqc%+1s`5SC#~m7nn9+se|-)!u79J(<_HM)@O0lw#CJ$)0Bi z?lpgKS!`MOyLm~jMWu}Tf&C0N?SXC|Je0d4)|f8uc_3`R+~V~IwgZf}Y?_Og@rpbL PI-9}M)z4*}Q$iB}&%|}O literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/tree.png b/Icons/Mapnik/tree.png new file mode 100644 index 0000000000000000000000000000000000000000..7575bd63b3fe7db6fb5747751fcf545792102bad GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1SD^IDZKzvoCO|{#S9GGLLkg|>2BR0prC}O wi(^Q|oaBhlC5u1Fge#n6SfbFusK>@|nT1bw>bJ?OfNB^#UHx3vIVCg!06AzGssI20 literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/trunk_shield1.png b/Icons/Mapnik/trunk_shield1.png new file mode 100644 index 0000000000000000000000000000000000000000..bb849c22b9f659e8d6e80d89b2b7c0b965a11a7b GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2e8GEW!B5R2aAHTIGFCp9)I_B7UP z=xPNqrcV9Xyh7u+aZu_0y1&k^zQ6yUsKWyUMw?=IJ}NDZS|YV+!s6eD|5nFK&hWU} z!P_Hcly!o`qy?zC@!`qG`8=EJO5&75Kfk_iza*h;&9A?|>u+pMzt4K2FVdQ&MBb@0C_}5`Tzg` literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/trunk_shield2.png b/Icons/Mapnik/trunk_shield2.png new file mode 100644 index 0000000000000000000000000000000000000000..eb81d8070bd87a4b64241e54fdafde03e582d2ef GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^5ZW4D3t4V)FCrYx$u4_5b;k6B7~=CQN*q)FG~UbDyk50||_cQAOm`njxgN@xNAenUYa literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/trunk_shield3.png b/Icons/Mapnik/trunk_shield3.png new file mode 100644 index 0000000000000000000000000000000000000000..4e6e9763702a4f9100d8afc75344aa1340af4cbb GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^@<1%e!3HE%my~+~sd`Tr#}JRs`>R literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/trunk_shield4.png b/Icons/Mapnik/trunk_shield4.png new file mode 100644 index 0000000000000000000000000000000000000000..733d5d0f8bdc9f89920aa5b14fc952e01596d8d0 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT=!3HEZI^Ek1q$Ya0IEHw1zP+Z%cgR7&;bQzI zUn!9$DJJm;4%yXQC8dXX3p~E5#V~L(ZCbXB?N*AbpsB=>6)R`dH>uZ$#lPl$Ff;rh zquu$<>vXzTtYyr&ojCc@3)ur@+m}Sif4im8P+a&%?z=g6?uq?8YG)HJL5bXL2J9cI w>MVHA`bsljjy=G_t=VgLtZr$}FWnl(qfeAFTh6^a4|E)Zr>mdKI;Vst0QR6vm;e9( literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/trunk_shield5.png b/Icons/Mapnik/trunk_shield5.png new file mode 100644 index 0000000000000000000000000000000000000000..d6700e74ca0f084486dcb1d00887610708cc044c GIT binary patch literal 202 zcmV;*05$)KP)w1kNb;*-(93LG0yoGzG)M}q^*6|!lz%E4~jz~X?eRm*Z=?k07*qoM6N<$ Ef;xmxT>t<8 literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/trunk_shield6.png b/Icons/Mapnik/trunk_shield6.png new file mode 100644 index 0000000000000000000000000000000000000000..053784ef574173858d1e17dd4e12019eb40a14fd GIT binary patch literal 205 zcmV;;05boHP)4RA<$6E1)R0ja5(0h&|{!4bNof0lkHc&`|) z!v)YRgHeDk%VKPr%BHS~;hb+nn6v`e?$&ghexEuj#<@CX5nRA?fmvba_a+ zJS1Hnl5TNB3gGqpaPo&+>X;bL`4;{|CWJ{_`>hi<&B6QtPNE`dr{q*w00000NkvXX Hu0mjfV3AYX literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/trunk_shield7.png b/Icons/Mapnik/trunk_shield7.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8a555b98285a2549aa7c1fb43e3ebd27e8ea5a GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^)<7)C!3HFgg|0jXQjgkO)`?tTIJhSA4{?y2|r`Cj}hOIVQ9Xj*s ztMzHT2Oj@>Bv3B?az>0(hipxHtk>kP|Mm*xojO~~Ak3(gx!Sg^0q8siPgg&ebxsLQ E0G44<5C8xG literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/trunk_shield8.png b/Icons/Mapnik/trunk_shield8.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8f1b1ba0f237ee8e5b58d88ac1dfcb54e2bfcc GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^PCzWk!3HEV{i-$sso9<`jv*1PZ!aw5J>($M`Z2u7 zS4yO57MobYg3WW8VtsEgv_CORWK`ieG1J)efU0`egSQ{lAO2PQ@hS9hr3K@MANdCv zKa|Gy=H7OBEyb<*blsGb)(jDApTC%XySH>oYw~9K{Ojsz*A(|VDSKdnCm0Vr{&z_6 vz1}rLv7l43A7ll+X4dq)Z!Mg>^aJDdK&8y$Yk{&rXEJ!Y`njxgN@xNAK3h?7 literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/turning_circle.13.png b/Icons/Mapnik/turning_circle.13.png new file mode 100644 index 0000000000000000000000000000000000000000..1317ef054f323c5f1eed6f7725aa86f2bc7b4e04 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@q#X;^)4C~IxyaaOClDyqr82*Fc zg1yTp14TFsJR*x37`TN&n2}-D90{Nxdx@v7EBg%|Q9%~gnK^AuKq1Kz*N775{M_8s zyb=cIqSVBa)D(sC%#sWRcTeAd@J2pyprT?=7sn8d^K&OT@-{f|usnaoXfDAZStI88 zrP$~IL!QCG4-Jb1@!z-W7ck$nSm=%uo=Q`lr*<{an^LB{Ts5(t}&T literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/turning_circle.15.png b/Icons/Mapnik/turning_circle.15.png new file mode 100644 index 0000000000000000000000000000000000000000..c4303a07adef7515c253e0feb8b90de1823e385c GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^{2QL70(Y)*K0-AbW|YuPgfv9#KI_qkDV(Cjx~eOI#yLobz*Y zQ}ap~oQqNuOHxx5$}>wc6x=<11Hv2m#DR*Id%8G=Xq=xrd86PV2OgI1p-s%E6p9#F zYdG~7Car!ctnt8m0RxB3P9CP~4h?4{B#yaBzjjm3ocd$Ilp+SJ1*}pDEL97YnSk(`sj`W!ifxnYT}E<2+Dt%8KFU-PD6`|2!-EvRdv|q*3nD T<+BTbPG<0Q^>bP0l+XkK-r#X< literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/turning_circle.17.png b/Icons/Mapnik/turning_circle.17.png new file mode 100644 index 0000000000000000000000000000000000000000..39e27af23e3c71b16033310376f541b59eef7192 GIT binary patch literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPSkEkHCw2qRl8c;~G#5JPCIX^cy zHLrxhxhOTUBsE2$JhLQ2!QIn0AiR-J9H{7;r;B5V#p$I}Y`G3O2(<2>d&zH&%ZANo zWY_enZ@A8wKOyR%G>e+0`@4k|e1bYbw|!DLSxkRV{r&mI&B}Zx!L)5mQ3>oh4LmcL z^dE4UIILWiTchv7RGh#a(;#`+rok!nb)KVAqjEs4;DPVj#@4lQk5t#hK8WXA6~%5G z&9GfQ&LHGg&>!LB93@L-kM5q}q<8O_h*6>Z5(825ATIwx^<@R(+l#n*8J2#ZJ<(3{ z=;4qa5zUaTq73|(fBH8Tiyyim&HCF=lkcx^n%PH}=ND}%nZ7Tq{KS@e!Tz{Q`t35H P4;egN{an^LB{Ts5?#+Qo literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/turning_circle.19.png b/Icons/Mapnik/turning_circle.19.png new file mode 100644 index 0000000000000000000000000000000000000000..efc0451d36d3a98476780acd9e839041917d5d06 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G^recZx~4727)00r4gJbhi+Z}5l;N+}lV#r6P&BuiW)N}Tg^ zb5rw57@Uhz6H8K46v{J8G8EiBeFMT9`NV;Wj(EB_hFF~5I%Om8AqO7U_&p9@Vhozb z4zoEW8oo_8;L==wmceJjv@-&oIu0{=GkCfdc?cM+x4!$+JN@_n9?2lD><0`}92lP* zU?_25zB1`oW~`ZV30vQu<&#QgiF#|UZQ$PUv^Xk3|0Q3-;_jtRKYpM7oUnMku4ol! zmF-OP-^bqPoLMe*@LkXGFGvKicV2z=Zhf7| yDwVIvi{tli3DM3pH~n=lxMAtakN0i5J#MjIy<%6}-!BUaNCr<=KbLh*2~7YTgoEAy literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/vineyard.png b/Icons/Mapnik/vineyard.png new file mode 100644 index 0000000000000000000000000000000000000000..6498e3f8b758e195adafa38ff4b107d390706ac7 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^vLMXC1SD^M{15@8I14-?iy0WWg+Q3`(%rg0KtXp; z7srr_ImtKvWU%TA9A2?=@v}aOV(V{LduDkH7b~hMO%5>-&k$f)xRHJJ&WyU{Q5F{r s?sf1tIwtF_J=CaTlJ#!I&MyYy3<%y{W;-5;Q!o2QFoNX4Ac-e|rC2Og&7ZNKFs zbz)05*Z6Yq2kJytYz(ZtF-0QJsm0UzPf(Khc43bkt}L!c_iFV|{W`a4_nS|a+cw{> ZWl%dN?%;o<`X#<^OgQqmwGODA!PC{xWt~$(69A(6DzE?m literal 0 HcmV?d00001 diff --git a/Icons/Merkaartor.xpm b/Icons/Merkaartor.xpm new file mode 100644 index 0000000..53ee066 --- /dev/null +++ b/Icons/Merkaartor.xpm @@ -0,0 +1,509 @@ +/* XPM */ +static char * Merkaartor_xpm[] = { +"24 24 482 2", +" c #AC9744", +". c #877119", +"+ c #756110", +"@ c #735F11", +"# c #64530F", +"$ c #8B751F", +"% c #5F4F0E", +"& c #332A09", +"* c #141002", +"= c #151100", +"- c #342A02", +"; c #70622A", +"> c #74662F", +", c #574C20", +"' c #524513", +") c #524616", +"! c #54491E", +"~ c #685A1F", +"{ c #7E6A1E", +"] c #695918", +"^ c #756420", +"/ c #796515", +"( c #7B6616", +"_ c #A59556", +": c #7E6E2F", +"< c #705C0B", +"[ c #7C660D", +"} c #665309", +"| c #594703", +"1 c #241D00", +"2 c #171200", +"3 c #181300", +"4 c #2F2707", +"5 c #4B3E0C", +"6 c #92813D", +"7 c #C3B26B", +"8 c #A89856", +"9 c #968649", +"0 c #7F7037", +"a c #382D00", +"b c #120F00", +"c c #0D0A00", +"d c #261E00", +"e c #3D3100", +"f c #473902", +"g c #7D670D", +"h c #715C06", +"i c #776C3F", +"j c #7C6D30", +"k c #705D10", +"l c #6C590F", +"m c #453701", +"n c #0E0B00", +"o c #251E01", +"p c #705F1F", +"q c #C1AE67", +"r c #BBA85B", +"s c #AC9641", +"t c #BEAB61", +"u c #C6B571", +"v c #483B08", +"w c #BBA85D", +"x c #7F6F32", +"y c #433600", +"z c #2D2400", +"A c #0F0C00", +"B c #1D1800", +"C c #493C08", +"D c #423501", +"E c #6B5603", +"F c #8C7B36", +"G c #7E6D2A", +"H c #4D3E02", +"I c #473903", +"J c #231C00", +"K c #110D00", +"L c #4D3F05", +"M c #9A8531", +"N c #C1AF66", +"O c #BDAB61", +"P c #A69240", +"Q c #9C8B49", +"R c #A39354", +"S c #897B42", +"T c #94833E", +"U c #93823D", +"V c #8B7D45", +"W c #514412", +"X c #786725", +"Y c #5B4D16", +"Z c #100C00", +"` c #110E00", +" . c #4E3F05", +".. c #5B4902", +"+. c #7F6F2E", +"@. c #847332", +"#. c #3A2F01", +"$. c #221B00", +"%. c #120E00", +"&. c #1C1600", +"*. c #2F2600", +"=. c #2E2500", +"-. c #2E2501", +";. c #2C2300", +">. c #352B00", +",. c #1F1800", +"'. c #211A00", +"). c #292100", +"!. c #1E1800", +"~. c #211B04", +"{. c #181301", +"]. c #1E1803", +"^. c #141000", +"/. c #322A0A", +"(. c #604F09", +"_. c #927E30", +":. c #978335", +"<. c #554504", +"[. c #0C0900", +"}. c #171300", +"|. c #392E02", +"1. c #312701", +"2. c #1A1501", +"3. c #61531B", +"4. c #AD9A51", +"5. c #AF9A49", +"6. c #816B13", +"7. c #5B4900", +"8. c #413400", +"9. c #282000", +"0. c #735F0E", +"a. c #3D3105", +"b. c #2A2100", +"c. c #978330", +"d. c #9B8634", +"e. c #2F2601", +"f. c #0A0800", +"g. c #191400", +"h. c #161200", +"i. c #4F4108", +"j. c #9F8933", +"k. c #BFAD63", +"l. c #BBA960", +"m. c #AB9748", +"n. c #5E4E0B", +"o. c #1D1700", +"p. c #100D00", +"q. c #56460A", +"r. c #7C660C", +"s. c #504104", +"t. c #110D01", +"u. c #98853C", +"v. c #201900", +"w. c #312802", +"x. c #403407", +"y. c #B4A04F", +"z. c #C3B169", +"A. c #C5B46E", +"B. c #C9B977", +"C. c #7D6918", +"D. c #292000", +"E. c #493C09", +"F. c #312700", +"G. c #130F00", +"H. c #54460C", +"I. c #765F08", +"J. c #6B5602", +"K. c #140F00", +"L. c #5C522A", +"M. c #91803C", +"N. c #302602", +"O. c #887113", +"P. c #403509", +"Q. c #3D3102", +"R. c #807238", +"S. c #B2A260", +"T. c #908042", +"U. c #594E27", +"V. c #604F08", +"W. c #473900", +"X. c #1A1400", +"Y. c #423503", +"Z. c #735E09", +"`. c #745F08", +" + c #4E3E01", +".+ c #1A1500", +"++ c #49411F", +"@+ c #86783F", +"#+ c #2E2400", +"$+ c #635109", +"%+ c #8C761C", +"&+ c #937D27", +"*+ c #5F4F10", +"=+ c #302703", +"-+ c #857844", +";+ c #52471A", +">+ c #2C2509", +",+ c #3C3000", +"'+ c #382C00", +")+ c #2A2101", +"!+ c #241C00", +"~+ c #211A01", +"{+ c #4B3C01", +"]+ c #7E670B", +"^+ c #745E06", +"/+ c #584702", +"(+ c #514823", +"_+ c #7A6B32", +":+ c #322800", +"<+ c #6A5608", +"[+ c #988125", +"}+ c #947C1C", +"|+ c #A18A2F", +"1+ c #AD994B", +"2+ c #B19F59", +"3+ c #7E6A1B", +"4+ c #B9A657", +"5+ c #AB9950", +"6+ c #7C6A23", +"7+ c #4B3C00", +"8+ c #796823", +"9+ c #403404", +"0+ c #887424", +"a+ c #8B730F", +"b+ c #886F0F", +"c+ c #7A6308", +"d+ c #735D05", +"e+ c #423500", +"f+ c #463C12", +"g+ c #917E32", +"h+ c #483A01", +"i+ c #877012", +"j+ c #8B7419", +"k+ c #9E862A", +"l+ c #A48D32", +"m+ c #BEAC61", +"n+ c #AF9B4E", +"o+ c #C7B673", +"p+ c #BBAA65", +"q+ c #6C5A13", +"r+ c #614E02", +"s+ c #7B6C30", +"t+ c #8F7A23", +"u+ c #927917", +"v+ c #876E0B", +"w+ c #856D10", +"x+ c #745E05", +"y+ c #3F350C", +"z+ c #887735", +"A+ c #251E00", +"B+ c #594805", +"C+ c #8F7717", +"D+ c #9E8629", +"E+ c #A18A2E", +"F+ c #9C852C", +"G+ c #8D7B34", +"H+ c #504416", +"I+ c #766628", +"J+ c #AC9A51", +"K+ c #5A4A0A", +"L+ c #624F04", +"M+ c #584703", +"N+ c #5D4C08", +"O+ c #957E22", +"P+ c #8D7411", +"Q+ c #846B0A", +"R+ c #7D6609", +"S+ c #574603", +"T+ c #4F4316", +"U+ c #766831", +"V+ c #584805", +"W+ c #897113", +"X+ c #927A1B", +"Y+ c #977F1F", +"Z+ c #675613", +"`+ c #4A3C05", +" @ c #4F4210", +".@ c #534719", +"+@ c #544407", +"@@ c #5C4A04", +"#@ c #483A00", +"$@ c #40350B", +"%@ c #968026", +"&@ c #887010", +"*@ c #9A8223", +"=@ c #947C1A", +"-@ c #886F0C", +";@ c #856D0C", +">@ c #5D4B03", +",@ c #594C1C", +"'@ c #8C7E46", +")@ c #1B1600", +"!@ c #5C4B0A", +"~@ c #967E1E", +"{@ c #322907", +"]@ c #665924", +"^@ c #695B22", +"/@ c #372E0B", +"(@ c #403300", +"_@ c #231D04", +":@ c #AB9952", +"<@ c #9B852D", +"[@ c #866E12", +"}@ c #998020", +"|@ c #8C7411", +"1@ c #8C7310", +"2@ c #80690D", +"3@ c #41360C", +"4@ c #80733E", +"5@ c #342A00", +"6@ c #7F6912", +"7@ c #9B8326", +"8@ c #998124", +"9@ c #8F7718", +"0@ c #5D4B05", +"a@ c #A6944C", +"b@ c #6E6026", +"c@ c #302600", +"d@ c #5C5021", +"e@ c #9D893B", +"f@ c #6D590D", +"g@ c #282104", +"h@ c #796410", +"i@ c #937A1A", +"j@ c #7D6504", +"k@ c #5A4903", +"l@ c #53481A", +"m@ c #867942", +"n@ c #2D2608", +"o@ c #816C16", +"p@ c #9E8628", +"q@ c #91791A", +"r@ c #A18B36", +"s@ c #776006", +"t@ c #90791E", +"u@ c #443702", +"v@ c #7E6B20", +"w@ c #A29150", +"x@ c #BAA75B", +"y@ c #A48F3D", +"z@ c #362B00", +"A@ c #0C0A00", +"B@ c #483A02", +"C@ c #927A1A", +"D@ c #564503", +"E@ c #524615", +"F@ c #887D50", +"G@ c #473E1A", +"H@ c #B19E55", +"I@ c #B7A354", +"J@ c #806F28", +"K@ c #382E03", +"L@ c #7F6E2E", +"M@ c #836C0F", +"N@ c #806A10", +"O@ c #75600D", +"P@ c #937D26", +"Q@ c #6D5807", +"R@ c #1C1703", +"S@ c #C3B26C", +"T@ c #B8A558", +"U@ c #A38D37", +"V@ c #2C2403", +"W@ c #4C3E02", +"X@ c #66571B", +"Y@ c #A9995A", +"Z@ c #BBA85E", +"`@ c #BAA658", +" # c #BEAB60", +".# c #635315", +"+# c #695818", +"@# c #715D0F", +"## c #8A7212", +"$# c #715D0C", +"%# c #6B580D", +"&# c #7C660E", +"*# c #41391A", +"=# c #C3B16B", +"-# c #856F19", +";# c #0B0900", +"># c #0F0B00", +",# c #453B15", +"'# c #BFAD65", +")# c #BBA85A", +"!# c #BDAA5D", +"~# c #B5A153", +"{# c #5F5117", +"]# c #B9A556", +"^# c #806C1B", +"/# c #8B782D", +"(# c #87721E", +"_# c #4D3E05", +":# c #221D0B", +"<# c #6C5F29", +"[# c #B9A75E", +"}# c #604F0D", +"|# c #433707", +"1# c #272002", +"2# c #292102", +"3# c #54491D", +"4# c #261F06", +"5# c #3D3411", +"6# c #BFAC64", +"7# c #B9A555", +"8# c #BDAA5E", +"9# c #917F35", +"0# c #76682C", +"a# c #BFAC61", +"b# c #857226", +"c# c #846D15", +"d# c #433705", +"e# c #705B06", +"f# c #4D4213", +"g# c #7F7034", +"h# c #685818", +"i# c #A59141", +"j# c #B8A559", +"k# c #635418", +"l# c #94864C", +"m# c #C6B570", +"n# c #AA9645", +"o# c #453B16", +"p# c #B0A061", +"q# c #B6A250", +"r# c #766729", +"s# c #1D1703", +"t# c #BFAD64", +"u# c #BFAD62", +"v# c #C0AD63", +"w# c #7E6B1D", +"x# c #7B650E", +"y# c #6D5F28", +"z# c #8C7B39", +"A# c #C1B06C", +"B# c #C8B774", +"C# c #CABA79", +"D# c #AF9B4D", +"E# c #C0AE68", +"F# c #CAB978", +"G# c #C0AE67", +"H# c #5B4C0F", +"I# c #4B4220", +"J# c #A19257", +"K# c #AB9641", +"L# c #38300D", +"M# c #221C04", +"N# c #BFAD66", +"O# c #C2AF66", +"P# c #C3B168", +"Q# c #A7954E", +"R# c #908040", +"S# c #C7B571", +"T# c #CEBE80", +"U# c #CDBD7F", +"V# c #CEBF82", +"W# c #CBBC7C", +"X# c #C7B672", +"Y# c #C9B877", +"Z# c #B19D4D", +"`# c #6D5A0D", +" $ c #403819", +".$ c #9E8E50", +"+$ c #8E7A2E", +"@$ c #AD9844", +"#$ c #302702", +"$$ c #3A310D", +"%$ c #C3B16A", +"&$ c #C4B26B", +"*$ c #C5B36D", +"=$ c #BBA75B", +"-$ c #3A2F02", +";$ c #6F612A", +">$ c #CEBF81", +",$ c #CDBD7E", +"'$ c #C9B978", +")$ c #695C2B", +"!$ c #816F29", +"~$ c #CAB977", +"{$ c #C6B572", +"]$ c #937F2F", +"^$ c #5C4B06", +"/$ c #6F6230", +" . + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ ", +": < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i ", +"j k l m 3 n o p q r s t u v w x y z A B C D E F ", +"G H I J K L M N O P Q R S T U V W X Y Z ` ...+.", +"@.#.$.%.2 &.*.=.-.=.;.z >.,.'.).!.~.{.].^./.(._.", +":.<.[.}.,.|.1.2.3.4.5.6.7.8.9.3 ` c #.0.a.A b.c.", +"d.e.f.c 3 g.h.i.j.k.l.m.n.).o.2 p.%.q.r.s.'.t.+.", +"u.v.n A w.x.K - y.z.A.B.C.=.D.E.F.G.H.I.J.=.K.L.", +"M.1 ^.=.N.O.P.Q.R.S.T.U.V.W.x.b.X.n Y.Z.`. +.+++", +"@+1 K #+$+%+&+*+=+-+;+>+,+'+)+!+~+K {+]+^+/+J (+", +"_+:+&.*.<+[+}+|+1+2+3+4+5+6+7+8+9+0+a+b+c+d+e+f+", +"g+y o.h+i+j+k+l+m+n+k.o+p+q+r+s+W.t+u+v+w+x+7+y+", +"z+A+2 B+C+D+E+F+G+H+I+J+K+L+M+&.N+O+u+P+Q+R+S+T+", +"U+2 '.V+W+X+Y+Z+`+ @.@+@@@#@;.$@%@&@*@=@-@;@>@,@", +"'@A+)@!@~@k+Y+w.{@]@^@/@b.(@_@:@<@[@}@|@1@2@S+3@", +"4@1 5@6@7@8@9@r+0@a@b@c@5@g.d@w e@f@g@h@i@j@k@l@", +"m@g.n@o@p@q@r@s@t@{+u@v@3 K w@x@y@z@A@p.B@C@D@E@", +"F@G@H@I@J@K@L@M@N@O@P@Q@!.R@S@T@U@^.c [.A@V@W@X@", +"Y@Z@`@ #.#[ +#@###$#%#&#).*#=#p+-#%.%.K ;#>#g.,#", +"'#)#!#~#{#]#^#B@/#(#_#B@!.:#<#[#}#|#1#2#3#4#d 5#", +"6#7#8#9#0#N a#b#c#0+d#e#9.f#g#h#i#j#k#l#m#n#1.o#", +"p#q#8#r#s#t#u#v#w#x#9.e.y#z#A#B#C#D#E#F#G#=#H#I#", +"J#K#N L#M#N#O#P#Q#e.2#R#S#T#U#V#W#U+X#C#Y#Z#`# $", +".$+$@$#$$$%$&$*$=$-$;$u X#>$,$'$)$!$~$U#{$]$^$/$"}; diff --git a/Icons/Merkaartor_100x100.png b/Icons/Merkaartor_100x100.png new file mode 100644 index 0000000000000000000000000000000000000000..bb34a7d29aaefdc457be7e113e0f95e8c7e51be3 GIT binary patch literal 21054 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 JPDHLkV1kpt*n0o~ literal 0 HcmV?d00001 diff --git a/Icons/Merkaartor_16x16.ico b/Icons/Merkaartor_16x16.ico new file mode 100644 index 0000000000000000000000000000000000000000..7b47ab660bd28d3a9e9b08306b272f7be19bb9af GIT binary patch literal 1406 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 Dd=KYU literal 0 HcmV?d00001 diff --git a/Icons/Merkaartor_installer.bmp b/Icons/Merkaartor_installer.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3cddbb2d50acaff63782a2853092f368428891f1 GIT binary patch literal 154542 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%0At@glQZYHCK1(u?V`KO&@suzWHIO@`Vl3^vEkx&f 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

    c{7MQwF`pxWoHD3g_a$E=8Ev%7P3CR;(# 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%0AG&fnjfwqzNk4>-&WzOJsW<5E(t3vTYyr!Pxb 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

      kNW(UjRiG;@NC#;TMj6~j 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%0AI@R1|k5FCeq zXcmK{0-~aa-oQN5`Inb?DC4|f4BNvB+N5nvAZr9o!yY_V- z!Ks=-cnL+~m>wPLKGfcZkR=*TH8Otxw_k4kh@77oJTWv}8K1Cp0Yafk1D3B$NQzI% zC~Dl=eH4qUH%I@8um4sZ&@l7iUda@ys%5=WPO6(qUZ|3^{ zUKr_yEat7w?#}h{MLvH1{(jQWGr#(3i(0)I1Y*seb{KVaTXZvB`kha3gz@(6U;p>~ z$x~fOiRt{cW!L8c{sI2}^FLVlS>~qvjo510QlZ`147u5^ZqsgqF2l|jtv7D`^3&zh zkT!=zYv;YX@?{GaFP6@ut_nD&;44je)u!s|2Hfs_SGQTWewRV#^NyyQH*Wj{nSow> zeY>lzF8-6y#i0up1$`hCFUbJ2URbfSb|-Wsp}%T|WMISiGgWTDu?Ww`6D3ZQRA`eAm-S>U`SK-PVG_eSdMNlLTa$t~=9gUXM2On*T+kC$@s=R@*Y2+3g-DkvXDVm3JDcEJhF$NeVp*Nj9nf`csjW!MTzmV*4;Okn4np0y zv$t*k2Y4wV!RE)DxjsJPc{!!!<&{u~*u5XAL%|qc1C`;sIHudyvMs5kyzG~o-%s@p z4>q^8wRd!OMEJ0Le)s(9=13}XimR(!dxWXsL# zSI!O$wY4xUPudQ(HRl8%X&+x7Pj7wir}N85p=4WGMSVkir)lSPknycZv$=BHwu*+E zH^04by15Osd235sH+G|a&;>nF;wPSS0=_CQt=Xd4Ua_aS)4cOiM_W@vOLKGG&fVpW zH*f#+(|Ai4zUYK}?xvhzKY!lX-7Vt0>)%c`m?)a5((eBIb-(K+4TymL=OZCy)M zdG+nvzaXP+2U}WEe@7eQSI(CPAl!kwtIM1@pJ#2`P68TrUmt?i!;XfXwFMjVvUAI~ z-M)SE=8ZFLhggSx#W>KtX5}*35^3<Z%}P*(U)@7R#jn@(l3KljoO~SE#o$+uzl;Az5n7 zi~F@ZcQ!QUuV1?^`{vE-KV2IeYXQNJgtaA^pL`OrWXW7~>VPH7^OtQXuF!7Zv!@OU zBOU9xPU|6FNsxNLdkSJ4Gu zZK>Pyb=}u3@Dh@?p6=+ZgLnosz*ACkknvxB`tSGC$oavRgNNEOmqjk{MQ{-x&&8pU z@@1=HRb?4Vr&wO3qfb`+N9jy%w)jPX#QrBm$`yx00_U#+j0W#C+b5`4}im&9$ zmxE!Ch`_+)=N1~XT%}sSUW0Xi{r;vl^xFIF_1l}acWQU1rL9j{2Ur#jcK!6kQHTMv z+Wu&6Nc>OqaXlfN!MFk29kf^dyF^T%hCy-miTm9oZ^U4q>0Y|~#Dne-g z|8I^nUpQMd+ucVREQgR@qRLcdkcepOtA~ar`u9~pgOx#o?_?4@_CB@YitGimCH~F< z0TH;z`$UzQN$(iBCxHL*W zbfW)w=YicSx->zlPnR0<5jS+UBsj!7T&|0_ZlW?mvTqX7qJ~Z|CuVw%l&NA-(08$m zaQP!c9^S8u-2(!ok+G;PWYI`voXAqXOO8FkI`OuDcTpTG?rp3x78gG=Fyx7xCD`hf z$q|zs*~O)d@?o4pnLKm?S!q#0_ANoBi~?ZzLLjmixqHv{`v{jBL3ohDqvPNx{_AOi zDprB4AK6o&B(*yx@x2@t&#duU9Tb_LELxdpo@k`}Ljj>%@#xTz0~sn}f#k}#2nPJ| zQybxIPqDkiFF=MIQ!5%KzEjejpCqghbH%2kLyZTD5>`W@@oj?K9Trav97SN%+$H`& zQMy8+9grFQ#5*uch>ML53lkd}PYm_6q{V;&0;;UwAxH0!2qR&9XQaU^-~fh+@2P@V z%6kb=o>PSSm~xCKhkACWB}7AEQJEGS37e-jo)U?#e?Y*ZNTdYqM6@mR4evqRE>_{E z?;-J?7(G&%R+uA?g$AE8flN4Jp8zrml0{K@43$jcpUODM+eJtFn45UGkDh4Uo>dU5 zAl=BASh)>VmbZVPzmK1{Pk2O}(o}gHNZV>8Aoun2^NAQ8J+!+*9t&J-wIWs}vOx_z z7f3t<-Dd~+gvpiW%3l*=S41e}a#`>qNz~|Mf4@eNh%c0o?1LmT8qYt#Myp6`b`b9{F0-Y6W0Aq$BmsGcZ%f%n;Y|3OkN(lhWDPKXZnYa_a58-frN|QRhIc5w(flFiqY<; zE>UMlow?wR>k|Psjku<4C-*+GHJN+{;i$3Bn(c?O<6X^J=6{))0}7z9!U88ZSENm( z%tQQ_BSOvLUAT#HA`%@tt<&~9%bfkGwR3mvj*+Aun)GsfxnbLU#?Ybr`}Qx+nQGT)BNck%La@$i6pqMHjw zF?R&^MrG-&EwJ}*Z0xgOfWiVBPW}K4;@rWyEftj&st3OrW!Q6+79mAmEi#8Ixfc= zfRoq@NqZvOjLSU_Hy4CfcSTG$CkOl-QByZK2>+UbmoTSqW@AaUYws49z*)8cjcjcl zoIJcj79(Au%N!6?Vi%UnU#M~H3G=z(&Fy^nhoETyV zka;+$)O&lc4R7~$Z{6mckm11R|6QBz`%zKPe%AA>XW0AfwbpN~U&;HSD*$Hs2voy! z+SG^Uu3HYM33SfvnS`aM`9r&>`rY$heCSL`^)*T&HZ?0EZD{^7n-{p!_p?^d75;Nb z&)j?iX04sGdc)kHIWswFQzwh$ZSRRwCr+A?QE;)EpkB+Eux)dD`B^O5edjg=K-cZ* z?(I5pa==4#9$h_u-s2FkPn|_YWItbD_R+<4(nC+@orkGLN=%`G^7Wk>Fl*wZ#lerySLP33oy{a%Pk7`fPz(NRPnTBKTx*Amm93@}oW8lW?t`lL z_iYZD;p*(-=I-U@>9=Igx+M!1|1o$mM{U~F!1(~Iyu3ZVUA+7<&V5(~4Gop-MEV-i zSaVgw#}`j=Ay}li{MD13g!vT9U9e*5Lkkzr4&A@yDqev`%sRk+^hF@LJq9K?@msCV051lRzfic6Ax=xFY}0=gQ3FY*n*Y zN|SAKN6yLDcdzpXT0%U~-PPMOVBzxE(D0z3xj}(5XU>`r^PI;7LTL`;X6OIqJ#*zp zlEL1@In&9GDb2Tz<>zOw_3*Tuun%XjjmM?gof2zp}O!g-I+TO_1O!Z+6tr&b#!XK>w_)+(wLw#T zU0w7p{eWJ){Bnd3S64OiQ6oyLE%&**+uGjDDLCfO06)08^E6u!v|-&wFw5(n_~VL4 z1^uK0syH~#!PoCi5&aFvR3rEmDSIh zHaDcb%lA$$b1&hXti~Z*Rm*+Nk~3eV)q;_O>jdt@QTf@`Gict@N0uynbn!z^EuJ)c zCLHq)EyijB)&K9 zP9Pxb?d3l$_AJF(>?jZeG~maQOXn}0410Kr7Ca@YH^JN0k2vJ07eBt^Au^HhA3gbb zbA~23@_v5i65J(rWp~JDuQ*qHrs(v+hi5nw2vr@1T?5?wydAuM@b&SX$n%^!Aqd%x z^A0#GGWKQnsFzT3A|*9HbiF_DsoVArMC*n8&(oWSJOk?eewP1ua-@j!+HPd5l5(w< zO{G%#^RW{ducdEUA0)U3=kab7Q{kS!?K6FbAHW$O|H+^!q@?U!qN|2+wsw<3&O&0P zlpD(aCRIWTO)2pSk;@+O^LBCq8RO$kh;!n!>47uA^LWcQtQ0O+JgpvDWPQ-!6cT>9 zOcTFJ!Go$}`%~hK+g}8ZN8Hre&2QQ?KfcSU$>KL-YCr%FYgUQjJw3+a+Jk`$&I^5? zq3nOSt*VZicE=^eZF($ll81+rtFyOXz_jVp0;l^;o(4s#zaK=W{(Qs!ioBz}!#KnA zxvvNf=UDY0rRtl?;>48Q=^0@`vpl>VCx9&Rn}qy~=~HJ+5A-wm{RCjhm!aJyT0JkU z=yEA6oQAUhWsA%?WTzf`{nfQoIa&mqJ$wWFcvMfHj{bfe3ccTt{u~vezq~2E_D1m) zSeB^AL5N%}|ED=8`qhG?dtcoK!pRkw1bCuJ(-@dX7TSI{#oy0YAVehLfCzJ3mSVba zfs*F^W7?XTe{KCG0`g3y%&O3gV z;yg&Dq{ojrVgrcIr?p)2B`Ln>>jl3dsCt zXDDC2r#+sKSA2!B&9d9JW#3*dBr88>$7F#|xJYqfKcC4S-m~XFOx2lz>AaN@S_g&n zlhe5I-oXb7&t1Gq5t9nGni?qjvex2L=ik`1=1G62@r3f-oLxQVOkFl7aP~9vXKQC| zQXqIIa4>F;Zk{_1pE-ZAq=FJIB7GHUo+0Ol_s*W^DCj)Le*@-p!{S;K7_?y8%-K_T ziSwWA<~4!k{LRf}+J=nRi_X4#xkQR6$<$@|!To8kZFvV;Qt8@TQ;MZw!k=cV2g1x$r5c6@pDlFR_2{`|Vij2;{@bb%KwN zhxe>y!K+q3wsOVn*}=1@BjTuc><63T=DA0R>vZQw-o1j-YWaO`?~01_J!#3_4Df>! zfM)N&Su2*U3SRcevL(+1&2!--=vdD|dpi%$bP@dxhu0NgCQ|ZAHlG49cV6`l)&MuI zZhk(q2(mp`z4Xb47cQGTkM9FJ$02){Rmabs*Pp+Cu2>2Ni6~FRQ4t+BuJ997%}*%q zKV#0KrHkj!dwR+Ipm|dubhUTppyCrbs=YTAf#8G>?FILxzV zESQVuVD_}fW_wQw;Jd=X@y90*GFOqja77*p)Vb0ml{6*V>hC&UJ7zyQ1|VcoNHr0w(aseRM~5+%b{dU!ob%OP5Z#b`;{fY64P ztn`OCX^xHcdDt|R7=!c>pSWgXjF=g{+=4oV3O3Z+bled@ObUV4QVA=EJaWlSN z(#qASL4(cgnJXXTQvdilD>v^Xi(9yqxMqkNFsz|4#A7NK2fUYTrcA#iNOH+GYT((q zYu2sP&*RcPmj&Cx5i`oHY@-IZuOTsPHWzNsT=T+9JLBOCVOr$E>Z69XJrVMl9^G%x z+Ys_nSS&fYa%rcew+AaBqrTFef6%(;w`>oSd~z90q&z*S)X>hr>2ug3yVIO4P8s2l+dJHg^}Sd;SH@9TCn*Di@)f8TNJ} zO=h~yu+HO&7eaI)%I4o#E_jy66K5(y1rum9Y%dHZx{#4A;q<4*^s`~Hu|D?R?&vw< zBbR=|VG$05MAFM;rt%IW8!)o$`4D}`{TH@LezRQVu#9R~9k}|_GMq=SkA;M6)v|=y z_*fdK-lN*pIgBb-H;2pKlI^ZtFaj`!l6lwWnHV<&Q+=DOh+U1qv}X!sby}xmHS_hY_qDp)R1^lkt#piF2B{Gyerr|i0j z$l{0qz!2&>Q-(#e)}^to36n%KMXz!FPD@)m+E@T<(})l3==^s9JCyT`CD-}0H7X(>)7Nu3!G=%1@tuu{O0$X?=hm&DXA>g4(KTt#wEY z$@Xja2W{!CwOKox(xK8m(As=WEHjyO+X%*v+OD>77TeTTtBlTF)ymzYxj4vdpd&OE z!TVIQZ@wn?TWhf74&0V(i5x+(Z~0-%pzIJ=4Whk#)X$vdF6Ecfc2_za`|t1b zHZVsfEF!k;BW=yHb*yhi1CAVTNgGc3?8Xwkxg#*%rI@A^wH3vUt*~HXB{* zfT+f5BA{`Iuv+lCTnhDG$ zma0{@Os@XEU~0ReLpHdr-M;-tQBy`hgAVPf#8xxJ2%oAgY-(N-@ zw0fdCvs%ejsfGo==zVx1$hf>5ywoPAVUpjKNl;&#ru(V`6rCb{svso=0 zxms3gTl#?aK6BMrdxx>!rDWldY`D2xWg)d4Vd+^Ev#xXq%{fEkWzvpikPOqWY95tp zp-S0(-j`+GV}p&BqnfrOZn7h0tq++XZKX6LTfl2Fe~AQ?-lMWI3@pkx|3|_w_K%86 z3M!(InZMad(M?Q324F$JCCQ$YvGJTM*)~~1`CK(C75Yl4PXDCRU+V zDCP&~QFiqzDyU{vYpp|Kh!vwt?ho41n_0VGXaZAx<$$^Ds=VdPq$@^vaaJqU3eIAM zYPQPgBE{XKSpfNsl~dwl<71+Hq6~7GH+^1iNR^>^1-G)e&29SnQ zH;Ez{6k$=N^ouddS;oM2`oFe@D63Rf(hHd)Rb~?PiB@@|_leR|F-nOLo#^KtZ`8aS zlQW*0NgbSF(DBBo3DVc^uj&q3#VDOojpwRVc%h>a`q5th$1x{)`_^fls#;UM@xE47 zhpHnQ&*ccVf-cG`FUw*V=wimCb<8}%fErScN_#~YE;9H@SsW1{7*D+y3b$xxmo(Nz zU?6A)&`z%3p~?x`z);H!q>UY&|1Mz1vg@KoFgVnRVKHx*Xus5O!MtLXbx{s+pG-hcw>u;B5%KHhq+R#K_JF znyWFx(vtC%7;R)sOf_m`XH7}BWE@BAH zIYZ-R(vDFO{?V@riKldqfhq-pH0AjJXbh@pJK`og!vDoGlcOXh$2e?ETWlar0)EX= zSs4ZvWt{&bVHo>IY&<1_P{_#N?4;->#w7!=Aee5lCsAxX=SsFsmQX%djY_OOUJ4Lt z@)SKnS$p|7#-54AsCLF!FEoK0Hh#buwNtD# znRM(329+AG#&Q;8RU>@AM!Bnu+&!AvtjhlLVXO$=kB!+GwNvglW4s|=j=8oDQW{6m zj-XhZ+;FxG$_{bWAll1E*pjryo{XobyVBvS&5Y<>s1oW{gx0md(eLTxWYZgZ) z#KzN_-Io;|phxYZeH4VSn5Rl2S9HkSX5D4qHH()^ER|8VOs@XEU~0S}Q8qX>-ah_E zQBy`h1L{`Dl(kbf!l!D?xF|JVmuRIN7aBOwlgw0MJ~S1Z87*b)WklzwyS!pT#c+1} zhG*A3yH;8I&!-m$xH>peoPnGv(vwqvCL9oQwC`RkNqgm^ynF9D2%f!-@w_ zWSt?|kbb zF4wQPy=DW^c19*gzNxvPm9v_Z_gMuX*6dj`Z38EI)x&GN%tiOOV)xj1>w3=Ceo>gm<1 zmOi?C`O>9`{<>=QbI|F?v>TUwYD)cJGg&wps{yhk5jrL4Li^2e}@f)XuDL~SI!Ml8VZAmr-mX?;8Q5M89D zCG38A^V&yTeTb?NZ*y&Raiy5Tq#3j4%$py)V)auYp|P1oRV+Ng3y^vVgJ2lQE)-#(nUAJiyfmh_()d-Akb{Xc47HmoFPsw= zFVQ=DUshJe-h?S`B2Dm!LL9Do*ZXcBk39bNJJofJO|9m}`%RE!v0t4XGXHzE#TPFY z!o&qN$v$Nt=QksEGc^hjC+$&!#4-y{pU2V}nbc(m_-yfC~6&0Rj_`JPY znQ3Ww8y|8aYm^ySJqhjWTn1g;d}pRrYS|*gP1iK{-M4bKh*o%d&Rm%LA;OB>XPVowtCNSM()3wX@rAeFIrBz#_P&Ha1_r$7 z#mOUlSdc`h)} zRUXWCj=u92KvhV3tdq05>OM68sdMkjq7Cwhg0@fGi%2WYeNA<6UX{FmAQsk(`46!} zc8(OanHNM(Jpnxwcl8VKpZQ|`yTxOvWJ;42p9Z6U$vw){8_GWT;L7E*Ss~tD)H|UD z&p0oii8Ge2qVR$sIeujG{9Ii(?cRU#+(mS6l42a(WcrTLp6DRhM?w+>N?amti>iLAl-Hcw zuwvy3o`*_s|14*FB2N?)vD1-V?(FSPNie@@bLN9%To|Me`g(D2=m||2v%RzyB8U3= z;TU zAfT1Yqa|X?Uoq6*s@y>l<{e>Sk4^TZ-T*3-^X)j!HDJ>G;6;xwUbJA|!i5VKAo}Z~ z#VaX2FViOPhF`EB4AmY_+O;!Mjr?r;)4q=KolXk2Bcv;|ohNwu&j_3~cmB+2vll1} z`sXiv^651%#ur>DF_a9JmceOIDzqi_pVws@c_D}l3kwa|u<~K>L{zMpAkY~PKZ>9Q zPMbbs-ouNOMfab4=J_3IC$w}G^$K}DV&;DbcSTK|d4Jq1bP*Qz@|JaLg6BF@3q=BS zPOXkkR7UUyfjA>@e$e8_o?O2*BIi5{PnG}?Q0!jZLbY(66u+L7CbTo5p<5v)TIl8} z3I3zf$+yJsohSHBn=yCpq9srMzh^=sNtgjw5BrC59FP&QmS-j+$FE=RrXQ` zI4yE#Uw#7jp~sAvLkDvUFM{a5LSRr_IHOmwt8Zg_mzLxo=36B_ zJtbzRvQr5k3Y+H1{uvxqC&l?T4|=|4CQwlA=y?$NY#h1zi2rnz>0^+W79Y-f73nnL zx=?lwMTS4+E0IXpZrB6WS#clObNH>3MJznBSKyIQO7G&Gf`8=dm9r*fmA!Y;_4NKrS}MmNkzmHg(Wz96U-kPlC#X{S8p9`qM@EE&J^AF?Y2yK1Do(?| zB*u%p^RP!i*g2L?y)s;SRde)?$yzTJy}>KNcY9M(;$933{lg!ES3eU7q)kvd;8n+S zf``CiE!k6Ii>$R2QKjm-Xs#)K?$}|Ociisijepp(?5QUMseEGZ;pXM-I(|Igby5x? zU}oGIgcZ5jGzW7{HBU;V^t1B?ukX)2m>M0u>*Z%A`8*}hXgep62j0$@F^J2GEsQR_ zM7~--xhp(pWOO{#)irp`e!X(`t>dr1VM-3&v19wnNt2x9>1=TDm;p#*tRRzoIR`#= z_^2$}AkQgiZp4v{v{FWr86*)W-q^j>-;3(Q920{B1!`u@n(688j1|J|>gnSZ@Knmt zg0aLlrPPY|iqXI1MrG>rmvAZf=f1vz#3%MC;+dU=gJi1OW0Qo5$U=dP~e} zhmWB<>5cgAluCWoXkG0979;f==h{4MGw3P^>@aaUB@R(aHT4BP{CTDJ8NQSVsm`34 zxy(Skd_bME`AiQ9tQsDEKkgMO8S5kT)$ ztX9H*#??o8V5-i>&!faN@FjbjN#q>p{ntnm4lXDqVp#JPDTz8GK9m4o#aHne@>X@K zj*=F)ZRgIJzvd+%^x*`J#f>w%6WjVW_IE_sqw^;FQa{qeR;TEEZImfP^B08xf@jv0 zMxg0WJ5dh5@#s5U*>z(1xPocHq z`@qMU+V?t&*?QXy&3kOkW=Tx=Eh;!O;M)|26)Tj(Xo%s(2`|i8Yto4 zMBp#Lv5<&MiyLDO0{Jwdec_A4O=o>ncdIr=i*?{>Gfzj68NVu$x;|3^iGfXER|&O zXWrSca`tQr4SIOE*r*CCJNg3CQNxELc51HFu~ybUt$S>WGG*8o&>h48qxNC8w6R9e zL`nQfhSf%WVF?7_-r)WW6d)OK+CVEs&Wq-gO-<&sD-riYf`bC*&+#(AAK+_aHLUp) zxk&w_PHrO{p6fO$(8DMAWra9s3>qZ#R>cQ*|Z zn}q;ZB7hPiZ11q^;D?S#J;C%|eXmt$7gb??gu7Cu3W9_J2{yJ9swHNL2gkN!06PaN zNZ}tgz=x{qRW0&oxEHG#qno&+-B_$oZFlI0ZCfNzE~|q5HG+ta z=?LX4ERr`yZ}usDBe0pnsM*v{XkQjYTSJM?Vq)u&?w7Uc)JU*xEdxS<*>~e+A6&4= z>3fH1CE?x?)?OA~Ldc>f<7*%Z(NXCghH~}>V-4RFHTAt(JBbEM5Z4y0z#Zv@aaevF z6D*c+#cRa2Bb1d?A-^4)TkB8@?h6Uw5}&qhmf)<09H1vu)Y!oli_$Xyg{iQsN|v9{ z*WYBiy50c^{tNVgn0t!?&_Nql25xPIF&Y8ZzUS_k3bIBwwe^9MR_z^vXB*dzK|;tN zl~rU%$HpFPY3*WcO?Fghd6k}Fge?eJZ<1)Q_6`8eU|fmyi?Ryn4ISbAvB>f;hMMe3 zKWx03(!JX3>4F(UscQj7!7oEApb176K)J4EPy;Nqa3%?N3q$vPVRD7i7H;7lrALmf zVsT)xh-izl8k%4X;~_F_51@L+Wk_>_#VRr?4k@w1X&6TkmVm38s$>cMChn z2zI^qIkP?8!Y|w2Vdxm`sb{f;F?@iWe{nBpO^3SZyqg0s+SRS=*7|kQ`jtBc%INF86l&Dy z>#eYpqmUBeJe>b$h%#d#N9fB!A5q#I^i>a@o zg_F=*_wlg2DUTANk%y+1HKUc<0SrUvdVweDdU&QGFxtZ|4ay^^PwtiB8#lSXdCFc< zN(TuVLvSXcNr_!nR@qhYLkEO_C_l~}tI+DG!t4V#kxB^xiBU@Ykr*<;RJ;zhRRg@1 zQ)NczA=OHUDqXFvUf(dpL*tV$oAM}O@QJ#n|p(e%}hDA%Hw007vmgurAAci~A3*)f-GLRJeP{)YN zD9OWM*5Bu59xBJ=me?|ZbK5eB8cUpeh@MbUBYzZ{z5ytzggp!Q*pSeZUSqnth5F}ifDlAk1y~7ey_)jCH?S*YSNdUF)0A$|W=|LF zCX{LQ;5+zbFoWh`WI;{q$_F(hg@#eUq^O6@QJA`*EQ31^hlm_orQU(XBGfJk1q>_T z1Np%@Rw^Dq#Xu`PH5Gy)$q+ifC*+mkOTas1N(4av!$6nGTbffAS2i{+~>>+>!29w zhN{tO?g-eh#Bvr6FOyFk7RqRq8$D9_G}u z*g^<7Aau84%FEp~R72-Nc{*BCtE<)eb<+BkJB3nPjSbWcWVck<3=uIPGK@eSgpLN9 zJ2wpAv)687ihzlVs3NSsa2@(AK}h5Nhd8uvF(*>ELdkZ3j>J`yvPplW=gT_Qhp zU>krRnDi#Al*U)3IzPk$D%txIJe9yG!EK_v7|FIEz!Nc*6NS&k0277Iq-M&WVG|~! zkxpad?Z%>`YP>_DE?t+YH^EfE4;g?T#9727jE#4Qw=-(NTQNV>?!7PdFq#t5`PRt0-%1Q8w65sD8bTge$c1R2CgPPWN_R6k${ zSrBavC7z9`sznVB z7_yHX#u|q2LZq~I54r%ES4}|X)8KH=|mOEk+HcMhhnhZCFo5= z-!@9Z*%E*sq9;_;Sd@gyX8?K$A-s?s5dyA5OjluZtOE z9unTCGc3eRh?9h619A}|zECpc*eaP0EEbIZCgdW} zUU1ZvSUaOMXKpGxIiR5cv=tkM14QPeWR5U5h2x%~V;~hFJ>UrZEus*=<=}{pU`k{J?hYOFb(Wfh!9&!(J>RD{zVHyxZH*sso-8Ga-=fV{> znwqXl*ZOtR`jtBcex7U-wJSB6FDrykD5WG1Bai`|l7Z&VrU4j0w3}FOx~~zDL1Lom zGORgSXb!nmYPwyzRrb!&q#PQCG9-t!QPT&Z8NykW=pYX~8tK!~f>N1dEl0EQ`Ks9l zQ$OTSIPFAhJ@_&R{iJKr7e|AN7EZz?l*_~NkUUC+kP9ji){ItaBES_PQ~}VX69zE^ zMl;x@L3sq_%Dpn2bBOy}HQ8Eh#TLN4!$=WpeDp@2p-=3jZj6C0rPC@Aezj{rGXpxB z#Eh1Abfx=Fj|JYIJKKI;v90Ai4dh0>+#L>lAyfi!Dv!o2>V3(!S5O z5A#Lo{q1@$rUji~Ux@9>>%7uEi0#wW@xEqr4r$lB?Xe#;SAjv~^tdI&#$;?P?c3NO zq9T3tc2#cXD%y?j9>A`$;JFY7!A&uKf4R}yt66i}P*^)6jCvovxn#0f$t-~*cE=FL zXx|NHGiF`(Uq_0ev451#-?~JqtG&Cs^~k=Ble|!o<`^>Cc-lh9c$$jef=0n&5toJd z5;{Sjx7I%W=oAl6ZDMMVbGPPR!P1gt)AwTeb|`KC!ldkI<((L!+m}|&feu15rJ1S> z@(XiiA9`6r^y0S|z<=-TY42*sGU{usth@T*N9Aj!#Qm5YYO{Ct5PpoUkO<3fZBiC& zsE*F-e{E}SYBgWId}8PJ$;8LpSvSP=oobh^+qUZyc10Fi>@^v(1NT->8}Rdnrq++I zoje&al`;~ZzMf*Pc6Hi{&8c+jx~yW2;&5VPl`aZOb@zUHqX*|hOIJ@Dr9K;5Km90o z_l!yY-hSSm92}azx8;+YJ@vfHG~Mh*@M2Zd`Rw^KCizXA z=Xr*wUdTz6MH-U6}7Sq=uK+F}z%LlXoOt-Qbea%uk)!4yVzr9uMe1dg62iILiM z4peZ>AD6rl{-b)^4IRp zPJ9q}qA-qoEsa%`XDQs=+DRtD^_KjMq=$Sa`9Ub+<>g8a_8nL4EOm<`k`-5QBd9&M zx;omVd8g&px1Zzry8P~`!d~9hv98Twb9_B1r4OFMTk#$S(BLYzIJXujkPcY=8}!tT zpQNp$_4=(_|N8E;x|a9eefLt;dnYeYeJ?8nDhl~cu;1Im*VEUZbFO(&#Gj=0el3n4 zR=>5QxA&8O{_ER+_SO`alvJO1EAO3)Z#*(dz$AA(q^y7o+!N$d$M(AQ{*wW_+pqWj z?VEpn`@=W?Q&Dl@%Gumwg{R(l9SDTts<`W*`yeXjGiPU7uS>7ehsHPl`RSK`|K^+T zZvDNz(OmKNi8oK2JDIk2rXM5)r0uG%1cbbU=cT0J6jg3~(f27gWZ$Qse)+F&ZhiCl z|9tyd(Oak9dZYOD{LnNXcSPJlH>s`zPCg44E>217b?W`$`i<+KeEKOOpMC!Ke}8@J zR`;i0G<=Y+&VLwr6?&Q?|*=xdR_VSUr2uPx3B*3-S^-0 zHGKYAXZc%4&+%k_BWZ>^ql|d?liS7`ib(%zxzJ_=eOT| z_peVs{rmrXdcE}0x&8Z$Svk8GyXstT2M7&`r`K~F6$`uN(EAH+ygqT6e)0)={_EdA z{P2xRCE;65P1R=(WWIRdK*)A?s^5Sba`oJlQBc!l5kcE}Td_+pH8GgPGXU|np+#)A zS`3pKjYzx}D`h}4NvcZ4q!)WZsl8JN(>A7%5SQZ=(6v~F{#c_Q##*Y;RU?fd|3I3V zDbS1Uqck|yT4~>6+kz>jH2fxX$%{&DDd|C(EX9zzVNYD*lCeTSb9fDq)sB zy=dx$3C@~X&s1fQUzjWVK)GoA14wBq{=K@cvZfL%t;Kw<_|IqFJsm9d-^b)oo4vEI zz5e?OiLm@;DGT0ZF8RPt7W0jgO5O3hojw7VJrmljT zomb3l@5XKM7aSwUSXQvwu3A?!s_jYDmz)Kx?kYO0t#7?ncc~P-#kE=lkDV{giw^YX z3q|p;GA^5j+r_?GUvr0zF;mXJvKo($Y}QvzRV5`Cib}3j)VG+goO+}1&pQ?ecz8Oy zyHOWGQx`d<=4<3?Ybtphii3dlU}WkhmY%(Ep%lgi^Lgd`FUMn+%%3n}yc1Ok0KIYc zG)XMxntKR|4@ocu_+Gwz?@Zx^qSA|1we_Wi6_r;C@^&nk0viIQSU|kFaZp7wG*+vJ zHBS@xl^V6;Q!OK+8m5U0hjLFGzHpI8SW`)9V^u*y{F9UXz_LJ(53WVb#r5R%8t-!e5*J+xhZa=PCRAq{C+CLEy|k1 z5{}2@%bKbRXVqWiGN1lO$%ZVjI>U~Oe% zgXPv2Uww0{`|R1*PacX(Hf5zIdV2x709*%54T%ZvQ$xZUTpCEDZBUxNYwP>$)~)~T z{jBmz(b@eO=^2M#3kwb)PS4Z;nK%x)&7ZM-J04o4=^rg^+>yKk^?h-x_ty39uex$x z&3ZMpATecq7@T&Blhp-$km@ur-hJlG+1tY!oEm-r1@5 z@E|QdKIIX}`4Cek=%5H$H%*EozHtgE3RJiKFJi5hPyXkB|8c9Ov*jz2Ou!r!sP!UUM{jTNu=U-6>w5{#4?zYCllxJL0L`yPw=3 zs414u$#wOPw2P(nB50dwD@GD_FH0tF3V1pVxne-3ValZ_^g)cm)WpZQtYi*p*VFAWtTZ2rLFDxKYsC0wY+Mkx(MzBQ^kD*F z!Bw;ypFV)WDXgpFIXNU=fnRc9Z5Gp38wxW}gi&vck5EZ+LCJK)AREF;&lRfDF|)fr z8!3jyFjSK7!t;o9JQSYJdT36^s4r1phSSzThSN0s5u}EYLSmwdj|DpJ7~@u$HpQS< zGn~^kpA+V%EScVfJ0MYs6=OWnh(~MNwg?;gr>StCYts>KW_G~D;-L}0#V7DkON6 zvL04iUAk@R*KCEXu2`=!S|ZNAj9Aha!Xk{@cLoGd-V~l*F>7tb`c~3)saCPealJ7# z#LkGCj^$)X3Poy0EX6v*jmNe)+1S|((_?zFU9v89R9pYVzq9X{`-$|Go|$(j<4+MF zMh>MTvm_*9fiPaHnYelEll7^0SbJgqj!(veB>VA8PGVTt=5=A=v6;EX@FyNy^IsHV z#9@L*!JgCiHSN<=<8hIQBZ4V25VaX2p5MGV0&)#wh!Qfg%oY(V$4QgGB2T?XWARZ5 zDg)onFIzXP*}N{|C3v7C*2Kn#2QQ!sB^#5fGIJ)3pN69+Y}RV*KehZ1c#|_W&z-+= z-sYFGjj=gl5!s2sFs6^U!Sj=ms!JWz)JoO>HUALeQwD?yJu%Ug86NV&+$nzwhke>; z%#QJp8jKu*2WZCzvT*Q(a(ey=xw5oK&OBXv7BAlNMU$tPAdtXQu+GNC26rFFk)whD zhx+eGrsLy*06P2h>5o1>u`TA&MT?e&JQ@(Rd`+;5fWf4>d}Juq^o@9_ST$p!$&^?5 zQEjE^rQnq-H~ag!%wOUKM~b`YTl!0n&o=$#!;fm)K0NjO^FgcUI=N4o?B&Yk3Gfx; z$jJHm*o6;1{P5$`AH;{Rdp^+L$A4Y`WFanG`8F3;VQ5^AUHIt3(;uEaReNH#-()|p zU{?YsR6o4;&gqDV&2#J&8#_BTalref z2>7NmGQTlVOA*`G%gfKpFCg#U<61G2U0N_CH?!SkMnCw8Uhw0*fB*7DBMPcBe%2Nrgx#an|rzZk4)F@ZWiQ z`A+ronr)&QpVpShp~TT8us_;s@elz#8XY(L+&yhQANb9gJulqMD=`6=kBM?H!!~>| z7B9;`aid^2clUnM2RaYi(!+D=;^61DXIG51mYkl!=CS@$qS~hbo$=t_mz( z(yW?)Yr~9{{oyZ(gR_b^Nq-VQ2@W+G$I~w~DKjM{DJAD@^~a5pF(WxMerdMRju7!yb9oeYLy-SC_A z#M;p4%(QHzvd%OT#3z-7TpZp!r2HL!4T{rC^Kgu}C|%$6bm1qn^j-IwyfijDk6fed zl(bB9YnKH7J8!oV%NOhmUNRAq@V~v~8{iN82S1;s*TZM=>-l`;CB^TKJzQ1I*;eot z4d7bSoNG!KkR|a^>AKY(9mn8X4nJ#ztIN{s;u4;pclc0tT5Qtpq$0dgf~L^$G2(*} z89blJ>X9{YGyyMkqOM~3vDek}rMx^Kv`LJcaHN_G9o&`ruJPSNWA~QMGJ;1?>HZF^ z*7ZKzGky;(Ii7zoJ0lCkZqmW`TLd$~>U4JLfmUc?)~NqX8{OXrRLnC%3eUdkhrH5QheR)vm8PS(?7y-mI*5{*re%Cuct? zIEPPF;tRr!Bj6IjAsM=daD>vHX9eDDf>-=+eR=&AT zLthEfg0<-qA281kap|jpLft=ie3aR(O-6-%7@f_mC z)lRnnIso_dYocAiGw@iBS~wv?#V7M$KL{iHZ~>JQ`9J_j8f;0MZ@=dG)j9zx$Mo4` zL3i9h{s*8p4S$AIAm`x0oI{ry03k7Jj<|JfLsd&Z&SAN&xVLncyYzx1(SrBm=1uXw zcHC(={q~y>5ai`$9xater{%6Mr|OkMvmj^nFV2zb!qT?PuO5 z=jrItgGY~3*Har?Kq9*KehS;f|>+(bvpRi5u;7%$NV%92dKfyuj zGieE=e&(^70_A4G7$_1vtrq9V2=CXr`Y$k}a1}I^T`oFPP*4>U=)4c`R_M4B}@Xsmj~$`Q63l%f(j!OcUp=t9Pg; z*o~lLeSb}D$Cr6(`ck)S5O zDFX-}sQ<3GGw&5E#r@>UlvQCsSJ!)MPz`b?s*B9H!E_TyC8I>&l${i}(^{5}Vci8n zFxpV>Am2IU+F!-qt*>ce zDc#&w$47?(fc<&<0b7^8PY zzWj$5Lyd2g3qXU_sjkt3 zp*lurpu^E7_qB@u3&_h5hX#Gsny<*ItZ!*(h>Xn5PKe#JCx!%-*sOE-dhpT+l0`sI zhT0)KowVnHf}jAPexRldc0c!6!!L0R;r$8xhsn18pKVjoo+#ofF$bIL~Fo; z;M*A$_S>O?*HRLVd(=I{Y1AU*13^1!7%6SO{j4UZPCC(}G>cXbSGmQy!yuH?Cb1*HYD;k^}qG6A}{> z5+afc<@sr4(U2dNC6h;>hJmZM%CX0x&FCX_^+1pnIH>BXD-Z4`BPc1!n6#HlncCQb zfVnMa5RVm3>-xs}+IqYCA@OZD%41oazBUb`I?Czafv3?pR!$+tC@2O+!n4WZ@fg7} z&}IIH<%I*l6t#WbhTz~tTPeXG{8FmG38?&FjKP?cz`2tCAT=HH5f2EM0?iB4Z^}$I zu35f(vkA*&c=huPqecuy8O0Pw#(+a*gwDrj4rD|;|LoeeAvC*Vx6QbH8*uq3BE=b* z4w=JZEoM4q4y2}sEqZiaENyDcr^OS zK#5Ak+)U2&)?ghZY$UHUN(&uD3AGjxV+jKSGZ-~xdeCeTcS7Q!Tv}Pz{Ye^)ZYMhd zrDO4ZWO_+ZI}Qw{Dfko=Vw{-(s;$wLm@-lofDb=v4U#u1XU= zi&0!QHvhJtyLo%KB&JAe3K=x18JN?guGnTcWUA={V%=t@=Hf~jaW>$w`Ncli7#|)H zMy5)5_;&IKjGzyOnX%^g$QYN|k3#$hw~@#=jc1Izic^R&JvA&m26v8DWQ8&jtVS}b zquDqnG8mhTA1ntEtAYbYvAL_x2?r)XCJL!AMle!>oB`A!?jy~^FdnDFgN#%>RhhZj zGKj&2OdM!Xm378cffpp-Hi8xqbPfI{5fXrbedayfA^Zo2S*D3`hFm?I?BPna8FCES z%<)t3#SGx3()?6PDyS%N{OHov3>|xWkMqgm;5-@=_Hc0=FRL;-8#j-jFf<5`I6*`P z#}l%8WDT;RoFnv=bHca;^z6BNbT)&|o4Jt4?V?W|pFT8p{B`2B!N2hUI9PTrjuIpW zeLWmRQPsxk@K_9Z2!^4)jvn|1J~1U-O~oIAmiR{)6&3LEjbn(vIar=laj0^a zi+2>QKj)D08E(UzL%3Y@VcVv7yOTz2XYb_we3T%21ZbmZ9ywg1a!YHl5g$L?(`TOrLz0914*-0^Aar(> z+9KnZg$ZN}Pm)5t5^Yb_%ziwrayxNyb(wc%TY0+SB_Xd8pHbqSu$h5ATB^U|wniRs zRu&EUQCTv1TxsC9OskxHoX3nll98FK&s9wS&df-TpA$&3lbf4^n=h43wXp^Ia$Ale zt|%PDnc11?nRb~&;z!Pw=cagAZA^8&m;!)S08wCaW7V~{x0Jnm`Y&(4T}5Heu3n7r z>z4OV97@W{#ZQ!vOX)~%!JEema`WFjMa6*JV@QMZ_?}3t#e&U({I$~eE}T98erZE% z4+h=+n|;?$?M+C?%FZJU{KK*Qyd!x9$KO1bn_W;?c=BXH!B_{%^)LIbcUgezw>H(i zck$vo7vB4zkq)jCsJ&j7A0MBwH|a>eKL6gayaLKY9ELct;G}Z$>jMmXgDH%mKsvhG z+ZxRmFT7K9?o4TGUyr1z+_!X99SMyv;*QSO<@doj@FsN*vJT|s6~1{S8~X$+UgF4j z52RvglNs&L73LR|_Fb2m-M`*@=14?1^FNxe=6`~C!Lj_@ysWH)g=gL}$+Gu zApJYKdh5#0y+Z+xBggT*82TRc=9{v1?adL@KRtF7HJ63?nds0 zrL(D+@)2(yIP*>&l0b1TW*4?5{`mr%}jdZ+3P@X3n80{yu<#2IatL_Vd@B z?Okp4H6@qcIrV15$Mt>P0>tUAuPZv0pLY;iN;(+MF=g!|Z+SE`Tg@ImFxhWDJ@nty z@H&>RHUVBV{8U$dwX`ri=}cX97ezH1+dAsZcp68N4lsd!Z0da(d$acCvKYh0rvjGJ zfkKYRmtcxma7%mj$L9<8?ky-hOF$Av3`#sSoXpCNA3JYK?zac_W$iUlm1FPTtc<5O zEF~v`sfv$^!GG!L=?}D7fc-M=v6cH?pTKFuAE#Iv=%Yt!1z9@Uno7?e+Fy`+4)fu|in6LQ^NF|K zIgpUDoBi9DwQt{k%Gw;>#|he-cI4gJ0yY!q3Vi_N5)4#Zcayoi7;4;V4898UhaViL z0?npP5lMUZrclyke;&`dgE#$a(u6jHUAz>+1fT zUzoD#xpm6Ae{9^kJL|wco))=Bat)_o(^GFZus!rJLd8a zj+{27glrT+W#hLId((1rx!d+1$UVY?;>eM_;Bj^q!HA7zO4;}JwS0u9#nM{WTK!?w z#q5Kjo1WY7+;bZ@Y>JLGlD{uBjYo3xkK`UXlI=C#0jQ5^abU!jkE$D*dO!QLxw)d@ zY*F~jo1WXaN!ir@;^yexp)cpYe&ncfRLQ%;Gva7|mcN~ycFYxvUGHBRyQ{U%T;KB9 zfB$!PbK{3+i?TL}@TM0-|G0U3L{j#V+}HDu=HerKfM3$Cd3N1YyjU5di z-}vJ5|L(1Cy7uvz*ockmHf;`#{$t3dKZeHd%RR#5IPd7|h~}+z5q+=s+V_5j`wqNb zPe)VTCtu#W^*3&ij;6v07`Zo5O={CiFYQj)2a#od0kgfEM-NW$E`h1J(QDT`+Q(Xb zZRz=>?(;7`|NPdcc)7b%(06P2rk6Lp_~KS$N>1)x=BONfz;iTvh7*J01e1KJu>?J( z_Y+G`UxUT+w=ci=0-uqkt32u1wdS^Hwd)~!iNIr(Wh`FT9R`6|keU211zhvT`0 zfUO`sa2sHmR#uk3ee^)~{{81Ev0BrBBcZYWjf_`9BjXa1lT(tD$L>P@YGMBChw|PiEHMk)?)_^mjalI@zZ@BzK&1MIvJmDX)FKn_=xo|#g(FCujl3*K3HgOsgt~(`}H;F_n+OTUvznhfOJIg)NOTv-^z=2je$wWd2Dh zYRV^wrzNMvB}7IVO$T4ynSd$EuST)dNR5D8sQB%}xm4MR--`>$(DI-mWoP973*RHE zf0~?x1Hl*{9c@g=-k-7zK@4D7cg#vLqsuR5?akeroP6M76VRoRqf)KJx+N)%b^9eb zJ|UXg4eY}1=sj`&Z^jfl{}Huok!z~2E-j!uMEdT7xy49=7djT5{Bk7I{e^Xo42|3o zz9Tv^CepZKx+ijf!|KM7a;>qJXV&RcuVx&~h%DwVX=ouOqpl%O%0wik$gsc0$ApFN z2n&yn-Vw3qm5JW&lBp>NrdE6aUsqSwR9w0Uom^J>rpuRFYGn&*FBRuxr6d?3!K8!X zJv$?Jky<|*5v@iK@AmZ!q=)`%8mOqgrb4hGB|jCP{&S&eW9Y%+3pJF@xKdG7T$G?B zjD+rH0{!>}cI^m{+!e=S4FBOVp9ORP<97X*0H0X!`pOHJ^GxC4X{JLL&Yy=UgAxuU zuSLdf8#`}G+_$@TMN+yTdRKUOW}-S7caZJbLgAM#+^Ok>TMx!y~tE3k`jGlNaui+A8rV35cn#9^&iLlA_d& z>mxQ~yj6Ja!h5A9S1z4Bnn&S?9lPS@Q}E}MMYkU6}f9y47F=wcX5Kk!{U!l z5k#E8Yv`j3d2lurwWUR;3n1dX@b=la&la6IwU;t8t5L`QF1y=>K!8|fizccd{sE;cqT zaW}W2F@DeEj$}qjKA5$(TdI@8T`0Hy4{PoH>6i+PHr8$`vbDu3EAB#jStX8AtiP zB%X6A@p19-(QXcQz>(B?2SzM^_d-c&Lswf_+1ZjqIUColUb$+uvbz7NH7{;izb-B@ zK1oSZ67KMfNJ@$HvNdSOT&cHf_$y=An2U=pm3Otb*Opy5b0{a0A_1#buYPL%Gix?% zf+IaHF(oM>L7p)~i|lL-W7sA8hR>0#DlaLnX{VxLUD<`gQwO$edUExuHS5=hJhN=W zhUZz#ByP032~u+~*^}Z91o%j66X2tzuIfrv$>pXS*V`K|m0rDkaOV}jxAI+P;RdNHHEn|bdo?AaRzLmp zmX~+E!eD94_HF__P!ke;i4xj1jJB{=U)R^Q7GoG(?`;#$+jjI_yK(ip)lWUO_7B_l z#Dz0QCFudr(P;m142mO963m9ReN_Z`)lyPlZ{hVGzgKCmOY%T_)a{M4qkYePf# zq=fBBN#Fs_S5fpq#2*q+!Vf9YW&V0-tmxvQJ z%{<)Q0X%s_isS@o5H%*8+>r(`^F1;8%uMW6tnWS z-C3=RWvkSxi`7!r)fw0N$2zTjP*AK?9`5f1c6R@AXaC(Wzi@Nj=j7azbHDTZzAw=1 zD1x``+$>vrEJPHcX2KmVurR1ukr!o!Jc{FBqby4dCrK8gmc_#uFXUvS@HagsFNA_BJvybvM4c(V97EmBs|39FG`+qp-mF(hjeQr9VONCWN#n=#@YJIbv@9z~cP^JHWQ6E|j65F5i2$OlJ}o6LMXz5`-wlG* zTp=;zGE3yzoSSR@gIvYKiX|e<>LnQkQuV9D_ zXP#ymcAkqDaH|I*0muY80)!0XyY8v@sm(%BSsr%>?5H#cf*#@|ZjR#6`dg5uC@G3j ziWmq5YNw%p^mp*GFwo&0?xuWXG+1)r#TNcqU~0s-lo6?giAIZ4oRXmwFv5ZY@b@kB zZO}&|h(yKXp8>S#5XO9cEJ=2btuTN=B(v!O~BH5|f6aw1pI*>Je5EO1O;N zpce%?{f-JNd%R1F@Vq+Bbsuvoo&P{%v7GE+L2%6@npyr zkjcJeI3?BtQOhT2HJl`9(nyZDo*nYt3qUH&rz{ayMj2krp2#u7pXW=izNV7 z&oEdsVKSi>)a>}kL|YvMXyJBGyW8n1Vg=-xP=MMigX1g8AZ$V=jERhiBt#}cZFO#+ zKeD&4rKQ@JlSu^NFbjs`Q(C%>8yz=1DL+18=`a_$j*2?kJ&wkU$DpJ(84mS&1`Z7j9PA?!Mbc?3C}=v; zV{MBIY>ApK8$q@OnqoK<^M%9vj~qG#8D6-f0+oEt%M>q5SW5A$K=Ry<7T*DHvT>`1 zLQ-;edMd^Qsuokprs7`?{-t--hIA3u5^3R@dS!NMDp5$$>6Wg!=gb+eYj+Y1M_vGVm{9k7R+z2o@tx6f8>i>K$s?DS>n5W32% zcK`Mb?5vyY%aDFjNHQ$VHl-W%=7LkF-hkTktl0?vWZbNfESYH2^pfP_!-VIB2>D?d zcFn#K^u(R5VfSl`!7C9ga8q!43X0d^*Fdi)iSJ2wG!3qL6niHM#6C+?fDZXgQXf*6>E*?uY#~OwE)l@b;Or5Y>$)5R;QMf7PJ2c>R8F zh28b!b8nu%Z~?puLEsqfiiYFFw7`z0?HkwGYoB?MkUbzagW)RfL$y@=XsxTZzPQTk zf0d}bAx1#!IYG@QS-jabRo;5Ly>Z=a43?U@S~NCRf`Hf+EGH1XVl1227i`O6U)8(EAQFIc~!+~+&8f8g`WS1x~W z9)dS!l;y_Nsimbh67exKZ$?goccmEpyfxnd&yp+)>!o612He@fvY-eaeg2~_{AuTk zLX#Tn@D*4#<dsAfX%Ifg zXJD>P!gH=RDZ|s>|H`W+_s7$#)EO{PnyQl$S2R6&?8M2FPOBN|Cpl4P%t$urB*V(1 zM~|JPPtGpU^DM{Ca)}Axl}+oC@_UKn3q&Nk5?P-8hLebAOI_39#o#mq3+xp9AA+CK zd-&K3FObAJNos`By6I%uU_5;E7#`B#?;>4h)$C0j{Bs)f1`a8H=a%Q* zWhtqAlcSr2MhmYo(< zdM?vdQ_7T1l{J9&fXDM;Og{xntFG$!)XJKg%3^C-p!>z4x8A~eFvpPrMm3t029L9@ zXqC16u|4FF8n?_st`GTyd|!E4`Mvoil{L>1Z5+g57sRq0uM$%$GfGP;@3mTMqfh*i z5F>_$@vHR}uhN^#S6i(G#jCBhx;_X(!0jAH`zD2ilGcWXyvo*1Wovhy#1rux!WHZd zj@4wXZD?(+ti7+T>w$ekxI1AiYcYy9m6WwQ%4?jRFAl!+`tUHUTfrLXtE-=i_FTO5#icig@VLz&$2c$FefK>i;yvgD488=$h+=r2g=x7N zgQru1EjZc_!)vSCB`TSM%lnpg{Qo|;-rv?n$rN2TUk{ysnVQKb{sZDyu7xW-^?kmp z-s3@_o|<*l)ngMxF2AdGHGsnIZ=rP5ce*;9fRdv0)U*wkIM*VVQv7HvL@sfnitTF* z)ZSYOnT?U29-J+a52m%`gbN!+QjCLe_d znv>dMVDKXpTUP9Vrd7+SjS=vAncjI47Ed{CYz#H+g1D9Lo9pev@7UB*+1D3}bfC&U zC|4&?6P7f~^2px(A;JlUaRU5qO~5bpx;>{)g`j!87&KLIXU_Ad&zufNut#KKB6X`^ z52(YTCY%T>V%Xtf2SgBmJ%M)u^0F<0T&FJr{}}TEDCvIxc7JoQXFvLnT4{WqqSWv90DFJ| z;N^vci!D>1E2q@wHUUmxGvEdu0JZ`T0uKS(fbBp42m&3zW5DA;7l885^#V@=sOQ{1 z-~fR7&K&`c11|%=2mS!O4h#Z+28Mxmff3*%U<~*K_zd_0_y=$WxDHGJQ@}JZi@s2R z65xRZAQ6xOBVYzBz%n2c$OTpbMZg+h9Z(9C1DgORuo-Xz4**+%2Z4uxZNPRQ00e;! l;4$EFpo@%WIFb6{N5TDPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXD* z3?wHkx4}~Y03ZNKL_t(|+Kj!|uVh)4-uK)4*zgh8r_b_L?P|KGyJvd5g~S0VP!It* zVn7IzIL`v~-v5jsXdr+hCZN9bEx4yNu`t$$!zqBX?)?%?(V*pS}VQfvAtufY6l{s}?;&}mK)WuqZwH8xX zyz0xC3Z)e1r%(Cg|KmR07=GcsE^oa427~bd3WetfcwRt}uknJIG<983R|TFQGMZeYDl>wxLm2faiM|G|U`-85QCB%}XGB%z?sgW;H}%=y7j9`f*M$v3_-=Iu9cvv>IB=DNm>dtDb) zWzJ{!KjDA+=MOOko}7ZI!Sf*Sp{}7DLz06vP?TWZxLYgVD9{R`0OAO~`X&szuu9;= zhY*MG4}SkHUw&&$QKZb~37tq$6gjg+j`Bv>ddoE71kJ(uPE|F21sj+n*gPdT>?~9PE{7vb;VCU zIwQ@Ys^QbeH8*c$*y#(Dl8x&7A$47`Se%2kDdK!Rf2+U zcjN}Oa0|m?OijNRb8v7(;QQ33CQX-=WsbELtv%|xL@7lW#T5CP#q5|Mh-6ahlI7xp zB2Q#umBRCUJU^hW3Y7NnynrWF^5NYsjHISV3(-VCrjtlRmuH(AMo_WjDy_^ zqRxQ{wx1{Si)*3FS7yRfa5BS$V$a#7Ky^a8sF*1gxmZ6v} zonf%N`pe3)&rA6}zJN4`htFWTlpufbY8KSX;zWsy=ADW2z}wa;pCinW%wJ0yySSW^>3 zJ(Tv)dJFWNg;3fPki$~sOXAK5tpkdDi7_Qw`*_xn=S$+w1g$-+Rpi-j2Xk0OPKwWH(~1AzjZX@-=l`Tm?mIFm*+;p5X^E zTI&s%H(#Cp9>!E?_bk5LfZc$C)*7q5E2v$pQ>vfsmj9L0~-&o8BAl0^I`-Pi+si9r98xH zIU|~#Gub&5K&dN=BEb&=g22b~e5fG^Lb7yCr>n`bC4nD_9dn;!>Wab|@t`WPw$>V~ zLj-FKRaLr)tyrWNSYybuHOs|0RatU*@q(ipZ%|hy$1fi9{AA8zW$?X(;@ps=hUpTX zo|e3pt=Zc@rPtpfO>;i|^iw*q;!pqTgik)NSf{e-7wavr38;*0V7{=#Uj1dK)0!x-oX_F(5{5m?`Ap{Pc_Lm8z>hyM81s-M`;6cFm3?mCd7ahb zl(Wm6JYDk9!<_TE#TdEoLhK1i=KiiAOW}hDhB$zu~1#-ViK@dP* z8GiU-g6|!ZrX@v@@%CG95O;@US;=&^AP!5`>oxseAFW|AI|T)u&WO>@b=e@MB3VtT z%9Oe)h`VF777yU^;yIU>Gtyk~^w}wIy?(%aK4(1MWiaTnw||}f=zu65pp^$o%lc7z zr&=bt~~!+RI};`_Jx+WX(c7=!2e#J#b2X@Idc zRh3~)y)oPkSjj%Cu%^cI#4ww>q{tJJ^$cSwqNqz4^#laBo*QJ3DrFqt%7mxu8P*z! zeyW19$ngC@Fvdbv=B!q;W~EY<1>>C?1YvgrXedS8-6M=A_+bzAFaP)-Tk&@EE6sG8 z%vsKk$@4X3k>h#tT8ky{BNmHuk|eQ~+)ihG#4 zVm>?N{9?v%5EI8;@;oKa)~r()^n4b}jNRQ4-R=O-3$D1i#>k>B%X|Y?+m=W`*^nel zilU$>3f7s&YF(q0VLa^c{M=9$nS@0~yoLE1KKUHZX97532*3G@0Z|llc3E+DnNl0Y zqZgK1A{83^-uB*=0^f6++qB_d18Cde*1X?Z(AtHQMgRdM#MBBx-vuE`LdD8?bVVhv zSAeJG_uUw79LW1?_xY!n5QR8vEFjnK2-p^tT)%eU>*@BMUiJ=^3uAqchNZyU{=1fc zcOv<|eh~3%-#Xym{b<3*59Yl8w#Om~Ioh>+eqJGXZD&bPnDaD0e01)d+! z?d<@tTAcC8$A3#4Y4#6}&^n;5bJF#U$B*tY8tvfw9#PaqDUaS@2km*R=BMQO8qbT+ zS~=RIBG1?4d4?av?CsyAKiu6!9#xs5J)hFQZCWpjfh%ps;zI0>llV=%mcR&Wy@fhs|sDJs#e`sZMcwd04s>*rs|s}=phkh&^aCkxIlQa<`DBh6)@Y7Jj|JLa7?4;c@84uHfPn@!JHua|VYz0JdV zp6|ji-?@l(!}F|`Gpx1D=L;5V%Y0?IeZ9}S@4ib_6{PDG$0w(BJ064KguoBExH#tg zGQ(3P+7B5HIt==K;%*;L`&U4zt}DtSd&zyZtz`k$>m_AbP*o+LKB`DE*?_(WmkU`q z%_a{5@o+x)Og2E{^?2UZjk>*YYv)NB+X9wSa?MU8Kv30R@b0ew);4HuIj=I04hVeR z0*_L1PYodEh5RlG+-H`;hZQB1Weaj3Ko&>x?_pQwyC~t?U%$m@p!oRS6aLlTIJ&e6 zS?yIXv3b70zY55nixO%hUYW7-d4VrrxLC`$hJoDcXaM5@jQet(UI#p_d3tL3{F&Vt zgKK;8yJ1g&dX>t*s~Xm+Tr&#f=Sd2k81^SJK3{qxVmyrL4fc8RBIAQko^v`i9E{=3 z+X09BL&{=FURXM@Pf=9#dL4?QAc~^R`mRkaYaRisX02seLS5G+X-QSV!NG|2YRxJs z>2^9~r6Nf(K7LqHl+LiYbrc3y=d%~XSKr;^`q7v?OIWRzELSPdPAcL!;Suh&)@qG_t3`vsUX^r+g ziXs=TE()>MQdQNK6Ce>?mX%yCG{64qzszW~%V_sC-u&7>B8(?^euUou$Itqz>zegy zjz!Vy4J6#FD-?>VE{WqFN_kw)=DawWa(rHLHWl8atXeK33K7CwRaZj4B2T&hXi2{d z-7YR}R+~Qq9c|o0tu)av+%F&C!AfDBpEzA zlL_$soH)$6eYD`6HxBT8O{dexa|EG&MVt;$mN{vf;(0=?1jAiXUr*xj4ryY1X;0gmtJfykYN0!U?DwVltK&`A`u{IbZ|8Bc$(?T8z&+m7lLu0jwW=oHOX=czVv`6Pf=khoXSt1-3ZB3q-B z;&N_@95|Vx^;ZOeTU-J+C;5WJR&YJ{5AFTtF^6(pA*j#Okgi}f}8Xqz}f6idEL!PHtYl!0> z#@2*k?7}t0c-ZCSY{m04*_=fs)+y@9#;qzipIP#}*zjd_UGn(Zlr7r7g<^ePoLqA2)-^iaA=X-F`2va}+qf%LRa2G)FHYB#Wlb1ZdL4zaO*Y3;IWoK< z$xoJYFQ=D|Fn69xHkEQWm z6fJ00wJhxBwZ1R+=X>qF+&X~$ofatWJr?h=EZZ=%S%=2Rf`9E+kFS5@R~heIy8?o} z{to~BAO04fKYYM)wPw0heEuxM_X0lnbWT|r?%o`LtvEeTS*7mTYp7lL=yE~$-c|@& zUk!m94lK=DP;15uz?3cocGsM*VAPW}(TO1NAnd`Rf#Y)-+pLs%D@w_-7Vdg=EnM7& zcdNu$HVFf*;N%kaCx(Lwj0Xy1Aq*^KZRy4VMOjc39-ilIJS?p}I-L&l<%*N@f-r#d zY0dQmkMY1KD>T-YplZTE)^YP)6!Kh3iN{;jGM^Wh2}!ah4rSh(`ETxZ(1qt`;zb(c zjIU}9i0^?x#=QZ>D1xfCvWB%nyTw-5HOADGMM)U64p9&WWO>Otsl_`E6jfE@yHG)7p#c0&$^&2zF+A>`#)~O}%#WkO=pePkZS(B_+gi*wLy=1joG3;69i;~5<;Mo~m z--lu-+cl13=OU*(JENLA)kRldpeee}_%^!g)i-MWeA`P{$%5#Rgkr+oC;lEq5+&n7%o zTM36I6!N^QJRe)*SvxPI0ak0P4fj9oW&Yu9<^WhLKn zB;Tt9%F2@F1ywEY*V+;WHNK}QN<$cE%F^A z{=|7%rDCzR8-h144IkXQWOuY6ihZ&)rzkB^C<9v6&dT{R@h9hNl5~yI9(hqQTgo8i zr3_B!!{M%2vBGgZO_*bx2hfC3WvzIA-iAp@-frHqg7s=f-02IcSeHamk1*+yt#|HWVV{cY|7R<@xAuv4N6(_MQMVuP*=`t+5)s~ zviv3W!j<={t*}l@BB!;Kj?fMR*c&^!gd3+pSKj0M;$@&*=vl+iftK$nZXH?HDf~yj z`-}YMuYUvI4^c`}mIChm;XY7rI8n)rl^f6sqaL0gKx)yRPY`za+WTL_^FzY0i_#wN zfBlzu{k7M4_~27MxIZWKQvTOJT~O8Sy){|Lz?XY&$o?kmwN^G`Cx+Epyrj)|o2$T{ z74odUCt&p9L%9D$uCYpBxt7h_cxq}ZJU3gMVUvB$OZi-D1q9EgGJoTNcrNSIa8a_|}tKnTMw|AG01{(A%o~|h>aSE)3 zPAmh}&>>pM{78@@#x2QUv68#+!vVeF5n(jE!j<^i^BtLOUHDZ4BAiRsGmcNrNz;Pc zHw<~6QWW{-&1G4T=c#i84bP94410v@amlc-z3X-haSh2Edvp4eP&oM#faFcB+Y+$`xYzt!iPU%%_5EaG{Gx=$4MH=@!F0M`{>P*W8mBWTjx7K`sk zA`P$x&kLNaMueH;-CMjrxyJk7FeK|K%hjLr(|arOLcAQ$2r#6D+~d(+%UK=mw43W- z2Y&PkJb1=N%*xi7@Z`puZR={il zA3cPdhw}H+%YqLcJmcT~q+ovnzxoS?qOeqzB`++)zGAty)NUOOdjdM1*Cs5QFg(dB zio$NzedV~%C&#VFRF-h(NX9EKTJLh5w%!v;Xo{k8A)pZtTdCHYt(|10F?`LJ)^gqR znXHw@!#};0knzruy!V3#?fc)pBf{XK6enQ15YBhHfXBzr_|C7TctPiCvPeL~+hpuS zrCnj_n)!Ur$$3gyRGd#wxP7ScJhjO{tkaq_t4MPhlhwBw?Z72E>tXJAk!SO zb6Lk{9)U}vN^ zp=gsOEE@38t(*Qb-gvrQ@Eg#w!q?P>pZiO_0>CyvrrJ%`jB6ajwLz z3|Y3s4ggI^uZ&o*xl}J^tvA{weADl7I2%|0fS0U-IL76~@T?iSdMk zYvL&m-6o3yx%V%>p_s2N%e8n4p63XD-IDrg{>3r0R$h1SQ9DO@(GvHKM;G~G2y*B7 zKheeEveNpE%F8NmgVQGU~Mz{;xhWM zMZ`ZpHKdtXhA57mmZRJ(?D@)UtV$<_(D%Sr9PEwg_j{led6tl*9``?AFz9R6X^pWi z``};AHdR$CG+ZSz@VOiKWdb+$;j^dWWexlA)@`_T6mvN*Nb?d;!?RQIB8-dWcSbUJ zc_|aI9hP}Y2=Vio0Gf70Ze7FE(;DqBxqa)9%B*?tOkP)%GRfBQU}b%k5bngzORB#} zh;M62YOMT~%d6tr>* z-;?(@+|IY&KjPi@zQXOh?@<+NlJzB?A7C+P2v%MpnF%qO^<$vfd7Nodm)cFKU&_Tm^v>vc6;l8a}8orV80~Rn>+zAYpuMo?P2wzO~Bfzr)GiG0qcj&F0)jyRI*FV^CHHd2YAlq7|xUu`HuU!s(Qgaq?=Xy*x4yX;>e_V1tYc)iRrL$~)3m|3XNOuRA zjX1K&cr~tlL#STNa?Z{!IKNCepUcFiE`1#aaQj-jkQ>Wwx3p8%eo+Hu+_f9vGF#$L zrM{?3GA{v`=gC;~I}Z4eMPl7X4MTb6ZX_GX7y%xTvAvwL5%M;IQtLKW6bg8Sfh?@| z-iY|E-~3hf_pcLo$8>r-q93YD6dLVn@2ndH?xo^DH(?>hlkH)bFWi*rqd~0 z--EBet%yU>Q|(V0Zca8~69zYOoXuRQ)}YpoE8DK!G%h@?Oj|lTi(0oQ?C_OEDwT4@5Bss%go0wRq zZ3)=_+43i|mE3f{+j?!U-+)gZ$!Dyb2=)4&40zzfy+;{) z6Mco$E{c|T&Wcv8ZM{ZsB8yug09My9bzx`Z)ak~^qA^C?>AkUJFkhSrXbk(Zu&g69 zP1%BreaWNR&h%}|0A4Qb+J0^0O*MZT&rF~aNU6gR=nryg7FWT|MjcHAr?frsQamzRr zrAu@;4?pl_j2lTyR>+!Z*12iNU*bO%VhEd*g~UHyrJSJUuB%GD{~G5ZN8W>wU#CQ4D&DFt8|Psg1qj zjW%R_RXIc8%e~&Y2A@2VJ=d@ZN{i60*=Li1cxSVv@PA1LbzLz#`;h){f0M-Vo2qrS zDd=qVSkqa`>7{r?mkWp^(L5EUfK*<>Iun8>44uU=xT<$enyv}!ip4UeC=E9bV@zG6 zRZZ@~kSNeRJ2iA-nUscnZ`{Iz35}$zU~;+VB&Tp-kS{R2Iv7ueB2zg<|oR30!W){=O#*T{(W^NhSlF<+6Ai z%M=B2t&PS>gJ)YpotLbz*%E5LOr&oERg=kVvWpGxFzAUWHO$Zf%m^S=v zJdAEE0M~@94f%XJ71up<#Jo~s^$vI7Ywzyx%isA8x`TZ@FWhwUs7k4}_xun)h&Nu4 z)^GH!JZXH(13j%=p+N{m%j2*`nWU5)56bh@<4$hFeE<*okC z+ReHR_45*fs`ZSo?ZVSjNo-(UQb-90W)bc+4&8GUK;9-$y0PrBb?U%L!@#ZiAZQXJ za^KsDokkYYar?B%0^UAS+`2KLu4?voDw4FM*NvDAHH($ua$YbVz-u=GcE%lgy&+&( zt(F*5F`efmX}$3vqfoO<49cw~>xlR`g12vr&g=D?icVzt>3wH7SMpq+K5<-g;jpBJ zyj0B2?s0JAeZqJmj+CiOsxrq5B3XQ{;Ba>NoDV*JBrcnC-EJMqgo*DB<`yRm>zlY!hH!(^m*@Dx6KVo988+!|TL z%E=9u>z1r8Yw@0*oLmj{HblGcNL-{NL0&ZJ-mNXGT1}AIDvsa&eUsVrwLE_m%0kQ> z7&WQ&`BEm=S}=Wa(GPZ7Z!8R?%fY6jgK3{7$=DbR-*btLs`UW=tAF@acE(+<-~N&- zkqRh_^+tzL*9E4o&|W}Qqy$lK(_+MI#Vjq5c^f2dK*tz^RRKTxq~iIR1CrT&{$XkP z#c%)4Rl)vNCxHg6nhpV=cdM5OisEwL2DmB9N=p&Ks%CM0aj_! z^_1`b=sth-{hX|5i%`qD%@An!;KRP=a&G9viol24H^$OGC-7Lz&(YejP7H6}9g!q! zw65`##q)iNqUPE`%$=JdVc5YK%hTs)9PEvFak|3ToY_+G>HWv7QvtT|7#;YCl!meJY-qHJGa626@jmbW1rR9V2q)vYRA`TY8%jvOUl}!6;!q*Dk<6+zZ(c} zH7Q^1eqK4grwQq*swKKhM|NgK%TqO^>UJ57dbwuC%Hq7S@4P}S3vIfTNnEF5jhd`b z^VY@MbwVfvn0H4q`Tef5Qbp_8`MOOv`+ocPCT#iYd)ImI%ikc3I-7Pu#)W~(xsXkz zzx+&X+N-p^lI)doCZQW#+YqHTt&5&KJ)x=$mD^B@&ujkqpWUaZBEJ3YZxKd)cWs06 z)EDxhGTtJ1J~(=v-~C;mhtL0l$0rM+2F%rvIxoZn*%`^$oX;&`AZvKGgh5~KLpx*9 ziDYa~E?SSp*KqxsZ1#(}%*m_jIbQ`{jmNV}+WYsN5xRZErbEUuk?S@I4^Ov*cNj|; zm*(Pa-#qjf_5|d>@aTo5*L5oYy4755(-GQ*xLEl7S;4Ts;GNfZKxwA4C9?(WjAKTl z0h1k%>E$I++;z#bRLb&{rm8Jxmo=+YGJTixno+-GXWSu43l^)2%6;bHen1?BvV zBkjBcMK|`DFA7dvZP@cO!|_E<;wCi?UHOK~!W3n@nV0L9BWOG=>$T*1L(G;{tJ~3z zpxrJRF~;et>`O7cZAssLNAx}odA>}prg^uC;D*d?3YVu#r}lO=fH+;%pxbVmPAJdX z6bUzmr{Tul|Iz`!{ae3E-03?G%52(uV9lm|h;_S9{?o1@ow@>6U#!EF%0Pv7JXpz{ z+t&$$pKQh$3!gkRT>i74a{Xw`;kDazx+9l?RIe1EDU=JV6xVOQ!5{qoCClaaczkTg z@^&1Q5|B|!LcfOZN?q-ta@nmWgW8m{G?c(PZRf5&b3A7tz@WI=ErXvSGkFz3T{%5m zBbZ*Njx)6`(_BNfMSRC$%YPZ$@R=T9Sgs}8A9#>BF0Coo3H+98t)0#+E5R1<>7$Ip zohhE@oe@fyf|GF1d_l|+M^#^27?aPl=OQM zLEupoHS44%Nh>^El4S*fui2XftkyM8Ppqr+lzB>XG5*s9ymQy%aqH$0lgWfQ z3S3W}8fE4@J*k;4Wd*!>OEVrQJgqhWEL}otl(L*nC2iXjbMB0UM89>|s-3rG2zHD3 zZbWm95?m>_plVqhdC@NPZJui5M7>n(r`!S@^`%~~Awd@os7@|iO8ymH8MZZ64ZqQG z;zHk*YBZr=(~jllp=^%*3B323W`7L3BL#STJ0#=+sCG~LtQD-~$c zd{VqOr9G}49`MFZ#regQqO3MqzlLLpBcTfNs`ZWW$PQFIwZ-$Y!#5l32_UH|-;{{#3 z|M7qLZ@#-;zS!^$)>?YK0iQj1%!{*1IzqY>Xg6v#EKNFoGzhtN?Fg)4xwzzFy2A4m zoleh{FKCK9!5G8EG2Tx_f&t{ez2c8rrI}>S)bX+W5p>!C)!9=q&5^c_BPb6h~ za?x^3wn-z`ZApyQ!Z-NNyD4h{l%{;eysFL1OMRZ~7Dp91fY}`hA>4^1)Lg7u0b(Np z#C}nm)r9HR$uovM==a*+c)|M!xxp5fr=;6nlT-Z%m5Cu;E zvn&WW=k}eqHf@Pt-tI4d21+v;AMlG`yF*}~69*~F1eBGr8FaT~3sykB8@GI5lVxo( zcv;?-{cI;pHuZ^H4F_K(U-`Sj!)>u;!-qE4xso+>9(Y5bH_G&GBwkYB)l5bn9l|IATXS;!g2jAJw>QG~40Tn53W%bBJkJQD2+#9aC6+X+ z7!F5_#{+yV(q64ftgRRhrM2vAzUE*2+a<^6hOfL8Fzj2VOYu+!T|>VEmrJo6^QA#4 zOW-Q9iN7s!ty>5rWaKi1^ z-e>>l4T7y~Uke6odd%n9-1Toan|i=7>N^lp&I4*x@Aehf(XHoZt?M&xdGPQv?tS)* z*|JsHH<$6fnqkjyffq7*#I&*NJ3Y z6fPUL)#$KpTGbS7^}(we4!%mv`*V3#>S|Yw=GqN7HNW?qKs0c=xTYw*(d`*48OH}t z4F?m;I)h%vCo9aR7ZysM`^JHjz&JH~<=Q@-PGw&=S;?Y=H*P5QcZYPlJ;zx|6@zp# z@yPO$%UMA`wsd=4;yA{0()ZdJ0$%`YI$vSYq)F!ZQqk+JQ_GJ($yp|CA@!i^T2MLA z4*in5H)8gV-e9!z8r}XOp5MXyFaG|W?=}thw->|pea&ooLRHn9`k}xzNUL3UgfM_% z*D&k{T+RzZKd0Z3Shm~gqO~SVSD3nFckh71YqvN%Ul90)IFtn!ce?m~$Y-C=IG^TZ zg{2!N4EmxgFjYpL7i76bYs=Zil>h55&w2RFa=Cy}-y;fYrVH7q2NUo-MI0*1%7s>m zv^e%WO(&A;yf_z)Ndrnv*jKs^nQ1O6c!gUePK?@we|hmmRrE z>LsvJn~)8Kw5)bsQLhtHBrmv_WfYanQ*#e8CWbsY;r5-k@ci%kNP{ysMJ+Yx%moR zH;qA0?xEKaPdo@(Ky1iz?etm`r$g*^px;&OjKKG#F3%zvxTYcDWGL-|n)PXF;Xd=? zYNv@bhhA5+zZ25yb^t{j_XxsJI!IInS+c;>(wQ|1J%T{y)bpCZBUwi*Wmyphnz|M$ zVVz|B^wWYz$8DuXL+zGMk2&hY;hyIDe$3wC8}x=p40qoo?(XAPRdyw-(+utI{taHc z{VDe!pKd0!u>>zJWN@$V!;Qm;vdrjr6^oUGV%8Wek}A!!l(-|EM8h!VJHPrne18A0 zdGhpx(J&&8Vis$|=|#@&SgeDoD=sfD@I5)DW-#dT_}P-#@|>UEuX%pzD&iwJyDWL< zj?3)C4FPU3#xO z&;K9F3i+PvhTziSO*@ih(w5p-=c?yL+j@A=ZNp5ZBuzc+i;!+_1VJDtll;cF28@PM zXuP{Sp)69q|KleFUdB49sA{|6gznyq*_lj;J3ab?3H{+d-Tn?i&_R3tX7dYiE^-m+ zXJ1oS1x22)UQMN8VVO~t1-*f$zsx&L3$1&Zg6#oYo{!LT|9oFMsEENzy;# zqfgH^oX+`7LjFb4N>3UcS|g?nJTV}rmm;lsIm4?|duETdKR;qMMyCOeMp9Ecb$1xF zB5L1n*GlubowxzX%j!^O;Qsz{M7UJ&_aSuF1f#C)Z!6 zZPIC-8b-s6$=GbX=%(9mo~1xduj5hGmgziYwk$Y07~*T6x^|5>12HgXmnlVMi2_BI z=Omfoty`KmZ~L52D;^)4mM3%uJS)KBad`br{Gh|m(fh>ReaRBGCH{@Rh0SR==QG88 z!}wwD(#sA{-eR9ruZ==VbwizQ_xptD*hEE9NsR&Ppc8jG_x(F}U9H!+)JKvq~L z0~il|;!c7uJhEXQj&`+ZYNCKR)J#S(lbt&oE0)aTx154S3wH1YbC5G^=TbdyB3H*XyN16tV`fVl1 znwFejCGaQT%klIX;{n{bR?+JXnN81FET(9s@O{m4U16+czBDY?Gw$9TkYy=h7~*># zVHo3k>1G}Dx&iB~VmR~(gMdL#VQtCtbHi-Wbe?c+ojZZ_rQ3UhFdn;2sqp^W|N1-M zweEx%)o=|;QI|P?^TYcrmieYbX4Cd~G8FAab5KE6NGG{w@+YGXKmKIJI;j{BJg(n* zhvDduFzQg18OP7=(+Ml$C?p6&!oV^fXr7*wOcym-RR%W7a?4`e+UeX-a9D1c}}+?!FcQrnQzId~A4rX1V`p#cYxCfB(O!aB{Bly=e%zed^41XUm_ZUViy2 zbY4=^0(rWCRVE8C+_K0~c$K?o2>r@P*5+V0;P#Cj_74uoGdW`~3`1_*`6}0LeU&ik zI|4MkQcl$zzt-yydHv1z>Gk^b2D|hIyHbax*tqv>by2WR^qD17)~gG&R%GeiwWqEz zbxCs+oc28S4&S2NKiFumUR+aEB}dn8W9x#t%n9Q@T6wa8TxSQ>l5m@2wY1Xohx>HGlDe4knllTk`sZu^vuQ28)p${B+0YyCLa2dN+5%Bi zyx)9I;0u5ax-c2F@|I>@FIG)=4#hA1!VdjjmwtahUFDpdmz(w2aB+Dd?+vypHL^n5 zj)#6l9Lfn*ok$Y|-e!OJo+b|6F=rNPw2u#hB)%*!~w?CWO>ah zsVQquxGpCdX^O;sAKrTX8sGl4|9qpxQ(ECShZ{BrQW_)t4~V3`7mK&>>`Vyl@v!Xz zFkMKtEA&OrfvxCtM(pn2WVM{KyEEd^lVj@YQ=%{+&lAc@Gn<`Ch-MA_;Q>{dv09#U z(vFl;lA|D z(qS748j*M#Q%RD*9TIG9#boa$Po6xcHW@eeMMPRwEw=8C+sc4AlDV8XF=->{&5PDx zuM*ecpbx%NY&Y-cXY{LR3{>OQG=zTBB{cN6!bBrsUs1NN1KEE&BUxM98OkO^&GWWB z(4Z><+vz+bFEdU~Q{ld7YgG5fvaf#fsr>B22Vy{dw>O@<-uA;DC}oKv52cLLI2zZ~ zP*K$|Th=5g^wt?sD9tguosfRlFkR%V*Qo$iWtlF-(HRZ`(!64KWKqgvzBHgb-h1a3 z>FSs=pA&U<=nik-r|WY$ZeA(L`na^SRvy-6dXl^?pzTDGUF*cI2XrD2GVFWYxPHja zjx3^HZ-i0{-g@nT15Xyw zqZa}=zSovb+`87m_bo+P$pUgI+#4>tmgaJwvt`?hx*^Uj?&Ov2V&uQWo7(P&w4F(7 zG(Al-xTbwgmbdMUle`sgHmBV*fVDS@W2c2`7d~YcO)cei57(#x~iJWuI`*8rd@Fz5yFJP$h~gIY_RUMh5A1K;zIbOtzk_A?0Sp+C9_t!wzr3ElF;G6o2v z4t92L;bMA)vUFn@TSUy4G($^4?eW%T4~I8iL$;h@u(5~9`4i;X0zwF6d4<`MOy}?2 z-XMBGcL?7PaCPwnVcbU$#`x*aKf&omjk2tvjc7WcD5Qtm_sG1DO!9KP|JD#U_Humi zDRHlAMFM4JpXY^>J{a?|=y=_eyL}?QWL*r}Ao42Kvw%JOVz+HZSUAfBLl&{}O{fiU zdmp&5N0ftF8N^Y7jqw43Fu`bi)T9f0L1a5A8ofB;oUfCBZ15u?ge?`;BgV8OHV_cd zHa6XZQ8nhX6I`4=!qw#o=8GxvJVlc9kaQ^n?(*y_3eWW;L`e^xAE3x)P<25#T-1Y* z9&HTm!p2bAbe@1Kfu=B>rmn|)GBMXMT{-Qq4OON0)e6|5ET+dQ6gJT zQI#3|AhEi~nlL&c?0b@K86e2La%b-@zWdz)Jn!$3Bny1Ix*>pg)k^9(>!Cn4zMwhNFpCn8Z4J|rhd2p03ZNKL_t(FW($QlBD{Ol z2f|RI-}P-Uvp~1kN17}2yD73fz;I&=0C08j2)-Yo$fnS`g7;tjXWszbKq9~T9)y8` zu_u7f=muUKpW*vIK1ERzC+TYL%;#ncC)pWvfcvlA#b~sF-f$a1m>}s4F}Zk-`D}{k zXBD!X+StI;I5@gT8w8(hOQx5{xV*f?i_;}eFDk3{HaOUp*ct(cyB)+~)pT@Z^f0T6tyecYQo4Z8 z@rVlV?wI}`c&%L%k0Dv7qsmne!+7E35qqSF~5=?vgWN%x0O)a?LUaJR1fy+&nnaXFJH^H<3}>_n8o@!MX;(;Vw|y>49y<`C#PuF#~t7`j&ut zYv04(?gnC;$(eL|7z{?ZaX5nS)i|GI@a*fadR@Pi1w!43}gx9#UuP^v^#Ea3e&|MZW) zr|P2Vu(YCe^L%!Jzx(@N;qmj@VMso3c1ah&_vy3|0(k$84hB7egPZRljC(Lz;qu}s zw5s3-K9-9)cDA}G%bHF)ROk=J*57-M<#LJ_$Cr5Ult`+fm1mq!4MzPCFD?YMQq7nU zSfj76j!grcwzkiP#jtt8gJDny)C6+n`ds%}(bOuD3i2LaFH{p36;toZJ`z(~Vg)|6b ziOw%G0Em2z zUe8CCD`Yu24GT%d?5kto`Kdt?Da4V7jZq&``WOy}*xDMP$TQqL8dHtnLk9xBAH(ks z_K_|xh|p&Vhh>rC2S4};e)dt;csz65I=8a7_iZ4l51d})IM}Ok{PbgZJ^{6PI>Xba zPvCn3N#vm_3#7S0RU1_G1+u(ErxQbIiC=v@!PzC{m2D23Jxjj>{Q8TsA#w&j0kU6v z&BuJHuuRR$>BZW*#99QmMWE6W?XKg@2=QuhacJYjsv1~U&T5uT_IO+GOX~cLCBNO? zCoUFS4znc>0BmpiSS%}Sjr-W!yNM`CFy6j{AWUe4YjssjPc&Lvix#Z#o*;xxsusWb zb~hSXc7?}ZegLg01UF84sOu7*=Oa$~2*U(I5KBCax?~enSMV*s?gvp5_DRC_2vxa+ z=SPi?yBh~xH777$zQVIWG$-uAPJr!Eg(oLYSE!6jZMm9Tib3F^KiC8yP~=O@ua42} zZ@~{D1Yr-XZfp}<8)}8;+wWE)2ot>V&Udj$fgk?x$IS>=lmxh^Ir&%#K^|mV8#MCy zp0O6w0#!{im|OewaV}@B;}Z5zPpw#5vE9#_Pyg>sJYAarWGmmYEPMzTS2N`(Pe%1xWxGteb7bb91nLkEfc(D7MB+Wr)O6vii~dXAcO!}sY)rZF-mZL znbH?j0!d_WayCPn%@70zPmT#7j{<6`IhSzQr#ZV51Dit+og~D`MFp)5=BYtZ*-lBh z)igXRR%PY7D8>wa6Tz>Yj2zh4U^^Z51mnNY{_jGro_wAJ;)FPAN4sf)lDDnlmeSuDI zd*wT6#!@L^l(JnP-4vb|;9I}{U2KmB_&@)ze}#*w!ZKf7xIoY|P}=)!JOYZ!kkOpA zUK)>Fstn_qoX&l;L!BBw!x; zDvRSu^t&F0y&8dMnlzrr&ui@OEU>#h!o}qbzxZT^EcXxu9T-col3oDM4-iB>c>l$J z{Py?CB3)g*`T-WRGd%ce*+drcXmzwpvX;7b+AASFymm8z(Hd!1LO?gJkUdNF44a_~qv{j?Z;x^Jtm!H7Uz>)70+}KGpW33hYKE@PUnCjBdAw zq|?P`&cql9>Aw_j1kff>Hg+m5x!`4M7tt`l={u-#dG;9d=^1is!bYP@ z49~u1Z?KKtV5cco4aOA2h?Al9|5CQlD4S~I!x#n63*h^a9r<1!`y?~qSJ>~S8QF}k zF}r$>;};Jxo9B%eSXt47J(*F5!dtF>2Uw;h_O=s*VTigeP?Z_9A_7sA^jCRVR$pjL ztK&1ycU}mA(f9yI`vd&jpMHhuOf{)9+)4A;&w_WxKr2OuI9pjqHjA=rM?$u^;q#-D zI4p@Ruv=$Kql6G^_D0RUw?^)2C*ugvMl%XmaW&2~;Bk~OLWV|)vczOoV}A^!S%xpa zT4IrE;$#(${=?4}|F07}C?@oQVPB%t2@yx3mE%b)mN^!wMqUyy9|Qv0kP>A)5{LpI z4r^>|3;}3N=Ow;)T)~qCZXRxu&_3)Sj0flq_uLZEr*C`2Oe!Eb=BGg z%7#GKcvDGfw_*Ak<2+_bm+<`n1_DKq!}onek!-xJXoF>oPCF__2pCnvcnWc66UJ!x zL5y^vo!FRL^&o*KB!n=n?W*gr(AriyXAqBUmuqr0Jv!LNlNTADoEAhE5!8{lgHL(u zb~QH$0*Ne}0}$~23>)J;6!{!QHiOrTR>arzqk(Dp!mo6E1~|C!Cib`f4(As|(>br; zM)sj!X6|~|Ew8N57f52$z$Qg$mn%NtpS$`KAjN5eg3e*-tGdQJy_u3(*k(~ z{QRR+{KG#1JU>Jb_0S(4Vz7A!-hcidzWzN`IVfxW(%+Nj+~>Sc=3x^QPq_sx*y)jc+!Hp78E{ zfj{_Kgj@Ro;z&aZgJF-?@)8I8o7f!hVr%CXw)XC!H`sxcA!O4{*>yk1WZ4ctaA)QD z4Rv9~p`ZzQ(5)XS#aq<{w63w7pJ6$>K$gx?mKnCT_mOl4D2f!mA0mum3^$J&=Z2L5 zj&*^$hS4?Hp%ylXf(mU7W0Wm;(x!)_NjhQ7%^2m(#w_mCF!--{F& zbZW$rMw(?PN`=4^v`y5`zDWpYQh8=`KFcDmph{g>a%v#Xa_kykVgGASN^A@hY>f9&mIdm%M6VkIIzzwX zK}v%(tMTku;dEli)|6sQ}cKbYp|XvOujW+`9D|h8z2ck^wx=M^&ZJ zssgO>8{gA3dYLslC8u?~_u3l-tcw!eMBwziYA6A1*$8*->;RhOR)}ovm)VMGW8m(~ z$d0o`XS#4?0tCmNpO#pasDV$#mZ285WoCC&-!n*}3SmHtl&Ut3y2P}esYOPe9TU6f zsUcr`dpPvFz-BMQTkm`a!|@$>US#73gU(BzTu6!DV2ryrhxqZYa~E@N6FlZio02T4 zLM}3mZfA<5`vOu(l(mm6Um(k=^AbWJ%>|SJ;?Oj*ggCOIQyViC_`vVKo1m-=e*SU3 z!t!O}>eh(bNnX>QO|HLq=C?RL@MB9whlvVufi1KWJSw z;SNew)&{1q&I_6SF^A`oYbzPuk@LcE^AJ(gb0cI!02OQaS%6SdfT|V(p06lp41nj+ zNLp7p00TcTkhTE2gqzhX!k@jdVYc$HDDL6Tfrn+L@Z!uyr`b+74$)e_1D-S(^kYO( zjK#7*6fY1)WTVN^WObcFRvx7A$ag-eJc)r}Pa+C|PVCcIFAM@-!1oO99!b17C+^pD*>X&87J<0j!Z-QZl@xWKS{C-mLlm6Bo}g|PXCRuB2?6!;f^pJHPm@JC;dA%(%SQ`M*e zI*B!&wB6e>vzV4}Uhz*(fcv+|7mLPUg|brMgn83SCEwa0*kxnj#^okFSOc4zyYwEj zE2t_%)Y*dfU;d}x_+Fk(UV5svu5o!a!v`Nt$n4&d=#q#oNM6#Z!l3GS2xQACdi?=@ z{_7WzqC~$VQB(#3HGJR4$%R5zpdkk`2>IF(UFdJT7322N80Qxm0v~wrOf|Fj=@k_# z2IG|izIaMs96KId*DkkhIojrWyb^AkqjBrbW^Thi;bTVA&&Na3T)lT6xV0~Fup3~| z3(@WN5Jd?(-2pnCA;#Ocu)BW`N4MU^V7P})e+zz)tXch@IPfL@?1QmDGHt_W1DvUCou72>1^qcwscLVvh}xHE!mx;L|CX>27wK}_SK zl<>R|z8~Ay$BHbd;X(<4z}hFbX%(g^wyHszjr|Pmti#h64^UNA<6gidT_Icq*Y*e) z^aQSE6<(a?I6b>Sl^tXM;0{7-rOjQQs;iZoLO{IaSSo~s=ST4T0Dcg|4-#}bL%ex^ z6Op_COo7QvlU~r`xb5*zw@8~=0nC=BNyt&PZUR)ZLco*sdr@G0)}@PSXEze==o$2H zr%kuqdR8qH*Z70%jH^v6kFu2}#2EyhH44<4_-@1_tZ_B38(w5DaqpL#6|J2k1b0rJ z4OAHoBm!UBMu2`SE2>zGKVL1}v&P?}l+=*)I>2BMm2Fc6LU9u8}ThxO*gVHLDS123Zpid(OMO zsH|o1K%$>$C|zMZ^6=Tcr*cyVUXu>rjIZjbTS+wUXkj@HI!=Vl@8SfP!Aht(0AiKT#8Da6}* z_wi?cKE{W?`UyV&>Vqbzq^e!II46zE*lrR_U@mAp`uwr79&v7r^(5WP%gi}>XzMb< z*@x{zj1N&^TKSdUtF^D|MXRi65@8%ViQIu5S~W;nQX^7SG_HMhO!nQ{+S7Dm%WLFt zSZlG7SXEVypa1F${Pe>NMMYomu#2XMFpD?zfvpW6gC5z+ zq{}%@&X=f_KoklntyJK2icOqb87+Q;3 zNrcO|i}ChNY>sarj5?N388;v~jE0b&#cPza3vMYIjin2$0O$g1-Pda1f>ssCX@iJp zTGddxMz)+#oV*uUj#3A{WwLu-06&N@8114r+(Q_5uklJJT#Y&uOQUF(0qzJFps`EZ ze}_lm=Fda6eqFxwWI5LfZIi--#s$^$Jlwl`A8);R3q^K?i^-C@ZwM?>g4kZH8^O|wpal};fK7$~^=H?iq=KHXY?lKhHlMM6cy7sw|_KS%^I(&PHL{*!{7CMQn4_LAKeg|FP zy|=fpe|Q^%(G3hX?jTGy;cH#f#qtWfu~By1(AeAEMBrbNuQc2SLTjqnl?`sVv9Hlh zW`HU1{G`I=oLonrd_Wr+Pf{8zYw!Y_`{!5Wr;`^Yrt=c_Zf@Z0VvdU|g%@W6fBv0q zJU+g{#k4{g(1&_*ViS-{7c9!#K=BGamM34nfPBJ8VVTF8aSe6eYE|y^ch$ z;~|a{R28KY#7PI+ySK2peXBX0jZH`PMQj0VB5_L3hpGt}H%d2h5eHU_mqHZ;%*rN! zyPmqv2}^1^7<%w8P9MUk8h#KVw2lv2Rfv;*6MhzReD^7o3DM&-Q zQ~vwLdS>~7XQeL^O4as(7tM$$EUkdr1UH5e*dCC8*-8bZ^Z`G_#>O`O$v^&ceB)~$ zVLqQ@Fc=a}Xef(5NqX=+52LLch;6b;U1wA*rL-;;RFIqpmuPJ=sSvZU9PpZJ=*BIg zWyHx4!r#Pr_@JR6n3e-WJI;**9vBO4oM!D7{N#dcUp7Y``aOdvRPZibB2_n`Kf?!U zy*dD`ERwDR-mi@lgA+xQJ(Gh*ifVO($Aw8LDrk$PMro(1AfS#ZwuOxs3vo!4q$Hxh z_vpFCokL(_K(^^h165^EfvlS$1V%l9$;==xP17*wR&r5U5wW?hQk2CEe%OciPyS-( zd+GcfbxlC6RusXsoKNsCzyAPdmsKNwi9)y5X9F<+c<+rajLvZ}sgM;0(>Vc@mviS5 zTG&jr-A$qayna(yHn73PMB#J-)V0QZS>v-O22W3D1N6>4gR-Pi^5l}VP}7A|$v19~ zX6@>*xw%ejJbX^T-P10C-fLYfVncxMWT&N*gXie0j`!* zh=MS}>vx8TL*V41hB4GBzWW+UmNo|hors$o6}C+(9>q@aTDs z#nND7;M_TQxv;ybaBxV@C3Urg=g08#bb_kPP}gN6fJRkdnPxbjl+8+(3r=BY?YIL3 z_RIX_%PDRhNW3^V)>qp3M78%rN>hjQ`YnOC?r)$rbIj&7@`C=v*`!2O(Y8cu;PbB( zLLb;2`}punjYa0joJzG?;%j(-XwCag_as~}Eawk$u?hm~Pqjs_-AjmxI~vB2QlQi6 z!S@Nb34#!vZjAnD7eSb;*#nCPgK}g^+KOqdU@YKfARx5Y$VRT;Xts}210z=54#-Z0 zl1z-z7>>5#Ngtst05qa{4KdX7!zO$3H%M%$*s#rTlb8UT|L(UEb_l38x@tKjP;pQ? zZ(K=*6p+G)vKl@#fPS!|gXCgtjIv!BkEr2__ZKm>Bh)n+Pw|q1fqS8Bk+s{v#<7ye zP*6uzRSNUj6uvJp+}O9eOs^@_T01(1RyE~PiWI$$#IWmf0-2zkM2^+oW{3B?)-T;I zsJ6yE9Nsv@a7cpkx~@^AGu%}gr)THr_d<*YDPEk{cyXq2enrxklZ(|UqHR9;+mfc& z-A8JhY^@6_Tr4BAw=L{&fXsS(on8X{oIU|Ovtn0I zVb}8Pq)FquL6%OCF0S0{zd=TO4KBu(E1vH(bT5UTN|)^i4Fi`mD5Yoj2AZTVs%(m; z=f_P5eY*p!tCTu3U8AmZOee>Ncss^Xh0JJJ0y#Pf%N1n|vyE?1BZ2qdy@#*8 z^ENiN?*K4};sI1$LP&u;og&YsNS7BFjdpOjJHyqifHA;VCr-Y_)CMN>zji}lG#a2P zGdy`gz|?>AkA4qdd+!h6`w{t+15kB|y2>z{JVz9L38iXm?;K!nZwm427Z5@riJfz9 z!-2ZST+*0Vgtl5wH&%ccP1A*`0VM#L6X-6*s`Chh^>;r7E~Ys?f0X0f@6tUr8VF>$ zK^%GTeG=i1N0hW4`m_}$!vuqF45XRHcobu{%<<8K0%b+e%kEgB-wCk4+lNvbA3rDw z_NnN;EV3(1&OSpopTYP1uvM_!=<)tLxADot2Y7Z`A+ciMc}g=jpD2x~UuAGUsc>`8 zL#-tqKC7DOto8pX1$_CW#+&yR(Ar=;vrlcD001BWNkl_Ep_ zp$R51Ak}!gSeffmY>X>P?Xk5DxW|!80($!{@U_=~ey@X~D6J@%ET6mG4m{7d>Cv)r z{3M)8p~x4s74-dPglgU!cT%k9Q`JkcR|cx-WUwv~wpf@})#^BCM|N1PV79zMU1b<; z9ywe?YfF|it*kyDLD+3kAykWMz^hf<_>eRfL4X0fDg^QVtL z!(aXNXL#dwh^p2Iqb_dWeH%9q5=<^%Sa(hz=cmtbd9|?QOM$&jgCKCv1BbP||9XUb zuf2)w-P`bj2&%5o>+c}xjTCK%)_N?NT{t&B`n}F7|BLA)%=+Kn^l^B!3ti_((>Z+U7DP&Es9NJ!U+5;T zYq6x%?KB52u4)`#Ebzvy5IdVbKKxSQXxGF3ZXaPt8rFL^2k0l4fB5}}4a=S&)Ya(H8 zVTAxbeK^PKcQ>G`5=k84uYZu@@$uT1ZLMOmay3SNog@ddY9r%W4b^qtRvZt`Ie+(V zM(B1We4kkA#u!_q6y}RL;wVNC1kkmjT`K^k6!Po}W%U`Nc!2(B2QWMas#bx~4QEPg z{ZhMbY)8Re8jV$=DNIIlFo!Zipx2A>jjw+lqm5mH5L5{% zd~EIAN1O~%*9DHBKfvGq&EH~Y9O4H*dyaqe^Rnr-Lu*fTF(scczFyDIf&cZdPVlF{ z|3iHJ-PbV~?Vvx{YA`_l9-Xh3um!fn{OSc3^9%g)!$%Nxwb$-J=TA}BIWDep zA&9z-g|+i7a~9W91_;6qsxl?%RKCRaW(-eMIGfZ> z`qJ6N6)m15TDc-k7qxzn3l2-VhF#4;ssKIPY;@T^M&Gw;)5kSxljF`&fGk~No|fqMLL_mF zq9_Sh*A)y5s&Wb6^8#1x*}uq=?S#-sbGqSWJQ7L+`QDzHq2Z>{_DTZH;DCSZIJz?&7n=y*&PE%I|4V4 zhR~`;Sr!)W5b*sFMUmm@ixfbCAn-8k`{;Ll>(yT4@+!mWgc^ zrHAp(9mL7duIx3mQY(C_m1fYO;W25>2W-i0T$@kDuPByS%+9R64U3_DET(6c9W8AK zRUyyj@Ph!pA7g%XinudGr#FVtH5T(TJbd^VfAjrM@cHAc(Qw8Q5oG5nDH=kbt#Wca z{ObD{4trQEO7uDwSoeQ~KmMaX#IHX57(e*gb3A>KqL)xHP%Zfe>*lnggKlq&UjK_H zK&>^t|Klrs^x2P*BoY4bn@6~J_b!rzEJn084K1Up3#5w)7PB*4oWH=YKAqv;{<4Da z8I%?9uYUXi{@@)!jO@ZROP|vTjZ|4lY1lJs@y%OgPqtE&O8Op(ipY*>4s;TYywvD- zYyj`2GxSrnBeZVXuv6*9m`%?q8K^f#5XLqjL)b>u*e*u2HnF;KvH3wl|!+fdSpnpFYeH`eZ3HU0#zyE}ZYwD}Ag$v$$xv zBfN@}!ZM&yj|y-n2GZrs0@1oz=a*H5EGuz2Gk9@UVY;l)je&2!E3n9Dqx1aCpePOI z%PTAvKg8C^M;Jw@YlYs^FYwx%-$ti1Xn@@2W^Fca#=dvsgutq@epvp>ct|&xK~?2A zdHy+GJbP$q1_nXsqu1>rNxDRn&^Ql9i1n0JU{sYHxItT?Zb}kaLDOY8y{&pht?HTUE}ew#;-o7 zakHvydUpkU^uXZu0sTA*s8~IG=8}b9T+p(Gla35rG#jTX^Y@_)Agzl+Cw709a|4PL z4bJO()cy223R0XS3VqadiMTUBT}ya%L5{L(?qE^?+9oE4Q4h<-1*I8fHNJYDBMJmA zXXI+iGPSPt2;;C5E?mqDQ|jeTtF8KY>3M2lfmLns=Qi)l5Rjf1H9m_{+`ID#z5Wn8 z;~4M15#mR`E>?=w`o=N}fLjLw``a1ORJyET(RLu z_F7Xn)$bC4%=dshhxBLj3b?T=@Y9bBq@?&Tru6H2jhgVAu&Q?aH=NS_Rcdx)Tjhft z`nRSF`eI5|U}w|E)R==Cf0TL2Pjtvl8i5S2@!8 z1zx;3#`Dv>iHK6V#IRSw4|5bn1y9!Sq{hQ%3Kvt7LGdUgJ}O{9GAyGJi{hB_55q}M;WC~-9_ z@zxyye=|gu=cp@%2hSAt##HbhKBLbuZJF6I(97{$Sz!y2-TdC%x67lF-UoMAzV%&W z`|rwLd&WVTxSADCV9y<7UJzNbah?@qe>0n>IK25b%6thwR0zTZWxhlh_Zl1$R)fhp z%&JUrarP8J5WyIO)5{vOrDz;bxggbQH4Bj)4%n|v>s24Gwn4>8(Gn|6pr*?TeRn;% zLuSEtR%kqadV!6>8FqH>;3yix_*49g|L+Or>C5EoQJ+S^C;-kT2A8u80t&s3#Ol#%J{OnWeQifgNqldt9MmM9@F3LNwE(<4@z?}nE{kMh^RV}f!06U94>w2|7 zHLi+kRjP1Zhs7Alb)8l7XRHU2F?6GT_LxrkB+^Kt68CSG=q5{)mBh1CjqMF9>@>t3 z`|6lJZ&ACjR!I6DMgzxji2{0fKYCE2{`?Vq?-A;nI*XmH9@4DBut!C2nU+YB5GNN3 z7gK{psxcmg*xT7aRnBm5aDYL-3+N?0S>WXO49Dk1Ba31l(D8YVMK&WvLhK&g*@7e& ztabCG>w5B%-fJ8IMGIeKjhrzwvXw1ADrH?~jiHgM)-L2T^j){G(Wmcao;epzPf{m7 znNfjbYhOg z-ncjUhx!#Ukj%MKtHq;DF=}UQwsGFJN~CQN0MOx+*m%0rvnlS}dJ`Hkl&SHT|L8x# z<0ts`<{=FzN{ey@bQ;3 z9Bx0v(GjIdg<%hVHb2Jf@*(OnMHKfev$Q~(DQH7>7;z-gO$ZNIW(IHGq8s-7iatQw zs+BX`qR?IFua4zI;KaY-GK`*ep#c7X&a*sWZt7 zYtV1GIuD;O&`n%)Rp0}~d5Mb|VJGvHI*X6KJR#lJM_)op;KnX}&pe{B1;^#g6$XG6VKTR?%S{IwNcQ(#UXHstFE0&Fp(^8NkxPttia*`#*Y) zoy`+0GvIPoW06W2^D(-Khkh@_`DKpDOk=*Jdy=hR0uT7~an^{1`F>Wd$U40yDdR|c zzBaF9{0P@Ea{=Toi?zd*0s`SC7o}WEdaZ!l2La9}IsWh;d*_W>dBXWxArldB)$ z*_o9n+4{jeN7f70iZH+^)W{2ksw$D?8S2^~jsn!GrdqM*VRt*RzH796@r9HqvMal- zBL5{nh>;{6oLm%CNTjAy#YU=MOlcLou%}I4(2dX}$q2V~*xRC{os&zt5zem+7HQR_ zGPCWi)~j}}+;YFl9tLYJ47GBky*A+2UUTruS+AM=@hNgSYh6U;Y-V{}IKLtWKL?>Q z)q_>-So z?lhZ`pyh7R2*RZ+IALJHVf%AFAQ->k@sDkFS!dQw+=IoWT-{RZ7p1)!trgKSv)d;_ zaa3^#oGs}yR5f)!Y37Oz>)V(sbb3hzYI{V#|LlyqCjOk4GwLeYRiI-9yqPtX(-xkX zE~%s58v|z(jomTnB>P>BjlO}gPNE!`DkVK^9c#Lm=JXn)zD=F6-9KYp-0caViN-P- zn9K|&v$`q7%S_wuwZ{3R#%yV!6xR8vW>SQ%Xi1@80deqkHRk0AyO)VFtA{u{u<-cK z&l1b0MyT2%-U4szIe|O|vJW(41Vu$RgRp_DJn}K$qaDHZ z(pGJaB7wE}yRnf~ZU%1y@~<-e=Lb${dQdCnim7MQM=qz1Bc|+}-A(A*aD zK)H<_+ad64rG?u>O>ByA+jNk>ckVcg%8e_NnY-Eedu7>2H?a@2{mgOb0%d)#m80mp zMMPwc%XY3~bA*H9fRkzyP}GIK)=K+7CsxDBCa)0aD-}pVP0MT+%%e2J|^k zFX=}qfnG%4S!Qi`Ijr~jDZOW``I(v0;bB~OdAY;a^XZ8za!-zdZes9zZ)B;&{Vt{CT+Y~`gRVnqyS^l%t~s^YmsRZwSA(Utwt2O7i8*`#umi<FH>2i*p-J94s zcmqcEkuLrkfJUthhCPEP#|p>ix|yu5zts^NM-@>C;&RX<-%yd*ax_-=zTG6r4-=|@7y7LF7VtqEG2c-oOj30uB`4a zGa9e`7J)u5Z4$9u;|JMIV6Wrw7h`}&&(UltJv)vKdrlI<7@5-61t4*q-3mZ%i~DT3 z+VL4fV$#RI6GE%lm}{cJ%iVc`ESU zn?uA&2W6RKKA$5D4Bmeu#Lmt(hMR}PV^kH&d=5XIJ;V8nUy?>H>Of^P7-KNcI(T}T z!uQDYhNIf~MmwF@6x@I)3(L$EpX=1)ylvs^x6Pr8+iq{D%x}nR6KkDS+hd!zfY6TG z(nNQ)0t6aSG+g0oT!HQDs8%GH(ym)Bjy2ORdOc=kH3*EHDGregEcRYb-z=Fp)FGE8W9Gri6|<2 zfNR&0EA0+YmbDc%5C^VHXFKG}na0lk9$vfuHZD%TM4nCY_|cbG%r4RGMkvc1z8_+D zE4IA55>il%T3(Q;KoSdl^!WsT_{}bH&MKhO>7bJcy#3BQNV+3MUVj8^WtL|&*?>I#rpPwl=d@3#t#^ePi^lYr5sy& zo}v+cFEcuU+nrqCJ1gAU77rdRmZ@8p$B~ssz`f_dZXR>Hwe%zR`qrkr2^-*tiBE2& zT=9$}Yh`QwnY6_u0?*=-SFST=Ai15$5{Iq>;J?oh09q;oe%KhR;KDoV69mvp?BDh5 z62yKk&c9<2yk1K?;(HNx9A=jR(<)}{(-vDhqM`(}T#bW+EyRqK1c6%$aA9ae2h;h> zMU#PQ*-{HhLGSx=N`Ge9LnBLC4^C~f$Qx@U;V22OkbO2IvH5LupEa{eK5%$KVb@QF zGBkV3NjDN|J85*ujHGcajY9hUfBmxpkDq^z+4KUZXH%55hm*40vRS;q*L1rGU^YP?Q0pcwoKU?JCwN_yPhi9{&*Y ztEY`stuY$Uju*|v@sz_=PA>_#416j!MMeM5OS;*(HC`u=brSlLLu<3@^NMr>4R@n` zL3ks>e%^dxSw_K$9iyJxHY!V|e#3M{uyCTRNwyK3AHS7Jr72aA=XIR$2)y#c> zs&d*hCPDf(JRz|gK`GpKs%>H5jVa?pp64D`(;BJyAz<8#c}}%*V18Kvz5r?onA~A0 zQd%D)=BaGdSY>lX^nJ)=I zUk9@pwB<0z@xWRu+XtMB)FQoByWF(ss#@KAv~QZ%Z+hr=1?sxS^Rrf>k1bY$34W&4 z<+L_w?0U+lZxXu%5H5CYFYWbK-Cz|2&P&I2GI}*xBs0!OObQx1wE>n(hv8JU6R`3F zRn^X+HSh^fT+QPO+Z2R7aJ$lfm3zul*S+HMf2gvq2 z4o{Mm>&QaO>EeaNx@UgdIitOu3Ou*^&TS#C>s7*VoA{_TVKJW9f&*;o3tI(cEs6}M zFY{JR3i_POguPcJ}Y!`9x^rdUlN+hh)08HFQB7jO*~|usI~GZEM4h zvb+F*!_1P{xxsRD6?Z^d6BfkZ8!uS+-(%>&ldD2rV_sgqv^z2$CE3qxJR};#bWSve zs$S*mC9(T?Q8^VuS-EW|3ROAB%{%YFvxbmt&E!Y%sBwRUR(9nb zVl?dH?K`F+v~?0dDUIKI+efb>5&FP*Lm&*Q=0@A!VrH_%MgqIaw+}iyI2Z$@skLF% ztF3X{CN;3Un#(CAO0|n%=+l?=#a9NQpF>CwRjry)jlq5HaCm(2q#a3o8*=Hdo}&Ec zSQ{32t|0N&lU*4ZXW&g1D!|082hAP<+@*4^BU2QNc6gaaizM4(dN-q=r5|JkwcfF{ zGRX?ML55u-Yi8DKyRZy(en9!uUU$jlNTt+n78$7aloKrT7|$4%?^6L|5I(TfkEXy| zEN9Sl4^?hAkcFnt7x<*nGxh*b_MYLGEKXz+vh|&}x{7vZ$D6>=j){INkk_-LTr6hNk4-Q~2cx?feaUKND;68_W@^z#-|2>M=c9>lnH zG{lz=PvH3h9zLlMMNUR1CGeg1Bb-hYmdhHmj9%}_aZ8vE*Ilj`V(y0d@MS1~WkJl9 z<1SYKkb&bu!n*lBJJr}6WH`G5ZtYh%+%t&c7)lE~fA$Qw?|A`yJPjwxumv(*Y+eN32bFyDa4{`P=c-Vv zmvJRtx)ddKRp*z)6>Ho5dYtHOi&#GauIlTn2_ICx-Pp#Fv-#$Or{Qd^IdlK6nV7FC zT6`aN?G`qPXngfNA{@sdQ6|3i?l%79yWfOXDWv~R{BQrq-{NpvA|xS zyJH_oDDm|-B|dvx6GTwZbi+ldy%ldJkrtDFojG6E?(=ry*75}}Q!z@L!n4sQ;q<2u zCV2hs5XWb8^g2FHj~`>PSRgAsOlD-8^xm7B`0k(nC16NfDWrrH0bn$It;rCst_tgt z$rsMx?6Sh;RAHkJ>}`jLlMqR#hpNn*Py)~M5JfTSy2kFfg4V#NkKGu+EoM=<#8_h- z;nZ9wyRkqY6C(LFc#L3pk;MD2d+2sMn9Vc1 zaW}zW(8tye83Ilx$GE(l;&L)WUDue*O@m`Zk+m42dkNbc_K=Xy=#g)9-bQkAa8cQ0 zW8?mgQb1^z28k7w8=Hj8fIkNu`;(UP{?A9R6lykW)GA$QgS+7Jz3duxR8c!cHr472G8ZrpkY zfAa0y@MVc#eteEk0MqcksS|wpq;^yuSUsrc?z43u zUtbe)(Z+VAq@oJ5I?*tWS=vaxVUG?@-xDbE4Bc2@zARB!=g10;nN<-iGlBWCqA0a8 zgElo;WLsMvACQ=wKR{KcP1j_M!D2B-mMhc>h$Df1FTrp)LKp_9${b47jURWK<(SSD z%35NPs;0BxP0@>U$MWS3VjIkUB_U3`k&88pb>+OYVe zh{$*UCei*EDT$EhDQ!3Ey5$vbTAM)FtO&7c7RW6+Z_=6v({~*q$AEh+o>#MlYHf}9 zX4i0=EYTve8o2ac#x}yh^4V;Q?lgS@TN@HP;}C!J2Y0cUO`wgz{{9i-PM@4zA3sMD zF5w9UDJ6m+#MagpR9&Gz+{X6)ZA#tIcaf(vEasPZ^7vzX_T>enM-MdT%qc5t@me9Z z{IG{|^+pfv;wAL0Xt; zW5jWc!y6i-VHa6isv&RN`3EaOGVmRtUD}^{TIGxbHHSAHx%h$)V zWaf6!YAZ+9BgOb$ZabBF-YQniL9W~>PiDa3j=(Z4;d>HE2;`;4A|-y?sPEy{J}_OR zIDYmKcJ}W>tBUe0*~>p&oHqX7u;G?fxx}N#&l@b{;d6t@Y>GGU8Qi{o1H;iardQ|A z>eY~wLoW%jw*?fHqS3<&X>09n0Bvt>28Vy!#zfjLU~iN7IUHii)nB$&%Cc^=Ovx$#;x)_&pH;ERaHC}D!%#AVpnSm z<}%MmdaLYfV0CT0?z=5Lw}Lj(X)T2XQH|Z)B=$Y#1wGL3-1DK7#@2X*ciwpi+k1DL z>#B8ayJ(G07wAMD&QBjB&r<|JgfL3r`vFW4q1PY7^EhlmB2ESfqb~Y`Eg18!v0Tn= zfz>e3C`*m9GL72dx+2hQHZ2y`CKC%T=y3W!qn*|=iCm||ac@i~;VobrdusG?vUMNH zRibg@!1)`{@%04pYg200e^0#pd+YxM`$KK?$?oRc?@G*Oz9gTAUzmL(4NH_0wrN}KAfQP&j~slse2u)l4{9w$r?MG3NWi7%gMC`Fhs7c8d2 zbUSD|v$j69O;KWOtxf9?a0ez+QQ9&)o~9aR`%=-OMXKhR=)?lO(m)E0B=QjW0!CM; ztK8Nmmp$N1ArXWfN?y?lO4nqlRk{t4v74!WFNRjNO%N8CPN(?bQ*A}fz~-RD<;>}$ zdWmB}OG#tRWy@bltnH8ai)e24Ru}T*gh2h1i&X`E7~7Pan1281srwR_8GUIFpVMo- zdtYF)pX1(*KElw4@5MMiukfw60whU-y)B8Ke3&;Q;nmy{J#DcN#*KnpXn2(5(T|ns zb?syuET3sEuwK=At&avxXRvm?)YYZKE{}lnNd|)16gDj$tKw?v7v@YG@u5wl-7b40<@79+VbCMrG@|jTyz71 z&=6-8S*&7KRc1zH%svlqytA2Uam=pSd+wfD0VE_u4f(=R4mp+%=ny?hkGtx?xGq-r5TVc7CDqBuo=xQE_w&xBq`vq_T)VHl-&{Pa8c@b*_&ua;<~G|9eB z7^}^uVac{?YqG~;swielcMbZfYsGrTZ>tgB^q6f{q_K9yQy~b?TdX$IYm`^b2i#Sp zK9CGA!~yzlngY8=%5`6>cc&NICY`9`qfLf{1D;$e1Pquh6^e=!5LrT1XjubARpI$l zg)9+h+7>&LA(U#7q(fX?yhB|V;9Ou`)cE|%Id(=IMHwIx8ZY0hF&)SFe}8(7uMM+b z83z?%FvG^kvn-WiyQ1>R+TDg7xW3n#Hrfffz3<9v+3oAt90-d?_A`cn0Y7}6;$~K2 zxo#oC#H37_%uW~W0{*}Kum9tp*VPPlwdgE)IS(;kEOC6g>Lvuk9xxtdNa7IC(&&B) zvLp_ih}SZHACxyoq~Tgw^?m|on_ zsk1w3P?ja$9@ki{o6bgLe|Lmu4`UqdY9wKcC}Id0!#dwGOJi=RkR?>X*$Gva7}0O- zC>CH_1i^1P&FyrIdk&JZp&pF-K$_C)5Bucv^qr4K_~CcPc=Y%g4j(=zIfDo{Z6q1l zUTbqI2p%F%G6)fx_MTF#$2(6DMLhtjGnr#1x{NUfB^%6VXOL}!wryPygmzwNQRqPW zZ6n6kvqx#X_Sv@mJfOkTrjv7QCy130RJ@N8@>Z6Xu|4|HyvYRg`Dt4-@7 z;rQL|oZZ3tZE;$6u#%DzjIQGx~a1py5{4)tBgYd?2H0%9-wJjoLp*L&56VH(bFSL_dYT~w#pH=m1?n^ z9h-K+L_RT%VJ|=uF%*^V#`eGb>H=ry*LeCcgVqd6YmED3(UBy;KffRym-4QF1(TP# zlZf1P{M_YX<%d7oGTK_bSWb*>-xh0Et<()oseDjtFzh5~l$h4?_$GDf(%RhYug(=)p%6@MFw#pe~PG*!PRC!%5T#B+!-t}ESrKI&>gMRJb+4e8K$1;d{e`eYdM}sZn zzHS}aDv8~rb!B&+wYUFHJI7Fq11;8u(h-q6uTnr{ln2ms*bA;9RfB-Fcym(VdcMHF z|F0&96N!LF;9TQ-pX^~eouF+Sslk`>G&3_Z^o>A zdCZ+yfm!HTNZv?UN*jn34!=EfwkGys*aabsU5strD0M`mZd#mQ(?$RJSDH$1)#7>) zqN+9aCeE;o{LATcJ~}j#pvY(f6H1D1jek?!I-JHjB1q+`2CJR3EsuR*t!doO$nxF@ z%zSc4*ws3xROx^D``^Wbho7RVR!Gtz!YJ)L;sYLbDaae?JthNDgb8>^5%z6c0R^qJ zIO$U;tXUXAAWS%h%O~WV%+=O;zOjgvM+LF%L@$k?q0zRIIAg670!z8IIhz3Ns&Orw zoze|@u2Q#vyJhwJ{%JP#MtdY%s}Atjp+Bvaa2!FOI%6v}D=fEb$WCH)dw@zWhlCqolf%h5J# zT+ZmZ+Zj;`y9OC?rm@DG6Su)DP4J1e3G#`^evpXml(-i>V~0~x0bIGw+^;4>;XKi1 zE2Ft>ttAj)pS=_q4`UQ%gb-R8x_{OYBND5n%&B_&u8U_3d*;eH=C z^Epl2QsTR4XjFBJao-&$S96Wy3tD9M!EPn-Utp@MyD|#5H!KT|>TN$Pk8bdj&uFta zxuW-be8BMJ5C{T|(KtA&yyui^z?4fEmNzR=sCO6oaQnabrduInR(z8us*c2mg zCnD)B4DQ?L?@G}jxGw0$2br_Y8TXxwgyp=ga^Uk9C938M-}|`1bng)svvV{}h22Sj z>6i|>j~_+&@eiNk#j7*?$G=>-0R)J2+)7fNbQKeGQ~qsZ0;M)LUaLK{8eS{1_a$St z;(d2YpTk-Z4SFG<8`LdBuQx&%7Njp+-%tX$+B^Y7hrWx*^!)C0{`8Yi@x{xZcHmgZ z8Ct0jN5WKH%J6T95kFf}i)5!-7PDC8-+ZI|Qu?kS$nHUiX*7CvO`Mx7p;)oKod`)( zFr6@s7fa$9o)y z`vbf`zJ^j7i^VmvEW>Oz0~e`Tlk_HxG1{M$Y`YonHi&qBeug*#K6)5oI_Xo|aaBVI zimj@f8X6j*UVrbWCD+J-@xN9hZtb(qP{t4ebno=}6#UZv@U2(j>rWJVlxfu$*6Detirf z5-^jYXah%WHKldXMTgm{N_!`UO@mfinF@jMEv+P^F%8pD$d?z$`nzC^q0DCh0~R;O zolx0II~p&Z9U54d8g)xmDonzVy|30y!&WA(bh=Le(CTC^+D)?pZ_;W3_%tEM2TL(g znz%)WQ`(fyuIL^Od&I$G#+1-Xv}`pYTLFKt6-h)sjZ zZgPq{z-_(Rg4wW;(EvEwr3-v|NgHs_s1YV3hKKtMRdIv5nxLvRPS2JILj|Qco;)1m zW;R1BB?MFW;~yvZ*{|0KLyk0RyMWuHUEuK{@W40-TSr*`IpmxS32fKm=i4ephc&Yb z1S4$6)7t#-7}TgxY3F> zh5a4ZLjCHsMkH#qiWVd{cop+bL6~WabyW0S7w0SB%eTby8uozW!ljecEwz1VOpBwR zGGqx|aI1BjuYg~?pv7;46t=BIZ2KWSEn*nC)0>&8(4YrQ`oQz23HJ7;*qQEu^ANL} zGiukBLVq{~V*%EyOY{x>z>XDd<{=9x)*fbv!WhstjkkembH7~#Jh?iyXqyr@mv1q< zIVICH#?k9fkY)qOwn33E5QT(THx1#Ny4`AbG>lD=BjHM~Ww336#Ws`%Qs!)SEJw|@ zh@qiF6qV!uSU1?Fb(T4n@ox`>{eg1`$qdz@k(<`UzDJZ+4!W>XF59+SO{v{Ttn-J3 z9^%k(%B%t4c16`uSNw)U-?oqOIb7?41{BX8k}vwxqW~}8w}?V|fOke3SwaUb7b)th zz=!v5kR=++wZvl8g7X0Tdt>uxN8nuG_kY}nRu%q_|2RY4YCJh0tZiLT)z!s{dF{R* zS?@cM*lQ%Q>DnL#5H-%`#ts;IDQ#qjyBtSH5Ac97wCxKl)*3uu81@-HI(SG!AMXNc zts%5lh?5bTCWn%AM*3;-Pg8F_f=opAZA_yKl_4Ot~4gc2AE*hu59J*LfWZ%8q-CxVs2F$pKVjw9beL- zvp(Ef(;_&&0RHH=1AOPB2-8Uqt<<=gtx(r3Uc6WMtDm{B2!EpKpO{vI7zv=#uH5g! zN?Ra~0{p>`ck%3_$C&PnA;J){t&#S|nC?FV7f~0;+R7UF@(OjiLe`&}(wRVVW-h8V zBcwJjFu8ZwxcT-6tjZOnlxUkA*O%{beRYcUa^6*fS}7!H4{ci`juYcM6`*OTa%);g zvJIGfSgjq2G9&!F^iq}@XW?VT$+k*qTSp+Zt#wr!hug>*3R19r!{@yN!H_8Ine z1UL`y>>=>#Lxbg78-FoM$6hXT#393KUE<_|CbN$Z1wyV63c3&h=ippmJQ?D{hp(}> zL(s_H4#VlC#$@OuPPX#*U0!`|WZ;49PnU}ze_rM?g&J+(Ge};Fj ze?g3dQe(DM6|Altg@AUdXdRm{=UYqU)Xr4<6k5glRx==q7#^JRI)|DxuI@^-SMnz2`(bEZH;_=O{KC(NF>T*Lv~aq1&KB} zW;7{!(J&5lABP&yJ!H)w%>Eg9tQ=d__9NC zPOMjaXY0JheG`EfwI#eT3+dVO=uOKXkWq)TUeR08@%PYI{8$@*67MS_EG;9B0B&%F zG~syuMB{qi5_5e4qzQv;bG&)CL|$sFOJIM8CcA?{hPG`GaE>=`Zg6x!{5uAQ-4Sq{ z0@sTGoKsc4SUZBYr67cyItcqr`Cez;B)-|CbJ$Hy2xtE-jbY;M82It;{V7^`jnlJp ztP8r3PmVZ-eSz7{1=h<;jCLM*@nj4luo4W$z%+SbH8pt_AHV+s?>=1M=wOJlQs`wN z!Z0%U2yi`bF&WZ_YFgLVTGRcm-@m82x=ZG;!T84AxR(91Fe>&eb%N=Re-i+4;52xG zQ(LgkUGS#Xj&zt8Zfary!cfpnkD~x_6yWS)hBxo7@Spys#`WA2J+s?*ggs@2AyP(y zGW*7XE0Jxs;bh41liz+s9I8N2J7?JC1dekN;9L0DXI!(MH9ay zRS3h-U|kwoGYm3dcT56S>r7hKG<7N}0(7I0aErpYD%dGh98rJ<_YzyI*3@nYc3Rp? zj5SQR+3HchL#4VA(qG>*?}D3e$<9h3a!dRC&B3C!k8 zeEFuvx&(e$h4`({0$g0Ju*x;022L&{reomme??QnETPx#XLQ|snu zsl;FYtj5KS8|?<{_NLV>ZsDwkIR_3V#xBG>sMb?xJc^N~ePf7~ zArc(L`Vyf~c=~XJkDjC$jWRrZ_%XEBD2fHnj$h#PeBMn0wFc&k9KBu!Fb*ylc%YG{ z0va_Q9|B<*;TK=#SeyYzdkn)2h$D@YE4rRH3);8>vvJ3f%M-NK6*HBS)eNTbrcat} zL&};qu*i#cvz#|!FthU;+GG}M(?YhJho9WDACHa^Pvb(HyVs-w9;jKTCcb`A#zz<=W zuYkY#=^MoSFYtpO{SI~yzJpg^{AU~=zd_Sf$SMU#AxT?2Cq;wO<}k<%1B5Q z1W&-Zz@o@-y_n-@pHoR0a44lvlr`QS7x?;p(`A&|>dI!1@xU3RZD*uybFbh<9N9ms zt+LvlitwftO=I%n8W$oUm}eqpa1?9bYu~Lyg8`}1XY_G zp1+y0J2opjTDQK~y~MRZNgQBj6hdj$`RUt3gEmtF+b>RE;^mh=LsgQ$%5tsIw#Q(M zVejxG)KzZuei>w2L$(!db^*iw;WKm5PBH97==FDyq$30(LBBshoD2vb(+W}CM-Xs~ zv_yZfhuxz!LZNYWbqc0xxFq_p`-Mdp7tY{OPf>)d(Y+xz8f6D_-4 zd$J1UMbc?@+bWp_PE*PQKr**Z8wsG@)D3R4!_~Lg&20aQBH)Lga145Zc@`9uQmE?& zK|o5Brq$iXzyn}94w0n-JEIV%=L_(FAxlW|V%>X{()j$VIWA{JbXJ7D+-5=uFo@Cg87@ygH{k`+R97Ve#&L8w1!E^D%hpgD3NXg;@@@%dj5$XTD5iVm4 zv+EC--(2A3%U?mYC3p}(N=o9css=^AM83K~TNg-s6J)(90ARH9c!Syy1OmJJ&pN42 znoTg-`xsiaXqv*KL}&xlGfZ}SnCw#ZefZ#0DAk~@a@<_L$KU_M=ZIqg*%pYRxcgop z#ApCKI+O?)u*z!)&M@ken!r{a+z>r4XD;qb8gZ-*cTHliZPc``gm5@mnmQxK*t9D) z;@(d1I@b&D5M(~wpf{~zx}Z_qZ71UgHr(=V-x5GG-^F7~E338wPH$;RjehsxK23DB zrt4ePjd7{fC@bRqm9+!z&#oH$;CYNR6?kwsfYvQms|tgDjLEQq;0#g%dlQa0R#+Fb z9$vh20}p^UvLq(_cD~kKo`cOTV2m~`+m?92H%POaSE*bztrg`_20uN=*B|}? z&mWV7jB|m(ppT}NIKNyW%?2IOxvQ|s^;M@8>n@?vPys_fRrvTJL)B=UT^1-Sg~eKT zAmICRSDjdfx(xvED<-Ws0d^l~zr7+h1<~7a+cxYoG=N~?IYHWKo%DReLqR31b&j-Q zr+)B*#UI!f0J`CO#5O4r+n{PEnhjjyvLzz+GHOYCsc~pD6R0?%N-9YPU76fF724={h5<F zZ5z~8fwrxYrehjEiy1Di)(E-6&WPc9p}V$i&~sI=J>2a5lG05Gc|bg?4g?P=ki+Uo z1qZT$qpwsA0ME)K3Y~eR-?DTYjN0T9>8%!R1ABtAv$h;CAKkc%@N5SPdP`S#>;3K^ zQ40=y{18YYvTm}@8%;xQz<`ES&M48Y!9hmfGo2m+jN#_$1a;kDDio$8j(#RkHyS7B zB^c-+u@0@B&zn(l6gBXl{#Ii=AdVKhrgmN%T-iXUo#hdA3@*BEyZEr0MF!x_sm8mr zHTv1t*q;!O^S}80F=Q)oab2Qq6+Q`j-P-InEK4BV1ho~QYE)H;P-xUGaCsv!UztSW zh<+cKBv-q}SGgfxZpF!~ZM8bvx`Eq__d8;_?U>o#{3s&L73Z5^{I*J7Dzefz+M_9z zb(65If_?pj8%^6Ci%)O)eM@hlGcS&edlM1+Gxk%rNw$(UsiT7l!YD>n<_H3YlMi2! z!zT-%WQ)~$jiy>52pC>{{Q|237!MexJAJxop+FSH7z}r?v-=oaMC5yvj7%FCKzmF~ z#z50Y!_n%nvLFD{c8IcBPXxxQz-knUE+QyuNhIJR0v8d=e2!MuSk5myJ{K1PS#N+N z5uzvxtj}}w5{3tRjyq*}Sj)AsW5oFtkSob>Yw#CeLpoX7y8E|UFe(aCK9n--{uHK;1GN?X~#ztF{|1 z*n44ZkcK^~Vx!Q6#|l?{*=u4YJ+@kI6`2Ht_qbdro8Fzc4vgATjW7hR7c+eHz)hDI zdFT#JyJ1zuylWe5Vvfa8lx#2>#HgF9doZPRNyhdhYb8+$;>hEecpH*6xa-K1YSWS7 zu5!3bZ}v6@pXIz*nfGrzi($Q)xFSNg+nii(N(5|4ZUZ#9@J@()3!J?}g5R}!p3A1+ zR`gQf!7eeblbCgt>3pT|cc0&2kOlbR^8_MT81>&H6bf0&QIu4=$00`)G8|4B zG>HEeh7rOr#{SVK7>o`Or=t#kBKd-LK%Ai{vW`^hUt{h?XGudOH71ThKy(QEnwrt% zkqequDhUxL2*V6*Qy^boLo1Ed@*1+O&8Ehnq(qtmNBas&Y3xlTR)xmZOyc5(9)$e~ z1;ko0Y~u-wZ3e)qpeku^LJx_B8Z6#o|7)ZJ=%sdtNtYO;y`&`WswH=N8!XEbe&y{o zW!pL>@7}C%mlG*Az5D&VK^wYZH{QG?fBjD%16i!G&KvZ5G4i4UGZSO211#1pI0vR< zhP?^HurCmXk!iUUk~l!y1c;&-^TiTLEHE04pj3+>sPXE(z|Eq?yHj+P+WrpxJb6hn zol#D$qSkb;>>$8CH>-kR4G{pPNgJ|Z$@l%r3ktanL)YC{307I#%u<2JkER%p(p%pz zc$fgW_8dp8_fdd@qmOWTy#(hKB0(P_2uQMG8Ok;}rp$qr5oX$U&>Ew0FF@4FF@BQ_ zBzrP-L8u;k-2eTq1YGOhnV9M(fTLO{<@}BUugWV;%NTr9960l$ytHctHzp%3X|axW zf!#4fFB1rb#4=ZS@ecUaD}|<2_~(}^JUJliW+iJ#2CP=C!BI4%QpmC%l0;!RoFa@O z2oWL4h8Rz&vZBq1Z}z69N)7^xOMP=n3u9KO%$&s#(1HJ?C-me$0aa>2+=B=c#OVl8 z+=DoOg~j}gC>7A)f+#aWgit1?X(UK%n8wr^UN7imC;JpHzRV+JMn+hEy>R!*h5^Un zrkB3;W48=+&Np#IdvCLp{!LMNhLRo*3hmitdtOi*hIGCM|2F{X{`yo#WMF-zlGt#+ z49xN5kPf-SDX`8Z;)t-!C>oVB#l;Qks=zX@5rzyqJ5%f(JjU_6FHuz` z%CbNh3N%d(Xay-7td^1P-XUrw7uKO@@DyK|~gEho;}{H#mbSY_@Ym|p7W zL3Z=8{J3xWWu<%C(_7lqt;-qkU|-8*X>8t~ zIq=p_F04D~DhD3y6ISA%6#l5%rs`V5H9KAG09+0XGKN79_@}Ql7V8G+ zUf!0f*aJ>V`ZrPNRVmU5bDPGk5xW7^Eub6cv_OgiYPZVTWcUf1V))Xc3SuD*@Eb3+SUPrsMag0pRYhD2TUWhnOF<&kq701zokC0`3^m{{` zpMQYVYrKBH#_mo7trW8U1jirVBTFOndOcKC)j4j=7b{c^L(?*R^-iIz=snj3t>>GC zb8M{};G+i)cm3kEY56<~Q*Pju*!Y?WVN5fz>B_PFtEikIfS;&7Uzvf*s>Q|0mx!Vi zWj;r5xNp{`hM<$r2U=&fYkQfKMKh-&I*UwYu+u+8D6j z(j5ZNV%HyW|II&ZeEzjdh*4W%mG<9{`djVf7HG==WZ4kC!43wa1B7AfwQIrFXh4xY zkU505`~Um;TjqOGZ!mh9CzBGM+F`rxp{hL1CP=d}#?vRbI)90a(-%;RDy%rBO$$)y zrwnDS5gQwlYcn?QXe-*|WSQYiQJG4FZB{LviJ&xl^Bl6J2(V=i z40;UTe@37C?HO(0Z_nu2NMc&Qt)!ph=^^1st#Z$lwd}T=ded$uNZCm+Q}<8*>&9(b zHg)=DVePYN9ZK0E8|-#3qP2!d`@2{z&Wwmwb!|aY<$zY0j3TV^s>_rc_GuE)&uGH4 zEM0Q0)eRLDIgeU^-I7V~3dFq2^V+8ySZfi^$;+s#vef;H$@lTm+C{7@MQ!crm2(I< z*a5zJOACb=H-U>A@mx-rQV+G(g9;cBiw^RgwCfdjbV`n1M%H2TI(&q=my zAtn$693sr{;OXyzu>cpRU!gG-Sy>il$|(`Y9LMJs7AtBuEOuoL{iNsc$+_`34>vh; z+tn|Fr*wdeWB1)kZIr#`$l2Gk_RLL7{3>gU(giPg7DsJMld@KN+%4vf?X}BTOk(=o zI*JNTcu%Vcy9+B?Yi~}-?)q@o;Yfe*``<^_8$p<0konCC&d-lAySYG;BI989uy!i{-k;r=L8bslOq3*9|SeRYCT{Rip6flN5W?K0bOvJ|4TTuW@{#@atEm z!m4RXX$Ah{0sV}2%@&pGu58z02NTvkwr+1v3p;sThgWSL*q1Zl$-@CY{lULQ)|+BE zdxyGOnmtQ{|1baZfA{C>#R;Tr4B*NU1Ob|+!g_gyD2kA!3G($CZ%=8rJ-+a;tJ1R= zF_QqxpXsH>7e{R_ocmlGwoj^ULZ(eX*5BYOWW}}qnANs+R@50e=U*f-wHj7xu`cLj znJpay|1NLt`vM2LvA-q+ZM9@IKHXhojx0q5Ox&|#VE&P{6j!jo>1nS+lRchlGqSQ$hZqHQWD zC6OcvqA0@kT;jz$)w#slA5Cug=RZCGK6zw@HXg0Ozs9zj*4|J@;|`-e%gj~=uME5d z<84=kz&(sMJJAR5ZFOKt%Sp6p6>Sw4RYmQS#dkYf8!z_&M!22Ev_1ztj{V&M`ok#& zeS`^=CRxkmXN>1V)jkYdn} zFdR-%R|TR_qbM3=De(L;$84o>IiqlihkG!2mbAGJ`<}s{++5>UdpLaX2^of#%kEGXX>S){oRM9wwi^~l)|;R%*Vx&6f~&LFkm>?aq%m7K zu2tPS5?v5DQKVJnThH$6xx)zV5{7Pr?0(BXpAK7Ax;Mfqio}1 zxytIk*EJ=yY#_lpV?Vpm`QOi2fWVVJSa!WOx>BEYf8Tot0l(#P3TVX15OLB+UFUR| zWJ5?P$;w7ah@j~<3$3YIO(U-oH-yj!d(C<>7!0iGPlj`(?TwL}&- zXj_G*X;2g;sv7v@5yO0`OlSpdP9H9uQ2)sx{fuXgi>}{(o;%Y+lUKN0-TgR7wW-In z`^Y-4@gM%Lzr>>_Pr(`@fif{xxJtF?k)f|vZ zjo*4szFF&n7IZ5eNPE|Y;-47zRaD!Un$q7~LHZcgyHk1~rJ~Y22|2P}3LylPQsAb| zy6g3R6EIyVvZ}PNp^TcrdcEs=vtRUGLXun977P4|qUW^*a*F5;53rn5$__WyL{heB zTiLm5)W)91F7iQ-*3D$-G9|NwVP{Cp?l5#yXWO>>*Vi6A*5_*bV^{@5RXf=h_l7h| z8J4>Fs3G4>dRY~l5Qnux-ViaHpUrMoYD==>Q4YH*u;251<25L^ zJ7e-lUMyy)s~SLn>6lT~6_I_mlr1!Xi>n-~wdy!qHU%A8uim3>G;(7bTvk*S z+ud6*>yo_*7i)|&MBH7NfN>(JdW>DhHn(riLnx(DRR!9%GADilrE-ji9N&K?@v|?1 zS?hR7k#V@NAarTGw)Q3rj}9owX}KoX*Pp-GOk=WR`k-~-x!kJk{hK6>TWTPjz}vPa zHck#6Vc8e*Zs3yl__JGF@>X*4)*&VpaB@M_8)LxUG&L1qXxepwwVAxuRS792ieioV zisSOSK$>XuQh_uPM%mDyEOXR#gH_%FS|VT!gFaAJ8bSo9>IMN*VBpA-0EfGZHt;0G zY}w*qhvBEc(hvgp?o)Ev5W*=3I$x|{^SQKBL`!qv{O%3Q`qM`tZFtt}tSD)E{`l#0 za2}fui=;GSIeQD)R@8QEJbVhPNcn98^_i6RKkqiwp_A*mzP8z`0Qh#ED99)5?O!jP3{?HS7%tS7Wn$j z3_pLNaj*k?=ShI!Fm-m=TAS&tK%AsVk{U1GED%Quy_Dl#YEBd$lQ&*G-0etT} zk1?4(-qPm<5bFim?`owwqj!6P$8mx*voT%@xkBsnxic z-DcV|Z==TAGp_Wb9D%X7KfD3Z;Yzm6t@*0V4 zN<$atwOzNGr$ZZ2wVg7;YUu)g3&6i?8pxQ~Xbs7NnRS!JO_N7@aAaFywYWf2mnib3 zM@R+gx`a{+WkokSjey*M<<@>W3Z49B*dxu`FTd8vQo==#FKAuX4XrmHZ?ZBfW~N$6 zM6F+4yOzXoig7y=GTUOYSU{LYmHa0UZJi_ z42C&#-?A8(H5ol~RzwOCU{vyJcAI4x+G3d7n> zFj_ML9|P@lUx6q3RGygC;#aM75(f*$4tul^mTMP;5O8;*rZI4{P$+AL&pxK=B}+nl zIBPI4Afi?Fw=LloJRlCtlSBIXUmugK$G4QZE0$buB^+;C&ussi41gy`z^E6Pib|V` zkxsmTbA(}xBpsls@{Xpky|HxDJhSoGbeqnq2HHt%l;4(X!`o^*ec{~|8|!Eg_QQ0y zQZ`_LG@F)oO}z%Bs!O^g1^S6BibGxsfI@IxlEqCtKp(Wr@q%wC)j> zM`s5;wpHwcVU;_8p*>-~{N|#ppBc|I4xC)nDC-kUC)Y^R1dI7Kl5~K&X|Xe8Xr;!} zBZiyV8j}G-6dHfJFz5*2*Vjv&UzgaQFsvIOigZUJBhP#Z&I8nqM3(4|`G2!;8o_?% z{PlT2U$awPzH^H+r8|o{Qs&prInn~%ewLs=z3V))0|VCP zj{jlV#AQvT=Env2X2I4q_2xG)?iZ~e{PKOU(#SG_<+=vI5ycu!Q{mNz5&>GADLRm@=Pk4*-QdZEMw&<*PH9!X{-8Q5=)9zj zYHDneu4eRHUM)5!{+6$1l^(*#-Lf8imZBtUrB&fkIJSP3l`~PW2gl`2eP`7#dc#A^ zu3kZ_rdy-|G*}=Y6{jf-Ox{?znNim5tjtYGtn%ERK-*xOZwudfxf`;lm0d`+*bk)0*Evm9WQPyZ%jj|$6Ut{y@6g{k$Gq@AY!zl&dTn`rf&Js5jRNAF~ ze>A3QVLGHW_UU8bU?)HvX^e*g4-aUX*2@O?zyJCKRnu;mQ8G_~(M#!&js#6Fc|gA> zCO!H2W5Pq%1^t`X21~P2w8~RP+$Br%;S>v0TXW214!r)b#?jFp+NMSj1PDWcEQ@h* zS>oY=KokiG5n;9{(C^2XOm=WHTjG1q5?o%d5QYh)tnl)^1~*<|p&5?lr9>14*qZ>; zae#mPLUn@&9?(63Nh7yDWBFFwZhv;;s@-L3?v9;4R0Q|S>FjIO4IMPY9!1ObM~52? zx2Ve{v}(z`&pWAQTjRsKuQv2^y~NQNY(S{=0w+5_J)odWyT~ke##TnYbu2vH(Yn~w zj#)yWFW&)ZgVEZw0tQnU_UP1j`Of+Ita9MuTH~L-tntaC2CG7MKa=J0^itrDf2W7v z{?R8i!Ag3VOmYkZs~cO6GLjznyesDUWCh;> zE<4sev_`SM!sXf5Sj?}$IZ-sKvcz)T;$}$?&DD%H2f-;NTx+0c9P3|sfw(~caCsZF zwQZDrNUj&Im7J~U5IdYwigy|ZCLu>6iW5Bhk~rxW~#zxW)pg+yKu+uh$- zdI|8Ir?f^NA2O_qz{H#}laHu7%j>cNZsv4&TH6+>?lyb$J>I1vobGzz*0}EtcXfGz zgTn`Cni{Ls8cn;xpr3*H}F8f^&}1km1$)l6=OD2|!UhSB>$&rJe_jvJw|-U=Y&1oDSXLQW!RYg>$Ui>3zS} z1--}Iq$~Zy7aC1d5{_$jbFDQ*oK3J=oEWZ-19FvYpk#~4WXE-O7{XOQHe@l2>568F zBj;J`mBwQ*TWJFK8M21{OjBmbj(eviw>CQ4ncUV;0R>t6rby$-&R0X9P$hO?bBGj5p{WjWvvjGM?B*TBz zfGOuC{~L*>O~u!(9VKyf@diy@8A?MA#u#oE)Pe=ZePNk9Z+8*U!!b0HFaKa`C2eSS zeQZZ!<%LUf4ux?Ri0A=}Lei4FmSr1xieE*ro*Y6poV}Y;V zH=VfM+9p-CA+Sn~UaD}s1cE^0V9N38gY2g1>(Y(%1Cz?+XB8;JTiOn|uNL<`#!%-t}erFt_C>j*C z#vrrnP(cW8h949Qc5x%SlqaRA9d1ly-}Pd1xM8~vJEiShfsIMuctH1TnY+&}?xQ%g zgk6>f=-=M~(rnbx8OXAlf&Wkc!=L?mzC8E1J+u-TdyK!*mB5Dl2gmBZq zVc+SgTIE>A_F+vTDwU^W^Fyo609DRCFx6OnbfZwu(sp-DW#`&!PwfTH3pbV6#s=(Z z%sHK2+*E{*4>^APSs$bE6lJ->_2nsqAb|elY=)*)l%NyRO}SZk8EkOiaF%Wcwfa*| zhTEd==?M6P9|g!#lFo20kfsBOFhZIRFdQEu43jM&TyIR`lx(0)AZkZ3@TPRiR8mql zsH=5n)3LD;but{QK2{!nSzP_D~YO@;q1e&P*(-2s={JbBQF)^D~g|5 z=9@OvmLg-@rO;{zqfPjMv)f+!c8wMF=EL)YkAY_o=yit~LuPnxRijK*t`UVH0u~@i zhlt_~B2aktWP(SBDR###X3M5Csml^N{cRFZ6jHR-sL!x2fwL=(H>ajWG{3w1J^%n9 z07*naR0plaZQ5;@hg;N>%@((;XhZL1g#TC%w=@Qps}ikj(6;m{>s+C#HD*hyn#j#o z(;B8=0NL&!>9-*8gN&ns7p(-mee)Qk{D8>8J9MkCy0v=$xcZ9N7K*|=OkR6|=X-U&o8Qeu0 zDuwk73Pa-z&~8da?(?xPYuZ$rrbQHmCTyamN=pb2EO+CUTihsU$fknk3IeWeRI-6; zt4_$gUS49gxWxX^a|ChLmDt$YkSy4~DdEvxYv>#u+`Ut`z9jx#iMf%WPdqwyY^ro?)E3MC~Dc1Vc;LP5R05QWaxx~wUEyl#O{9tB8Zj_XB@ z7w@Rz=xm-_PtbjbxnHM43^q3_yIxyKuNOy~S&w;1!<1n^G!C8(%9^g1R6t<{5oJx) zQQ+kYoL?!725#b7*9s~Q5Jds9jN|Qbjmbz;oLA$B;&u{moh$(Aa;*N=Zdl7TZG?=G ztqz! zV^?MfuS1i=m_%;GJzu+1$7(9|*0j*yfa?bMhhJ;_$%N1KL^_1{gb%%0!#@lFd`wg4VYjKE3=uYo(o6 zz?W}Ka#2LDcX6XhG10oIVcp!IC>46?TLeLXH0xo$Xz=qdu2B?iCqZi^(4RPPziy~% zxSmU_3vy4rS<>2E6;=y)x3Q%Evu|u-ThCc!)@>`DC)HvN>FRp*GJ8Uf4c zGnrd8=`+e3RE|t*l>;H)q+twtz;ve%#(?KfIbOUgadD$4R?Jk2wVC#}ty2x;1(7{D zqXNWEQ5S2&+mg-_86YCJO;{IRn6W>>(w^ilU?u^)Z9TkIK`7aD0Tfof4*-XUdl(Nt z;CkNNj@vdwvN)uwWhq@;wKf0Jo->6cRV4b&kbU@Q9YX%ntK0}df#q`eW29(@;_3)J-*Hw%gV9Xd!(E~%ncCKfIXi3(6up5+L0Ll?_l z-;R*lrrKEP%xvkz?o~q-d9dj@h*6&&uD|{H9Mci-@uLuLKg=P*&Ky@b#1TgfVaTz!yMv}FF`De5 z*B{~i+h5~mo?~yq$VZ9+d8Lt=D#=!}7M`}=RhHGiSSd(dVRs_1%r(A#uez{^QQsv# zN2Z&3{+O=kvj;{-Wz>AX{MvO`ZA*~R(pZh#s;rlqFk^EcwO5STpU)C{IS2mDA3a7C zvW*G1(5l5?^ayQJqOEhPQe=z%U>D<2jM<{;BCl)@t4zxB#moVVcE?u6Nz>jm?%8(u z)-b+7oBi6hfuH^VB%+gGZvy<*bB1RR$pYt-M+*P>A6k6*c5@7E6MP04Fz6}tdNDqn ztg%{G`1*sy!~F%GJQ!eqcZf9Yp>A3X21B%Mjp^P4a2{YdK0r20v6x>0xJFeejC#83 zwXN@#^`dU&ZOfD39>YSxscj)Vj&&0@YwwcvcRIk`iIlha)XY>g+ErE>8X`=+AOpF4n~tT`WMH5 zUPEi(*#p8*UY|IcOj!X}l3Mg6HUYCgA|j=5CIPmCu7`PpV0M|Eq2BUR_hwqa|(=Un$2gSTQ#PA_8lUM z3OK$jaWezfh3+h0tXpef;>PUoBTWK)|6@aP4m1R3$V*MMr-JTP61nb2c-Jd0=@2PQ zn`wpL+qfh%9a1a`G<5+XVwY}StS>OXeht|YsH9~J#u&lu_RF&PiQ1BPCIh$I~#Ne7tUoZ|BQEy6HHRW}%q z#>n#=ylC+Futh(kQ>OJ)|F@!{^rkHi^ER>Rh!pU{KER++*EQleMGyqYdJ{xRuiG57 zmd3LBwzm%R(mFV&o;-^CU;+6c*%BmRK}Rr!HzKwemTYSRG{e{sOpWubO&V4T0XLIM zGX>OMJ+HNfmQ9CaQF2ZKtu^xX97?r_LT(a^H4dg4XVDsr;xogAY(7_H>O`DCa&K7H;B8>V*1!26SW=mT0dlMK; z&hhBVYSXh#>)&j!YHuYAZrd)kip1Ni5(tIH&OwGOOEI6%P}K^9L7y8 z%GQ(2M%UZ4?6P)4Gi%^CUlD!8|NQozK0W|M&>BLrvv3zm)(E2%ZBszX#wQ(*m2Xoo%t*XzXa;PWNot$Bo~!Z{lamKI`=9gXZ>h)EfBi6LMh;g_SIr z4a>ACdpjIS+!AHN82S%-#(+-){fyz&dm@a^mh{@|0(kLGuaeBVM?oJr^#WBnhteEUDoiF*gmDj?lVM+x&rKUkqG=@+;*eq3lLS&L z()ZbQVsVo=GS)JNhGMPIX|fcc&wijvy+yvDZ-=>oUMEUMR9i z_tv?^8aa2@Sa`0ntK7+$m`88Yn)sVa)1mP3#~&jUiQzq(4J#WyK(RhYSjm(GPpHhC zErGm{Xj^SI9wO~6*HrG4cMrqSF7P+M&^W#TzJ4zWClO8>5XSa>G=be3xVfQRy(mi1 z)D^-o!sYcGNu-glR~Qa5#0lw|R_g-2los>MRFt+Qu@=!v-MuiYn%ax$5Eu`ER%rxM zqACjrE>PEng~d1c^qW&A^yOnHES1X99M;i?!WK)5gwvYt^P|{Upnl`Z2;tZ?B zC2_)rdsLm7DPdEuQI$(WsO^I>Zj974-n{-A|Ic5)#nsh0da1;_;|i0Jz<>Lv&(R-@ zu>asQ%&w2IUe9l}oSXwkQ-*b^@!`x>De|}95tlSc^`-7q&*tBK#Mf@A#M%p8X z>P^0G90DIbPyiIlvM_u$X++14D3c@!@}j(RG-5X;KS0I0@CMx`)jihJ%mw=AmG^De~kG`qI!FQbxE7KZDA}M z`sI6inEII;&0D$yW5k%Zp`Vi>J;+U6qY|YDc;7FC@%4dLdQ;|etXDInynJTErnUd6o=&(+Jav!e7i9@Z4de zt)%P80=jQ$%+SxsI5J?4lVlG+E6=hDgMa-y0h(6hYOZlOCBOdVnyT}6XD&q7pE!0{ zBXfjKJMFU}D6^%(mFjP4^E|hRz-z_)alQ{$>3e(<_jgRSE)`8s8AB8@gdvco5jYo! zq6B4`qpCG{pf@&O9#HXcFbxnz5#F6O$YO=?|7YyYx+FQWGqKOj%y*A9*V+p}0cb3Z zCfVqw*lLo)p$_#p=gfotgdX%4^pEtQ<;>wob4ZaIlD+V-7c`avs!&_*5s|U^YKtDO znY%|;0aCpbx;is5(!>4Qz2E&7;i0Ovb<6+>pQT2cL>OcqvaQ5yQ6jeF&u!5?@5TT> zc+1DO(8x=&TYmSxkFTFM1m$pxH)5BE=xn6j^>m8~=2`WX_qws6R>0ZC0$Mg;tp$>S zSTCMpbNvFwVjUhQV0QoTHnQv$s`;j++V{5@u_cK1w_{q9KaK;W`?@JN=II_k$rYzS z?Ap<|S=(U|pM665GZe)ZO(QKY%Al$Zk~jfl9KIhR$tHOBT^~6)Z5 z{Y)XKkoP0Q9L{nup%0lD{0g$Ev6!90V-XH-y#?V%^oDz}T1qwT7SQ9w-BPl~?D9FH zcnGCxa0G3{mXZ~uEO!h5TcW2i;7nMD2ZQZ;hQ;+7|IaU9;varB!_}hu^3R_v$$e9N z2To%EUE}mdIB7gBwD(%TmEca37VKk(z=H6(xYj+*k(OyT+tZHC9FsK_k z`J;d^t+MX?mRvfGFFYLWG3<>rd|@#8m@*Y#ohzKpb~T56eX8R+IW64Pf*A6QkuG&p zSUVnkzx%8)yKV)JllZ+Lytm6Pc3^l>0aMR|HU_@SHM6FEq|a24QlV*dn?mEbf#U(g zc*wASFac*AMRf_SIXI(&#TgLC98u^a2>jM8^4{G;>`m6VxLo4&szw@j2AWX_%$E{H zNfTF58N4`eAT9rGG9apxb4zKV5p<)q)6TYlyMFyTaQpYYyN9+|bv!|_xcCCHDO+PV zVqN=4vnd8?fcb*36RGHdbT-7kAh|?e(-qncPZ&^#QC1yG_+Z?T;cB@nRd8F4n}A^> zsY{U(_|0PiLyxV|*UO7;#L{-eElMh47mLo}VSfTN%ERqLhQ(UpY)MA0-i_7HQ8VfMk_Rp!kwcbPR>gRL91Ff>(7=pT5L$Coo?%QgP% zubv_f4AR)cB&+b=hd*n%Th6nJ(o+n%mfBDW2bv2JAjzg!Eh#nW+h?!vcfVNTvnQHz z{%&&Y&3A8gyk3XmPG+SHgphc3VXyg+x^K=6glO7_`*1=J*|wwt9tObOLmTSQXcCDx zolOa>n}-YYbUB5U1hmo6+QVqTNls8MyYnakXziM`| z$i5BoP0XsV2x*g&Es;{0*E=lFyODHmzh{%v7Bh(yrsDurqan42H0IE#&8(IK%yu$ z3CeAD`KF5b2 zs@C4y^E`-yyFW&0z2p!_jC3*z2s+(HnZ4MBWytp22eX)f zRR@q#6C%SDaJ;0rvw6GLhb z*UJivwZv*e*X6H&D)8Wua}}i#pJKNpVNX3>Vc&~A$)=bdJiyCuKf^D6yTr3o-Hu;x zBs|{0hg|^)cqgfHwkvH`r5%5hu+yMAAF4F&975MQZIN7PNZ%B)tUDd26Grz(m8zk8 zaWshW?t5>eEY>KC4eGi=p693~Y3q`xv-xeBZu!HkT@3tA(sD8H;E0<*I=naY>-t5@ z_q!3Z@!o7Rz~=M+`1}}7v$b>`_RY91qqi2 z2@r)I!Z1V_h7ck^97W)bf>IJnc^G7zloehA1qrP+l5~i=F0t9HvA8ZEm9Y(khbRCp zuU{vl`l3s#e*ByYylZaiy3;|n&$;P-$D25>D{}7h{!f4Z9DniiEr!Ek=Z6)ihuFXM z5mxhWv00t8gLM=QP}K^X+_asN^II)iC|RQ{RuG(Fy~*+5&In;Z=7#9e7@U-& z9ThFJpY>v*1_?cwQQ#r)8Qs*99we8Z<9UR+&6YJ`U$w#6EPvy*`al0!;@+L#;O>J@ zAbg*w23msgfG8{Wgu1zD^epe|?EC^nX^R#6Zf8vPh6lADK;rvd60m1AX>RKjh+edl zB@zaL?v3*q@bTLgVDClBD=XQ;hVFyqrYl&CS+0~lB#x%QM<2e2y@UIZvc~24Q{Kd3`8$A2=Yy9w&KW+;a|DXQH|KWeWeD!OT`P>F{ z5^W%e$g$w*^BJ}U*`+Qwme6Ns`PM~I(}(5Kklo4T+C69R#q5@0y(N6WVFEC(GnbiX zAKrj&XqSmrRhHM)voa3-4%|cUA(2g|9+wK(Y%3VU(bPExS%6Kh@#<`g7q1q$cV~(s zU*YO%j;hY#`wUSOKq(F1r&CR-235Jia|v)XP>qtL*EauSWg z?(ZXxHqjB(+=g&l(1++i z`iHlzkhJN#wpwxdeG35Y4Mm#MSc;U82McJM5ixs_}i#ZU53Kw&Q zJ4b7L@y&)dnE~+f)d{q!=|Ryp0D=iDuh;N>-=@99$nzCs(_k_TkPSw-b6nw*cT2oD zqZsf;bxe476ZUOnU6AFieF7-~4J8dWIoEN*mib`9B7?L+IN zK8AVi*uN7S#u$v22-73HJU?w)a`gQ5P0x>C-3S74FV%M3y=> zNl}uh3*vQYOM;XB?DT3krruFu+y*)ffU}vwcC$b>+=pyRY*usp!!Kv}l*Na?tWe8oy4p!|8X)G*Dbm+X1?q=Uhbh==d?NQk3PDOe__}7(G`5( z2kN5Rq^B`(a-lIu3NR)RMKSK&8shPjGt`YnQ3A82-WgqAp5@?-o?RtN3`cw9@6H&C zqJ{zSEsLVSW-G}u+S6bj0m^}I;0p%EfNM!Ph4W?Ch&YVd72+u9wy5slj>GO+yG^<2 zjefj0eY`0T)N}r3aRw1Y6wWLB1VV&pwA>jNjM1pd4V2Ptth9S!r}uJ#R0o#3vBr4_ zDMgyGwjyg9&x9obCJ}v|!@RPD?2`LkR$191XQ&tiqH9V0fX1qyd<5)I0(|z3!Drt{ zYzs1oOJgcvRZTLY=@7WR?;(wW&!6O2tjSyI?jexpmF;{4qA)-h#VE=Wjil|=cDux2 ze1tR|V=|tDF^)LS@YekVtJMapZ3)lotZ=pM5}es#zu4p@eVsEbWXxc-?Ycu{IY|d& z>LNA;T{oq_Kl9M@fX~0#;IHxp(!pW(!80=E(@NQnrCUic#_Wn)wo;isKTGIpP5?y>jivUNJa3kGo*V*x_dRt7lrgwZW2h8tS|JEHm(BH5Fy9d9v z9j&7{Yg-JjQBUuLl`5w@FbgdTEaLxgui$OC2JxD_DFtQ2ng;`rM9P;>wsEK7wbMa zWihV0p_u4@Z?Ir)Pas1D$89V)r_=JzA$20-VSvB>vjmLI z@n3%<+vFZ)7X(oNeE2AV&kLMh8l2D74!LeTUUShiajqww&Z0fY!h zH)k}mY!BPb3{iB7>Cl7c8EmZgkBdXU$$;*62VXn`e)O&aIV-xhQ|Q)>_6Slv}a zV5~OZ%>z-G(;(Ty#} zQybLka8h?)mvwhQ^vTZ5+wCUZ0pnB^ues0m(y9Ay9bQjT#F<@2=?>p?5*zMOCw}{Y z-s@^zkQY@`qO59o(B0-)bkrgTf#em#?SNywTEG|$Ap*>=b8t@~j(yCpx9~ZMF@52I zc^Y|9Q{s{KP}NlI=PN3l(-H92Z4z0}uIc^9k#(ua>3M5YpLKUY1b$B+>g{^gDgEaA zs(&ChbqUX7@Pn8@_tE|%=!-9~U7uSG8Eu)y;{&|?V2ZDvU!knK@j&SggXnWkqM!rf zJVqq!mI~2yC!xCuHif;}c`xx6y9{La;0)~;b+PFA2wD4)Fo;Q$cD=x4Xz<{e^kYp! zys+sI*q<=Gb;rYI>*M)p-DVvwHT;wp#d$<|6|G$5j^AW;Bo*M>pFJ4>3=RJF zpBfV4%DROy+(Fq`CxKCB4+7iuueKdSzN~ws$9|5Wx4YqrqfYq#T_R`Q1Cot?-S*h@ zyu38q^>%j$+pYcXdAME{h--~F5*VZ&-ntXu`DxwdDfFFMr3T{xgz&N5u29tyd7jgA zYYERqMMU2H3B$!qQ4y*%Ho3L2wz^5@QEdX}2N&ewZT+fFIn?v0R+u_|6CLJWerRvfiR9mZ-~h+g&lnA^Zr>PD(7-9SgZ_ z#We|xncZ+~bNT=WY3HgKg?4W3$x^mO*JA6Q#HR(|aU+$+bRN-PzvyrhXUF{P6kuL~ zpZ;hMLEz()A;)s(S9eG%8 zNOSe~|4QA1Q?WbaLpKtJ0U6sl*H&eHh0bU6xAO$=V`1OruXMRE)*eNH_lPg9KoQ`| z;enoD*_3$tAu|0?^i6-!)4lJWJQ<|_B&{R^DceHQ{71TqfTT;Gx&x`xSfNir#0nX*QvVk_;8Qzm9nP49llnrDwI`) zFyIh^V{c5q@0}xo^_mV$&Vb1%z+f;yRpv0-z<|^%q4kQ1q7Xn0#;A%O?E%Y;!nQCw zcI7V5aXhg6MJaJU>$cj>jjs(vm-bv+rwj+tcwUEdML~Bs+$8cc5BTZFDSr0z{~pu5 zV{k#HX<{}18keWPMOCcGtx}WAB^Lqe%@QZ)IZC_ra6VAZJKH^MQP8cJmF~DWiJf2b zvb)%CN?5*`gxeo+{9drC&$|y<^^&5`=fF0vF&q#heLAecClh3uLJ)Aok-%t}q9|zQ zcyNcvq=Pi4&TN@OaD%$hv@$MEu(vlx8b`Q$D@IXNXrw}#4B`76*?_vMvRJ_nVq9Im zL@j~mXA;8{*dKeCj5EYhj`c?2(LLg8g@JX#RP=z12Eb<9X}qeY^9tLR)N!;91-fU! zgV*UGu3-K4i#dMxyWir+KmG~4AZ>-C9^>TL@R|{y#^a|~T`r%)bIj{e>c;FQhngGa zYp!FcYB!QlvHj>B>Ka#hPnQN_rJr7zwzHCo{M?-;)v?a=a(4_fmOajTU3lQr_f}0O zOn%d-;Xv?O5?-2DmUo4om>IiULF4U$=I--yrglCD9^D6i_t+*YxnhT1Gs_*aDY{(4 z{+88I9E2c3t?OQrsQdYCtd=$yjRs(>#3tXOsuU(;frC8{T9Yt(wOl|OhN|%(WsRya z*p?Fe;{bJC(>5~-!5G8!s)R2T>ZaRtI?iQaVT(WzDR(+%m|ZKpx>T(jY?~F?071_l zJq+mnb<`;5wF&s^-8GsF;P_nWkplp+aje%9#ub@nb^|omF zME$63=5^`IflmOq%TpU#66tc&jX175GkBdb{9RG*LUdz=>#n3r>ahj1Zh)sRwzzYw zF&;*CJltS1iZR_gLKvmktY^@gI!6N!Q9Qu?J0YraOJhl+I^v#ExV~P(8yh@$>w`8` zrm0K#LDZ5)^6fQ@)|l?yf!4rVcXGrLg9mafRZ4?%;NwRg#skw@J4;0)pf=P+&6d59 zr+4}~`jGat{yn~W{Hg^& z`{r{y4{+a;+p-y4GqRzq5a&CI8x7;(nyPa&Ike(0R#k}KZwKgl?gEe}6%^}~#$%Hiw zbX!eVtkA={1Si>3mJJZcF;<%jQqm8uYlG1+B#miVqLCU`3-VM;LLdqZHo2muR~R8l zGSqcJjuFFx)1_sfz}FDvFxQ-RQSUePw~~aMe7>qwi#|T zaQeL@qSJ7;>Q=LZq!T#yNrvW478~CK>biE(fzX@0`#NWc&phDSsRq0PpFJ+%`v!Sw z@Zmcg%k@h41;z~S+`fao!}}PF z4y_!gw4Un%Rk4Or4TK+pbAiR|6tXEW9mmMBA&O!PDI17dL-`)E#77bXMO9&2XlnTl zu*~hkBI-ohSz?KHWtVC9T>z5lZ`@2*#DgHg@%>LB>l}5phA|qO>sQFvm&iu9pk$5n z({J$m-+zXG`qc}}S7t|`>UQp>-n9*3-=Ru)(|gkv-ftSZADmzO*7ijAQjc8Gb@!j( z)Zt%U_gr+@t~uRz{c(ERKIu8Kq}nX*yw`iivhBzeMI1s1TwR@FG#ugM58lCMy+9O` zA6l`!Mp+h!q8PlXAw<64l+k;2TSU*Z2axSzr6O*fQM-p-X}6%2wHkL_wEJw!3i#riITrJC93H<7 zt!g{^`((vSCT~R7CziBEUb1c+vjC;=J9fJ^U2)nQ)6JLK;x)`DVZ>nvH&c_%cX(UB zhGAJd+d)bf+TjeYh&eWR5&>sd8k1qSaeR52V_O2-{40F*thP5{i6ruH|JcK(P*|=t z-oBS&Fi5dpU*q1LDW1QaBO6YUq+`N@xIh{mplQgplXD++wIv)N9YgpLW*5(_o-)B; zw1?T{3Cgm@Bnc2F3Caq%ypASk4}!*j^%xM+lPHOP{-*5}wRnYJ|MH*k?4)WP2;7!SFmiy5!tNnFI1u>ZyD4rRFuZdwz;?jDqv7SBAu)AMGze{3t zsA>(2Ermh$oNe6!?0AK)t908;uNRbC*Yx^<-)+JA#8B4zUS;0w0J@_bFrDDLZ(yku zogeEQxOe0si3OB$hK|5=dH^YFT%12cHk?8$h3)1V`F4XBC*q=xP)g#}*$S(*Y0VSeGhNnp5uq)RZlB*QrV%|1 z>{igewu6aIuR1NI?lEfj$H0I1n|CnTzY9M|ptXe74MedyM^hJ_s=pT}RW<_im2M5m z+-O+K&h>Gf)0V~P&ilEn2$yjoncJdEj-IW0r=fYh@;c1Kx1jxa(A~VToss>J0PDI2 zl09Mrzq+8;`uJ_&EbqX|lM6b|hpDxE8F36!ime|_rWgz+2%-dj5F$7e z0u=cYo7EMJQB=^lPZ3&Lfq5L${rk{b;l5@aKQb+XrT~HTdOc5~o*I5_MzStqSpdW6Di#Hv4xOu&^>Z9=5S`dYawbZV|ZW!rQIg!>-XQM-fq&wnz-AOGa95kv!o@dQ%Rb1dd(zlV|~MM-%cw9#N5g8{>4 zwIB(C-+_rm)twy9xUX*LMmx9Q>SSO=m{n(h=1$YT<%U#rst1BPv28)KZvV7&Mr!Ze z?KW6KP$t~$TH~`PgsZu@a!0y5-19LVXJpqYa2`M@ii+QCx8U4IHW)(6 z2JgQ2BXFC?J{oz*hWpsAui$waN=g6>O}%Y{Ck~qiVX%di3V-`g3iFl4TWt6G{zDIY zBl0$Sc$?@Qixn`;IR5B^0Uq4H2PrEX_eIfLvRPrXy1*ZvG_9M48~H-Hd^ZQdG51|qDK!IBhv6NU5~W!A-^ks8lm<(Q5`RF#A_D}(`strq1juZ(0% z3Y(mumq9}B#}^E~@8RT9wFgCuJKCIsTYDW5mNTjcx~Hj(Z4_VNcb%7ejTfgi9)I?C zxOL}UMDY|sG=$L#!q_}JI%zey4J$BOqHdbD1!f+gY>=c|?e^_vjp~SF+k$S4D6~fN z)^0+GT>_uO3IdD8#9=oE4ARbxG_wBQlOc^t?$0pg$V-ZkI=Q6(FNx^;fB2q{?Y3x7 zt|;{I=;0LiA3U@=I}eY){57;zD2gq@FtRd$G1kiqTwT0?Rub>L|KA`T9#8_y^$D)$ zC$w4Q0?(hn#NolnCS?=29YrznTwyxhhc5(#A6mcl3|s_gssd3mLKqDw;YI{lU0*L?sno6|G3UEmti+0!_eQh`_~;$rM?Z*LK2#K^5L{q(eTAYd zcZ?{d{{H;~XL!vC)U(f2mJoFT03ICEYYkHmzVMKj8l#ki@nx-%#0-La2m&8Tl7TUX zAc!b*S8LJ1EaOtp$wtGsPN%MT z#vw2ng%}MJg#HpQ&Lmb_>qBShPf^e%?z}wjQJ!u%UI6rZd9|BF^~IA7{>wjpjlcP; z5PL@_2+Ad7lS4%D1o`^BO&Mm4L&_SmE+KW)sqk5c8%ZZv4LZ$}R2>OSFfx;0!Bc<(+iUsFMIX|;C` zfz`T%FBop^dyrD1tPN_#;QIlBC`D6O7!C#q!Wf?Cp{@zT6C$ujfC6&EjZ!7ea(>x^fUENC*3< z$}Ng~2`+p{*;t_8M;HYNRfLZoQ7+r39~oTDD;(^_v{v41TDrg{xAGp=;QZo@Tqzmp z2ep#DwYb5pJ!|t(cak7wD&i|ApRFX?q(oLOHiZE$tH8-*PvRM5hZL&*kG z@z&}?Hyf1Y21z;reBj{lKKvlUVs-+pHKHg*Zc|={!#(UBK7{Z?3S!_9wyO&p>PRD9 z7^S$LpFwMdrm5_fl?uNfhG^;v+8Bf)z-oDkFdEnhFV^A=!jJIc#S3_l7!I=*Lky!B zj0x06V?5qRQEX7xC8lE^N^2|@*N}=nbW++|vf)1Ygi}-M%&+zcA_i*>l6r=GuR?Bk$3QAE$^!)%yI>g%#Gu*p9#%wmj z@!l1F^#|bjnR%^KbQUpT(CI1Dm^PD}f^@4tdY2;40zr6e=nF7TkyeZ`+ieKDd1kFg zn=uA;RiUmcYuhba7lt^FP}Uwe-;f3Oeu}e;EiPu1V!b`JSecve0gEWLvH5S(fi)96FrC8gt!!3(m_^sywTma7H$hpM2 zj6{QOxnz3d{mBLJZ(kI6|NXBCauERp<37^C5sK}+?X;9^@bxz@aB@+#nR@Pob}g># z&F;=eI!ijd%WY1|8w_P-S*#8-DeKOZZI}ViPw91Bj+rvFDRi1GrRhRPc5T{7y6I-u z-DV~Vfo-mlr6E?=74}BJAY~YhhVcE6I;?epFdkTo6oKJrA3+$Su0U~T#zPRMU|gW7 z3nJuI8{1(BBHC&V#)Wlir50Ul1>g5k76gQH&f(jC->k0?R9hs2DXKz|Qobp1baaSs zpFW0?_QTIcZN6U|55Ty9(h^NmW4qnrdPC$t_W%e%Id(t&VTQl_**iGC^KPdL@pk<| zkB%OosD4Z9ecK^$P6vZ$IZ}6SAApO12&YV-X>!Ez5Oq4nc0GgVF(la(aWaCGHAa&o z4AwK0#hTu$?ZkpGh986&jspC-e~#H~4$eI+mI{qDEy-AEU^=k4lOQ<3c|y4jsFb_G zx-JaDjeV}Oa<(s%VQ1Cb=4o1^#mNwOaEsyIv4?|cj5~MkVldo8oQ@F3b1WAPv>~4< zr8$HMkZ;MA*AHUs?;qe#;t)z-;Kg~p6RhI!z&i)zOYh`6X+-+g_a6XU1UTBG!>y`F zY)sufk$RQwh=uU2C6IoNVC}(!QVL;6EcLRiP?jZvK%h~;-Z;do(>02cHibz9q_KzV zmBA=;8)^^tZ^fwU8g-)}I71MGn2bD(w1(gu7xRj2e{4a%UISWJ5ZuFL?ey;s*m%u!B~b=?)m zO-?s;WCg;LA${MYyL5s*KUK)K3X>tNf=M%(Lu-Te@*GN$qk~csaWZVjFrYx1O{_dA z1mgl+1XwOk5Ck!Nqgx`W3+`|jLKwz?XHXP5nz}+9rwGCXT=>Y6eatRjAR7Q?bp?Rq z#q%%0xewnLC@TeH6gX$dGLNVeHo@5#DqKoRRAmL`HEprd+C@SEfAjA@#&qvC;$%qQ z2Lr8YFpsw%LJ*~`Rgm8UO5>pG5}rT*7I*I6$7oVnPc(8S&4!04^CiM~fFzqzRG4aD zj6sr35G6y@`;o@u=Nj{+!T!|8-9vHvO<>=iyAi0iIy%QgFpZ>+CLyRYfh~fbbj^9C9EKwC} zXuC8q+U7w*VLm%YnhjtKu)MqiXBv40eDks)>6q;toQ7_H4BWqE$<)^_LCM1hZ!sM0 zlQ^C9o)rRL(4xyagm@mQF*s-NJO(L^4MZU-1GIt1JaEpz;USJw>b|7LYNIh3Y1}@{ zkR%C&2=LQH-5!*1cjd!w_{9`{MRMmLbMK@esTQF;Kz z1rRsJhsio+02ff`y6L-V6TbkZ_d2d9c;*pIhy1L$7LA!Cp=?Z<`iA{~&fH}UG zi>!9$d(LFPsOUm?)KZ!jF~TMWWSlEx5R;P_|^z{7aFkG;c(ZHHA?Tg$4KD9Z}9BxAL**5pYP z06%zpfWQ9tpW@ElckGst6J^`j{6Qnz$otLm998Yvo4msf+7MU;tTqzQpZpd-_~D4g zTqWUIeadKhmx_N=w%C|4Hs2AH7VQUdTd<5VkWGaoB}VUdyF`+3>@kM@y#`TsjQz;~ zNj4(Cam}!p&ruc&oVm1KtU1Kx=e)ARG+gSpzvg@oy8SvweGQ9I} zil@)caC$|K5nnwsC`yHg_u>{HH%6nbE9%1ipo`eE+djHy7@DTCzbl8*y5&kGNk&VZ zx*Qgsq&LSHL17L3wwk{vel{QTR zXf1HP-eA7e7}-$UC;-YzV!hEA4>=y(5qNQ0*+rNghy5(v#0`Md3FAfj9U2BJ&40q-j5 zbVz)QZAovU9qV*Y@YxeVwr#Y1b74S*&c$Fwp$%&&J9`QzD4h)Hm*b4K6Asv{YJ;;G zZCI4WlZd=YHpG4qK`9Dr&{|=;S)i&)_&#+^VVIC(XSN5~lx-K04fi2sjrD4V?S?{U zx7z|$O{RFm!5HiH8dX)IEGtA&fWdHzFiar)0Ckl^HZ``}99m!C?MHuvL*d(vtj2hH z8}K}gr+4kiT0yG@z8_(`xq|0;NRk*;RpEM7qP77FKmO!CKK|sV7>%cGT5}s8Z)BU4 z;|v+U{PHVYE=+5l=U;Ybj-~Rx95Fs5Lfb#&H`>4tl>MC#XF~%6A ztXt0_&(cMV)<}{uz&!YV4B1rJZf4*-K%7IP*%JT&AOJ~3K~#*ug+P={z(oMgd??jG z$qGlu51>?y!^6k;>hoV?lQ%fMq65oC(mP3wtY~!D8v$`_lYP7{B5u9yER0!CQ@FU^ zAU=NvAwr~sLqzEmfQPEgQ4|gGQX@+kiV`@v)cESz2^MSO6rIiJXF6i(DDCvKpS;WP z(R&Gkbc#P2dWgf9XruyTA&&NaFvh4m;$p}7wVw>*oHdlPsuN>&{P>-liXVhzXC6fM z_2~PxqEHEV9;(Wam9+)>7pn$>bqg@J0J)eo$ch?A2V+Rtw8attvV@^&G?K`ph9wl3 zEtDPA4U}$B)>ORRV#OJB#t{%lq#5;?l|EU#H4F%(Ki;S3J}-f9UIF>M%V}tXj|?qA z#LKV$GxE))6~?kwUgG;*4qBgiJ{@)nYpH?8b~}Q1n|-4GZ*NGTdBFWiQrMj8tQfsdxHaen#& zgW(WyGC)ymuvsr5{0M21+M=x681~u43(T*+#c;HbbTGyI>ZNt#yC2@h2eKmj3%Bp&kg`FXjBs%L7P4W#SiK?l9K`J^@)bV&YQB?5+$Smac|(m<Q}!&mH=rIw~049*p#+fU+ujcws!x!NG`X&kK^1I`W7gmMt2RHz$` zMmFuF1!#l;vEeTlz^hBT2F~Yfn3BW8An_0f8ilh0N@<%Phju9u*_7_08y$V0aKHz* z1s1atq{Dp(w*~4)KymKl-Z8^sxr^Jn(`lX4C>C1X17{se{jJ;d#)Tz{ZSrnZba>VK z59mW*ZFg-Yoba})Nm}6wk!v5LfNsL7CNO{01MFSYmr|V_$NreZ7akE*wSmXTiE_2t zV71x+o`z?D#d3-CK?*K>D5dbt*T2W`{5dYJuHpLv`F4pYJ_n4(YPEn=oqi+`bjwy{ zf%T>!>*Pp)b05Yi6#2@^3OsNjAZ3N+^##Hx1-FT|%s$}4j#ZooV4T{X!RQvMa)rs> z127)I_akU)9%hVc9X47hw&#CES&IT5JV;r>4+8wj#}k}h6s=T--M|-Hvpo-3E>}=e zV(;KS;&jp$8s>3mCTsySEzy`f)I$4v(R~DuwI?+b7TaQiV#b`IU@vi;IDrzL^`OrN zQ*h?N_f5;@cm7arvEx~2A+`iz-t)48?nV$P>5wgJV7@ZAfBOW#`se?QPyXb;MGzzy zO^y(TAui`l+qpBFKpg}gX4m95b~x#*e;iezk#s-*_@fAEHpb!YM;J}+p(cFOW9D@&pcbK%+598+_O27e%n23tx*(PBuNH9wA)3_If{IX zqA0-y$8a#hc(6uU3Dk{57L*I+kv!rkq^v+H2P} zFdZ^X#wmg@0%HPVFnK_vz;fMQs31)6=^sDBmrwtIsx~|6&0%2Mys+a^Yzn%0+`okZ zbvk)T!bja(Uq%77)vK-TvSf#WIYM6=cWmU=OwEFH&h`SJjKVaw24bcYYf44-%YefE znBm^-fn@}9l$AoBlLJK@F&KF81w$Am5Zp&yS1?B54`05(rZ7ljhQqxG%heXf0`8OP z6oK#4cy_%+;FHF1Z<-;`3&e4PrjaP}HKc5i4JN3o97;*Dw=o8?DZ#jpy2{}j>aO~& zKNTZt{gZSGKOBJb5U_!$fT3uzYD=;znAW?!AK~Tj5~evk0C61Ry$4n?z`JXiS2Qwo zv0NNM7+^F$#Bg#8Tm)1MZR#*QKuY_>dKL&4K|4xNCZgZI56%Po{yba6ZgzrQ)g)Fv zagD+#0T&_aZHY~8kXs9GCt~i~9l3TV45{Nfo9z}YXHvK+fLjM49=-DjuTHP9zCOp@ zw|!REES%<+Lbl+Iae=EYy8z;y^Yc2E}~=#;m3IU z(MRB3g?zh2)6@{cw~6Dd71tX>1Y@NLZzNKz-tpe2Z8UH16VIbfBj+9%rH|4 z%QdnD7!5NtQo?zCPsKRy-O4Z-dbnJe)`KUoJ~pWx0dv~+W0=~|)1kFV)?F1gJ>T@Y zp{>bm*?DRCoMOD<(1NEuVwp?JaWslbcfhGDY<1JEP6MAfVJjQ5TGc>aYOFU~crd6N zgD?!SH;u4bt!+EZ;CUQnz5y3L!Y~HsG~ONW`A$+iT2c7p+^X8w-<|fo%-pz(W#K=M%>ea8ke&QVd!Hp@DV2o0ERRhV!k}5 zXDR|FqXbe)aKRA-9nkK1e%l#WRb%NsQ>>RW7^9$UaU2bRMj5QP2Cps*1h2X*O%Sgv zjp#WPoUYCF+7fjc@hOuSc=C$mKHHL>)yM|YxD9ZU0C}At8SEhl5`s?Za&0d{kL6)B z&MwwiZFRej91S|(n!*B|dD)3F9flPMU~4gwP0_Op(KO~c4VMd81n-L8J9p`8irPwf z7#WV8&ZvtrrW;w3hN^FZxPtYJ8VtQ~N zMoVOaDVnB0S#Ggj&Hxx_OYts?4Xzh6FzzE8?AaJ24_Y@ne(Q`;QDCyNK(>OmzP;Tz zNSj^mhpm9!Xa$4rYnr;iS6}`fzyE5BLD~hI1_9wBcaCV4%{kq~*Ez2j}iEFc5x-gZ({x^M7qHUv&$ng_W|@wR;HV zj)u`OxdGt)hpr2Dow9}>q&PT!gsY3^?dT?DjWCQYjwmc`h#pE_7buHuuj590EtS$_ zcg*SktEvLa)f(GeAxi}A-5!8*0bwOO9-|c4ZDIY$v?K$|D7=B8b$@ft!5BkT=GbnQ z*ld=#UY1yI$)%x@v<;mt>2Fv!30I)DC7=eh7@IArFpaVfPIC4_Q9#eG(^ytjM`v)c zb)USSz}Q533LUXq31fPGksiZ%7$S)ns#>>mTr;`?tO#!BTI}SE&w*t=tV?MaWhn#b)XZapROK79;_^aRJAAk7@KBpUD zl+i<+#y&=)G48+h37Up@Qls%PI2VYLAw2sqYpuGZ&lYd;ce*%_@t&oOx5Ki3b0&tj zgPpoUO&iTM&R;#odNspllVh=x?ZGHGEoO`%tzuwtEvFB3Nj+Ly4v^`B51co;?+eJL zKoDlF4;(e7N$a}mau2VrJ9}jsr#eoOQ-TBmVY)BQjpg&*z=n-!KmVqw;W5^eVF?65 zY>Ovt5bLUJT{ioF>YA24zF<~x&k_0@Ix_ZvGGJC|z%8u=@NoAy#;fxZv!y{PE6Aq8 z-Xw(Y2N2ewz!=k#Ry73X%N)QNws}F(bn7l_w5Vw8b|JQm0k`%!US6mj7mP=D8Q#4| z-g76Hz?aYHz{pE_W?fBjR@9D=?ozrgE-vxW$GnTG526u@eBLu+WAGR-9*^+wjt|eP zi0r94Uw0{~<8pJTyNLqPS^siI)+f^;@SDf4r^bB#)UMR+Je!wvl1)dprMEbR)0a87 zL`I=67^PIL#{+9{CV!`5aQ@)f~KyJWkV>faCJ4qa5%tlG(lMwI5@hG z+2ua%+osa1NtQi|xp!z-D#P zg6YEQ592t(bZ?5g4?e>F(Ia}mY+vslHmxP`tz2<2p2fv@+eI+WEnkoIWJfnb{l2GY zwNwlZi-$2tB}re&eF)(}DG$qyY27%Krft;z8W^OeO<-{=b4P3F3y`%TtS%0Km#@z8 z-s}Z@KY<_8C|>3Z)Wta!Bb&L|C<5_aH`pfTh;Hd(K==#*T+UYb{L63f=}(T@-&@HV zb+rNGKB|hGJ;Ep@lB&ywwE9esb>O)J*Nvg9fx0fCH5DZ(UBs6MA$$yc-*UIOEjr%L z_K|aeO>S^L2Y?dqKVa~TY!3;>7_`x-i;B8H&$DKd4dN(35CC~uLvRmOZ7dNLh(dvs zQ3&f|rC=5*#kQz8SFK}`86u0ia2O%PeD4Afp zIz?j&DB0MHK)NEq8M3%rBRk%P^CilX&a5p8yUk4+(=C|Bwzy=#3GbQrc^2ditcxk{ z$bIgFbiPI|nZprN6U(MgV*1`Npx1ZC_WNUo$w)wOALp|g+rnTxU`Wyd_+Z@n2PH{~ z)oKlo6^Nn`o7Eg;nPW8G!|d`EHd_LH17G0sYJoJ(pk#&VbPr*aA`BBS&e7Br6*w*k zJhcTz$_7onLY#~&O@V_8pG3`J0wpDqWQghhZE(v8lTCG_U|}aGl1Pml+VkMqj)p*P z-gYLQ1*QzN-L{c*$QK^=$5i-XXyI^td<$El)3|7Vwi;p9$2_~dTUY!Jr@lDLFYM0RyvS`JpIYJ)K73KR?-R@<_J zADsVsSpmmW;GMURk)#vU^#&)eo?yMaL|H7b&6^gRa$CvRhPfs^7$b=~iyHt)6M6`x z)cD0O{sr&9_Yh$;gwYa8RY->i*xS2>-~ZurFyMH z(?`HL#sdlF8EhCG7N=K$FC?ZzuQeUyoI0`b0LUwY#DcfCN3y00QJ5BnlEGf@pR(i``vahUL@ewa12!ZS=6#jyN}~IZy(L zGMRbu-g9=Wz1Fur126RL#@!r;2P(*qCN+#qCL zNSdTr9312H4Cs_$O&@9fv?d8oUes9cG?wcISz6$Y`x5gxbxmctL=wlS>Ke~pmDm;r z(#vt@IKp^5LXwXAF2nOYWTQD9E&&+Tq3arGwLvzTb9%Nyl8&hDmt<4nc|MHQwABQ zY;?$B6%9iJgh2^mdv(1hB>$SjJP0tRZJ&6}XMLYjWd9z@#qj?fvzsI_rq{AI)s8z` zjq7EF-+XDXD> zru6(em*DNL#?12(Y6YJOdEY+I5l0^Go{k}eKvCozX3?PSER3;z;(N;hB1vR>onc-P z2L1Ai#ovL2v;s<7Ji8c-6Tfr3?QluB5py;MK6uxMur;=;S4fg6WY_GFZ(c#`y|@%u zB*_TVNeJKTdf9{9#9Z9a=;v-U!!8TT5OK^&b6V!61QK{~O8UZG$pHiv@XODEAH731 zG;W*V6z)#m9~M^nt(`80-#o2 z81w)w_bTvwiRI;2_?ut+HI}QAiu+NB`N1*nJ^Ue}DC^}k1oqp0OGoEPLkM}x>)%C# z2`_l9I}&@uM|mndNkmi$muMq>B4Ik4pHU((%6znSjy6c(2NA5%SYAKDYWV_X z4dj)<;X#e#lbA6_+$!Xj!EiSg(ikscqXo^>AJ4vh7Mj{4jxH{jrX1S)rq02 z7HHS>_l|fyeRd?U+*owl!`-tnEG#CI1(Z@4O%~9qB~V-|L~(}a-+YQN3=syRcPubG zVyrh6PERe)?mR@>w#Z9^G^P(@KJk#H5lK4I5t4Mm>~G5$mgIJvCZCkG0 zp9NurAc)}mAsSKkqE@BaezWHX5fZIvbM)FZWbJSutyK`P@B|Y$J)dzV+jl};S3v6) zc~N0o5J25&gZbhP`DAMaD-Enw{X+ub(HLViZz-AF>dAimAU+xc`w+~p;$&%VWwfff z%M)xLJgn6`)>YcQ*kfxIwC~@xsGm5z<9do@jrTRnG)jf zeI@{cAcWQmaU>z2$RCUCQpkFyH`W3hW94&!hD!t$J6O%};Nec*9blf()U$hFR$r#xzK?F`_7=?I9PmY&6Hs z)ibnBg)|LdxZ|=$!TR#Gd^`goWY5VFLXr$dhV=U_`jKv+MF8i|KgWC`V2wZ$`#3qd z#~^(GPlj9shlEbYNxTlK|aPhtZIh#+CQjD@h&@ll|w?7y}i`|^lu z2HT*_Z%|iT)OC(;A3wz>Uo~jhXwYK{!QCUUFO$Cq@Eb&-kAs;;6xv>L;!%3j6xs&j`_x2IO zkkY7x5$M_)FP=Za`L*ulP(`JYl_ipN)Z=~LULKk6ODNOsQ4V|rK?J2Vd{4n>17G^L z#LBN@o+KaBh@${XX$V0fsV+(`js2d^;kj%x2sBO8>u;OZV7W29U9w>fryDDsL@G@P zvT@k}S1SXhJLDyei<4~F;%dWik0i+G?fcYyHR^Ucwu7Dy4i<>hDSSVKv_KEG50{{T z3?f8Pg1XuE9#(El^F8{ooH)5@h7QYxaVky3((5(56>KbURAZ4&;{13Ek z&3Z8(VU$8^g{CeL#~GTsfD9tU=@fA?fq+1k&9L2EVY9hLAVV0fF+X?!|24$g-JA}a z5)9%y+-HbCcLYF#rmN9)HAWeEvS;ZCX*R}Wb_N;5^u784^ISYwOYOhs2k^WQS~ol* z3YHKBgsKACdHl`Ay_?R>0^MckjQ0o0}zm z^~nVuzp$vBpFA&oXt6^Vb3jU&K3s#aRsr85TvBxnWDuiiDm;C$#`StICX6G2D2idU zhVTTmQm~!}W9{B$ak~I1)p3xBzsF}2d%QMBYw-5;zX9sHLKp_*+}kSllNV^3dhh+C z%V<2Fqbzd96p8mmWN?X2X$WDFCd0EH27n(?p$-G`!f#sOW~2Jzw3yH&<&-ea=)irM z(xX~3Ne2?CBQ~cAD3g$Rh4TFAFQ8TXoz=6H5e|>;K;VKsbLh7O0r^ln?o`tbskzQd zc~=g}IRTRs59dQ9()F4JkSSC1+krRJ%PT^nPRu9tP2X$)k8z1@L2c)HXHhkVjp!6s zYYn9>>ZZeV++aR`Nh0H>Mv)h2+6LoM0%HsgPaa}4IfM)(KKt}j7^87^x`5~Th?5bN zY9RxOKm>hc_Ir;sEWM&m_4(mC8k1`#DgTZ};To zf>Ip^Qz`^Oh?rd!f{5HgEhCg}yrQvBLs&A@*QyL*kX?h5y;my1dz^9dJjSr!^7N32!VlcA7TaWJched0J?Pf)wr0sBUNMRIBU1Gbr##~b8 z=J`GXFJ-+TNmQha&^9^agH*Jlh&nmd5o=v_4eBaK(^R*(UR_5N6EF1lh?+D83UV7K zuXU^Ux+4qAzE#!=wqK4=vki>1GwIqI>FA(;*bP6Zp6A04LgQSv$V{Sl3#~1R$`A<5RG7M@8@%a&yZ7J1{OA#lpF#|N_d>wv7OJc8;>Bb9=98Cr zc{OAdIMKgLELuzjB2E{#R^aqV;@jtKkI!7*G`Lz`;Df4Ur&5dG`N4Zg(-(O8>Kexf zVIR{)b}*)2Fa(km2gW&Lurr7;hS}@7Us^bZytSqeFEPfTZWOCRB(`}6=?i3@MiPhc zJu*lvYm51O+;`QIP0?u6$mz^=hct}=k4z~KCKN0Z(1I8NKdXybjQKRi)%6y}5XHn( zu4ZT$OG~(Q&J>aEw)ei9%AC`S$3$Eg9eDrLX9tjwh@(xtW6sU(3~(uZq^|X4u1Uon zLv=%=n%zq*aprpa_|zt+-|J`yjvVHDM3o2`n{uwp7I?fo- z-vRedh?zg1YA8kc%jHdrFtAw6Lo8QYVmZeaPoKTSD2rh23I|PrvLFxlyT=k?NP4`w z++nl6f(4MK8I0}7t6T__#SUQ@qp1sAUp~d+;10qtMc0*R>YQ6y9}P>Mv}##n7n1jT zTO$aGpk{Q3Y&^qea}8@Pnx;ZFn!>Vmva@N~AElhs#ux=(c(;IUa!nv`9`MjM1nd)& znQr6bv$rTomn}?&Rl4nctccY<*wRp~F|d|4iXN}c&AyYKqg3>p#Mh|{`&=&W7}^TU z>&Li!^$lLV_!_%HVYO}X>WW4PXDlcLZKY=uiNk{gVW@}TQlqgeTGWk291fta^ntTO z?%*3bmu*}0?0?wd`*ntdKmF-n;a~r+U*VhQX2=sX!{wUB&XkTUR|09!DuJ6-+e_58 z1!oyrV7{0_*$BdFOtKULExDXT5nCHm(WDCpXsY6t&6AWN7pkD&`gLuKFp3Z-89YJo zM4oT^ZXYb>@03Lpg*XU&TwK>kV)BGv?=*^%wuD#L8yp>skR)_&U`(%es2hvbR-jcD zW!>TIP{I>rC3CeT=M3Ur31lfj1iO-^r+Cl&V3V_N9dp+L2?Qg?`&eLp@0c2$zD{uF zW)cA(d@sbKho{`-TKNC*zkmEMji!y0^8t6j>u!64i;F8*Yf)4~hh+^_#=7NbDfYa& z*`QCDbpeacu+Mp7^_IMx3hiu|v6m$`8`H0^xho3-x@GU3(AV(r6nJz;;Ala!xPZVY z3!$`t))sl$LHZO%y4_U(6pXProRdsO8;wAQ=(-wFl;Gqj#iO_0rwFBt#s$ZV>ADU@ zkz=>ppejprU5hXbxD#p-MlqCXQP(-NBFRh?rI3=G7`nFR;0X)>b^j=nQ>X8FXxkc- z$pUelvPDb494I$>QI?|cWN$sQKX#G31O0TKE509KvwDuMtzoT!3_=_nJwOzVxP!(X z08YymDPsol4gY=q9zo7BokH}!VMaH%Ft$P8DE5lgZBUpBfx^wj*ZAmHe}%8Ud4|U? zS}Zpjl5r<@hMco(mHK?z$m3{c3HJ} z@Zc0lI^M&3d>Gx~Z$A7G|J8r{2`-oBJI0lPB#GJmQ#$Ya0V_>s`tdA~!0|$2J^}9E z8RPKiF77?}9+EV}XncVAdFt=L@u*!TD9&gXdLaQB^I*qX53|p=nCq5Ngy-i>I$Tgn>p9S;{GB zG?p9PlgJNd5{Gk%C=4K_gzssrwz~JvZ#ZDKZmFT^6cs6@fy*13lICL;vRlHlNsLdl zl&S$dPviV@huKKu;OGvdRxS%&@&UHY=^$Lj_iS%f+;-$$<2A-_66$Ds`0dX3$XKQcO_0dqhR@;Te5{apWOQJfsPFpQgzq!+NvB zHt(Pfg<$%=Koa?wj1t7Lgp@v-ron1cplwS;af+j(JAl>5vgw`&k;G=RL0MKX%y?g| zYfQ%>k|g0=xCq5=#Tb+5wP23vP8Kk_w@B8yBldP%_3j43^N@{ZFh*lMIYeFUxW(^) zwuChXL8uWWvwl-&?RSO3x5s)57{Vjwi+e1*22|Je-b=#s`ccnyKeo3v@d2ow(Qb@l z8iU6UtcnHICHrh;>~rP!94^lf87QScN3tG^uB%YyOT2vcDV{%jg2&HpP`BV<4Z8H4 zpV?%@5--jPu%<@WIx7^7wr!!5CVe35&(efIdT=^R*I8tVKpa|JU2pNrU;LkV>#cV& zKe)#uZh)7suJNz_yN^-T<~0)Run~7Mv{6d8|MlA7{F?CF*@z0Gg+LSlNi1=2aERlx zw~?fCgi*%!Ogk8>5l11~w(UbEoLg(3g1pC8cR#2Qb=;AOy`PloL)J9z*MO$!&@_q@ zjEE`kL1B~%talck4`dM#2Mx9x+RVmr0){4{C%pyH>4p9{pNi&KaeipaohS(yu#L*sJB>%5t>=c4Y^PXP7PS zKswVpV%6Hd>bFgaVs}j=nxNTT>A|kpVNt8?kOAj7O^!3OANy^ATYk>1qJ!zIPy@D1 z^;s(zv5ifdP@8$Z=I)CVgjZXGIQ9@oi8xNM%^O_ZTw^i{k;Vect;Hq>9^MI%W<(%0 z#*kD24MwR4Pk6}EjEf5$fUYH8PZ%Z8R-ow&CgT|6(Fkp~gy&N?zSYbtb2)!(F+y|k=Rx3+7qV~|wP z6s#qUqx0H%PJtQ%?+~Gaby^l>x zg?_c=$UVy$h#amv9nsfS>?vtHkC^cU>}!1cYzOJf2*#A$B4Z#OwiUCmsgM*Ey`Xy_ zTnOW?WZ(7X_5qly{=;tBJ*cL zX>oEi#lg`XgkeGi(5^<2Z~E`E>soYOi#SdogpbJcA!UH7+#!laJ?)?@R^&3t%y{w- zFQB@HLmXlh`5J9oLBK;0*6<}+wzN$_DLOXoZ{7Xw=({`|+xsYKrLZd$ZdMJxda7}` zEb!+){Xg)>fAkLi(I5W^K}eoST6f5|7w|lZIGG>_Q_87yVrU*u9O&yjyM&;XJh>7X zSO&30OQ}OXQ#GDH`4xWgv%kWVSLh`+S;CkF->ePmMqT;}S=D$rocl1^^Z<3!w#?#v!;Uftsr!>s0zx5)EwaQ%l4Pjrs#hAM=@?ztK{83z zO$b5|?j|?~F^vHTAHGKv8sGP^%S&Ww1nGBl>G0UNtA|{Nn>GE@ISng4Ok0)>795|` zH9v-%%$HYy5hKVx6?jiFA%q|`IYMlU0(CPGJIPclO@xKg2G(}$?Jkg)rZ?CRBrr+?wr%my z)D^-o#(Z%CrCN&Z3dvz%vpOf&(IA3SExb@No)mE0mX9PI!Q_fYIRPX|*1JR=oxXuE zOrTVY?fMd3N6dE56aDt3EY@TrECWu9ZhBfk+g50ss>hmy0D>Utoj$4a3D7iK2ndAH zc(_^3Z+Atgt1bTP|Nj5QFF!Z8^jkud`1;we@zKX$<3Ie94{&slaL|QBASE`-7nmK~ zLz*4*QD<5;dn4&U2k7bLEY5a{3Ds4oiVfPP!g6_z=g%p`;pH{a4U(8-Tv`*L9?HQH z#2w~I2J8w-_>Lo=l@AJg`Xe;$0P1#%gH&gU=!Epz3$MrqSc>Fx-?9t8OSJ$M!@N7FPW#-Tt_8KPdyLyWQzO`T(P{S=eg34EW3!KY_u zsPYS}Hycz{#aV=+-x8W$VZib8j3H9j>p=z~>Z-Wa-MceLP7OqtaNGAd0-`ABr8`;T zQ4_(6h%gA47C{PzI8I@WMbp%%>JG35oidOz2B5IsmRRpB#v{iTAgnD*Q=DIJamBpL zo(=B;aRcC-rz#dyK$zk3a+i)ZfD9;H1guhsBjERcbb^2Idv_qMlV1n|uZ3W%TS*?u z*ptV&sBe!kDkp8Z-V9z>N)7f9`&zMm$(j4_vL0U7iAZ-Pby`sfn1a6GgDEf>$G60? z=hwg_vzSg4w!0bv7QQFod9*DG15OGF$(FZm>weazLgFJEFW~zDl5C2qps}W|bNKB2 zJ{r#vMhUNa4LLLT5=oMw;ZbceJw%dC*%1-!C|R?K8f^xlJM6YM{jAZpHDN-6_%~fs zqpoSA7sV;k(HudLKn5{|x$?nPU4`}aGco3d@maxY~ zU2cH?>t{KB{+pj-lnDI64=fh51n<3bf_o3%;m(QdqCFGv$ZWpTd3c@=!&HlbCZW)^ zHJYZt`O9zd@?wj;w0M32Ecsz~5o4XELgK;*l%~%+j(~#+aq$8vIPjG`pt_bWEZ3=* z&A{zxTcD~bFoDRu2FnfoUDq34s4&vs3E23Nv#2n(PwZ=B5_d1CNR~2Ii-!P|ci6b)EJe(6>?4vK~Jsu^4&NyV2fbi(j`ki-2 z_|N{uPY}f;NHQB6I33Qa)z&2r4i1qdE9^=|=^+@BaAFoKKD(r9x}U5gcnoa!u;6~9 zZ3%#{>cJ!4@?o&tojKB&($s?AJ0St*WHN^53AAm?he$vvg{o3mZ7KSDoC-vt=xuT$ zz5$3J853CCHP~*}h>{t`;}~I-61Ac!(bR?{5guj5(SzGTFo%iAp&l$;r2Gg`oKY=e zhtPwg2NV$o52|aSdwM|#rMv#dwARAsV&wZ2Rcd|#lfX~P`^G>UBV;g+|*W$fEenofn2 z(Gb&Ku>Q?m+>;D=`@V;>6WUy+DG-J=!hj9*q{QOr4MZ_X#8x-Y@c7%W5lDgAG{bay z&@XAURt&cLJ+G>5o8AN7nQW3j7HyZE^J`h=oJvIM6d~3O>iY=85L)S;@<1*NWYZIc zqNhtZhCE$3)Ooe7hSC~YA`t}wcTW?ftk{~4yUQ-BXKNq7vbFbo8H10PIA)PdGJUbA;7ixr2? zY8WeVwQ8{~zH8*@HbY@Z3zf4YfhhDCy!FsD3Qf}?2z*E>p_IXLqmY*tW9CK${$N#{ zr9Ps-B8mcpVT4Xq5Te0)N8Oj$%OaMrNr~{#IXD@#v)CE zy=90%6p!J{5OFer=lKXj9~UEfJOD1(sn zwQ-8BZTO6)h~t>f4S!9-6Of*S(FRFG&j|%#IMS^~*L6hlWc^3)Nzq3*4<2Y0ZJC{$W>dt;bPtkZ!l=>EN+T~VzIq0n-|SG= zzkv{+;-CJbcaV*yXzMissqt_Awy;iFYG%3_T&-#`W-sl#1(NcUNUqlC`bI}atYSm5wrf~IMDPFR+T{>E=PZQQ=*$7C$}tRaIz zQL!&Ka{x94i30ad1RkA{OvpJSxaEh|3UNYF@$R#$t1Zc>;NxbaaI|QVChV~A8c)q7 z=QupeWfVFb%bMFZ)Y6v_p<4ho{qGZ2^l@*V=W{np8*wSUeyZxa4y$d4vNGh^u4%M) z28G6UfYmrYl#l_1f?QnYSZ^CdAxV7>r@(X)psG47w=A<`sG_Vb=2IVwIpMBJGQ!Q; z;Q7U_53UGVN#mAuLI6MczQmvY(;s3oUGzAv45Klcdh=TkcNnMWOopPY5Qo$`?Fw>Z zxFN^~(-F;{ir3Pkl=v#veAidf`QP~7UQ7}n-cAj!3{LJdnA2S)Cu=@p#OmRA4{uQy6-6ql**6ru<^(^>3BRp#j1hHLk zbA5%I6>VX51@JeYDtJQSZ$AAP$8*xnefrHXvc&A}c+0WM8y;4VMZJn+(qNcg5(UV2 zD_Tf&Eg&S$?!Ma_!?}nl%cG(Y9=f)GF9USD3PvkZ?m099EGsYz`5=f=o=84o#& zdWhqoch=aKQMqo*!jLze9$*;?H?=6r9AQY2cjGLAQWZJBGM_RI1LTE<(zJZAhR)T? zD~mJ*(p2N~ug;MqBYgRIiOue|Yikm*MLKVb|KyJ!U^1N(DL14oybR+B>T0#8t{;9} zTrTnS#S%(WQHt17V!5NPXp_^r(Yb=U_I^I08>?!DO$r2iW3zeJ{%C0J0AzLwP`ovS zTSxoA7vI*sr%|VXdnXds0+Y!EVVEFECzwtTuwGrl7_+x7CK6{=lKd!1$0U3;2Fhw= zqXn9}fYu68l%lS4?6zxIqmhj!yb+`pylY!1MQwc7(IM%&dT+xz91a(j=@{o)w`iNH zXT#sN69zy0#Anf6OO_ulea30TI?<0+E51@(pc_1$D)AVw>U(v$s47E;B=eQ zKY#L`z|(W!a%pL#N&qQpv`vkh>zDZItH;Q)2*L|+_x|_yl>K1$2F<)M!448(-(k|W zu*GaT!qHsen-{vbd2#ZsaYm%zX_GC!z8UbM{p(|Gbq;hPu3MJB|sy=z;G z?dA$`lED~_e77NMlr^0{M_7(R4mxoBTDupA&hjyb`^6DElOzOLw44_6{+klUcu3Qv z$C?N{kI1^3wVg_}C^nY}q7+KC*llmv9aodgr!(+<7g{k$p~%x+GOqi&rcgsE`fpku zd3_f}dP=ot>L>cw>bj1(U5=wip{a39!7RtIhdU=Bma8=`Z(4?9Y@f<5Ea8QDxx;iE zBaC9iQ3t>fl#}>~;uvw%a>qF=S9~A%>Pd|+pERgy;QXdWQIRiv5)VXSW9hS8aB$7# z)e`T#^EQGY?wvs-#njuqH*DyYuP&ZqwKW4bhS$a}<$2$+!MO-JhPw08UhjrLN~aC8 zz^%CSmbz3VER^2gEOs5ST?0v)ql4+-DZeW;79H6PTVoJKDRW8M{)QfIbOEhf6#2Tp zS<;Mjl*W=bRofKIjnP;foFGod?8XR`#fk{EZPRm{d>J4JV`$YOPNrOJ>Vd)BHSBo~ zXhmTTZX>f_tQ?d1o5$x^tk#H=DUxi;;iEpu8>%fn`uJ-c%mk(*i@c-<$ZcL6CgkjV zJ#X+VibLRNL4fF;BMD_BvNVD+632%b{*$|J;1|Do3f(Mmw2+vM1@fZA7azaEX4fIF zT3oGufj|4RyF|4JB1)7N0slT>`RHRQ%DmJ$8${pwit>?5(1Nq zyt)WWX&85Gp|wR>Dfm8cy|%bs51LbVj#@=s&tht@T&vZC_&w{sG1h3?_rl0C@YKESRjd< zn+kRDF4j1s;&n6!Hn~O;`LL!% zQx}AvG$kg}Ly`{FC8{ci&%CFmsn9kp0gy7lXiS}zofu4}$M8H4`R;}d?Z80*234`4 zn}Wk8_M?!r>d@2$d_O=K7OcG+FbR)2G{#zlQ9=}kwtmg)oVurr%N1Un7r0(l$R^+5 z^z1&;bc`s@&^9?f{p44ui!1yWe|7|846fH2>)gZNe6)n;(F3gw^H?N$Mzi2F-aALY zY%K8L?ik0%XE-{2ge05wxq|oaonfxwbx6O-!LAtZvD&8<#+-xi^ZfG;;Od(xI?{HPu>F?vJ?vwGn+c+Bm z?E+~8B$0KsxkFu*-?80s1<4gD zt@p*y!Qir?Y3%fTpEl9VaQ8e9ah!11N0b9%#47}WixDGE8*Ra9ly!tutu+E42tywy z2Nq>z`uA`)@sTDWqBzBFyF|y^`pJlvVM==#X98s{m~=Y0UAW@pJo(#>gKJ{GOd8;7 z%|?y<-sjtE>^4`JEl%0p7G#m^-W-QZ2;pI~zQD(yy`r&$9T%MwU=-2~RW)>2s)kp; z+;O=Cjk=-RO;v0F03ZNKL_t(;$ob$nT+6ld&I8NcaQou_{bJ_$UT}bXLx<+*AVnBP zD2pw&>m|3cfDj~o34$22#a)i(5<@(c?ug&z`8_k- z6|3v(3%t7A;rs^J76zX``4qG9XZXke&O?0fy&s^=m#Fe{{NSA_=8Izp;opK6oGF*_~U`AmMokqYQC8LRqXSl*1a191|F& z0j%x%qA|^Y!zp!GmWALV^iY;1%35KyB}q(C0WI6<67So2?9=!9>Y5Ju;S9(NjX3gg zvj)C>Nx$wKM0)7LMV);&_78?f*17@WU;vJz5ct8{DbghDX$Z76^?ILr67b8uVQRgU*f1E9ZI-CT%vhUUIJg$ps@Yc3_IG6MZPpO)rJruYNe!6I{hNH)C zHXK6G0BLM+c~fGNwMde?v=u=843{Pe@8$g&h!B9SH`$AKAyQADyH)nYms zBb30K_s-ENO)1%GAn=ZvjCpz(;rMWh+3bjmso&Ee9B?d|+hcTxdv^}ewH4;m0Bzgg z@@fNXflt1+_~h%4@Zb$rK%fLwZf|_3d!9TL%62vblkS_U)X-wMX_C05r@V5~(|Zqd{g z+RmV=ax_heAPCu0K4MA{g`s-Z??=JcO$r6C--QscT0nT{N5vu1o;tj?ZP3&;jI|8Z zdyHkZeW#_hLL6rhf*ctDN

      0!a#B=GdYd=GQcbb4iDyt;snKRgBQ=AB9K0mGKgcx z)aN2-fN|F0;zr%tvn;uH182t>jOl2pAAEm;`D{#Ir*0`6)oA$qCi}iboJ?UfrPeqH+WYs8QRF-P?Z;2>n=f_m zQKb#=^N$J`^OyJ+|6JhcVMibj2!;c-!X>AqHte3xt+K64pDyLY%g6xf#NL_ZLIvH3i20_?ISxopx&AisdEc zA0943Jbs?T_bk%5#iNIZh!a|{1YyJ&Sl25g8m%}?mmmpZao6x5PA7T?Agtk!Gh{?X^0 z!~)|{$o5bgMjM1-j3ln1mFnLwDP_NW&|0CW6l)l{+1cZ`S#~czn9=8Qv!w`01|-{HG6sTOF(n;|bb22fQJ;(eowFPLIe>$Lo3!*YgIRmGtP4IJLbKM3?mt zr0RPE0PH>k$9^r!;fwDn40e!5IM3%e9B$&W9%8;Cwq_k^i|d;eCbJdBlLd@c(5gkJ z+CGqyW@$^hz~}%s*RPVHiVc-ES}~ zE7zO4=tpZOss;;8b)Q?8NgVBJl{cSvZ1XTYQ>Lc17o`^8!T5PP7Wgo;o;e{mslJe;{L<;D5i}4wzQzd zMAuemngV6MLD#hyr@9UQfRNOCa6n^uS z#d15G7h*IU>~e!wH`IYy@S=u^!-}zo=Sd|S+avI`vITN`+lC&o;X$vj* zthH+B);!ZYOZSBxu!@A+g3`1x;OHz1dN!Z4@I(CoHlqsohpBhf??hk4ATB+ZtMR*yJ5P`MSfi zODe_=+w*+_$=|;3alpB}q=( z4S#Q5uzk<0z@4)>;&?=~lkxmM^6fbZT^ZyH1#KE+5MsNmq1gta>FAKUuF3(JOtYeZ zMF!vn==Q5y0xu^Swda})~bsZX%XxpZDc-*Yl5FRiZO;GAx zzvph-2Gi*R`EJ9GqY?5vN0w!X!j>8CExAGnzn2ElR`K?&=do_EsY^V0(ct;TV5`xS zIekhXdF$a6qwyG5msj}adD*XkwE@0(TtKM;=S%7cqJUl}knEvfP@0j_1U?6nK8tDA z^&6Xi{l9#PpMCf>-h6n7$v8o=yMpu$vP7V1HC|k_cyUR^V7X;nQVgyILJ&Ur*S{|C zhj@wEWQ4A5dS06o_PTZYWF)beb|`C$AQ(1(PhJv?U?~Z#*Pyz*zqX+Nm#}i*MSdMj z>H9oA0KR!a#rbMQ|1Bknr@wke?}1ZaI9h|FF}N<@@xq+f+c>3jI-ihzc9w*A^Wg;R zO@kym!h<&s@#5JR2!a5LwUdtf=Psza%AvZ3DK@%y%xF96UM%R(Os2=MRzr0y1K1H` zV%4ogXz2&=rG)BQ_%a}=SKIU&&VFnP2p1E|<6<228H}_Q75w@%!c`R;11Q_$cW#35 zgg~b()|(u{^RbwX$@6P{gD8p-MG2JB(3i#>1AaY&k2S1eELQ>ZmDYv2nba5U>fiHRHOnQ$lJm1TD)e?7e_<51S}P@ z;{_G6n!m8=n2Ou}0l9xdExon$fG9t))cnExrG>MTUSx@}DzPhF@iPofvld^YWkTS%<;W0MrWlscbTO!zbya5a&vREdc zZQ{zDoZe%$GI}jw%z(Qwiu6y66DZX(hCsO5wlMuz?FzJJ{NRnd5z;J!lpz)ebNJH7 zlNYxPPyvB0JnBsTl2 z@O{pnl)yU=s2Fvc&QcN&p}G%FfzO}N`?AURcxe&{_rh`=Cgm_w*Lhh(o2oeC2jvb) zg^rI8aecGJ$TaYP5#+NKrusi8SW5O$Dg~#z`rhB8(DPX1S;7h+Q63Pg~Hc>zyCm1MAoUS(YLQ zBCOXdI`4spwj+{nSt%^0A=*}>>kKyAEsl=3KxOe{%;$+gluQJ~}@8@O9)*yhzcC*E1S5q}KgE~D5heERt zq`47++zp3^&piN5M-R=Lcj^yCmv zo-bikiK9h|z_%#t2AiBcxoU;HR0vN}_|iw+YBb%Jw1I5;7Y73Kc?K{L9z_YPwa7*@ z(if%^6vc)?*aky`Eap=lLs=#j_?VAb7`UOrybKLSN_eOX{AL8rb}9do-W$rOAaSiRd*PfPeRRkc@2$qSUypwe)WrNbbAh zx*uswzU`+A;Pg=9>|~7N(|dUL-2`zIp=}DRHs9do`3)l3lH}cJ`2Mh5pzg{ro=FA9 zXiBB&xQ&)RTX!ch4iC?`u!#Qhbh4Z_%W*hbaK>qi-k(48720NpIH8noVLiyn z;tgEA{FsE9J>%VCJegoJPH?d-`*BbDgAGj33=c(rIQR5{*z*f=4uml~F*svB2cid( z{@wSeSmo6aRbAG=-4lt~BtjHMI6jC`*ECy)froMCp=u1mfPU{N6$nEgS&-oQ%M}Tr zL5J5G;P_xnqGet~`wW8SQ}nvI-+P}5(K`=AOfrGvlQT@G3s_yjm=4=rfxrFD6~28z znQ~n>@ZP{K8!jC8WKMr?AgO@Z4Hcio%tM-l{TS`+ejQ%p^m|D}+QFjYZm=D0;i6{o zs~C!?8Y$3UR!HLiyqbPxy9PvSBruwJP2Xo z`x03;f|NDdmU0m^8~aJ=!wQQep$&MRZ;+;Btz?aX$L<~X?}WHn=Gf*m`Y*Sfjmfsx z+k&Y~-7tbnNl>%&fgN{eX-a8WS}V5X&fxhHG98~`e)Kl3UVgNfz~Zb?ZU2EfFwA+e zyUxnk+gN~Oth=qECjehM)%W1ft`xnNx0iePL*@Gt9U6pD zg0kEqVBs<#u-mPBssiC&5>iI=f$f1J#%RtOB=FPnid3l%pMCKHKl><0Q4ZS^-v>My zBML)!%ua3_)~9I?fA{qYo1Mmbt9v<=yQ#wfxOXh@;LO9H{F6Vz;n7|E?T3GbG%WD> zV=Cak_kN6V7GgR(#L1mEF`69o053qP$A`0D;FB*d@z=jDk(b{kQ`UUQikdntA&B@n z9nr5XW&r}}p=}%7tSWNY@GWLz4{;FsT$^cPJRF}3cV5~vc zRq%a-lcO2JKtcu~vTQ=Yb5+0?lEApmrRxX`Pty^(*UA8+@rXC!5?Z%?VRI3CPWENl z?!fmYs^E?vulFu0Wg&S?YBLqQ+Jl~a3jZ_{Z-G z{NUXMq9{ekgl2N4@Ixfo0SQ^1i{qH1r{K313;tWwT!DM#Y zneTZpBaAZKfA4pp%+K-koD$?yHS~9H zXfSkf%^hWBz3cf{R5JqHx_uXMGIlszNE=YbIKp@e8D?mk0$SC0_3{h+yT3W>Sg1Z! z!edgc?&;{mb+Pxf^2S0QOX0k4?Um|nJ^bNP16)C=eY=lZkq`IJo&Z0bwOA}Jz+e$Y zMC6R45N#XaxXPi8L6-CYsCED2j6;SAW(T*NVV)&lAO}i@A>mld>o;A1L^hhCcB#pX z5ffV}a)3)*#c!J$t!lsn;qVF#z#t5x&K88b*eq)l!YIMB*SdS4hA{&N6X0s8aJ5uU z1;DV~mH6dnq|V>webMlLPAS@sed}_E2lsAu79-#I@B{qUGYS&<_{llIBBY}O1c5+R zY!JpHhi~*ZwvZ8?zF6VuYui~5Gwl0Dt+w=Yp3JGBq%nPl>z&2X+~E8wN8OkXSM!{$ zx;CAUKj-u{f(N})!aI)MKc%Ae{ynz=c7~3-g1&d*AOeqjlEmX%tc&Uj0y!8X$!V6kjer;06DjzneX{MObVL6vzv%HCK-D(Ts&#hV zWN26vIhsa61k7PwEvl+S6vd8tPv0Yw0fZDz)NK()DXOYQUNlHzVi9;6h3_hTOqem0 zi&)nhlg#3J-7il3^5>lsYFvK(McZixsN##pVch-VcDM2-?cE~g5k(QFVHicWai9}?D$%7L?n!7yOd8pI**s0&Kb zLx1a#z-PaDw-#9EmhdY@U5zhRt@9~jtS8f6uPx$a1f^;$u2(4YD>O}ukAC?EXICxm z-CH9YjSwdz2odkeJvu9)v$y!skJos6)zek%z?su`Syj`gAg3`y-CC@6l%lfD72aHu z{cceDqCf>Wa@;22Ui*nlVyYeQ>g0f7KBewsy)zITxPNzyS7#+SSCEe3&fF59sQZ!8 zpSw`FttoontAM-Y71kFh&-3ylsn@^G4^9vWiK^T}hB3IyrxcPnPlwY}ND<=l;u*4R z<}8Uv5Mhj_DG^2q@zomBVZN3zNZ0Ln=}uYg(9{)@bc|T0Fjj-xfOMDcW@l`;z+i*1 zZ6D(rT0(ufunpMpoT_(Gwx}C}`80C6*l-XT=3RAlN6oR;ATKqx`3`Ms5lV~kNV%qy^z;&KfR8_|@PqH>ZcH|v zowhJWL8%(5Em0L4oWJ=T_wU4*Pg^Yhj}oh`?U?LdD&yCc-l_7YoMtGqF$2#b&%A~m z6eiZ=Se_8-+xMP-Lf`B4g~8#xg>Dt9+H{!Nc3WeVaip<8l8!nrb`LPhDC)W;&I6Ri z7T4F;D2fV3pCL&iFdib`T|r8LrfKo^?Q7h*a}RmGLEF?2GDHwiJebkiiF&CG-fotV zVT2?ZbtFt5tvxgo{LQm#eEOp4{Ghz+K1 zKZVv$@S~p;P^yItEbg8PJh&6%Z-4q4%#^rw>l8c?n9NQQMp?HOfAY!4_#gk(C;0r8 z`cf>Ly_wHyJ@3uiofzCYq7l4mTH5rqghOq1{Rm*)h1A;q;?e_Wi73K@+k9^w4#6|R=_9t51067vZ|oTMF4p6}MkcN-ejEcvEUqK)cC zLGpB0Zo%gl7CiyCmpbu*#t?gg`k_#oF?0g-Gzq~uQ5?uZoW6HemR*6Wn+Abgb3XXk{hGU&(2V8DwJepKT9EiVPp9>y81)Rj`0P7-LNQPm1{Z7@zKC(XCW zesxO+!*-IGfRjJd^|C^ikjr9ODHJ6s>6@m-Hg6#W!xzt=Lo18Pm_k_7B<&)_wbH1a zRkBhFiP4DTl>B=fAIrFdx63R1tAG6p&tC12m$oa+p^G|GZi8YpZAd-9-MDdh*zI62 z_IN|X&tDpR{_=_vf7_lP_nQ|@7oYXw?Hf!+mtZhRvoYxqnE->rPk(WS%ccF&<+JCS z!9Cta?g-(Z*@;0&_2@L2Vzo$Q{%>59uPcmer+MR z!eUF_?$o&x7id22WgB0-=^4?6^=6MA&k|za>B9@BeUXP75B0!i=3ol^$@eBWJ~<}G zSzbcOu;Wk>309)6w#c{F5Hdnt=a|lJqpo+z!Xw1#6qD%`fPm61lm^y0$L*8YK?H;Y zDHmws!(KcN>M<%WdLBCG_U4+sHGs$1yd^Rvi>oh5d3eCVz#U&JK$65{PT*L;-qisN z)-Gt{001BWNklA@oxQ_gVz-4MV2_-A;1@w(fj3^ue~!AdBz5o_J!0vNHLs{&259l^*QDTC(x?Fd@3*=6H9fy*@D3!FAPG-k);AkSu`z?{Y1bJMv((kd&!Ab zs*4BbJm^dVLm78TH?7k6U;g*c@X>E*j~mHeM<)esMWq9McO_8-;;?tc*yR11zH=40 z;iy%&UyfAs&Ypgw_?zbz*80GU?uv}c=a8B`MaTMXq8sB^u_{)zR zEaYlJmH=OSKscXLwaZAzAOewKJiCu_cY(UzAd1KM@SESo+w&EYPu88`-p#`+9HW}^ zzSA1E+g}t!u|l&czgh&HQh+<*7m2*VU0zhOyev2LJwyl*(#9bOB+6oizx)r+ z@sp1?m}WF3)D1y)%Xg@rJ?P(0X)Qhq* zdG{=kxuOLZ+!br>IxW%}R@Dwo3j|ub6lZ|D?turqTbR7LP}r5g>0yL`wJ0kCV*^BS z0x7-oDNQy>nn7#rCJ~EYe@;QnO3@ieBjDw^!O^TD>unZ*2Nu(j-J_X2ybU~l7-2G* zka{GYQnCJT|C@jL-__+3s>#tbTfiC!8AHkduV20DDkB>_G``iYn;u-}ZeHC3)LD-~ z4Fgm?_sHIeTMC`9)yG`>ub0KWoy}|n$iQHf1(1?7Qh_rj^YgpXEy9S1rVNxSVvI&r z=E(EHF~kGc@;jlb1wzS@BoU;HFv=nX0Z|l$2w;qL_Oor5s^eq4rIbk05rRN;wjzP^ zA1aD1KKXo$RuQHVIqMxi)>V$#>mR(bBGKn^(?4XslVAhB+ix4)ZWb9fv`%6BMeMg? zRbTaW23EoT7G$uvbu97z2j2wa9ICBwFdt)@CYzv}4NJ+TYCMQvAeS>f;1a(rJ zsV)KB4r1uzh(QYA*=qvoz3of)TF_4cdf*yR>aVXzEUx#?1Fc+jWI1YX4MJo^C#8Kx-mHI|oOV3U(=j+DTiBg$9IVumORJB#F^ zGT0RwSt5~Uqt3C^N6%ZApgkmc4kbUsbawyiKDVH0`aDR05^_9mkjApQW8;%&JcAS* zQAEqBpu>KsinK0>65yQCBOZvBG3LCR`D)sLLg}6bu%`w@yzmpJm{0 zcRhJ@ka*({KX(U!^S(PMhb(wIaEWvPr!Q98?037KCGWRUKJ=n)X*_J&UP6+l71A^# z$3swxtWvG>1vlWVM!-4B(i^2&%nwg+e*P9s(;|){N`wK!Y<`0AVuQuptH ze_teeYhOQJbKX0*`t|*9!=4!X>IQ7+PvpObcYGcGH@^_^WY11%@BY6lfxM1UmD`R; zD22pioMMtOY<8r>yjb@M=q_~wrELdGbW|DlnO>~`At<5e{JP&Fd&?lY)GYp=zggq+ z=Ue>Q53cY#-}x2ZC?ks-OW~^aWP_T>&8u&)DwjiT4@aF+>WLIXZ_P9q=2#7fwY#kgdiSE$LO^L z7{*bE?XE(e=N+TCZ7NLXcM!!R?6%i{wHS}5Xxj!=wIT^aNG_w1^UF5YAOL;P+@(Yd zx1ID=fw2H@FE!$bxJSwr}#BXiuVaRxAlpVke1=F<`VytfYNe0WNSCm{L`+>g!OB%u2Zv~_st z`}csm_rHm3d;%epZX63_1fde@+MQI!Xi_ndBS(!m8Br=Y45W@0ei_NY?nsC}^GN5r%8_#rCiVXE=3vIeBAZ_31=L^G_0$1FPMQr*S z*6J<=I!niB+ZwxF-AQ|jB1aU(4j!Q*CuP`8C4S@;LUc5TFpN6AEuH@mlW~mgu0~P$ zEC&iH4n#$%=-$)5gAgb%<#O4dOJiIfsU~ZvI3f+`i!*xWtH$M#vi=!pmBG(HxyJo> z-a;7DVtV)i^7R|%G|9l2g;ola%wm+%!w|Xzk;Yrf>i+Qi2hA5DWA|HeZT2^YQha%Y z8R9EG=Gx1AX5(Iy==oZ84VTDFO!FurQ?t={3I>Lv+@UOX?l2H|KA9e1xx9ig7I{G( z*y-tUCr{9-L0#rZvx)N?QkYD}9cE>;Lcjw=QS1Oui6}}C#iSV=@|zfASZ`~5`aJIh z#PPt;tWo=+kscemDTx6H6A2vWEslr-B{=ZG1E46V-G26_FM3{yVC+7|#RhTgvoSH% z$0=P1Y3x|Zb?-Ihi&k0p@B46^tQz3+R{&?{V0wX3DlnZLAdC{^%3i zAVOH9pmjUgstE`YyDYpA)>s$uRv{1)QItZf2FzhMWwAjRN}OL+C@Nan&u1AJ7g^D@k&-x)K^^~2n3>Jgvsm}LWD5ZP^hW9 zrKr``u!f3KnvO`r#W+1CcHl|WCF|I(LkUc;!(49qZo|J1>>mKVqtH2SI-jOL|G^<1 z-JiSA%n)Z6*BB)XRju&RlM+v!kvqcci~Z!62e;|H^m3P5M;u>&6d?>p2n53?pRe%w zi>CY8yji37<=-1Qo%`#{bKvY!;p9L8SYbXtz{9%1FNVzes%nd>*kUq0#Bo)F^9o@UL5L7_T@$vX4W{F;?}A`a zw-x~>NkNe0!n;DK?LFystDQFjqJzB(Y^Qyl^x z0FJ!cwyiUYj5|2vrWDIsi@GiV#?bhJ$OL`=kS^d|VUQOkve5+3UoLTaB#{>d)?0h)>kA4j9nlTU2JB)_*7L+YFH$|4yCmqUk5cL|D@&ivkZkQcF@Nyb;LrsD z-Of?SktGKAZZTLZF&>Q&#)$(!V<^^i(cqr&7ez5q4QvA;1exuFW4GHONk=eRVRmq< zyRjJKh?6md2s=L^&th+ziW~s8D+nPG$0?e&Mk2$`sj>r4;WkS!I5_~!6^%8^4ZTOZ zvLD+9k&wUjFV9Qi5xp<75%7(#-9s2>-N-O?;S#&;HU4zk;tzh8qMSea)e@gRFEL6j z9^U47bbp2@l31+@gdxY>cOG{3C=3?g%cl6?;RY918?1K?)?1FZR|cOv)2M2y&)mhm zYiESF+5&&|bBhPJfpMDS{_Pr37-GGnV)o{;XOw#k(|6mkq~aM$`r6WwXw7d?LHN$w zI7d?JI#nMm(QQ%P_Xz?Z02QuxPJrM2#u!O<;F7@odYTUsl2vy>`3^-$Dndf`96M_b zirorPOx(PK!y`;43ghVkv~I9kQ*f^oq~8mp%n8~R%(g{YQ}>>YX2f@5Z~}VfWK*WI zAyTSwta?h~ZferEmSu^Z+iXXY^m0o1Ji>j-M7Mp^8bSn+GU}EILlU>Oy#Slo?`v2v zRMigi`5Y&Q2{^0JYKurR1l;24>Kxl$gHaNpX<9Um?kFX*30=199l)JCY+3b0QVcYp z!$n-9h?jV^0{-?F4c>WYh3|ap7BStUWQr)BxX5}JkIn)xOUW1Bw$?M;wWiU*S46Gp z2ML|)r3aFSn2b06AC8Mz(rd#wCm$pa>iekmQ2G%jL=-}ZfhdZ)JrhV z9G)c*yVMa|mo)na-fo$?GMECB6sX2D#&~<_A*t35nb%)IAK^i7C7r~;2lpB7o>I7^ z(HdcxK*#{rXw=mXK_HQ)AtvrX{?nrq{6W5>>_*No9?y_wQ=FXCu%Ns|PyMi#G-KoO z3@oI(VZ+=4sYalQN>$~8KB^9nn0-wE9uvQ_jda<-u>02k&@{63tB?Gg8 z=5P2{tB9=XN7--XO(zttt1T8+XE4_3R%_#eVOs>8921fxqZlhj zT25=sfcVKF1cw$btd+s(3yH#0*EL!f1VI~7*69P`MAyP$aR5+N1=_ZTQa-eTbtF{+ z%Vo!k_v0o_31mLV7|_&2&4@z6pg6Or8w!G%j%bWD;5a%6Q8g4}9|`~t|4t)dl>^15 z7oxYVs~PA8?p4!kj<46ia%=G4|4*OeU;bAI5JuHdO@X#8pxYW+Q{Sysi`DXNmwC^k z-oCePXcX|c5?GI|cuXslz02sX?4=nnJ&sW|edoowvt@MxYCZUU#sKHn6|#guwLp}H z#J%DIVU$6JDMn+C_42IK`uX`@h7m@S1H|zNO;bVy5|7^f7V5g7^cqcaabq<^5Wy+~ z)l@L9mG-R=4+KWz8LBEr6r}_0U`vh;O--pOuFIluONH4az%M`7eF6*na^kRXt_A!C zDDG7TehdyJ35~z?IPL;2M$=P-(Fko*f^V-nA*=^%Srj0f9Cm(ZUKlH+?Ec+55y&WU z!dzf%0o9feVS*1wC-~tXF7dzq-#b+q;%26+bTM7}K zz`F0>VMv|#zv(`QD9*rx09Bczs&YqL;0OYaKvT3DR3~Ow+K{tko zq)k(k-cOq^=@k86Qif<%iy&Yq3My9XZQEn30noIjd*%U-IAX~2rgw8e-+UO;lcIfh zUbj8T*DqPTGl?Jh0Rrgric^PWbOR|10f?s@d#zH9+VJ+FiKF@ zMVC-QRy394ut-#8zQ?IiszF{_ES=BK{abWn6xE=^a2v02LJx4{mK(lP^&@g5doc3s zVvC0lYh>di#OWLi96=Jg!c{=EbvFWtKp;*g-2++duDhGF6O>9~cl*L+jDc1);U_hX zM1S^&AK)+l<0USZH)V=!Q+=e%q-B-ILF^^dN1khp@0K z{(KO2fF5k`l3Ft02fuTI_a5ECXf#8VOq^jJA4p!DEXL4Ekp~h=HBb&evM#ex${0~H zhH7glRih|2xLo9D>jIZ6i?3x9$S_49LS*9u6uTv6vpH&)s7zZp;kpvj(Q0lAmaS!j zS81HL+R)&Sxh)}w6m&qyvRiZsI$;#k)=@;Ln!Mv<8JEG?G&P!*BFN%6b^>cVaF1Z! z7QJa2RE>hIbia*dv~}%edkn2IxLD{tV^2TEdydul!fm4YephWAk27@n59_?gU1uZU zpZ@U-fAGC~5dOi|x^WTf=&UcEJY8b7H3$WfH<#Oe@@J#^*3GNnvuS^8deP%31=Myx zBK4aN-81FAdx4j&jFP_UrcMmJ+5-3QPEZyrG>x-!c7}|}qhk1x z(PL451ooMgqm&M?6uoVXSM-+!=>xr$&X8~B#ou zS1%EUF{F%8wG2`aCN>!-s4DXLACISB+1aoG9!ef;Q%AU z_gk$Mnx=FRh3Q!Ej8iI9S=E?~Q>5vrllu6A=jA_dFDgV4#g9!VDVoJ@Pfg&3>SP6O zaj~G!dpznFa*+gDcOK%f-$YwC&f5XKC5h;g@>|4z^bLtW{zpgn!5{oN($O&l0Bn|D zV7q#SwkbODqkpJ(C4IyBq*ucG=!*V>Q-;-B;AVSmjY-wj$ z*acPuE_-gA_S*=*rq4@@U0x!I5(0ad7s&Gs!Z3mm5=~Q4JeMV~TtgvA$F9ZhMc@2X=ASk{m-!4!TTL>YMB%|&W`A(&6YP4;QM38r{&*1Y9tWqsT3B&vEINXXc zWHIpenx5d>M+~=*ELqE>46n{D@`~PHFN)T(-{yH6pKS?f&9U8F08vyIfPy z>p;mb!^Cx+q8}ASNSKW6ElE5{(OT=qN9RUi42(6{ZZ~*!R(2iJS4j_t4ifgJ6YXH$ z_2X_RdWD4FG}orz26|HHFj}lPx!dpR7^Cjq4i*>zr}W^->=Zl*28Bv=uMGox7Gs8{ zcqGB`V`EuvXt~o?ow?rO;UWI)Paok&Kl%^&@I8s6qf@8j6Iib<5yuHGFVCDm7VF2q zfQxaR z$?@|sg$aM-{V~4x{Xc??QfOU6@IXRF6K4j-I*g-jE1X|99iedNy|GMBC~Vr^Gb@d$ zD|&P3(sAm(Yq)jf0#M!7&}Z=ZZIRy!#&HkcCsD6g^tKd91Z=hyGUxrY-fSU6gZX^o z4urcI9c$RP$h74vAtjmm=lKdzM3Rai5SSmm<2H3$lAS3I9sF?$iU!-f@<4{eB zpMLZ?mYacoaX?P>g=1*=$Jjo`6maT>dsPe%H3mj0Xx4y7H1dUk z#AtF1Sc@P2@DCA6LEV+Lh~hCGy!%~Ty!{P|f(XhY;HYcrtn$2uiUguuB8-yGOwor& zSY!I|39TGSSUM0r*eh7RFp*w$U( zDJ5o;1ZAoFE{y?j7wDkY6SvGTq_IWa(ny!ay$nw|{@iM}zZ~I=OggPI2KB_{fYWDs z>vYmJ6k4_9I66D}0NdqrlxM%D+fy^Bw#I|o5>KD^`F~YIgw3Mr&DXqedAp+@V3)(K zRQu?rq9Ug9Y~-S-#6Ay6aB?j;J)mt<8tpqnQgLJW-nWmzV8NL|SvH6w=|Vrl&ez&n zL!*wnlIxlb%17e^XrmB_5JoFBb%A_G*2v@Ok#lIQQI#9yyLH!12^o_7$Fb#Q7(4zM zJwZ~&ojhVFr=VDP4Xq7|ig;{EMBV3f1TbdNDu(eWL0#8~LXE>IJ+O7-;;FgHO8}BZlq%nlGw~LOu)DRXCByPzm?!ct2Uu`Wq@nCWMXa_?h_D9*ZoQ62<{k_krB6DYT-%ePmEk_k?4 zJ#^g|{rRd~sbB+7A8SdX9$B4Qr zFv`f{hVmWR4foMLIAWN0$vJo9p#l#$1+)s`!1(}aHg(fT?W~d7fiBTHAu~-_KG9hS z31clJlPF3B)!JTo&VV!xFv=vET&AjX4)q;!(@?{+E3xOdHgwSN1+4X0cLdzO&2j(! zyZv|$M$(+N-lC~!E8=fZ##x7(_%R@Gt^(_U<%uVF?#lfNsU42hUQuy-c*ot8tS6m< z^|;N^j0lY#flSc9=OsPh^9khyjz=j}TOi;8(j@{YG z_rMrK6lLV8-PRD2k<+HN4q(Qh%i6awVQxgCB9&vkJcCjVuCA`|^ow&`E=gXom!xw; zFzuHJK1dTjUdx4^#t|)4f&oo~v3=9FMp5DN(wo}(|9AW=K1gM99$m(D;LRYIqpSfq zYh{2VN#}@@X&245Z9I@)>C-!=yVCzR>f4 z?1*2#zUZVlX~MysKb6r2+Hs;@omKds|1HJ4ClN5tRwSqofPe94A$K1;001BWNklk7Nw zrpqUgf)oI)+R^8OUKeYOg;EBiEW^oRfjcMUllJDK!e*y%xuWO#rsh=-FivB8yJ`y7 z0N#6eit%I)A>!`L3I9Ul>;S>y1<7-~nS9$Ia#psNtNteS0O(L^;q_pxrVh#Lf_$Lj z^_o7Ayz1xOP*PD!T_EP!wM&C`*v*||4$chLJ76}Aknh%zfg+)%yJ?bigsO6GiLjj~ zcIPR?1@U5310iD+`4UC3Mp>44eYVAPlA_qHaDIM<)6-k1>jIo{j3;xVcC4<5FXOa? zbyYxX)pc0jpWAD@yofc56BI>->y<^-&}(1kz|ou`3j} zZt>!b$aYE-rst(JBe#hys+JOetR-BAi;ja6h?u&jL2^njT(OS$xPR5DwnANP@#5Jp zaDM(4WkqQz%S|7E%bj7~&7w6O(b!*B7u8zqCuSQ%@6S7@z@L7PLx=!jH0nH}ybn3x7Bh^4aSqNTnBi#h z98JBW@x$SnffSHohIDj@wkff^evW6K{{n|ccd%ZbV=_I$;pzKb%fJ{goz79@3#_*d z@}i~OK%k30v&KRji!a_-G>$`7R8(v|+4_I@-wGrVxjsC&Rp9H7giBRE`YV7A}gcL0hI^D*Q=@;>-7prl62ZzTEu~c30iTYdT2~$!#a0Xa_f*$E~#P+jl<_Xtxa*nz*fZG{Ytlf${#I=ac>QK6iP9 zp#*;Q)Zho-638osNNO~-MqQO%6p=pwz7vAAovn-ii2^A)XU8I6qHQZM#xb2t@%TMp zx7(s=Dz~`_F`b<{gEon}%rP3zx($sNP|Glab)f;CU>C8x@ZXB+(L z!eX^;5CoPqaHtT49L9p8qnu`tJM+TxC9VCBr~SC4oVj0Fk@>%B8}LB)*c4;11_)&A z@Qtuz?E8_mlVQ0IqR5vxd;J90*Vou=6<(at2)8Yqc29p<>*zZgV`!XDBU-*ZxJ9Eq z=RjUi!9AD~BtU_-^l+XpNhi3;`%%Gua`oLjuU+!s370R^OW{IhKioLyU3 z+v1z=ad2+ja)~;rq9{8NepwZWqNJ0k354#SODCRgJB&=o2&%2oG&PE{r4R{6+2Nd% zWNHxBKp;AII3xXH5_1Sab}?eR#dJEQpbcYS4C^kN)QR=A*96-hqx7$PNHW(3xN~bh z2nBKcLB<7mATc}s0A+rK?fR@^#_sZ>y9xdF$8#n8Cactai|?uRKEBG2i=K`@8PRP# zO6ag95gpc{rOd7X?w%5VW;O;X#ETLP8evFD9>ztzYpu|>HPUp_wZg*`5(-PLu~}VW zJTYLLBaX*tSdKtQXjS0iqD0f=I6gdt1%){nLj+3h2&E*KpqOvtC=CEdLAbts?2?md z6kD<#cKLAICAGstFY(J2{qwoCIG&S(L(`HP-H#Qe6ZpoVldU*`Xi?EC%3=cETMb;T zmQdznJbwHbqwz7gV>$~FLR$*QkTP*TPZ*32tOIVXwJ7o>F5Z5MXJ5R*VpU^X(1G!s zD?irwao&$;)`_tXXLKIY7Lj)XYtWmcX+nA(UzNmQ1pj}C?Yqj0?ufo7*{iaK3 zr!O6t8TzO=<$^e~l+M`0I{;@blI#F78WH`2lOn*HeLYklBK}S-TKBw`NL_I@Mx)3#sOknsN2dUBW{@$@v$HUU5yt9#zc#xX z*UK8~E#X`OEii1fEc3A-C918#}`ny<6bj7f2G+zoCi-UA;^`}k<%Xy~e#`z3Ilq$s6!6nefDhlLi;H5@482#1lE{rAK)h)h zltqcAt}q>3=yi3DvMdnW1aX{phLcI!IB6Qm&?x#VblObn=&Ui&E_kK)wquCn2x&sm zU#(KOysq)`Ot~{nzt3aSUXpj~kmHLtri*#A1F4m_AKK=2kGa4&htP^XK&>jQuAZW8 zDqLQz@Na&!#`U_t*+SWC!J@FYI=OYw+tXSLyt$&b+#9S7|2$k(<&HS$HwmM(kFF|f z8XfK&Gt9>vP1{0B!Xii?MKXynjLBTh$twH@A_d`FWcJUo-PK6q7BW=WZVG7KVmv)U zl1*T&#+}>1?7*j>)UeWVtz2k@F9K~#MrB_7n&)d&RWSfLiJNn^Sd)dU>!hoOicutc z{iXl^CU?Y1P9k2L@F?<2D$6Z?@$obK?Jq4ZuBmOGj_Bw0L8qNP2=762pC8#O!ZExo3k;|l zi?VWY@`^;q!>ytZl(<;*!0T6yMIP%INz!czjP5_DK!gx1 z1>jBk$WMy%09Co^G=5quSkUEI78|VBIhvO2VS3pSjVeM$?m`H#U0>qz>?xY2?248U z0xXHqG!1_B)Zpizk`UgjJRIr1<0;;>u=amd4e;w{bT+>BfPB4<4>L54!e}(=IELPR zggd%K+f+!>33l5h)~f}=FhrV;9cfy2Z#oZ%qenn{*ckvCBVeFuTm(=zbQ#ezO(u;p zlxW))7nd8HU)yd$;wcK_j3x?gI2bdSjV56Qc0Ey)?)RI&;3p1cQtRzu0^67WmO$ ze~kb9Kf41NQFyWNH=2w_xOM;g*skB;#p}(NM5T718*A$RFb|o~vC`MI^EL%Abu-z=swhBRDC?Y#A zkR}3cTLNH+k`alYjRNDW+qexQ=(pqmBu8~xLQ$u zU)4~j_VV1|VEPhq96I@pb5wQR6?fuP#u#LjVY@nmF$zEWo8RE=)xOP#R~Ik_#AZM* zVEYcFQqUzdN{DOYGXrG+ygH|%wA%JtzrZbO7JeM6dh(#fz6YAQnQLkKG0_ax;dbyK zZ*w;aO6Kq*K;1b2 zm><2)H8rGpZPM<^xl z82>>)Jg+SA8KV}vyuxPJV6iqGCCOhpzH54YsiAd_R#6hP(&+x);gbXPf-wX+{q@h* z_`UC+c>c>`dl|3nWVKsUDsG|bBwZh!0!@{Ccu!SW2_eE;G83h5@aLV zjwDHf^`=1Uwx{02&=+Q7NW`5+7I7@G+P0`0YOCwkVO&l-DFVVO9zPl(ltI_Yfo<{Z zP2Dl#edqG@mBIPq8UFDfMEKxq8H9}YBBcC7z`(Fso#XF*{ssQ}?-u))5_)SO<~Fu| zH1kYyxPNAv76WnAlYDmtjXPyc_>5OKcooddVOQIt=i~Wv(q#$i-r1vysO5JnLW4sJup_)Bm$jZQ6%%kEVNotK*2D-h{ujz9U6hxqHi`7y4q&yhy- zK)!Q3#dMN7Un%Ldnu;Rr4^FUHZBaEE0oQ1n210OLElR|ZBTWzdg@!nsFVX?qkJszG z{RjNFR?#!~?|!WDwTCsn{%(MSSwsOWaY`}uPL$uc)Fg5SkmtVDn2kumAp?R1mfKz*+_Vhaf}Uw9=<^pZps4?%hKaPe}Z1OpAQ;8dbhP5J)__e~Pa?$no)Kdd~vJS3O?^FBWu2 z$0>D1bxpuvt9p%~5VXZHmVT{OK;~|2FnS=FyB({VsQZ(Qyt}pg8V9owQJi&Ie>4t; z9apR@wir(jJF_(zMo80i1!aeieH=i*B5m*NcaWpNZ1bMP}8V8t+1IRE$ zRa<=eatEy`JY+T&xO1A}SI<`6W!zaPi9Ya_+5Pt+l)%X$nQdy_Kv=6N;;Y&ac<9ni z>&9X}C9I`WW;grBbM3%iJBfQslveeJ%in-%kOx^c^aFdFm8kW`{LbSUKqNW7{;tI9 zvl^TmiV$jRCq0S3Bp6j~JrFmO-Afq7uvTHaUDNu$Y_M8T+&E)E+t%F(>5CsF-Rx*3 z3!tnOfE-0x7^|__tWi`;tamjgS-$~g3^<;1 z+`D^-EE{3BUC}5kosYfl0r_#p@b0}4M&l_CkB;02M(X>!rzu)hbSXyumiAHipFJ<} z>g|v5jSnUmk7pQ<1Qu)h0J2Eo|NZF&KK`tAOz_|SAo!v+v=;J&&VZBO8F!KFeoVVw z)1_tXS7R`~L-$?8SH+VB0d;Q%eLB<4oJEhP`L7$hppp+Brg-o1@8amz`y}LT%U*gD zrjFX6`WUf*%nKJ6pLJXxDI=uW9OKy?vhQIWhsU>Z|LzQ`EifI2IKBM{qwz86HG>dZ zHyBS&u-jbXda=dz+B(v-=!lqgqw(%tdXGGJ@vFfq2e0UT_g#-2Grs@6dHnPFTcBw) zuGi-{J<9OmyCI~c|Bom0?wkuDVPTQ)*4S+Gj^^R<#UUBjcdm>x=cr-2uURd(ZX@YE zuPnlVBTZ5mQ{ZF{JbgtJr8u$>fyQh^5QhH@Yddh1b>n{!^sjw70;baml&T?30^w(G z8I2&r44elzz5OnJ@ZAm0FPHeyPpS@w7$%W^_O`h!vop6Ln|B@y>>5P zoKVqQtbww&xO+n1aJ{MV^5sh;afHLeLulQiZE7Ux7=cT&@ny7WN-%gSLW;7a#1PfC z;Jm?Rvqa{CE4YgRqp>b^Kf6JzOdsybfk;}EWed)M>%|svvO-gry#zvrt~iqp?e?9A zsH+|3heudlzs2iIhFzhdEpe_^s})A038vE-9>QR~F0kB~y@z}}V)XSiaose=^ z;rMYGVOLQI9M1)2(-=jmQPpJ^#Wi#i?L61@{+SqxnQ!7W!(2sc_wyC^BIsQqJUS5g z_ILjjv%`BXn~&|`lC4W>W*y@lXzLvL?gC}G?i?++iyt?p#curuK@g(cU1K^9@%Y1k z3=zf%qY*gsi8nQ>a)qn2r+EG93tX>iq%kc_c6mj3Zy4d_nZn;a={M!WvG6MacI^An zE9ESt(VO0NNmQoa(w|)eoaOk-pXB&we>g>lSga|kIg9?wx#gpqD{B?;{XbK7Ty&1Qw7Y-wS{fhc0mBc9$D zpU&h9tv_F4ke=m1_>)74fYsQoFAyhFa%+IM67dg((fHu;V=Pub2V+$S1TwSV=6h^n zwe9_@A_+9IcM}~Z5BrUwPmFdsrU-Qp&?|@iBd9O1B@M$y;TiFAW5M<9l_cyT4fPO+&#Dk zMgw7Jknh&rgAfP-=>*3?5O$80kKX?diroq!FR(2)_}~FCkpphQQDb@i2F4PrI87zy zlLqUZMbiSKRN!0Rcn{n4g>#5B-NuSBj>|=k#m11Mh3I)%QAik((zJo|9I*2R-D=hn z8~u8{Uo<%14_w^~4B@@~OTcOTKbaFpE{QniQ-Q<75oYrv99oNCKYKxJ?;8aRgO1^= zx`|Jon8v}Iqs?X_O~hB2A{VXZT4^J~!6*4fXHy9-uZ;PHKT z%WL55szDrIU^1R`tah(V7tVxF$_SI`A)2N{5QK;mbo#2%c#0@YXsctjyFo&7T~I9; z0w;!TP3y)+zkT+&Ul7naX(|ee&Bm0dBt*0)`7v7I?9DT5cjRL}9rfwu z07cdZmF~7;-a@=-9sb6@+&m7|( z{IK?ph;!~uQh*akRMpMOd(Mp$vG!Wu`iAlJ4mg*PTtu)|Lk4NP`ZZQ#KARygO$!i8 z2`~j%fvvCkM3>dZS>1A4TQ_bKVt}m{le{yema;mnw!K!)5uqmy(IW3l}9Iys) zoH&fi7ZBd2+D1`AU^r)xJZ?8Q!g+I(8a`}q>_%0sdnl#PYT^{7A<`tmcsxZ>Y;byd zx#brxr9?KEAk9Vytm$G1|wD(0k{Qcr}!=}fHv+1RK2tm zr5zsQxq7lArnVjUj%>xC>%M%tO3Z;r_hLMH>m3MpKX>k_)KP7jH}%>(fAED-Mihr2 zg0UJLo>0lKT$~a0A&enq)N`Jt-Z0-Rp|#y2NsosC%BpFDFv^-X;Ozzs+sWGfG%AK| z_PZYo1F_vO=pG>cx?fdIp!~o4yBc9Yyf~r{S=2Q>-%-fGnMKp6w#d-m)ku;AS}TN6 z(vH}4A4`lU`xIKtIEI{~*euaB4Xg{V@vp`p!d% zZ@zPcC`zGJ1;zxVkP);hp;dvVUb}U#0ysqtX=ia_9A3qm?GCGM=!I%Ur+Xkf`G^-x z_VEXP!>N$OUF;Lwc;Y>i<}2FX z-u&g|D`?fAC@LsT={#knu-=eI($9WF7wOI+@V)l~WNEf-rx{Z+MKADWVT~FFPm;nFm zheVK^Oph^|93#mlXqpm1kbpA*8C)Th3`J=>I)k%IVT?A4o~hpVx!URycH*DB8>M|s zUgJ9tCI0LG;sYeIKn2U4qpn3ykzahHFJ_XB1T*A zs-P)````Vr3_6ar{+;NfkH zBprZpa?1#U1d^m12C6Agmm8D?v7o1uA?_Rxadx#r?8o-h-2ea}07*naR3srK>rTln z7CY~_Iv#-cG9GKlLS(D6>Rn9PW4C&DfY8Z9{LCJPF8!GMhtHrW3J5W$@Ko7p4Er~> zcPQu^oB4!Yt(w+a#9E8dWFJwSVZE9m3>(sfl?FwTBhPbWX#~krq=O-{Y>b0rGHnxF zB8XBK#>v~$CyIv{PY!T)@(fpth9b}!BIF)9InzgvsmQEzjwFs;OWh!3ar-@lAW|da z9IN>m%3_WC58uO+uRe#hIkZt&tY|C`CEXO00bNHa2~20E3$XA9$?XGLa&S)9>vr5F z)W{yyKn-Zz^gw))43G_{&h!rsvy0miIS5lSdy`#ybQk~u?>Yot1IpgKnQYxa+^N+j zfSa2^`son(&U+CK_9kS54dy)homP-@1R`+39QHcGZ2=L4h~42u9k{@Haf(+jKF44E z%_lgY0YCYDa`8yzert4St-*SEhUNUc+k*Eun~XtehILMMLGzXKFgLv{z#RfC>ydNY zPO5iJR4)giC0c@t-c4DbeHf>xC?R}00uCn}S*p<}+d8E%X11_0FoDZ?gFuuJVuOQy zg={c(woMFLk(U-=(9|`I)>tgp#EoPOhf|BwOXt#|w?)q_pR?Q+yL0AJmH?d2QcU;n zAx?&5^DP2O&C#j=bKQy$ku*l*c&c&dkhXTx>EY^z9)MO~hHWoqugdOUH0wSj-ShnR zj-uXq)a%y#EbF_mJBL6RFr+a@qlgDWAEHL1Y6Pl=kkb87U6wkz5fJ;ZX)0*dAP6I9 zjn)FTA21D`BP6Fs`i$?~`?ktPwOBweD{`}xq%D9(^11FV-1Io0bl=s$9}2F9b#0f%JGMFFwP|=U=u9fYb98>Z)!FqA?1a)fq0&o?yA0 zx7@KVoWr7S8azLxgK6z@DZLlHw^w1kPT2o!y9wLAm^bJ-r-*GmOwQf>O2fgyX1dV$`2p zD2#^!XIC0&+>OD0d9z%1QGR{w&fkwxkoNHGVui1sJjeIG{}4e)JWMGAqU*0_&rp>s z2ob;-jVQ`+`*?(pzsy?!EO%>dZK!D39WcJAw`X$3fX2{=(ocW(r@Bwg@E=H7QBrIY z(dztYKf!}LB!l6cAvO$+($Jc|q0z<(p%XWbp-nyUW^GNa+7#P38MNYGDdm>n)>uPD zu&!tnOF~3pjOp|UL6~4ZJ9XxG6d_)fD+FQUun*^eU>U3{O7p9ic=q(yXd2tTPUD;j ze7f<$#J>TJtGRQ#gh7&I9lM@O7oN}%K@q@eb%jQ$mLJC%AcAe{>B?N$cN@g+AcD7u>FMU8 z-X@t5RMfdt^a2XnXKrWYi9+DrN5H#p#2Al9E{cnc8hsb0^9{JW#uZ_^0hyu{gTgUeZo#q0zJM{m#}0*2N66jzroAOjAe7?`o`L)d6w zvtsz`Us%l7+kW@0tjGm%c&St0y<;~@tOSsX{}I{^n9IM=vE^vI50}PW~R~I zfz@Xnw3|;CX7TJ4`1G@<4Iq#)qkZ`{0yd0o(0JxI6x z%GeIqCkTMRc6=Y}u*0MM7~lQQccD~?B44=8r3)S1%(0xG;>EMi9bV@)k*o`X^<#fu zljy?tlD2X(!7e z%EB6PHU${jNo!Rh%_eyG*7snH#(ePvj~?zL2&fD5MNtMZB{m6(Kq}OYK^!uawZ*2e z`1lER(4Ky<8;vG<%O(F=h@K92*Sj8e+gf-l1>4JfygI;ckBI$_%TGA4z~g5`d%1fE z98ERec?e7=DY9(X%G4Mmyh^FYg|l2@vspMgks)eNKpd}4VUWha@jk=l9C&$d$=BT- zq__4vmyZ7XYLk?LPDNAJ!1I$ePG3Go91oCvJeuGb`%Wz1nGAyiW#PBKWrp>!wY z4P>{D#_0% zu$8EI%aHl}9BDcvr$y(J?zb6@YA~4|K{`;d%V*=x#+6Q9?F{?45C|iRz>=;=P_`ch zQ>vzFSLfDwx(gGwTMYl+)~gvBWwuT?3Ns)NA;B4>ut=OWYao@=#%WYl2`K}TPF%fo zTdWjCzQn5+k1<~?TCU0#1G?u=RXLZ4EZ&w^__3g0wEBf>IOxJl>jt=UD3B%+Q50gm zI!BSup_&R|lw$AT0oKb?tQP0EJU_+x_af7$79?2%pJ*lv7+V5Yz15_G(LD+<2&yOG91*l4Plj1 zI@8PsRhgsV0-Q7FVoKpKql{sgGNeg>Mq9i%r<{Vtnx?ZsNuRw^)VTQjHx6m}W(-kv z<|}7}P%E5Wta0yQ4Wnx!j!GFry392TA}W&5F@?6=kx8AEjK@awc6ID8U)T=3x%<$1 zwz3E3zx|HHzxvOAj3n#8+`jo)I@rT>?-u5>GbmL%+f)N%Y#aDkR0o{Szmjw6cy;*3Kn1t~b1hIn0}WDwk`n z!fJVe<@^Fwxj`HS;Ls>*X@Qn$|%HZO1 zfk6UfS%^RexcA_FEa#`F%m!RYB&kG^&rudDTwT0`HX5@f!}D|E;CSnxEiA_AM?I5S zn;Y(z{zKQZn(4cb0))BjkI^nsnDe7TKNR&E`O>uGby>{8z>uV4$RKI)Ph&L7e2J5n zpW)?;=aks}@J-yl_f5z!Z6l`yXxm(s8t(05QTND-W_<6VB*bVI1eI|_A9_iXd z8qh;rRBlu63>CHB_7A)188en(8!oQ@e=Q)-yX}140Ix29vrAyU%5m>#j=kv!ku&)7 zDhp38FN(bFu&gy$triG^0Mki^#cG3(KCdxfb)T6Z4QoXOD=)gPGn8GhZq<-8ueZN` z{0uml&hh4(r-;)D#e5}$BkUi4fZ6%y*sM;SHm}BFeucU=7-rpuX;XF%0lP)W_L$54 z*|dL>a7J6QKmtemA#NRJ_~{?Ni^E%Q5`V^3Gm5A}+v4vX+#@fb`8h?YJ53Zt&_@6R zs=7d|2WXlc%f%&zqdlxvbHvFILBLw^t8*(u6sM@GqV=`nf?P%8n39sqvLw6X^#-RG z8Ykxk*15$xx44)+#~=NH#QxzM2%@xSakIo?euhm^w|Im1KI*oY7GWHalOrqzP{;u5 zO$ntLr0hts6rpb1*lH2SDdL!6g*mvCuwaM+f$?NQLhxdP@xWk^7?gGAov&19+cOzb z=T+9891Fye#G?m?*xw&wvA6_7>=qz2_H5Qyh~f-ov4%Aoi}_hAthLtSKm3x6+ms?K zvK>*}lO+Uz&)SUjWIGKQpkZg@y7|9?NNMhaMl{anc zysnw`(ti2}Kik29M`^U@YOiei*yiMmlPvyg#vgDeG-G(%I9{mjLjY6b6&wSfTkhQMsmImi+e(h<)+ zOyI@!$NS_sAw)=S4dm(mE&z*seGaWkT%3K4|KqQp;N((wtX%iAX|uzh=`(Oy*L@kg z{UJz6E7ko8@Gt-T8<Q4_R=lonB(w$6@= z#RXJTp{h!Ve2qM>dbw-p`DX!%v#Z&xX0WhWuQymMbA&;ItEI+tB=P)YgD;+0yt;6w zgA@LyGmg;d4}Da;wFZG3D+Z~6wSs60l2S&pghL2=FI81JtcpO&C<+k%L zaqIR2XjN13W*m1PypQ$j5=J+z9ghqGY}QLOP1U9jGscm|R2=(TAKL@d0m9H4b{%`^ z6Da##$Fb&ep)AZ6t2W#~|d;vos4 zFP`J{Y=+Av;iW!Jd7IjaHh_eziH!@k;23Ar{ar3zFT3e?JroDmjc&dp@%*)_K^v`Q zUxP{EHLy(I@uF|}v{meOs1UURe)+kE)|dFB@0Yl9`>2(Man6yZl!QK?=ZHd%qOvFo zfbj-dW-%H@cy?Nl(n5E(>U(3V0hu7GQtoWlNykVFIPYZYzfLJi3UQKAS~YQ!O4Q{X zMmH$(IjUlX7tg=OY*C=9x7o>kKydeBd4Sb#6&bemUe*A|`y7AvqX{0p`8L8RLl7pt zj6A+oQ2M`w2p|KxL94QWaoY(YBO>eLF{wYTnwn09+lMjYc(}zuVoXq;T{c1-$H+H1Db9xi zVQ3Ks5>;J8DUGr+NMa7{tUQdNaLzE05K=%X1+WG&x2PCMY&@ zGO07vs@IJ|AQ>8M+J`=KfwnKt9W}v`5C>U|J9oy2lM!y+d6T3ML4?8h2u)MMYK_5g zin_|t)TPsJR@cl9l~TC9&+zzbA}ID{f%UL0JCR8o1GOun9sMNuCZ#! z9n{MU{=IT4R{HIc0MoM5Np5+sA|w&-pwY#P@D^y09wswp65P0u2I-UfM|BMbvPxJ~Iq zi#6FP2QJp{)dgBAh2I>D9uAwvG=Xgj`ty6Y1db0Pj7A6Gj8iV5kP+f^9~Un_0%siA za362J^*(<6_~*Eo>(-|U*tWXpgNOb?#bJk0crK0S2Sp+9o%bhr=iT=xoRSO28rE%B zb<-(EHXs3_cz`$=qAWMGt&HN1$;>#EDj|g=*0F6cUl~LJ!+Lc|BHns`-<;#|GddAF4o;M*m=yHSqBl8{9ei41aR#%^u!H0C19yFqs~~+B0y` zpsXqkvKX(<3Jel}^8nTsP>TGqtpzlgglxUNy2g5PabcpHxU8I9ORK;p59264dFBT+dniA{f z1sa!nY>Y)&mWbmRO;rMo2nlZcWGMwJ+5636=%mkUiXU=>o!|8p@E*`@gjnU)~cW&?F@z-Z0opIrnp5-ok{?mP~h&S}|79fL! z#=yV$=XdblyKf`OrVenXn?tjTf-HHkb>w!&YPL;qmO+HWTW=yAOwrUOqBuoU7g)?r z!2*Wk>9KQ9Rah)80JcIPE!LX?aZ)04A5c|nuwKt`dU}q({lyZ$`1EEB007End%NQQ zY`Fnexo(#P1U}L~i+qVFN^o?159{?Dmlv0KaZ(@*fGDIbY?j5yiyE6^LyUChPk#e0 zcq`J~Y*r*b<(&MwnhJY+HR5E@GP9eiL|JZ}^$d;FQAmlw*6HCIM=cK}a4_ZAKRBYz zYMeSlLWM9Mw4`Bc4KB}~ARFuvDOV7cgWOmP)Qv_MhG^=VT6FfMs z##*+`J2aq!ko7&{uoI!CcY-;#@Xzi0l=JIEQ^wGGoq3Dy-J-^5a{y+EUg3)tcE)gJ zx=hiFd4nG<&hfqXD`;I~y(tmL43TBf+JG}fTs9u!^kRW8o|8kv_df{n$yW_dE-b2s zzMl`*oeaAGUCHTrD{IQR%o5;N9qc*J>J(v28Fc&Q8c)CcfAQkwDW08FxV>y}zp9X?V?2L#g`a&i z!}HSyn}XhNAaCBBwd@Pt^C5DbLtSg?njBX%=L{)BF^m~QXhH$`(8JYKA%vZR3 z9AUAn5rrIq1cE?92<{@LI5=mn3sh)$16JlJ3mSVb^z#iT)6LR5rrDVL4=|x zu_-O)%PtVtZ=aa##mc*uzbHG0Rd9!?xC`y$;db2${DBy7;N3SEf*?Q`rL9A#ZpSv} zx-HiJMe1lx8+S%U$Rdheu!+Or;$-BOI0FP>+G<0$;?=c+Rt>)T?C)@P`n09VY)fJo zl(Maj$`;;hyFjD41SDoq^CGP&eeY+uJ zi2m?@{e#8NKUv`J5yKyTC|p>shLjRjqw(zdIquxrM^TY?`Ev z((6F|f-Vp=g*8sQoJPQZ@}mLX|K@iv80@*wl!7`e@B5RD?qYKIHm*)T#nt6G{{ClQ zwE+U269T(UW6=J;O;2_1PTYU-=ikB~{n3X`+r`>3CJ19RRng1;+wQD9rq#d3N>%OX z*bkowgLrFfWR6SbyRw((20#DQ;varf;b`v!2h($W{Yqn<+jh)L;_idq8bf>Gu>Fu= z&)ARe-x0vA_gbT=I_q(O+l;ajVf z#&jZ_3xxs~qU}cOrh#eK${Px)ob0z95heUEaKW9|7LiL=Io%|xHCAMfcP89Oz&p|{ zqbx?HD#y2(V?H}W6eY;>6{O@4LLfy0Yk|eGgoUN-NlWd%?-bIg=hWfY@?{Sb^; zaI-P7TkR{gjpKP`!s(^LrmzSdlYh4x>K9_)J^5ng8Sm~~Zl9@E0FI6h!rjj zbskzbS@rbs=w0sHP2;BTwtP+jb?gRr4lKeDh(m?RkfQ>_*~J{I++sXnxP2I6Q`FGf zV6~y~Z`jK@*yNoUdNiPp%NUx<(kw&ZXhY0lWYSvQ+GIrOKJGsHV_dxY4X!RvP?j}e z9zAAlzhyPOV%ne1+C+x*zUi3#}pMK4eo4Q zWDvGrqhuI5F%OR)V6nNvd{v>WfaS*Ge5P8$oc}OFd0i&ZS^j2W^g?UwHT@k8W_MW?-f@?n5sboH0st4r6i-HA11T zHu(CdG?AE$ zB0PCf;`wQf>4@X=uQe8{?lq*_etPm~UQ&|Mt$iSNfi!#jx7yr9Ye-EZ`y?38Q!!d$ zG8y6hw`MrGtT0=3%J5bxZhPrCJ&ark;3wae_=|t}17um&0-pVgL>e#h!R|JLJ*$1T z9jWP0$+n>RBF5;h@3xF2Qf7=gjyM_O2jAYquRed(x|{mz_ z1@F2{rRm}O^=Bve*0*LZL6?JZ^2jQSHIychoiP%S2a@On({YH!vc}Qj5x^MAVvRVC zFw6{^ra@jbV5ng&a5cA>b6{_5+Avz|FcV#G@5#z|ke&x4}qFp>N zFYb5G&aPH4blbD0aXhu&!lB<;n*KA!sS|m2ivQogwv2Xqq|>cGVArV_o|w8=1HXDq zpYM0xF&K|Rj7C!^)!^h}gVRe3DRnE&>1!gr4%S00>%!$c_)rRC+(Fc1BKQ%@f}tsw zIC=K>WQRJKf{POrRdu5m(H0@J*Xn-z8xj7^fAuFAO^$koUtIz6n>3}$EfX|$BkIjs z(wcO+apW#Rqme%%y4Kv1AGb?A;ang~2N3`!yz<%Utx1AgaSl3CxVGF#6VTEDG zC#xIajk_8C`JcW6qbo3$A_x*x(D9uKgU7aCGGUrjxF)9u29~Zco zlU=TlRV(WXTx75y9VO91)-VRRx_H()s!}jVgS@CwRR-(AI*~5MU&P&Tgb1z^i+r)4rs{kCn#I&u}@f!5G8gt#=5I>VYoaO`)?v zX3$mBcId=zpFjpFqGUv==S_utJpEN6rj#HAY zD2v6WdrP70CJ#^d>7U6S^E17WVs8r24^@>tiBlYPW_NUm{Pr$um&$Mrq{p^@{4O}} zmm-bssabmZzp@5CeFBuV!Jqzkh-WY6`0_=Kva;>7;wPFuFKjv@=LYZY(kLogX$#TV zYm5Qu|HJ48TGy!Z832nQOz_nUMdM6QXxRr5eYz_caOZ&I&T)YM_Fw-;7*B7tjPfmB zl^3MeMH>&^GS9(os`BI2D&@T-XHX-uFm!vLZpjXN(IB1_RtVqzAt!>DxtN z4-avfin+589)^I5wj;OtJTu|Cu*;PHMgRaH07*naR9goe|KiW?U^qT(fod*7O!gjN zG`WkinB(C1O%(YOdHHup7YmFA0g{Ab$b6_}T@{Gpv`g+$qVGvTFQ5HpIx8l750TiWy%oy>$dUm%y8Ci0=!=kV&xW2Dcw+2z8{n45 z=l=Y&Ck_7NpNxS*9ickRbJ@A;BsD(ONrXH6uOBF>wi8ex)9Yq zskWtgINq5*bc?b}va+v{{&+&F)}0-5D4joDPY7W9nTNP8CGrK!T1qn7O4RXx*L6rw zUmE-`e|dsi`-E`~Qu4=}Ew|lceZrBK9X&fiOSh?;&NcVqa)EmfHH2WT^MW*{aRsYJ zRm@0%9%Xp;>^VO9s%(w^OU+aY_lCx++AXvgb~s?jFNuL^=a+a2$uALuUKxKK}S0 z5r(|AIPvrW##t+_Zkh_e`Erd~DV$t7>*)e`csszuyR?39ni63^F->6@LP+U+opLDE zpsq`lMGmDE>ROXLNVpg_Cx2)Z@WmIO;YMDpr{6KZFcYM}Mgx1K|wm0w`4@&3ss|1hX94RseX*oL5bS z`PD1rn-z6XKF%B#WmTb39F5XlFlw(5E4}?3wd{V@lOgdQmSj3t*0tG|xT)&(!4;m( zt~C%vot($xiMw_#)-97n@0zz(#^_}L?1J+)xshUfj91Srk+vIb(X`FJnsB! z2o5~BP570kdw9H;l6YLWj3Z~u&f8iO=`lON<=N->;;R?PbGvQ-Ahy-z?>tKIKm2z; z#b~nM(`t2BmBG?_c}LI1xFB2FHr$(bI@c%V>z$VW8W#bYI)~P^(~)i8w4Tv?a-JhE zU2K&TUiz0foB&6A4Eqy_I3ylTQ8g%QgD~^~1#YG`o!-h?;9{=v(Z?_F&kk-w1^{Q0 zl7yXy)#0sou$;d_6p!%e-5=rQ^G_)PoH3MTPOEgVHq4+ZsmL5mEk1cdrzq#Z!&|`q z*kX_k9Myr`G>J<@#eQ~q0<9Yoe7iL4APAv!4W$*5h}ineP3Q8+Sb^p01>%UKsvAhr zMapw-F<&;wQcHX;ZO|y&YQo4ihB_-Uo}(fkhxFk28*j08URo|}wQeYEw{Za(QuaCz z*4e9g6oIqro@>ScfAH-I9z8sQg>hXHTC%8@NZkZ7GcHi(Gp8O1AtVurjiFH7@$@c| zbc`?_xKWc{ysp(pdT~ zsNUgOp~H$>)+t^uq-MRT!52)WwhKzzmF--cz6B23F-_F^x|C{*CEpWm8%rDMIHZwp zQ_$xeN;K0Q~4Om028Po_+gD879uFv$#3;b(*12<+>3-dZyDNNU zzJS&Z;$#e1W_a_#p#6RT!=w8QMODIDBFi-m zJ;*+az0X5?cG5TxDGItM^Etw3fTqsf*CX=a5+Raof=|C(B8?f0rR`gmja$F2VzY)) z4elIp2xjo>uewB>#Ts}ZxC0@%>sskOS7p96Hj}23FtIcVDdg0d1Nw0+FM+2gfHoRO zQwp;veK>+E?2Q68g~Hui0Y-xqd(#xgGF)7o6L(DbRky}+P2Y35p(3+bciSaxyZc89 zKnXzFZu_dtj`7@1)Yt$eLE64Gmxh$%y|*V2GH{X^=`hBQWZdWR0Ss|6K~rs7_+UAI zi8vWyIJpDHWSi!a4v&zHZ^IhpICTm#Okk|W`O8o7%U}ErU@HhAFd0)?j6ZN>5aISw zhW*JL7tU?K{Ep}@W5_>_xj{k*KsVP%v{ohXnpm*bSbzgbxJ?UDYFh@>{&S~;wLQ@> zOqUDjzt1jEBiOdhhGm`gP2B*$`HGAp-+4gyhHn(2fUq#>FwH1on$Jjf#g&%(B66f<7mTRK&_vh9y;P~(V&3pLK zkAJjPrv0eXf#BPNu{A{AYnl?9^_8;{j=;G@oK9Ll?VG!*oex_#XqpPJ26eq@12C<# z!vTPQ_gBBd@|qMqRJ*=G))J*~J=PJh{R;uQ6R+Aq?lpOO3seL>LMPDG+mp zd$)ijZt(OKaQ}9I2X_W7j^bS$y3H!K9#qfv_Ld-3t#LkcCzkE}u)NNXbKrP-ouGKJ z@Fz9L{rmSY93NsaJA+XxD5Y9U7o#||F&JgQt4mjyE%ZarxZXO140NQ+;SIeVl9N=U@+IlT)#o@%W9N%Cf*JcY(FEP zHr1m5h@Ozx*qfv4y$+K*GA?(C*h+V)G}k~E_8ME}exi@PPK7YeB+&Lodb{JU@#>sX zpO5#5f8}w#vT|C`8mJp`KjFM%8KS9kGIyOlF&ZDy z2{$;{!K|*6N&T;UeMN*v89>U2%*HGwcyI>F1dIi=p$BC&=qzaC$ZOp!&Mqn(9VB3k zVZN*|Tha}AG-Yi!QaMb=x5(Vh-4E|(7*B733xV}=PP)E$hA_&&1%)$MV^EbV)YS&J zkH&cR;tE9tPcVOdI&(t8ZR%QK zom=8Q)!R!iW67{Bje&!4uX}WW@!^<&(3fX9MxzCU46)fP+t)D0Kr4gQ#z46dZ;*5k z!qK#geDi+ZmBTcY=|+;49J*@;>Ao)bHaaj&f$3y`Fv=i;1lFp~NfZWx(<-;+?^%t_ z>a1P#7-O(rUf}%V9Do0_FYw_9U*W^={VB%#_uEm@9}a%RmGJyXL#{rq4Xw;`a1UIi)N#Hn&H7;MMVB`$czA5zOTK?)le zeDZ()hp#cpYP|RUce@VDwnRJX3W6X;6ooLR>R@k6PLX?KhTs3@0E5v%$NX()V&*h; zb}PTHU${7z2%`b!S1%!Dh$za)g(1q?q!Bn0=yn&e6OIr>B%cuUzO}096mn@MjB|YS z*_v<@C-?AS2%+rg3+HoSG&BGzY;uD^%4mbgIrb;S*8SBNx($?-A$?G@C9qgr;?CW> z;9TPP?t3_U^*J`{Io7Ll3`WPWMw6>$og<7g)c>} z8Xyc6w6k!dMmiJk9E|J)VSJE`<+A`S(XYj$K4}fzA{)W zR>)F8CW-CqTQtfzduC@55>SC+3^?2)DaRn`(q5G6$fTwpLV=r&?%L=o_q8Yh{_wj4 zy!pmMa$IN%O5B!_li&zqw;K&ujXb|Xna^?d@)N|#(CN`6$(oozRX2G2<#XJ+{TQRY zd#$xLCGJp_VO)S|1%N{}1&$9QY;ub!6_Sp~F=<|@S0q8wT zZPAm3ZCP8ROR@3^LOzW~3Kyp9XgEPa2Sq#f-O$x~rxoVmgQ^#Fy1R+A+v0VwZCe}v z|JDug`BSny9;VdsozJNe2qkT;y{^*5FA(iT`2&q15I|jSU`H;_p34w*xkObi5Jm%x z_ikf}f2!FP`FqaVEA@|`^3VDUOYkh&i4=BOG<=owG%knT=~ z2&2r|w9tuW9An*|UiOA{NH#ox(b}o)IkAmZ(}s?g#geEArlTlmO&@ANtOq2{QQ-8l z!F0rN`zRudjH1THOt(Cfd&lHL;Q1nc`&E<*i}^W{bOJ6UZrytyRk4I>Dwo_sGMYFU zBj3#M< zgv``b4?KkfSADdX1r?Xt5ocGqL6$J=jV1Q?67t|0jFIO{RAohMcinw1!=!WMs2ef} z+~m~FDg&q$-H`s|ytWM9VR?HZZ>xx6z^wz|_rLcZ_73k;a*eLQ79gRdfLN90CC>jOZ zw4|F7w)+LtcVONv!t7)v@?KDgUrO~uX!=g7^A-K}R49wCNVU=|)qPK63D3G(8oYRQ zfxW}KxSfn3eFBKbT_}uUfGiteIu7ySH!7@h;6MB6J>0*$kNu;Eh?B7^CfF$^H{`xK z9Kae4r79v;4)&2|Q^#cqoVjgD@L-`e{0wOfo4<|7agk<@4aS(frEH|Q%9-`X^gjY1mKx>BiisN7}Kv`BOYnrL+2B-|R>plfWo6f{g!3VVDU>NeX!1l~N$A2Io#0 z@5ZvOU<>e&knFmyQC4-kD3H7x3$T-tBP4Zt2V=qx?j5_E+>4bHhBO-@2qFwe2RJ?X z62J;N&)bpI=#Eb`8FsqN<9)hGy|5C&n_jWnwbJQ#E1Y$H=bX{KoR=LZs~tC;JEwMl zwlDTY4WRDu!)w=@{T3E{Ux@9L23Bo{z_y#k*Vv->J8Q0E5;wntDTe9akI8<}W6Y0r{tg@c>CW?Rg7T6kOS}jkOln z2%y#)7~P;OmQbn!XI)YBAo6ZTApL|imJvSC-H5C&)b%5&uwaU8MRZeOwYtJ5U*?!E zsq*I~wZd5fym5zPkclq%GqA|AA*PcOT5Bk+F&)waPM{$0_MXJcGleIwIE073!+*xO z%TR<9_>vQV5M36caDs2ZA_yXAtzb-r+WBm87fJ7lhfULMeWW0PvIl@CL;57502myQ zcvve93tDKbR#z?Cn{(E#pZlr9fm>1pjyxI$L>|0cILt%baID!I)Dt%(gx|X}azUP) zNWxm9wg%cX2%}*OwyV0p?EDMVRZf_o6EX)uj3k|6DNk_k;d`jnW8~!mC+7v8Klvpd zz4M1I%h0%DRiZ2w*euVmoS#B94a%};4{4uo$vJR#xyG+QuQ46bf!Nphd1r!F1TKkM z(how#wi=CS9b=M*R$CNvV3n+q(jp3rv0F~wyNV>mtnw|wM06Yg|1u&=wyu82{H zMga?pFTQ++Uwl%wtuu4&aufoCOt#%2-Eb=4jms;SX56&l5Gd9}j-_Sd8zy!s7w(EX$! zDd;oa8_~Ax<(a3|xDIJ2YR&dAJ6|}ex*Nx|*%nj#*Qy*7y;gL+edvS5>q(}sD=tE8 zXEoT~DA_k(wZB6aw7V(27M|h%AKO_sc`>};)S<_Tvk_t((i#mJrqHTFvAH5`lol<2 z$f&9t(-?1)eyMHc*NpkQH_2MIu~uZ^TQ?QBld%}4ZcH|5L43w~9$2jH%=+ejZNd&? z?)@+D;@M~T#m84zZCtp5W32CuDPfs&*1kVqUb7 zdNdqhIEYYHMe86MhEaQsv{pE}{RoY!vDqwus&CX@5+GH;RW~T(;8y{fw+NJk%;jU9Goh9%ZRWbAB@YpA9`na{CaT_Rs!;^gI*XqwtNz>_C@Nr>S^xslaV#a{5>Yb6{_PK8j6zw= zpqd)GDX}guT9?KkOpqiLp=Bd7dINKy_|{LydOx`9$eI$3D|BhL-?~ElP9=F;(Ad_R zxwXL+By~|W`BI&oe2HKD`X#RBl<^lj&EUgZz_;E8LTPs{DtS9aQ4C`&q?Cx_3{|iQD*?~E~DF}ygf zvDr}4t}ht=hKyqhp%9KyX)S{`22u!=#p+-PZ?$mkM1Y9eft=3oZ;g91=4hgrm2u-BM2c;mK%&Ghu~b`==LMLc={<; zdbM@K3)Zc`>&B4iRoND&V2p5-RzaY8BJ-Wlgslg|J%maFahw3&vz^P9W7WYA z^;^pjMk&U750GU0kYR=@pF!&iGDxW-w+2$i?Pn3jgk=TM0M+@II6L_YoU?Z6QB@_H zMkA2K_xt!OjgPNJn!12?%6-l_O14B84ce2P`6w>zg72(lVpF8NLKF`WMrqH- z-QGCPY!xhHx&qZoFmMg?YU%=;^(9uT6~26~@%1Zb<)P>yy>|>8?Fq=%(UWkXB+U>z z=T6~boIG71kQRgCKD1WO>9asyQUbQ;jjT2ui(4BiV!!#4INL z2i>5^XK0$D?LdPdMlv`+5Dp+j1eS4B`4wPI8&+YBf;Ga4^R=_==7{293vXzxP!tqx zrL-ldSH>{PEPnKz0G~anaJ6t4(~jPbG2n|A^!4T19e8C|-2BhJ+H}Qzm=W~gc~Z~M zIs&KG+nnlt0r3oV(s3Gxi3s>>3b^xP zH$)RpQVLGcit_)+6%?;6THSiN`&6vMwEC~1RE?%Cuv%Q<)!7E0KDC%F9rYoht;*q) za2d(~455^QYLpwbtOKsmM#R^3i6Dq5_`w>iR!dx5RcM^!Ls`@BKz4?P{ZJ0myRj}7 z-HlY#bn|%sEz7zNgEI@I8VDh9a=wOE8nY$v>604YdygRqHsC@~g0&1_twxeik)bpo z`n1W%ig2)^Q~)bmZVm%*azPw2Yk~WBfk75h!ncc^_r=?9$`}_&7$d5NrY%7j1{e%d zGz}rkqR}|Jq#Q)=?h%KCpNujp(rd@}YTOjB9HCd6&cbIa)~m>s*lF0^of zXSw@-mog&Y+$A}W_a7h#QpkXW>7J*jRn_WR;Y9jEM$QA?b*0YHf!r8q%&r@YKr)13 zggbZd;=^x`v6!79->mRI{!eEpYr8GicZbq)-RW8V0q2W0Lnjmt+*W&k0(|o=`m@EF z3fR{tRMZUHxkf!-u|ReqFvfJtmcZe-yT#P*&?x%McFuk`DcoYGt90LIkWiO5%z(>z zcRzTVkq7cUo~e6D)!Y@tVFtYS?prv%`wrq{LQWj?7p=2xA?yka?ZaFYD=G?21#65; zDB-UWD)${hjkA)i2y7RU#zR;%b>3^`?LXOU%&)NfSIcOH%k!sLEM~a4sl}D- z2At2jNHESh27@8uBwciLa^ZxLL55>o_x`x^rH z9=yFZ&i6^l)@m4CW4$~@U6NQiPDTjhF+`BM2(uVrJc3d+%3?`r-&(l>R--OgXsQjG zI(Hsp6T)lVqnyMc0?D1*D@QimgOmZ%YzU=l{PYJBX?z{X?$Z!dFVT6c!(rPUFv-S< zh#Lm@`L%-P;9H<+C_uhLCQ9O1SIwKwycbh=tuo?!2Fdm?;$QGBd zr-=(AkiCvJSg2iWgk9uivCWZ&Z2@>YAue%tDSzAty1LF=yWVzIz%+2Hi5 zvorBPp|`0OB0!p^2qTi=cqVfcrS23Z|MVb8$pBAfy2@`WUlb#3)7yIwRCgGQ6a;?f74Yd-8k51sxo}uiRe`eHKuQU%HL~Fp znFFdDRp9*eDb}mG(_cD3Ut26T7N?i=^KVLGxG!^H;-Z}LvKKQ23X<@iS!{=>*vB&b zP5tge;P<|{2M*QRA74M`9q6tbNAZXq10GQI8VECRMxDKoF~0udFLD3P??b{u1_>A# zlq%^y=&ivP&Micbt-f&)?pF&ssC>8T7ZqjIkuSrbixTS_1J0N98k?fS4TU>M zy`jOiE~}ry&HiZ(#BS=e$KE*W2%#%Y-PRy+BVG)=5*>W7SYMX~pOcNytxFvij09#-oTakM5EO}=frqcmW9>ugV` zWB?lXHNOSooS55;StzX_C5My}jS(m+k^*_j%cJ`v#8Ctp(56I)fYOem0p&3^WgDa# z1Ton|#~Fm2W3jT=>_5C@VqFjitZB%>vn)4gn$ksJDFXY01VI>MeszlTvscIqg)pEW ziX;>k=QDDDh@CWNl>=r8oL+RDg~y^o2MBxMy)T&E>e*Sh#Y`e1uf{16midnQff8|Q zEaxwMYS!-@rB>B+P&aeI1Zi+0L`gm)B0wx+#eMDcl8W66s-Pe>m7N0 zXhmIj?kE<-_1ha$;jA0r$xGMySKR`^yU~97)ZpL$-RF?P;P(GV*_*`JmYio|U&M(s z-#O=e`R1y6uSOQhqC_@DwnVArmek!gV8ezNZNu=!T6lm38@)2L@xp7vD{pMT3%g;! z-7wly4{FKmCe$)1vRLD*dh?WX-ua9X;l&>j=iJPERa60mSCucPdru7i|NY-^^&KSX z8ev#ukCA|j04OtuQ-xuQ+2j~XDJ*8E2%|1S#-SC5CzuPO^t_skF<~4a`8Qh?%Nshufz&f;GY-=Q2V58I|r8t|>!wY?8dUlDr zuJGV#=|bgc@o=F-4xwDMWQP!E90EWDKMUr5aD>gsFV`h!$oLz{RFnfYp}! zaoB7mdy{$`&^8K7UOqN2O5o@BG_;uD-R~sOs)CZt@BtecO*TKq{?kv8XETIRYLbj3 zvc)O2cik-j!1U}9l&VmbIm%*Th|RV8eiq6AG>UwII31#v3UyV1bB4iigCfBqf<`{S z_ZjXznBt%Rw1zZoSY+a>`W@qvP&EfuQ39{u@Ub}r9=*`$#IzQKXhK#QNUUF0&Dxr0 zMvQDI3|7o;RTtV|rd`8?w=J2SBnpq7m3{?R3g?UzEjIgghgF*rVfUTYGTPxlWrijb zlSODHguLHm||9uGa46lP~A^{&%Qluc`$EG+FzG@c_P`q81tIDtGC>ae9WT zED)zX6#0y}5Pk&i1k()47;O27N>{?{$H0oLNqNU9LDB0$wib6SZxEg4W_ zE22pqKRbpm7#P#!Y-mjSl%&?Dtbivk7Fb{FxpWzOSP@3mLl7p;{ssW5a*4VsAVdIV z5;kgCAx#Ge!xUGxmRM#p?4Qu@*D(nuy_6QGGNb(Iyk&zch*fT5u(EXW#v1pY(EIu3Oc7W-^mo6Bo44OW81>+XDaI#{@%a9S zST3f>7KaFekcJa}gg70!Ji^6nA4*mziWyE0AKlqs79`SHI`oCe%4g8sZZ+RdiXINim~+@!4Y&ML(niIV*tAA2(XZ6&%ad zC_CHh*t>qmm?LlqFz)cHw6~4Ll-w)rO%o?QL=nA0njVo{L~8}k1UxTrprxI%X{At^ zHU%CK1c}Mhs~va7@vzJR#9Cad^Zriu|5xp7OgM!I+*sC%eSNP1#66FALH6qzBMD2K z^bw~6q}_G0r(q0IRw%NmaVxd)XAMRdr+t*g5}i&LcW!ZX;t9f#LDt#{f#ZlC)|XEk zaJ?`S#VDj3(c(I_1S<1jt@pZpV0OXuyFT`=y-9%yjKdQ?;$#Hw3Ct(^^ge5ax++kW z8I;l}iwr{eh~pHuuGLr@4FZ`ld;6khUYA4RZAg#GA8f*VUI|l zjL~hs)@v?@yu66pDHD3CS_XdYY(9N%%H-PUb{1i4fU?Me&mPS1-~4w!!HvBS@!Nm> zJ!FeB{QQ>>@!7)#hF#!?-wx34DnlSG!95Q_*r6N&GZifJ8IojxxHEzfk)z)bwI^_x zY+V-!!WhRVV`x<&jst{I>b&>=hyVGf_=}J7mCR1oin-$)*cj6Ledh-7i_eX>S`8eX z()*qpSAr-2Uc2hy;6x%fK)ZD;XkT2xIdZ3ExDN-k*7_Yqj*hZc))C4t-Ha zXf>dgu$#m*NoIyMZ`UI`&%tU%`&qe}uZ@VlY9^od*%l?O8T)s6Nte;6N58kn>CaYn zG9ElW!-MP(2l$0)jG>RhhIx`5*Fu|2VRshqvc8h7)qg(N4Ob40p z=vFD~=BBf)lg;h3_*N$Yii%-(dq|{3#>vD?1n@k8FdiUIhbXccCZ|tOmKm1wF=o>f z16X>f>k8dY1Zas-ub@1|x-tB(YFe20p8?ZFg)5sJRjp7qrSq) zgs2hRxL;~eX1n}rP;uz;`?$+jP_WqQ|j^M16agO`oar379aRoFis<7XfLnX@I~ z%(}A{_}1M5!+wbV;o9TNNZ65U^TLA zjwnuXdN#&q4~vz&gSN+1J58ppNs40=kE)v9x5=WJH1DhfokSyzfk!WC&EzFHY!p=k zWLI@#!e`AF`yKL{TA18|H?9M_8yr9Wxx(Ct&aF!WEZ%AcAe|Uk9}4tRhPyX8plgh$ zWPxN4VNW&BN}mJT+ZR#00<)<}ByVdVkxpzJLULMjHkhKby6(Q51#BTBs13PMT9x@rYTvK0pfn;b)_Epsepr|1oLTx)3$9>zTA*4Mj_ zyUEOX_e^%l;?*tsgmgV~5;b-yS>BN79z0VB{TbHRH8!?yA?>c8`}ur@@XDAl$-h96 zP2FLtxCAhU@O?^P5fm#`OO3n$PR0~}wJ@V(=tjJnMyr-GQqcpdWHZIH3Uy{~t4^Yg zpEi*htr)y2b1*hT5OryyWnRmCeulaxH_l2GZi*X40oI2Vrp9c~wq8;KCsW!?PY*Pn z>`ScmX%qNDVr>v2D}W-a+^V!8x+i18!>oHnRW)Q?rHNCcHMv2AK?Ay4{bXJ?x3bBf zeWi?qv5Pd3vgI0J2LO-FW>4ZAS@96pZrmj&Q7#}v2&E;Gu;V%c%E$DL(W1o3;XO>p zhbYS>di_nzXJdF=B8fRXk7PSlnZxHbuI+d@I;-KCwyf>ApcKFau(QtaqhE`V@}F!u4&2FP~{_tpWWmN8oEP zrZHPkn^o6MRg@K`?b0pE4S;Lg4FAsWucP1ZLkJ&>#SAB>Cpa7D_}QoR3Le>ZhPBgM zUo=y3>z>-)hn5?bM)dQAFheI(@!9l`)-T3Z1!_sB~p>Y^y-h7N!g&vpA!D5X_Hg&hRzG2&$4QkYjw{VestR%=8|Rd(fG zptG$WQf=;y5FvUUj=-lA+}g}?PH##W&~5hMg~s>3*I7BNSS#}WGL=;rb%1lAC5#?uSlwMC_D#c0yX<|}YD*D(m2hNIB`xH;p0hmOMG9W8}I%_6E zUnw1FiDoUXVfjAl5-jD#5!u>2dOpYF2fxI%n{Ofr6F2$n4tAkcZ6?4TJP{DBfqTfa z8IJZJ7@Eiwj0FgM&v@hu^!hZ^h~f?gy%@rqxkD-r8<08*s2$v1;|N2~RMQ2n?*MV= zAr2L?LIBKzl)1}lT;%i&xJh=-a=HjCQ(SARyg3K z9=}wMY-@85(E_sVMDf~gh|R4Xc)~|rmDt^T1EaM$o;|sTZqLI%_$P<%>zQhtW9>9C z@GW1eai?%GaDL-R8isUH+cq#SR$2OsycGkcn<~)a!-q%5c=_~W+`9XH2=0YO0PH(? zij=j9lD9#nlqwR%J=2l|D+fyBV?|(Ro=quaLWCD=lG_J@Ey1}7prD&yzd}!V@t?9- z;`y`t_~NmRqHio`ZOoB+W8NT=O|7M0CEEJ}&#_!QmV2K*pJ z8260umy8PQx^N^ltLgwk_Ilhi+aWoaA(Bs|n;*HxQ>}+r1#;vz;|C2vK+FirWwf7;o0QUkHhO)7J7cZZFhN`MD zot`3&I~a}Dk>^Xuy2kP03-ktS`1FfI!O5$`};oY`%mVGQu5RK@C$k!JL`0yAD+^Nw=Xd(h=4il()+&5sSUn$MdD{4 zO`(~GFP=!;f7(=|{9H6&6s+1UfAIcwY+rfPDF=eE11U?aZC*!RSGaZS0RQ!W`(t3) z(lNHaXI%r_;Kck~x_BBlZL6$-jV+pn9#2{{2-c`Rl(BdA3^Zad{9XsRdS!s&+7%jv zF)(OV8^?o&5a@6(N!BQ>eQq2T?D$+brvR$fB!VzC7y&M{e(lMh=fW-(n66r_-{mf& z=XqRJnd9X6CE3AN&G_8vlB5~EdmLCF1qh@5x$9iJgVU&}tY_uQ&!^v;+C@)`|hcE?11ZldWBnj}HwHP!tRFxd)-4Q57?s?0<@UId*sn zEoK6NY%nSqql9SQ3MkaIQI0cr1o%PX$fXS>;k@$#bED+4SRjh~hKr>ywOM9t)j_GQ zOT2vcIebs!))fy)#Bg|0BZ_EzY#H8l4Xh72zWvQNFI9^+2dMgbDlh0g5q^Zx#toB6 zmt#IXMOEeq!x(wKgb)fs2q>j7=mEol!r3^(d`XkK*@70I?>FsVUDKbIy&P~_Shucr z;0F|DK{BVBG;YQhO9&rQ0#Ve15Fri^9#X~ZdB~Q;S}%)&Y?#rE(Cxyj>IT~gTUbo! z12^{qbQ2Fj5a94+j;f+|GB*dCZ`xe@k98zSmsCAjE9laUw9}YI{L9>Mf-VsWf0b@+ z#ZR0yqH1fY;tSfKHXX@^mrfUeFEkEM3vjM*{bp>^pCfS7YIE)Z+{5PXn^?|{@chX~ zkaCV}xkL~K7_DuAF^>JC$2d3vUcXKUuf-on#!qb6UBzJbPb8EA4o>Ov{H-5eLE2rz z@xep9_s%U$PM_i4lQS>|Y_Dld<_yc6s3KOlZ0Q10QWYm#ac!SHBx;I%eimcuCJckF zcE8inm<|l3fcM@I_}+J}88ZU0l2XMD8(R1gh9ib=zkeH_J^C0?VBnRxY2|fm8tfT@ ztZKGaS()`M2zQ$;>F4{xu=&k1vt-z|_}v;1N(Drb!0z@CQQRfaoq=IFKSYsF3@xDs zGpbz9#A=$d+2EBSm)Zk_Npe*Jz zI(HgBhO*4fCNO^IDW%~q7UYca@|YIU=7?_5=SQ^gdugNf+ZX|RTO^kmpT0yGbqq*s zYdvFbVbTC?qfLs8Niwbw|<_MF%;RnLB*xVRF#u%<&gNDMRFMkH5H9Fk^ zT~1{IUoZ^1#6PnDvsA$58gOfuVQs)MnJL_Vu2GgimNhQ5M7gOkK6!>9O0czd4Qrzj zew2NVgQFRyvjtup5h-_Po#Aw%o%T?pu}AKu)Phw8JNod8rb344GXC~&_3`%WJxr%_ zWZ4|cT$u|MC3n5vJp3 zMhM!F2X)INX9eTY+DrsX*9Nu;hr%3iF7VUY#K6%an%0lLo(thNn01qM$uOo()rRM_ zoS)&v(@zL%W6Xe})LbvK8f8s4T2%qpcN6@Zf9C@XM;l)Ouz!tZ;tFw&09djoA<#CA zI$+ja)x1{gYo(NQ3qWfH;VDOy+#XRG-HE9x*c>(vpqoQlc)p+n+#m?aqujLaWwC@- zHKMo&-;Ytt9JBEOG2!j+>UjwK5K2i*W;GU>#=)tK6$dUPzbKv!BA$q;k z1;S=I8T(~LGi}-!0-c04AqO_Jz&J8k!FAv_70)tXCDoqCtt@N0tx>Zr!^-FJ<^Wsk z1J`#cB7JuQxUwY>1{z;HAw14XTn07;OcG%o}c2UA08kMfonUS%Mui#p*3(0bW(bMhkdHV#wOsy9^n7(@AvW7 ze*G>+YdaVWhZqb7;K42;!SA9&ar z(Z0U1OH<%Q)(mRmkk*pbGTKS9bCgx|_i@n5W;E&Gw(XaS4n8a3esPdPmM2(WA3|jF z1DqUuVjL7IS5+t_A-upb%U6L0)^dDQrf03(;9A%2fcqlz8&8a74}Zfl2A$3oK?Q;QTfnCj75(Xr1p(U5uG( zJyiOghwIlNM1a}!2#eVnxaXnBvldl@A&wIWQ9?>0cv_J7bV?Q1+JHv<-0;bK0o1j^ zbUH?K_ylQZU?fAn@h{smgAENSOS%;UqTM$Kzd~J0L;*t-($CpHZY)SFZWUO!3DM{v zPp2A#fku{*gIp3Z%$E#lq@7<9#gu8}q6tE<2bwan6gyb3KKawdIhJ&bY5kS7hF5$% z41nMHjXm7H-a$4$LRnR)YmI;Or!&gM)3kwXy30>Ln&9{M?_q229T(i&WDAgR+7CK- zc~l_~HR9PAVHjeWWe|el=G8v5W_Ynb#@SRk2}~yqp;d`6O7Y%%xA59)6_QB8_k9$_ z0t^g;(FVHxO`IG(!FY0l_4QqhPo9!qSG~a9n;b6=6~25T34b+H+xBHJGbWP9V_M@{ z6MpvH_xt$0-@1lh4oApC$*t5ybRIEOnEo;zH> zj%+za7%=2{hPnb?zba8y8b@au-I$)Ur9s%X@93-*@RA6{XxM0@T#+kH9G->PpWJ_uTvp|&bbEmJ1 z;y#V-&1BL6_~v`sjYlkd(i|2=VS*ZfEX$D>662Z1curNq!HjOdBAmtq0J~@Dv#lm@dMRAXGg|#r&G8#p`L|seNisA6Ik#5+~ zP2c3#rLoa{8Gh5&8X!D{JkL-RB|MKqDvhev&dVwejr)Kg9?*25sXYt`2-ZcDv~2@D zo*&X{{@TK}72Cydc@U|`fsM5YfA}B#4qm%`6~5q@P4+PzAK)MV$zM1hFn~BsRt(HJ z@MnMW5AmbljnN-nfghx1T}nu)kS|a1*@GD#J+E+Whe2tD)3Z5#`9+DlH$CSzl9w8B z2y{~q-~HwWcCXxoACfcgX!91ze2&HZ7}K*C@bl0aSyp8RB_%dCZ$Q>L_Md->{rv+x zc)CDYQU!i8X{LOG9#txXUZa{Qs;1QqeBd{~6XW0bgZHs}{XN(uEPx?Q2JnN#k-dj& zdj?W@iLEPdwY0jIk3Bf|G2FO?@yT;c#>WssKnM>>>Y*qKbdm~zFR{!uq7Zm_Onf+- z47DOyF>)X#n#0Iml9sAs4=c`S4t8w|_`M%?@$TENV|(u{h#=~d*HP}HmQ9|yk`hHe zCo{Vsx-h5HP7A13Felym46>u~S{5`kHPM>lz!?bK^MlxE5o_0eIw3UY;M#LMF2)%0 zY-YkkmC^0hIGxlqA*q_=*y#fJt>1VZNz%h#`JbygK>^9Ofg))hRh5v00!X) z#?rWU=7CjB?f_vx_|?Qr*Y=OeU4k(n@HvFwkacsBEEiK0MQ$oHjyUb3E_2j%iL^5U z=N^)D1ZF0ldA=|JJU4tSW0YpV(b=Mzu7y6~OU!_`TSH<&OIf3q5_wr8^f`JdM;g<_ z)b|C7yae~OnIIC0b~2*@rmePwM;q*PVh$_4+Hs!`OuY=dvZHRayqAOkzW2dR+P0D52GGjQf%$i|L+u+YWQcLX-?a8lR4dw7Wzyoo(w$~#J1_Q{tfMAScuzs7E(vz2t z)1$P4G?E$Ko(j5hj?#r!Ph;yy+7LjgFZNoM8Og^jm`@cMKX*_t<47t2c<@Z9npP6? z*$F=R{29uk!l*B>e_TLtjp>|jn>ZvQB;&x&hKHLsZeApzUgG6yNu+cu5R2_XeEK;o zkF~WJ0Khy%Ngv!3$d_b>C+ZM&Re*t^ta9Wzd5qQL3ZFhySeUNSZyA}TNq|AWkFqR~ ztEExm*H|oOCb>l;ic*xt0;;aDT#VuS0rAO{G~u))=$_BVoJuoUHdSFSC7}3p(wNm%CdAfSo~V{C%{>l%xvhz_ zJmJm5u!rjHYa#yD?|$G8EBj26bcAky3$x{TB^%JjNoh?Im_>e!$>jgQ?OQ*`*5(!X zVT@<*ahCu9AOJ~3K~%-;7s^{dJ_B zb)?-*V;wCWEW){GrjdaQ`Q=<7Tbv<^yV!sB8If9rk6t&%XxPEW_h*iyWJ$WqoLbqU zYE%lAyQCCwb1%Y;TW^vnf#*Zkx!c3cbU0zuMSw22C(s{Vhwww>*%)OuF$KkHE-2%| z!5vD~NIL7-z5XsZ_i%Fj3|a$OUYKAGwxXl#Bn^9AmKQaq+F)}@*eF4)K>NHVbvg%X z9V3W3=nZyBOSp06+s+7XF*}4(wPBr;_fK7wM4mj?<5GyEc0j!!#D)ZFJlI!rGTfn{ zz@Ux8gFURy2UE1UPfh^M7(V~(V|;dhN+54gJMNOrg3C~Y}jyE{nJ@Z6Z`a)&Z| zsM25YSJNE6V)kxdPZ;&!2MMGskuRsnmlLutSrFYI3`49B7<`cL*^vVPWp~d=XnBYXMoS|pW@{) z-Fj`eRQq;UwPByvBpDGYu)Wbkl62{Ctt(^8tfBQBLih+nioZ&d7*&y@tR*UA`XvnP z`E=h1zJuma79If47}~Xcs>@~iYV?N=?oCX zeMHHC9D7aZE#rbJ9Vc50(CKYqxj4r7zQvtTI<+ z*=RJaDe{kVvfdetuHo$XiNm%yWAJ<*p71c4N#RVa!a`^OD=u&RNZyTIle$DNxVp6&xrURDOH@h=rppZ{Id zIS-BVQX*W6TU~rj?f#!$V*jP z1_mStnoK6h3vD8h6y}R5d_O>(_8?`2DC#0xk_jWlfeH8`z{V)X=a1$z;;$ONqS91W zotR2`8#TYZ&Jg&LDr^l?QBkEWgpagC6cnKpkdfECHe)JVNreHW1C8f&b7lp-J6%JA zSgl-F`WbwZxekb^Tsp^vxU7@#-U0AoOrFA+sO^heiBH_%+%%wV^c z(90M{lnhZ<1$u*BOwOL8%$M%{RI0+ugH!lkfe+qE5CkNzIvE=b&ftx9f~GXJOV);H zYr_P?s2a-b7tXz=Yf!pX3}|RwgL?s(st_eZGktF|LbcXlX!fp@B|I;H@DptA+{MWu ziS0X`jxjgX=yrTeW)-!w#5)gqkgd4X_*0~01{1W!%`*GIRU&cfU_Ah+^~?u z&q72HLDEWB76_v*{J=Ok)a8Xr$Ag^ur$68Fv!k#uX2vK}1!iQjWCB zjqo~(63nJ&@cqDa?;K@Sy8sGlI9D(?r=0{9#^Kb3ga%E5&Us2hyC1Z8)!+O<4?p_h zo9GXBiAKVCD|tmj>k^#Pp>=fl6c3*lDy|siIfnzz4ChKiO6?A) zx-P(#Xqe$%u)-{tbqT2|_CGunPy*t0tb8g6rpqt*hUs4J4};eS?50#yzZW-NtNk zglsv7)(YF}g!M>8g964#y!-UYGpw&~A&R^1;y68eN{#`F9(*U|D2=~~Qq)e@74ZkO z8F=_X0Kh;$zl=PaVLF>RyIR#UZL{~tY)Oa9`ha2Bix36@!Z31EUh;?sq@p~;lhY}} zz(bZxRJB4;YS&s?r`MvQ>Z&b>wW4dwx3Mk>)`92%@yn zgBpf9CEX}UNw5FOqkD+N9G8V4s8l&*1QD?-1Q zxb&QEe-p#C>jr!E%$gufmUFQ>Ezrur8a9a7_hU-0<{VPi7@zH9xtwBmcZ&j5PL3cI zu)7uG_8vnLX_TeHY+2zazfd?lZQ6QpqvZ_HlGijBr(1)jyrJi4DMO~^<32nQ83>0Q zLAWVKw8fygM`_!#0%siSTQ_lX{M3E_Fbq%@1&UH)Yfa$bw8q@n-Gs(^$a3&hJLG~j z@PTJ=O4d5m0w4JHH?Cpl${WtkN&rAzEs-sbOazi{opIVx92$vDqxV}0HFba~YY`?X z^Gb0E&V<|1+%tVO7e=t#hQyhxu9T@36ly3>Vm3KIVbqnrAfc!gP1TkW#xaEX{3Uppnd%xB()AvE8^d|WdGL5!WfH*s?G2zkE5psTR8 zR$-PkcEEW7{NnQrp8pYEyLAQ*z zo#hD#KZGCbgRyx_hSUlJkqxl>@&uS?3Sp?6*3(L?iXuanQz~>;NX!<^^wLg!B9mwx z2INX%7ib`iPkGg}ICko{wMHIJTSGc9q+}TM7(V(^V`Jpu#+3+R)J57EqSM=0d0sX! z!t(-0VlIn0Hr9K1>sEm02PLus=nd$1JDn0g&$gts`5mm3rznBbDZ|;6cxJssBTX3A z*8=!{h$!h{=jz*rA#Y>VYIET6bB=DBCh6KnrD&Rdi4bAbL$(~7%*Q3_y2kF+x8QMx zJpT*)wGTFN=dBMgJ$p{U6!SAIms5Q42Cf+uTeF5E%OxCgGxbkV>s6d0*Y+EDB=1Gp!Ubk|KQtK1n8gdxJJ#`DA4 zg~4)TEmQDDWN+7-5XNvYYZMky2ox?G>>!4h#OarccqzIve6Y|?5l-t z=Am0@5;KdNfs%;*AVyg(u$WEYagEHxKv|q8uYhh;q2EzpOygkx1&&WnP}Z#xy}2Bc zSRe?DDjH?OTD2qSa{o7lPfHlnD%Ix#kDgBf44RmqySGFY zUpzorm0$o45BDKFh21N!;pXcfU_N>et3dTZ^JEe<@{pXsXzK6!|GKnqt=(w9CRynWfhpQ zz@d-f+I4jM+ZYT#!m}q|;&^kJ>K|xmlbgDVTSoa;_7Y><4J}%;s`^I z2cJ<3zPDvu7!1kJI!b0a9ZvHlZKzt&^har6I$ISiM*-cS-4x)Ap_CfF2I{It7@2sk zy25fXB^#Y8H<_3Xv|tabc5bDV6=u^D42J{kUG3vL-(;xk5@nI&#r`qoiwet}FuQO> zzkgBE6W?BAh$9By_c33T5WIqvHTvl`cCNmMBpsoy3#hszt{ZFGKnqkikVC_m)Jj1^ zqposfi&LDPJV9A3!99WHbdDepcz!U&$6wsTyLS$8=dQ$HZO;JW3Q1=Z%lQ#DH&5~F z@0{Uytl)=z{LXKE59?d6L(0-6w68k!(mG|H0E33AYpAM%6p?HBR9%8`&#aGj{xhv% zEvWAoIWL+l_PRvY@qXE3eR}ecMT>>b>^_ zsOC+5U}N!;2-w=%BR{@u3c8wtyXb^dL87^-94XZVS3p6Ua7?9$sP<%^Hh2=zMmZS+v#ha{ZL@5TPL}xW z(_iA9_dame$Za;gJzScbMVgXZe}&Brz7qRtyRmXpezzM2KS*%(<_GBZHnGV5B~HeN zm@k{2e=-MVONHrdfquV>?d@%pWq~r!ASE5PgMJD>px81$2qEhVRYlRuz8|@1?2DJj zm`roWyJ|;`$6<5eoSD$hss@hEO8ny9DTZAI;W1=|MmHf`%8H(?g^SdUf6?6Vy_5;P z@H_*qoAj32a=v0}7buv4aK}ZiG3WxGAlXM=Ncf_H!c#03Q+S?_UVj5%9R0x-!nkMJ zVS|er7t!8e9h_68sg;D30iq~H7$vCd8ZQr~D62C>A+4YJlB&MDw+D!m1X^ii*%Dey z^afiPtX-u6R7*Dt#?EQ)*o9$?RuY0eCi@7;h?uywn)aD)@q=FllcK zLDV&CzBaG@CHkHF*xu~p{crye8{2P~PNZ^H&~0zJrlV*!Lpx8@DM%n(cnn(mopT>` zmBE^PYWJEwbccH=izSweu_;E#Ua8j&(VuHf=Mq^#>&!~E`kkgFj3cVPU%N`r;P8wp z^!CW>*7ZLA&fmO+>$l$r_X0#o1YtK-fBkhV=LeXaK62JFo(NG_`B$>R85hv1#8)La zm&Jl4DzZWlrtWYcdtdH?EA5-y3<7*7aMn!0^8@51iFmh$w0V5vd{Y{1#5a?vc7gNa zNaFwgv!}Rrbr+lyiLSli&RgHKJ-fbILc)H3yO z{rrW#8hm_=6 zk#yEfq`ks?a^!eMo$eaAC$Owj%ROJ$j#S%qX;mVaO7z{>ac35UeiX{f4T@ne0 zT?diC*nF=}zPTGPaqhKnSOw0S@wWi3vlh`+ekX= z6dcMufD3RfQ2PN9T8An2uHC`f#tm@KgOb`&Wo!k+pq-s|gDac;#VO^AJn;C1y@+$% zNl!$mtBl%P!%rmK&O?9g8uEOO!xvu=U$d^z>Gbj1^$2k|#_3q%{&Tp=He+;X^-|!? zn+(Te;L27Atrd>XN(4S#fOQS*?R4<>{*ynz)f=xnnUM>ju;rs2YuZVJ*45XFQpl2n zZg@X;%~L|l;;mIyPz547;Rj` zyYJpbRegw$?kh)}3j<)D)ktDHiIwDmour796lIaSq#|Nf$3*fqRjZVA>zz#svNtg? zXhJlt=XBBJ=cQg_d&`&!g>A9WIj7G%o0`kQ*c}gh^k-4DTtkh&d(i@jT{@2SuLs;T zX*{Qj>vRHq`HZZ0m(tmk0rFyshtH9K#bK~d#WUqnGo9H1>wY+2;GLl;4&CABQW3KVT=oKArNv8 zy}=gFj-O&aJ8Po;ltdD7oItvZ&1NfF^6>p<8he`zQYt9T(MgCG7n<;r?|o|n{eD8> zHC&kAqoygLk`>MlKS91YG5eD{&`@4lF)(oMuMp!XfHY`;JWaa6vRG2-2@S0@l5~h5 zOq+wE1zxUHG+KiTAHpmYDJ4#ipJO)9DR|W2EzHCXaZVf39%R;=+@3jkq4D?suQ8M! zX_^W(ggK=r)Icmt}_D#HXcY^8sAyq1d zck^@~@Vx?2oWt`3vbu)weRR8PNRmE^GD8%1;0GbfB6rhQ`~EKH6KGA0X*(%WJ*nKv3mtJ#xkwW>NF(rHE5kzu^dOypQt4HHe5qM z7)edjayF#q)z+S`Ja?N6W!I96yf-Jdta41ohhR)2%S-ouktBs7N=Fbu;)(`tsS2t_ zwm3x)b@9$Ozl|{N6X(%rZ|yU4)j%tN10JW&MH{lH(c|{ z@2`ywbVX#@@4l_EckMNk%3U`xU$QPtKA^lfo(G2?L?qs1!o+&}<`$sQDEEAmstA*Q zQ#(gY;%Fo;;G)q6ste$>d&I4S(7u6j(ns3q;MU$8AKzEbCRRz>81p3&AnSVdHn)D? zx_SQ48u;-~KErQ*cMrYcZfh~>Rw%_eac8X?!s#lfHv1s;}4 zqMMSH@!4$EInwu=>MAd&it&BA^{fch(kbjFvqaFmY%F0^OPW*G04p13(N5fmV$+xw z?s!TL6@xChMQ9DYdz%kMk!jq#B9JCNw!Hw`yA&?M8K+PQ z!}8}|@GDiu#O3ncGqHPuf@?$b4B^E5t45Rxj0aAO+Sn+aqhE*sLDWT6X2=T-r8K$; z1LF*%wKb%j5!N-AN{YDTk08a$Xo&r)^L?iw&VhW5$mFp3gf+lvu}XL$G` zcQ|RAwlHt`;WH4nX*pO*0sqgxoa4Q3og(S1lYCIs#KSs0_z2_UFHMN*d3_wH!s4bs zW`;3qUaVA=b95lxk~H!V2|z&vvEzYoPq_5x%eYO}{jp6OXN)1~ZaV74{RdAG`U+Y<$UoeJatIB@@j}_j%)5F^O=D7)vcCHPp(jwh*aAw#k%1S%g4h3;ac&vsW1a5OxRe`E3h>>piSGBBAmN|qFm`+Yj z)lAbqUudVNE34H6l*%ls_M`Dc<4$S=H9Lt3#4PEOm@SR@nvvgFpCgYqL7HJeB+-ol zCFraVJ@ixH>NdmGod|bs2n@O$yIT?7e0>v}gBtyg!p$ol-nbd#*7Y^)ZgtU16*h(( zoy0@G-^2BrZ(?irE~2;(?gjAu2ttI8`^SDIJ8b40ZkYwijbgzQp<9OxoJh}Rox6^M z`z?CKDxtbr$3V6`!^>x%qAGJ}D05K+h@w8O-FgRUcfI9r&l?^i7Z85pK1P!}>A-Ss zFk#Mxp#%vhv9s?%wjAT+@II!K1I(vK7>uscrDqN|ZU$a97-n@})-A29TAel;h(pN| z%f;C3AJ6k3l>~!Co|l-+$VSPkA*_WAZyBh_R#%|`9G;XIC5PDFOd)H+!9|&$A)6nd zDwi!YFLuFElOCi7XTi#gQL=VCDhA@bNLd-F0!^$GfWVJUX(t;N{5f#ma#kG2%k&wX z3nbl5^m=`)uMIGpA0ZTkAdHRqoH9&nDOW3UW^t5rw5mK;gooMNh&8cTt5ZYnDjB?D zddRr98Z6rig>C;}eTjoj0;4qy0`Ru zX5_DpUe<5$C~z>Qp}8_PMEn&bVzvU8C{^R^=nV=DK~7Xh>;H2_%_`1t4l6o&^-p*1iZ4srcve63NGr>Lby7_3^yILqYL&#}0t zeHm2^{PNxm-+cE0cCWnyAwr0{Tq2Bz5VJ$nb>V#20fxFN=w#E1r~s`9EUmQp{ALqZ zhO^-kcUTJ#@H|6PD9;^IxRfEU>IzcT&`RO-@JqzW5X_5lbTY>mPmP$>1R;227D)*n zCRIeXi1$igTuZw6-=7fP=+i8+%?B{C$LD)=!1|7nxdMWUYJ0aeB z^ERZa9ro#YKGN>GOBZL1Lj(~x7ubyZ7>>3{&|Q~q^Cg`T(sT{Jff+pETM>+_(rvrO z&uzR{ap!0d;6wP9d@7qY+>(s7Iai*`Ezn<+6~IsxGc0C@$d^-8B?aEvgW~4xw@o{$ zP!>xf0oO$f46mBj)C-J0@w}nH<#yh7jm^d{uw0yifkf8i}8>a6MarFEbsH=>^OifT{Su7v~0g}QGO%)_*8c=2?3(rSh z=kUy!)W(8Q>8#*Ki5m~wKb@H$)C#*^D~Z}LckL{Ea`pl*^UttYWO#m1J1NNa8vXm} zLz*Vd77cLRenVC!(8mAzU;oiMhQkqAcC=dICX9fsOj)cr^!%Y^f%Nm0Y5NxZIzM1` zjvB!j5T_$tzkUVxA0A+0rY)N(9W;lhHnyC|oSfHKW()W}LpKp9Ye_z36PeSOyK2(YRk#RT9=>(Q06ln?%zY1X8;(|G)A2CXz&H% zZE0P&Yz0{t(5A9;O)aBtiO8i4c{Vl%m4vO9`P|S($ilqTOH>tMs5@I-c7awW1MeUF8n6ovHu$s(Guz_l_&V11T?7F28*M_vHRDtoy6O1-)e9iQaIZh3|tGMLQ z;+Nj6zY2cRU|8M?9f2{9J8ymmoB{vmKmHkN1$1Lzt=CNHEM8A>;TlE7kj4tWU{H$w zG6*=*tj58K#%xId_Q6S0p4-Wr4WF${B$F^xaGQ>knJmG{+;E2$4QStPwabdY^UV?P zgAazda^)(zy$xvNwi&0x6&eA>!%>ApmcGI<2JAr)L|p{vn1j()PM#ZV*y-HrMf0l5 zLcj77p=n>__(aTXR3|JqG=R4EnFHZp@qDXtfij=Asx?l$MBSt;S?_0Ub$VL66mKUv zs&XT7t1q~wtY}-?PPsFdi@ob_ z!t(;u)sl##vd&SJb3iM|y2RbpkHkzZi=UN-)=#MoEgrhkRQimm!*dm=RNfw3gv z96^xa)@$$Ktw&$r>5Ca1!p0WHl4N;H3|&?V&kqzf)&zWynT$k*UWX$u69x5^)idn($_&(S0i(5eUQx^p?4w;3CPY9Gj;z2vkDM*S z6jIfgPR=l2DoTzv6KSo^y4}QZU3@1+sHy@CK-yhHZEj8*$|~)F^(#nQ826y1 zhVRFayh2%Ic=+HmeEP*0)7cFBhf^$bqA;xWO%F)TnW$kl`AVEda_pK>5{TdqR{sC9!}3bMV2=LQrq@w!+~1naL-HY8pA$A z68k7B<$_XYOXCP(jPV>b#G0(BMt;+YjiB;3VG3T4Q)>pIWXu6eE<93#@>~y z2;-hPJd~>-{jg&uM1d0!Yljc&mQ{88QfQP2%nF{*8#2CvC#SW(#C4-Rq4myv3*EpP z7oJt?BC-eMN=2tva5NZ)5zakSC7Cile{p~)WQe24_`Q{+>JX7zgASuIv?0blLxA;H zDymnlNqcB2Sz%tf{y4 zgAP0q;urTMKD<{n3}y4h&klgue1SBL;CX_4sQDNY3}KjpapuBR8RMvm42*LW*~|!z z;|m~lgJZRP;yvM9Gk@|g{uw^Me}=Oeg?CO(J0c~G&nI)*xE3I`o7rZbu~x-kohvN> z|IsH8@YbC@tZm$AJtwwu%W~$m9-6^SpjIY8=PRn!ZnE{-&Ix1BYZ%+Pc#TyLy-!gj z$UocDPQYxhRi&vl8_x+u-`z0j%{kETGDHE#cqZ}aB^~s(Gq(VzJ~u`E|J!@dFuShv zJoH_=o;rO7GlMpR-UwEK5Gj!qRjA&qYDuvzC5&u8krO9z^2CmEo#I@@a;{=q3UzJC zk|kM;Buk=Yi&Uf7!A=k$(d%G<=`*LFv+KG)R@r->G8htoBHpa`dH4|1_Bnf#Ne@;y8R-=8uGeKTHnxf9Gc3tV(shxy(i3VILUt!w51QyY zko!f`WY~x{`I;7wCtmptqy8WoE1n1)cKNq4Ln9Om(2`%&JM@tzsW=EB8;S$pLt$|m z7p7)#=o#o@q zNR#m{eBWV4R@eCmF=kA4(?YFUgyYn(v^a~pLt&dt zWD@|6oCe&cnUpkEofi2}ksZ2jhmE0rmO{`>9fq!_py?De6+qWbY}=T}U@uGTiWV3` zfNf(sGHK?DJkY4_D<5Ag%c0FKdAPv(X@O>Y}vWJ;P zURjJ4B}7;lQ}dNFGeXv%MGM#f?S5eh`@lADU=m>-MWLzHu|IJA4=u=ce%d(Hc^whe~MymX$#e zdZ?7jrP$|t~pog-75;N=} zA%rD-Gs)SmGSs7pDqFP8rNxN#S{=}J!t}nx$%)n+lt?xvPv>O>lS!oE9Uc0b3^7Pk z&PJSKaec04V@`;Mku_T}KX(DgPE5#YzvU|6@kG37Fb}F&1!m?O$Yls-7egGIU`?oX zhihx=F&aXQz!$f>4HvMSXl|j;L&#d4t$S}5Q|)9U(+PHL?#8V*ZNlL21|Awj_b7%k z5K!5uOKFs65ly)=*{&IkUCzTFR*XpYm}(FOkf7@7K!*x;0g-5 zVL{VvIUdX~>?j?PP=x4QSP&|pnr_K^k^7hOY3#ge%VcwW9@TKxyKX?&?F8GN5GuJ^ zzSrOyT&x1=G-?RK0AUaylg%UWef0GXz_v;_d%l25jURAaD6zMT?bn3@Pw~X2y;QIW^R4MW#X2y{g0F(hj^Ot`TizkjwWYo0-GhQVq2_;Bd_= zn-8I|j9Ahx77~&s6`Z&u6o!Ch5^P*&;p%O9I8GH=Dg>aAxU8X6^Z~jaaQZ@sY>FuyI4%nv zFSwCJt)}rYQ8a2+7NMf3&WQCCnpUP6h2*P;fK6+du^Jp2!40q41ItQtwm9SVXhL$A z>WOef2=2wZDujfzu8YGhnmVjYxfrxDT9BM1VF(4`v!x%7Hs{8O^oHXGfFx1@O$l}B zB`1l`?UMU~a9phvFg;ht)Eo4B0;yxBX(kMzuF4tcj4K$I zU|xovp=pUO718sX(0U64P_UCd3_OH9v2Uevl2Q>>B8l{bgTR$sIYL-x3sWm*pQq=t zPWph)8PEx2NLc17B!n=pJd@^mRmwg2Sn7d5@C1FCP9a2x(1(GhndlkZilw<@sL!8- zX{BM=X~5`4D(#_MuAp9TpqnQMEjx|C_u%_3{D4_O%Vwj(Ks1U3sNd!w zWceLkXE~n!!Sxs%T7cu7h37|#071aZ@+6uXtLu?;iLlP~I(y*a&Cs?9{Oa5Lam!6x zk?$TtI@=@rAcbo!Pb4utq?wVwBAs{Alv-#nwagwklHd=uXKE8~92LtKMM7j}WGcv3>+tJ)Fk1 z*ItWkuD`|LYPyZM1hpvNQeNhd)`%vghT|IhMAtid60GT0lT*5BNRu)vZ4Ux1kr(t>mHO~Au zLc{fyYkN`b8-aG*NUk!csp2t2Q8&?vWm`5qFt2&4iU= z8bH&L@1Q;1|I7``p@4N8A2C}&xSXKsxnS$rm5QIL$z-3iL!&+ud z1J1wF5{YSz7*XfAZbJ_jG0;tLewNBS6*$3BNTSH3yB6iLGQ1UlXi*D^p#wWNS$N~? z_ac+YviHXaUg$B=Gg%gv114KTS&=j7G>}3Fxh?OB1<41XrR3g?@a&io9n zAB}$3HFnRr49gP;dD^)`^jw8JvhjU@^2XDUwxx)nT4$b_&-JzakZn541V#rnT(fHw ztA_fK$#%=O8DaI}vMk9H3Q~}fhC$3gbH#~R<1OI|m#xx0Vd7znh_(cfW4CB*h$wHX zlA)m1bcm2xK8hmr9e_WuLcJvNwxfif9P}GfPJBi}`^t5y@Z2gE7ONAX}z;jsck+k7e5mo|@yj*sWcurL| zg2xL)jHAUAQvo(awqCEmbsJGQ833BiJnVEj3r#ant5sndJ{pb(#|@CSfu$l)b9sV< zL`~0z79FSte-u~s0~lY%@)iWbV+)}TzY@Va!9|K1J_%g6g2lPhn3}C)dVxv~5aCHVPQ^(ShcqqX zC6y}dcWe`=v%(V_Kx(iJCU`cC0%5i!&xI81vOKDU=s#`KTX->9lV})5w;qGG5@(5fCAM&Vmjo?SDXK_=HHD{CQtpW=YmG!qaMjt-$8+czE`?}bELkLT8;f`VaY_)z2K z+_BJR3wZU_V=_}=0N<-2mFbgJQqc@823L5lgGzacuQzy+iomJYINRNZk+QIAcpc{E z&a+U_cNpoLP$`ow2;M&Lvgpc2IW0S21BS@c_-+-8GcRCq?j$T; z2CdZ`lq-(RWy~*m=I6%)!fm~PlG?G)^ES4a8d_-Pc<0GbvlkLnsb-If;4 z|%%tAMKm+gwO-42$;Ja+9Pi+Z-?=g}l&!g$OCA}+Mw~)#8 zp;(xO??(e#eVKQID9E}+D9Y~~9<|B{PbHiTiY zNhIu~;XPiu3Cm(KGRsZdX--bl&}VYNeA7CO3XZ(^EDj%^!?Cl`AOkV0%ntyAhc>z% z$)0$A)CXr6G38MjDH0Sb0S+EKg4f)fmrU%q&N_2}gG6GJaCz3iZ*=gWXo97^jD41x zS#2wf9oh3qhNebLSVky^N+3q^EmeUN=OFvHC~f5yW>Rd;Qg#$l>%2eH;9jZl@>ca} zxbfOy3=a=re0(!6!&{PQDDxaV52a~FOp>^@-!kb$kyr%_%kZ2?)4*Fu&RqPWagT_G z6v;7eaZ)--QcyU_)%P2`w@vG);E@8K5fvdZbyd^ACb#`-GbWcyqS=@?wvA(8)wnEulQs-%#$q?3DaSGOjkxy|uX4p{AEX`OGe-9yGTe*F zYR8HnanCmj)zISUi9<5P{QaMsv#bODWe8MQ?T4^D|)7d8?aae?*6-@NZA^0*z!ielsi#0LOqTuIc3O4WoQpSO|AL}QUC@A+IR zC!3OEA{j6YCZs2l@<9lst?1|RA*+-!iQ+9ASD|lkt&|QCW&bb`Y74ex?l(*2L`iWp zDJewv%%-(yG10wtxx1v1k}W%w%C8f~Ok<*6k!majn>ERQP6-GxBX!Zp48(}=&GZ2( z??)B|w4}~E%L6+&H&w%YF_HuJeRiJdI{Wuv50zn85C}0#rf#Ym@n?q{a*cpM=X*v& zH0)HoO+B&Zrj?aSsiu{YhFIsiV`0DutG=w*vZ9CUvK*9Q+OVt)Jg>o?Dc+c`X(sCR zBF;^mM6p;$%GQv}88WRQ<_VCPGO_DAuq;-2%w+SZFP1Pi>Y#L-_onja)Ad*=*w@9^ z3(>P(snoFV$wSz-Z6`F}EhF$7(FW8lsV&r~l~ApR$fnsTEZEdf9CT4Ev61tEA22V4 zzggdHL`>)9Lc!()Yv99mYgm{$jdN!Xpjs)Shie9khtB3Bs0=;wWNn_)LTn<77OOsp z1fIj&dkSSBW!B*|>XJLsNlAh6O=6oN3|2T;m2?PyrLWa;ax>$i^V6S?HquNke`|6= zA=iu2bOc@%yjA`7PXT=NAveYimwQfy6Hf-7v9YE4k z31v7%xGZnmN+}N$!Z1J>xRG)P;(Q9uef9s>D@dZ6;DfO4C8O^t6~l+>zVXl*{U8mzX2 zS+Y_ERUNtRVOVxfQg?`MaNR0jj`b3srN*5U=74x`of_(mDh7QQnqem9c51qXYGn!C zIRZnAW;sM2bqLq>`Mt0-i0?BM*ToX>!f^*v^T~o(yeQ^)tXEh_9Nn^aEpEBxdgSth zEDgm*Rcp|78?IC44<&DC?O%;T>6p~_cD$IIRtw=cb>woa%;Yv|uv1w+5{z>^phbfv znxrq{`&w9O-L&Dl4fwu?RLVfwc9Bi7=fm;X4e4BhSJNY7$)+YO} z-8u@A@Py?8BbHL@BLGXinAHkCc3Ro<(Aw~1( zAeR9KdV$SbuSTw`Kc+;XbK~d1Z<4loX`sBNh{?cayH>%JGeE`kCqv4V6A;X{fkvYW-)k^hM7%Yk#Ylw-?n|XKk6M-SIs)H^oywrMuL}dy69|qw zaJ|S=60CL|QPVTwvL^wJBxMMqb`#;9S(JGbZ@Hx(H|@QeB_m^b4nd*|!+@RWvS}8w ztQ(!|VZvjIdt^fGAvw!Um$V5HM#RUOv;TXsoc)=UyI>erQaVS|xw3#3??g<< z1cm%mXy!2`E3rnK))yqgV<6;}J_16#SU)D=PH3BEXa2g3YlSE|-kMDWDB+{LIAN0* z$qsor#YqSCUH+MxFzp=NMhSuMpjw_qy;{K3^fb<#E1+2BO;|KyZ4-VFtXTz&jR51T z4fOX9Mw(t)w7y~JaYAUW#rteIK$k1fXc{!I^g-Y|(pw|k-DZ2ylYNH1Ux%g}=;>P{ zIcCLD0mV`o!%jtdRse-lUxH~`$aVF=FsnSTX35Xm=ha6)q|l-9>LF06Q_L)|Jtnl& zT64UyFq!}x#@8T|&cJi3j4s6_l6APXMHJ?bp;n${i8c_J7DeclV48qejVetv%uPq-VJg?hDsbf!nP4z!!N8*h&FJqOkDJmzN4qF$>((=_z<4Z`<5=sJXpgLL5eg;I4S@SVhLMhYQ;%+{VFWI1O|=gD=Zv)^!C6iapF za_6xya|G#ZALnBEJOK~XDkan!9!x`%w1qGXVF*=CupuaHk`_}QUOmJP&6Cre+i|-x z%%~9ngWV1*FUUElAq;?(N7;BTpHB;B`Zk4PO%Bi$t;O>!Y=Vhy zS{?W|G!}hv=~&9f1=VUL**;-ddDy8eEJ`pndo~*T!=H8E2Lk>QSZ`5 zPjlgIIk_~jZp7q`x;6~MmLYI+2tnI$d)o1G+Vu@Km+zCjt*GZMYEBI!mUe<^AAkfd zTqlqTS4u-viZe`&G?j*J+b|3hfnP>n7f`O!SS}|XDzSgNK0tyf8QgGK&S3Qr!L>UF zk1!yrUci%I02HCG&izy%4S zVhA%jQF6asUQ1SYo1|`7ONqe-u7nLqdJO{)x|xFSHBhU}!T0LW4I6g42fkNFqgFt< zI1Npo!~GBJ!~Oe~VADDc^}5SEeVx%}Qt4iJUM=boq*T%mJh#df zE7&+OBJ-HySt4j(E7G{K1D97eQ(SVH2~P%|(?lf-q?e@|Oc^2!DbAcZ58EOL!VpfQ zA`|(BkwT+hWL&I}2@^7ndXKk!`EVRJMnPit=6V#S32a?Y@Z)_<->w~c^1wA)nPXy^ zz|8C{mKJBRdR;%Cyk$m{pEaT(lN&^>GAkdRRU>PWO&^9|VX_)w$a>4b#q*|S8`!-a zuxvBY!{m8&*j!U6>79VL0R(b%Ru}|m)XGSuvKSaz55q8F*%{2wp2I+22A*GKY*;-C z|0oyY6FTFz2{@dO1ny3{KCgap>OZ9{hfu79Eo4VZ{g^y%2PH|#rP7<&+Rf=_+VpcO zLm;8HscEb%t?Oo@UyW5mbK z7MqUaE>k1${b-tVr4FnaNujT=7rA_&l!yU;uthmsCf#|Dp5TPF_E1K7tk&X%@FF!{ zHRL%!9v+Lby%rlnL8L}`$PIDW#B5(aXC+TrsWBADhTwS9yJ(fFES%-dzU=+ksV?|l zT}rA@O7Y|q`>^lXCCo0e&{|MJD9@Mn_W(P_fmMBMkLx-cy_WClL3i({luKbb47I&w zKvY2+HcUw`pdcNBgh)zBFA^f%A&r!{gh<0uQql+lN+SZ&A#bcn#h0=uxp zw?5DJ<9YwRf8P0dpL6ESnYrV-ubDX`p~oQB`h1~KHB)uKn}Td1pQevOi39j6G-(Ug z63y%na*3^{jhgVHu43vDdvYB*2&p`7u^3x;vGxpFTwcQF8E0f_Ol;}?N! z*+sj=A8s*C)qt}m5@GAwlTK+K}SldsN#%c#*S zLi)-1;)h7H1X}0)-?19*Qlt^VK{TgIKiiWeQMMkK_9(Y?!3tHB-TGsiX`aVJv`Q!6CfzaFl{mp zAl0gwO|_y-JR2`ICAKI6dI41z2`gNaxqF`6CG0vn^tJI*PS77b$pnG5&BG~-*sZVN~Y>&5J z-b32FNe;ri`;6Jq%L*TPw} z7P(=&hTE_F)p=Wy60M$-^yo+NNu4G$VboLT}+ zv*qxy`;wbXp{Yc}l3vp9h927eeB$sN2JijtNKyVspA_LE`g)YynT9(NK)u}Rq@eEY zcimSHv(zW~wa^v|Da{YRCeD!FF;c#uQhq#Mc$c!w{;Y#PpjnLd!@U^eG-C;fq=ly1 zv^S$SZ&HufIWKvRjaO*G54tNQ0)sZ+nftZPl~`=x(~#79dxb8XB|AB z1Mqp7pPU*jRNZe*crf*ib()XN^s7wVQHS@>FHSb}68igYG;zPs7w}sa3TEUpakj`X z4&SH6J!ss*P1AIWanJ27#3KSnM?o76Do)O%EzI0`dhqlt$*kDR{t2_E5nnVOy;aun zYcZ>+es0#jcdjX#ApHLGA)|7K6T$f(4zFItA~B-jF+~`$V~LKfhX<>w&U4+$Up21z zMD%|hQl`@TrB!=`w^pA9R`F*gV5Ft=)FZ;b3p<*3y#g}nvlojy=!epMatqZxQc`+L zwP3L)pJG9RZFd01#IDAdFpf(w22?kjamn%PlN0xWY1=@mVAHWoem)CQO5_+95AJKT z2wB%*SiBBiZ6*g52Fx#?Iro$DhbjH(S3gX%KNJ&={{{#>& zFibroeUMSh-cz#=i7kFi{=|zfQZtyi<)}e{@u5d+cH7SMEHP!-J&T>-}Y(d6J;@8oB3-gXd4Sh zLWpg}+m8|)auv<*i@vr_$x_7E^Q^yX*oCt5)n}-bXw(iBt`0!vmMIEN2IM zJsbkzw}Xo$AG;g?8IZ!P2$yivsOTd|r2b6gz;AbP*4T$nxnD*r8uD@3i@c6tH#aTO zi?SVn(yF8Z)OkU@&W1MT43gR`xw{2sm5)+?V_|UDG&)?h(1+=Br}|Qbm~}-B>hrMh zOpgm;O7s_c-%)ShS?s*&O4`r>Ve0@d-F=}?=Y1q;>T;7sFQoWhr&cnIiV#1mR+r}# zn*`Fe44+8FGrpaWeo?f5h)w}*dK60p9w#z!kmEJ8_O~$jG*AD@M({o84*0RlT5Y%^ z(v_YN|@ zm`C$vnmBnF@A(nlEC58$Vo794>9<$XyOTTLHSzR^h`+pQXb#6zTRdR)6|I-osu@iu z3SGZ1oUZD?LGT?fH{VBhk^AsIav9C6_og`c;B~@L7~qLej!J`Uk|uYOx@%^PHi@snm))9r%3ZF=v@G9gV{Ho0Ecaxxl+y# zuRpIb>a0#t6;0vM?u@Y$%kDwG89dii7#DuPkfNl^uiY^`KRL~;}-*8 z9!t!mL}q5B|62j>P-?9tuCB=qOF>`wcW(zSPqw9-_F@L`M(sV=(0jWE?2?pTR~lUb zZH~Ei#>6EB59cUKLh)yvx&vEY4-@11>K}z^#zww8Fvcw`7olf(olx0!p*W{vC;Z%u zm&tM^yvD%aiWiXesq9D5x?G*OA!8|;QTe+5lOtz#OMH$v|7AIkI`m8Y;IFCVJn zw8-LL`xE>n4|y?W5YLZOZ)a`j32I{&e!m$$@vProAmE6d8d3c8h+tsu9J>H%rTMZE zRZtQV^rdQjU^X9uZ+V6rSwQE?|EU1rLZvL<`zey_-p%hKf>i&7R}W!a%V2eRw$mUzFu1jt?fgg@D0S>cUqS+0VXg)SKW zsA$oR=QPR$&=x636h6)wgMQ&Fb=ga>05QVQQ*ZQzWlOac)zC^j`&KRNiVVT|Qb2C$ zzfvA)9G^;sKrGZFC(5M`MgDHpp+#@-s}2hE@h{jMAoUAe7j@2A32UcdpZQ1WpvmSS zwGx~JVfL3Wb)FtyE!Z2gos)}#AKe9FU+gL~QxO}ug<8^@dtFn1MmAqo;JmP|n|y=O zBx2{kXH(Q>Ybv$(lJtCt{7>5JJ?<>Jy%vfd;l7O?F$M4JoY>Z&iW!HAfaSIY32NrtPy&zNN0ch6`TM(m+?J2Bzg*Ua{_kgXWdkZOFMz2if#K78{9`%YU1bTvn&uKV zJTv&;-zabCJ$t|nP+I5f>tGx7|6ogxICv+p&ZUs?%=q&e*%JjX%hM|3#U+N?q0L@1 zfc=MF;Rh*Z-%fQjt%7+z{h7Yo(wsv%T(|De$}b~uUhy46amktcv-;TwM&+!mj*)t1K;}z( zz6@cjkzte!Qvf4L=`$8VZr8_>DOh{2Ynz8e8Gg!LeL*D>lUx@jEFR79blrm?D$J}h z%0iGQA+6XMAxjC0Qp}cwPSK2xa~JXRH+|fAQkQdI-K)0|6;1>5vWY6Kn}D%FoXyPydK5BBogJ|1bZK_=Au)r9uBO5?a6`Q)={J*Z=usLspV0*4SD2PX8; z9a7>gW6RbYX8dkbk6BW->F+Ukjb#bZ(d3FLGB3xl$;GvGTv$N!+)d{Sb8+rD)Kqb< zdP5x{>kW2KXqY5LU-y`Fc;ghsW}$PUHtjaRBzB-Sq5X#3<&c8H+5nhP6=haZxYOCm|%}p}vAX=THyc8hQo|fI)N9DOVktQ@&9#Z^@#2;RhfnK&D zGUY%usH+S1(OQGJj5Fz6y0z*~q~cN@0AP=Zp|nm&I0y`JPDr~B75}KY*ta-Y)rV?w zKQd{%6WQq7=ekZ3l8dYcAB38bZ`*pmteg#YoR~}{^Mh4x3SnA-=-(tGV{?nQf3M1; ztkXX&-)U=(8fTKvhA!S@-~z7~)MU|U0_{9LJRJGcT$XowU%LOq$B-3K5FTs?nv!XF zgO5Axu$lJOFIq>slqk^dtjTJxynjJ9I$&u)z5ye2zlv#%4=(?c0`K92DsZo+c3Ocm zLGfou+Cn5FY5%}*>(N{X5|818n>*502-TlFZYprud)68%HgMS5G;@Env)0iF1RH)JYDEi=D zOkNVXL&!eT_z+V5DBg>)$!#yNKeE0vUb44WA?(CkPS{Ju)eu{m@|&RHD0!Eq>5$*H zwp0=5(-oq8X9C~gEynE3C-v83vk5oVT}0)G*v@F{S$xsN(arY%_QYmM#*glICg;)t zAJ(}nk5}{ZdbSK1+yif3##bH=#E5DLbpCSa-oD zO{$>=d;h2if>a*YNNMZPtOelm8+7h9q{jll2SlpE6Is|zMPsk>dB$l3v$_LrC-{Re z1{s*8YD3j$`VqPm|K0<+6}KC{U1=fX0;5(7{dT&@t-Q~LZx^8MZ(EL(^$O4D zb?@FH0IsrOgEsq&-Nom_fp|m|;~TfCV;g&=Dl{5^v-9GU-MdRIzK%I3O6^T3WzIkh zOylRYto;S#`x&vHe&)51g3}W0?c0-uz>iIJN;fuaxm<*Igkp`wfUT32cPaFMP~hR9 z=1|w-WJY?0ymw=$5d20qF-JRhAl1MDd~$$UzhqwpFGZzydamHWA-hyZ?RT8YSNrQc zJSR(?!R_`4_}w7G^7;AAsXO7785_B}Gsm1rV*oJJAD3znwL&4NO{DbRiF&$JrLg(dCH;4z>~38Y0FSn~NEB#Q-RDeUr@ZVofYJ zAeb~Ra`xjG@QxDbdbz4#&1j7-l#yPY6D2A>84aYc-2j6c+AO?15QEGVtlxT*SS1tS zm`bK+6B*8dIl~RsU%IdEZB-LAy8dw|38Ba{ZT{IU4FSvcsc8CBEAVA!vh;w^qn545$Se zP_G3Y*eo5JlnEYPEqeNWxT7Jq&7pSpJEX^|)p|3om85j^-MMe{HbzeLbsyW!f;@N! zzC!qm_f2#5f3(7}CVi2y0>dhqhHih%Lo4{swBu|Pzea$C?QZSJ0cmY+LQf%Gl>}@# zQ2PrMiz{ygU=IS`H2Ix?thHW96E^kKVy?!pNrelo1mWbur8SM}86Rp;-2Sc3bz@+Z zkA1;3|ZZzRs+ z`nI6rL`+TQdt>u%4_QCj@zC9ms<(T576b%F#$Zi;OHSs&(Zy%#I3d1}hXm~M$V(nX zkKSxJI)?I48{#9KW^t;S87YVj85+K9T{lU&{YQu4=)pjrjrmd)@cz-y89St8;7v6c zgQM=ywA~O*DB^l*66w%h)Olr1^!|AK+h?{ttd zBnh*0N2tYYA9S_p*Jf+B%d_m^>TRq;NHc@^kf8h`bz#K(8tzO1bn1ZXl5x4Glx4o~ zS}EI#jaNnF5R`!VNr`o^S@3bpZt;7lD^t~8J8!u6w{?G9>?~E+gj!GK;i0zei~^x( zZF;6zFSPHHV_^28enl33)ookB@O#tMef|r2VbVa2GLFgy85NgN+35>^=3L?9%Hkr` zpNV|K1P$=hu1YMq&{m&qgPv4-2GRg(%;)TMJIEU^J04!>Jed}derQ#1kEAEl;xcYZtty_nle_fzK)YSU!DDI~?`1$}lbX2#3BZg+$KN<=x>9ii0fCP^&Cp|9D zR}WOpgLgmk@K9UFjY`x#jqbeuYyLp0PCb>he>Ncq?QZSIj5F*H*-XfqoJ;LlrzS&Z z9kaY+ua9Ey-=`e#DrJe=w_XG$f-Hpks2piDL(K7~6fzvr0*My`YN<=M#>_?P}u>ALY;bT9l`*GFg6a z9bdlz0E5u+*H?d7lt^&fcOq`D^(}7${hq|xmC$+oJ$tZkbBf;?t&TYV zFqGh}s+K>GoKKBaOd!S~`eI1TG>#=p%C8c0X$~pjA8T%14hoArY7k zCqYidRCM@G0PgMI;qgJ^yc}~vgwXBp^7QuAGYj#PEBMX29(MU`KhbJ!kjlZdU=#8z zj2FD0H9mYShuXJ1qr<@=<5W|AVYs2W;cfhJvxM%M9MjEc!d#-)^$Ir7HW|8QJT|rZ z4YE!YcLmiL>#7K(u`tU%a4tXhT9|LX-QbP-Aiggyu=~(5G0=eUfOL%*6}re!F=-^_ zwVlfLN53}g+kEupCXvqOUwaZZKd8i+SBYRNyNti5hZtk9VmROJ>XD+zibh9QTh*q#yS|~1iW2^TUbdD^kTeh1UxR9; z&BU!wmZaDoo|^!CM^u6~1BDvFAuUAb>Q-2%=PW}B=3<>CQ{8=F)Qa`JReKFPS*QBF z;R{%0f656NX%@D8S^Bq;GdY#VDn!vTH8PUSRQ#(-!F1P3h%Y@z73oTnRTLXeCaNZ{ zVKUYuT%9T4#JmBiTrc2f4cU=p4cK7Lm6A;OT)-@UwVLDC3xXPdIVM(mI=q0hIr+E6 zaf{2tDY2j29s6t^_(ZMQDpYPRo^y8h7RrqX^L2AK|L7iFlAAP`6@K$Aar*=l98B8J z-4M54@V5>X!c`q4HS6VAm8px^JJhax)pD*(?cs+cO+DMqv=5W^PtMp}{Sxhc@BN;n z%!-6SYP0LEe~j=k7JlQs^QP=P>0XHehsw%XbLXu0Eo?BN+{l`u<{t(KLYohAj zf1t~6H%p>=&=gnmef4YJ4cBUT^M-fXj9hkB?9-IENWwn=w!AAe0Bw>7x!=}A$sLU9 z4x;7@v=&Vx@O3dEa;+f~eF#S8D$RSk)*)&v%qP+y7u%*VpZ$+%#zf;1&laGw6`CCw zd+MM!(DX1qANQf&Ry@BG`eA(jIR^Nc3h=`lT%x3r4Xo2R`E#HuBa*zty=;1y@XOj%526;urh|z5mqYgX`+$z$i)kRY>z4=c?Z@ zTBSESTy-~7aeKDGO;Y}LD^6!^$E5NF6(>o;@V<)We^fc4(RXD8{`Vaz7e{}xwzy?)xrxE?BLDn z9b7%q*lcD7=A50mwc3ty$(gbR%q2#!!`tnMH*48hV84uHPnIJym>0z;udqit0B=rV zPtq*GXYDfPvMDDHgy9zdX-_*1W%)ekMTR+Uk&RDBCNUCQn-*EZ?uUPVD}w=xVnjk} zEL_~^&6Z3<+zO(6S89tq@k{CIsqk>U>;s_BI=^Tp`n(gi;?1PKn>#W)Pq~#}?W(vx zaOpe{xC-GqIrqI?f2DC}FUnn#l4~zZ!W>0&hpf))hmGrOjwM-y3;+0^r3#Kjd4hKSNpx@s3*`IQn z?LdLa!;QInfmJO1Z~0y1d<)|9WWQ{Q%OU1pU*9^h#%tdcuc~G-Il?JVc0B^KeL%Rr1=`m0)B*h53rN%0=9ettGo`U@}96H#VHztW+{#!tyv{ z0y?jbScU`SqZ3D)z|}Br=cuaB5x#YI{R@qKUHwJU9q5Fcf8g?8G?R{E@wm812L!p2 z5wPei8IY0mww2=R8Ni5FkvjtDYm>Y*IA#E4)psSnLcgc6>E01SoFp$E6LP&?ZfEs! zii%CXBeV*VaECe=U!ULSambq&qxuNHZ8$JPO}@?Gr;kYvYAIbpUGFu=bI(>D^;Eatl{xfI zYqURis1X#6FOYPn;8Ya>;p7k8i52E$7+{HG-L$wfMQJ>$rs{*vujHsA<6;I0X$tL zKuireR|saVs#hS;Zr$Es_%7snx$qQTPAGzY-q~P6$~{12jT29B$<&Ea!ijge6gpZ? z9XYq`{x^ttZy8=qy~hKe!f&5=G~W!%py~x0EqrI*_t*s8b!;}i|?ZC7$i z2QJVRTl;ZYqnUB!8+>eDCL8j$F_K{{exAJ1RXR!hu@p8`C6AlAR(rw#<%Pl*g6SP4H zX?50hHCc6&QF}Z3ina5uH0y!#@|%{Rd1T^qx1Q>bK-D<9_gGI~3K~+Z97`I;{)#@z z8q;OOGUIA}mwArv*3r&4_4yHv-XE8bK()IvHM;#(8j=teHR;Ds(pe({%HwK1#v+i$ z%^de-@Z`|pcJsdxraroE57Yy3B9)MF-q#txAkE;L0$(?1AiTA~l@%1w7~4LV&{!lb z+j55|A2^pf+;O|C2*|?>KcPE4IPN5MckOleKR9GMnMN82_)~;g4D?}EI{@w-uDx|k zHM%bK^;z-cm0)~9+CKuZRC1QXfj^o$0$4ikHaDl5cSW#)BJapq<7U3aJHH5XSIlI* znHPMPnf`LMs#x6=i)Qn#=NpmnyW$O~V|p-pC53$H6^h`}*Gzb@%Vi z$5Fp0P<`L3qKc>1&J!5C z8Q%76K8)w=GwN^Onae|`@r)V=2;DIl=4dfj5VRvuy%dTcy_>AY)Ojv$IyP*J2PcI?AV^nM{&- zCzCcw-gjo4Oxl=9Vu}rf`+N4;=ZKp5{`{D^`mpY^)?Rz%#}F@;#UDm^X#uNn0Pf@uW4ttY5XlQaCU~jfWr>%Wh>4~-!-Oou z-{gn497r;Tz#$ImJ*HB(Ng6>#lYffLdXP6g!z_d++9$T>dfV_*ff6VwS#0ObUELf4+! z2_imdP&)*V{vdK*!NXgKoaG6JV%R6RO&kk0hs#7xC**0O9r!RDL^;H_VP`rP@p;&a zazYmX8&iM65QkwsY9~Anax4m&OGGf_D%4J-9CDV$n6JBtJK;kS zeKFs7S0XQ>9GA}NdAVpow}H;fIT&-FPvh)Fbla#MhmRo_>OaTJ2^RVS%gYI;lX70g zG~XzPV(5Y|;i%`B*2CY*X>FwTWqbwrqn!+XIKJGpKr#9bU9UOg@Lz+-S-uo8zZ6C} zv#~BxPL`;`=T6EgB60z9d;w~yg!3vO7jrC^j3wkG$7i2G9-g2!vx(f5#)sgGqMa8p z(nXZB{50l%ixB|gv%nFs$PxMo$5$cWM*c{1tjdp3jO?U7%spP97@0%Ys}k!zBIZxU zAUJB2Q{H%1apC{O_}pU@7jDt9O5xjuA<8N71ZNY)v)+filXCJONSNbu6AMH+$7c~c z{gjh&2Y7_)&Kv}OpW@WdVRM{vQV?hA8^TyII&@wM1;_!R&aiwU_@jfAlXwMkVQ+GL(p{{tP-j>^1u?u-NI9wd zkTV-7o{4cUU7}-UbOL`sOrOXMt{69*haIVAr_XwT*I$l4JxIQj6C zV(cA*7cgQqqDJRlC?~qqPT?T1oZ?x;P5{9yKa1EA`T}Cu4_r>>0!(s#IkiJ_a^!%h z`vCYh<)DNqM*c?UF5qXB^CF&}uZ-`7KNrR*r)LB5b32`TH*(`bCy}#!7sjHP6#_UfVdAqO2j@8k=M{WmJJF>a ziYZ6JD>@}VS$-OGFX1NGl;$;!IsR2FttpX9YuZHSLa)d8X0l%5nl>*0M~BX<`76lj zwGBT%5!iynljZ04gCp!Uj-NjcJ3?LJ_!h)%B!+TY2q&M~Y55$SdWshiA68M0fCpZX zzkn}k5jo2f4#gbB!Zkd`f^U~1#IZ)eNvC#NmSf+QiWvD%`vQFK1P8{*dd>F)r;Xy~ zyWlLPIo1sSFD<9?CSrdjv5$Bz1{QrLF_ikqt5`@G_)O#!)3uOr=W{u7>^bIsgQDp%HAaDugtSkX1ljtH3 z{U8@>!b$^RZ;?ZE&FNSqhoxTmDjpFgDdxO@kuB+YOOLC6yIS#&9pL>a)Z&N$HH(>uL zwX>FtyNt+LUcf1oBVb+Xb1&BSf>7&Z`~mQ#b>H6)+(9|}ZL#i4=)Crwf*grP=DRNp zxPs!ni07qL8lSyHSB%d9Vmm5aV{rVQ_py#*&)tKuMy;ssZsgU)x2Vs%3V`d0oaJ{` zVD2iEvy-fs*mHNKU|#Q0&Mx>fGDbPO5i4o#yXS(xh5EdE400q6@p%t?9x0<^?HK_U zV#4wRa^Nt^8G!#I!ZjGj@AU%~@`UC0!DlHqUd0zWi7w?(jQD^rVU*qHHFFws{HvJS zX9c-5)($JoMU2CazhT`qX`FYGI2cf$cak}p(RuBB0BlG75wNSsA#!(-b00Qm5R5qA zgIt{Z&W~X~PUH_lE}VJ6i32X9@*Q`8yJ>FhFa=+{w%JZNKTyuL#&LWG!CB=Z&U06jP3bx4w=00E7ZN)0le+_rboznZ_Ld8{A3l2yy{~6LD5? zehu}xZ#i%;!7Sg0`JUfI_#D3;`(3(EvYzk;mTkwX^;Z`?qkZ?0H22qs2u@&QqHURk{Xe-Jdsn(Q7rbv^{{y|fwMsL2kR*HroJ!05qnb~_LtO~`dT3udlQM3)SE~QrMmGdzD&%M7=lAFT?+}5 z{FgY>nC^=gIn+Mg7t&bU?!srW&Tk|0681RDZ_9>1Lfzx|Z7?sMFaz3@!r zJjd`Eu^o*ga$xM)(G7IHwvPb+AC>P|fU&$O-bsAkOmlS?e3s(&B0lg!oTo7-)O?9g zAY}H@p-NelQ@TneBy&O9cvhPbbMMq`pFA;;|m`j7;~p*K$ahTf|wHud_Hn&8XxtWo^lRjUKhpvez+ObS#qR;(c{q z!1qKB7^kmKZ%-fNw|lA+>< zDW1{DdR-E7fUfCtj5tt?b$^b*$%UPrbnd6_fFthr(-pwtem_HOiu?V{6KTFIe-3e$ z=6;@=zGroQ1pIM2_hAyl2h```hw$@DiZAp63-(#sciy9Nq@&`}i@1}>Wjx8}OLBrS zUt(W4j{_qQFXf2)0(mH%Jx?GH>G=h@nuxJFi7s-L%u&Foy>Zic2(^fQK7#e?guIaO zQ8!S#==Bw?A=149ECcQpiyVUYi5RgR70$)5L-H_Flw<#ndW!fiuuv=Dj~qGwE0rH# zj6DB4U5n$$lZ%3VmOp{~p?d^#`5v63lz)=&`w6Cd`C=!P3wu_?({YpW*jmr$eiuGS zak$%sIg0)LZWuVLsGYY^-=zNj)*Z;j{{Ge=aGS_!1V^Z)9RC&%EcW-e+`&l`Il34t zM8w1gvA@3sEcJH*i~C)`Vt*H~*xw13`n!M=h)tF!SnBTr7W?~~Z$mEZ1(tua2snWH z@CITi_4hYQru+Nv2GK*`pqx9OPxtrNC#U=S>l)x}p`6#S)>41JjX7TEByyI&`7PuE z=J=b0BjOvu)BXK=9OT;xpX0}{m!5~3 z_K4Kq$2y_=gmT8Pr=A5s4G+rVOfzy2vWH$*w|Q0ngx zJ@4-V-c30I7W@14`{0ZH{rVm7^F=$TrBZ*tj+~eJ`}Jku$VJY1_#pQ8>ttN9zu!m! zN7%C*f8!uHDwKay19Ae%y7x(#<8NWzsT_C%?5I)Bt$UCg5zO(oBOn+1*X<726#M&a z#C9Z3p_4l#O$PKZ-UmE~tfckt5bC>%2)uYq>{c0HGC_-fJS1>QBzh7wv zzE9*Ve+9Zyf4_`;kox=OWsr;g{c;L$1>tl2Wx^NxJIQmYzYF-D$bnqy@0YQ^r2c*- z8+ep*uKEFgP4Ts8sgJY#7{-My{BZpB3`q`5YNOcSZ`4Eg5#`+Y0`eayzKM8B{r%=W z;PIVtt`TUb-6zu!hpkox=W0Sa-y$)5K<&Ks5Pp71 z@!eiv!9Gj-j@Z+M9`qvaBzzf9^7)dSVC)NGU+nL9q14}RC1R{j zqKiF9<|ts)-neOe1GPx%?>9OjFC={IWz;UIzmpmw^>>1${x0BsA|J7p`a7u!Qh&dJ z{VVnN8+WJs`%O7={#UAdb20K`CsKdEh5V8F`>pT6IZFAr3BR9UR@lE%e<$lM z;pw=^_|Gtw^qJJBs5#PSQh$X%Qg8a?eQ-Ld{g1I;&oR*zt|wXkBdn?Pnbe0^N9i-E z4`4^CV;>lx&hXUEOBlXMpGkf29CQ4unD#zakV}1#a3uVfJCdI)KaIJUFfNat&ubcU z{Hs_ffrufIQw&Zb=E9xD1c19peI^*3F>u5>{|@%J^qJJVj=&a_^Dfq1`b_FwQnzQ& zIJ|ob@)(ixHgLWu$C^r?Ng?&0e!r{JWE zW1(hBpGm!o9FRVfdN&T71tP~3oHmNzK^{u?{oaB9(tW>oS|ML4#s_^$y6;C~DDAIT zF|8Fe&J@$Nknl&)l{nLw<6p(pKJxH|u|E7<@`2+&BsEj4haZx8EunMy;492axb{ZA z9S0V#0Y2yir&{D7x24adKJWo2lgN>W*w@l$QXgmli=Ro6oRmJ3B3SxN>QyX#CPm~F z!w1xG=`*PhjsoY?u|9--=`*Phn~@tP)VB{mmU0qvj{}E@k)I#=0qclZ4lG=sfJ646 zyC_$MuK1Z0iJNq9N5H~01C8^@Zjn!XyG_qcAKe3A>;)gA=1A9mpCCTcb;4iavvi&C zSLCyVKSi8JzNdCRBYwV3?SFOy_J!*Zj{ltavy8}Dic=^@kn0j%j{ocm>dfB=mhreu ze4b<9ASP12ebXypmj4EGm*ig$zJM_=DSy6xf%DaKImdr_2mB_wPrqCMoJ9Tk(gpVI zsXu6Aicz6fv%G+NL=KU^fTh|(IMRB(h{;?e&NSwPIZAvYztBnSvx1yr%8~HDo=kJ5 zF~`4(hlv^3A##c-N5X$co=co*%<->c$sZz@e0UL)wUap0n69)2j=*R6A2Bb<&JSc=#B1sAk+&DbJ@}srp<$ON}`)eP?KV$&kq5k}cIbK47ko9^%*6|nW z^G}F5T^E-B`P1n&`W3p;dOgHkE(!OLS^m)&u&^#1|M+jPf0fwh_$Sc4w26-O^b~L* z9c#Q9949)~1lE1@Ya(a)3HUI2h;k) z?!dx*18^*Wg&crf12{soLt-*X<_HeK!Xkk~@Jf*b{>3CZcVg$Fi759$e%=#tE@Cw* za{3UfO``lZICJUTe?lBa;^|mFAwE(c{0aSHMC>U)mw-c5#rR0|_LqH*rY0 zWWtdt)Ul@Gxj>YSMdM;3?x&zZSRj9xp z@m!!#nTxrr5nWcHqJfyubHU3Pa~IDA3YF)W`wbS)1%g~W3%rD7_ar}A#Wdz#!f-_D zO^RvE{RWGJMGz@pE1SE@NeJjMDWU?F9Y8-znKT?+}TK9{qKX^h-^E~l8=ff}9cJ2A^|)^Tn}xkOM*DSXYr7CL+Es`i?#dCo|eE@dergqfPo_u%x|k{T~t%m*3dG4k%yLhZCzDMQ%kGdUHHqVwQg>u+;4`T z@bh1Qzxb91ROkK|Rq1{C|2H72%N8xDtimMZfdP_1E%)~SCKP2pi|04A!TGBC8shb` zmfBjx;kknlwf|N`B`>RzsEI#esSJ}QTwpS?&xIn6H^`!U;YDKk%J=*@h{zA2s^F!> z3kxP-Le~^A{vuyA6yyYJzko>{CA#EC7cU9x0~1^B7&#b!tH1Cb*$ae+G$1dQ)Ky)EU%FVy|64qS&-5|E@)U*(?r&w9;rl@uw7V@O8f#lm5apRn=0qmEk+W` z9c$(j+jA=y)%a95w9?FzH?_4w_-g8r^$ZX53k?4)AX(G6cu`wJZM(dxh9ogD+Oo{2 zxuv>BUfn*wvbmv36bZQ^`H5gjKM_J#!f(KS8_U=;Q^$$)7^G7xz@6I0$eF3X5ZT`u9cIGj*Ps5bqTmlTS5}iBBzm{--wcXY#H$ zhJKoK=9{Mr5z>rx<3& zyUGWPRfr4k5y#w=Um~ni!$hl`G5_&H6*8C!(YjAaiSYADcmBo6zqaXPp(eS9M5_iV z0IfFA#`iNr%6KwV7E!uLl$Mi#{CK0?2bnzSt|S^Kux`*Gc{1^-LV23}vVkZpB?_lV zG+fB8Di+vZ!=ef^srCenXa9I)OW1!P>^Q>yGhyox_BJI6k+*V62*X=s$E_xc8c#u) zoYEug{}47u*zXcH*5+?SOa`C)LX%jIC6@mevzsDmKV^t$O*XtnVyZnZsJx~WrX@^p zHVODDqA^S~9utjXa3`#B!W&ecC2wadwUkpWK$Dt(AT{gz`5d8IOu;2xtQzvdoO!Ii_%Ba?zSE=&S0;i# z?8{|VbFaTt7qghhM&8NQTW)@v#{@G|bCs$jRYRC(GW}sP-G4IS%v2Xa#|Sz}P%S|p z5ah{(F;7*;mC7GjpebJ>yG-7#AgG<7eu84qCMUd3{Co`QF_Col@u%>69JxKN37^Lk zPJQw8Zzw;%rd_%}@t?Q)f=WIj`}LP+O0t+t6{d6@isS6hO65Cb$sKQ#_};>#Cap#h zrl}7Bk)972CW%zRsdb=ZUjg-#2o?NFvZV_)ALV?1+D~0SviB?U<`zM1;tpd*cG6Ti z(JCfy6cV(C#3Gw4k?J<(Ui>|^k-V2p)>;+lSs!zP*o`6NP2?>b?dIvSb<3=tjts>F}jGDPa~01 z5EP2ZKO370fX7b8_#%UAJJV8JXHGD}$f)$o}BL2sV z_IPXD_MInp(g=wD@m{AcjERz0i`r_|lX(_$q965VyyZ_yv?CNJO=35UAO|woV^sok zNC57VI@Lqa7J`HnE5W}9@=`rQ8F;CHq0g}q-$UuCE5pcit>Ndx*d6cvIF2=vijs`^ zkLH$_s+e}_&VMO2l=xQ}u&LAkg7`jUUMWc&Gl}b{7pmE_b<9^vZROM3R`~a1HT=`G&_S5To&HxjkpVLkIxkeE$L8XN6v)#x z4cd1}NRlzJadYg?9^$f4mVTyXNxXmp>4jqUR1Ft%*zQoeinc%&Y4WAIgbbnAPSAUy zpdkl@8uJk}r&7qkTga|^xkf$dR4RpfhJ;#3I0J-zgP#C#9eX4v6K@oxy*fmobH5V_cYp)%pRh)78xn{p)RD`IXlLGy5p zJzb8lMchf!MH433oG8m+-XtiB6yfO#1gg+@K0_&=+D8a&g!&JHtVwx)q3D3SjmWzQ z_Y-Oi+(!gy!0E>hFBKcm-z9I60`=4gy%d*IpbLGHTpK>_m@Y6sNd*QML!>sr?^L4u zB{udm(;aV-ttwn&SzuisX?*=(%8Rge*NJOOp!wt%D~ENz{FFl!N!y#sgW}X`pjQiw zP>TA9-WK%T$-lTDO>xnQ`6YxJ zew%s-x1Mh*)Lu&>{DKIjy#t}JFJFUD+96oMxrDd@>+*avV6*HY!ZfmOV%lT7eT+O( zCn7Pu$#vS)ei)N-7{@l8&%B95Oj9D6+DFC{vrwIRru>UGVTj3v3xd~;Ng|0!gAFe9 zb}<_arkB`2TEf+=5xFJMgcrFhLw-W=B6of8^U}XRrOj7X&8ur|Sv^kG@s!jI~lI=2E+9=G2G=P4EIlabdBwd%pZrN z^f5-(*vH7$PB5~e2uAi+AjZVG`?Do@b>X!IuYGu(z-tsQ=zR7LUY`)JxSK!UxPJY{ z*rki-&z!$BdhvqFg*VR+?@P#Bb!7O$=#>kj`ws0LJbrHI_|d~hFPP2fJf( z_rXK#q3`ysKYaK!EDWF8yyw8){{4qf92at}echY4?$~#B`0UYb2M!|*ckbD@cmKYd0ZRy^;ZTqf){p@~r z@BPi2I$A1LojAI8&BlR)8z~I2( z(2(HB;;PiB#PntQ!tUfZ-Xlbq)134UP4)GSbpwgMwU=ic(^N`~yRRBGc27`RKT@8`oiAbWd$%#i})( zYnH5Noi}e$Q(H${OU=CMGPdl?%KEyR>V|n0xuF4ZVSeuR{tZ=pfM`LIcA1>tnL9H?JNk45@FMw`xURNnUDF_OdOz_HJHS zzpOmHw4u7TDmyYcF|#=-Dl;Oby{C3L@9$%8;pFY(7wG4Y2##@MZ(Qw<3n*MLf7zV$ zl$6ZG%q814ZC^dFdrf6x)q>1f6}gEC@zpCAH&m8nH*}R`rUlP%Fb@iKv{Hmcrd+#p z6%puUZk?#{vv-Wm&&f&6sjn?8+pyzMXLI$c&W_b!~UsqjR-IAD` zlbEUqh)Io4nKM7#ua^`G4w>m3uGzPzh@?Yd=^)p?Qr@;7d#>RZ{-)!n;p zMN58il0xyx?VGo*Uz%xUB@g7IGPCpB4;|drz2nH?gS)paUa`5OXGecmQ{BP+y>(4H z29NG&Us+)7=-tx2rn|edb@r_4n(7Z;yLId4Sh=gahl^{VB0aUOe|^iGj(tZDcdzW~ z>gim+Zri2>b2kqStX|qPcx+=#VtbKySVc$kqNb(o%{loop})Jy-F)N5iNZ)Npz*i*UiD+Ju)pVx3H()F7o3uArU?Yv`B zlTzo@E$Qo9UfF&0X{J~rAp)6XL=BP2FCt-5vFv6IL4?pV>@7u}L8TK_QiE&mFrmv~7E9 zb>*h*gF{D84K18qkXMiwo|NY1Rl0GuXGnmLhm*Cfsj(qz*va%7=)ZRB#?9L|#4F)ZE9p_ zpr@~M7g>B`>};8ny^pt*+$B78$&Q<^-8{K}XUp>W?fs|E9NOBJmYkWKFfYHjBre*= z#mU;*!pu<5!V>y=I@((A-yCDd{xG`8+uSk0*3v#PGOnWk*om`;S9dR4T;0&NZrhg1 z^pxURNjb6M;W6&{epaUD*4E}$b|xmKCi>c1tk&c^q@2EeF~h>t%+4)3G%+fvX!-iJ z8#eZ?TfZ3pO6P*wc?sTuxwE1RvWn*|E-Q61HZ(A?v$nT1GBh^Q(c-kGes@iF?TsZa zW){}=X(cn0)AKg;b@Z(5+0fs$a&=R2R&I>PjDSEzUSU@8nhl9IhWZBjrWR(#M*2nu z+FF`gnt!}Ts@Xf;4i=U+u8Bo?1;vf~HZSh!U9fuN+Ot_N`MPE& z69Yplb0cGTp@Zqmw5DFW#$9{o%3zqigOg`M9$#3qsQ=i}?ahsKs6bIJ7N++0o}PAg z9v<zTn_n^&yrUS1Jq zW@2vb=HQZ9kd>HR*3eLz!n+%5v)ZiI1Y8&N|7Q%te|TlNlY@J3KxAT0M&Yu7eOr54 zSN1HJ6K82+@8IJT(A|;2ho)p@&MlrDZ>)_`Sxr`JTvJO&=l2NR`UDLR>&nVn+MUf%OaKuUgeNzd0F6nz(9ZOV7r#GI#sfndQad z&U(6yi6+qbc&r?Dv0KL9%|#KFZrbxGZZ z#d8z;V!ac2K0UxxTT@+w)p$!?Q%hGD{u>(Kyfiv8GI~76!Nxs2EI2GUVCCxhRhhvK zaz_W}gsh6FnB@4%vIwWtmSlH3H%|*~4RsauziDb?1r4!-FAbkLbN1}MXnQM%;28nY z(UJL!3aZll9OVwI!+p1m^`)6f@#)FF4$fI+HU|3oI+{fNp(b26GBGhSJb#)!{oSeK zbDgZrt$ba*!;;g>S5%}W2DmtI4)?w426irOOZN=-cJr{*H!woN22Y>hNHEueNeEk zt5-r=lpWPJ(t`GT8tNK4hNfm_aNSCty{O~ge|_WPiT*ih@wqG3bSzQ?`uh93JGuJ! zM#Pk7CRO<*`T95r>QjcADw>ZqGM?X*0}6k zcUxCyd-s3@pUjHvk}?-JM`v3b8*A2j(o9!VRr9X4v56@e+``H|Jl4nli@*Ht^2KBA zCi?xTBr+Zjbg0GLOvxSX`k%ghYv5|qUE-YwhYG`Qd z>Y?Uf-9JDCOpNq&fB5$8^JmX=#^B00B{3?(-rUsI*~8u4!^_px&eG7u*1!byT}PYK z{y<9ur9x9%M-NrY$jH>(%F5VKPxn7x+&X{y^ull-pBaIXX>-aw%uTJmyxd$_*Sqd! zW={5QmKa?J+gw{q3;t_j3fL}2M#knAmX@Xldb(fy&#lojr>kupynX$`Qm9N(#qV_&_MT_zyIOl`O~Ggs9NDk(J^U} zZaz-VGUqFv-u5QGNm17D9OLTf>7w9hYI`}m>%(_LV=GHbbPq%QZ|{y>ICm=E#@0E= z$0;%{JV0*m;_l|+;_MmXs5O&fvICiwY=5|qe|&~#VtsCO>4GF;!8If?lb;djsIRS~qh(}ip{tAa)6}1lw|cgV zmARQd`j3&3rLE-`w?=Vx{c^CXFtezj437pC&0SRPY4t+_7wVFnVOrLSekkJ6h>C$r~G*G)X9^_ zkDoYx@W7s(dk!5uuvca8n|lVjLSpLH@7;TFaPOh6wQJUI-Mx9s#&sJH>^V4eXz#uq z4aN2I7WZx5J+SBW*)wNOpFDYbaR1Kj1A7Mc?HSn1?tQSUe{->KU}{(2`VCt)cC1{^ zE}vZ0yOv%1U03V6zU_zh?j6|Hwz_-GvhH}4yE+%mt17G9ylZ<`%gUaP z#Z5~aJJvy4cJ9fkjXmAn>(=+NecyI1>0Z5fZfuy3Z$UdGYZo`REo)!7x|{80*W7Pg zR9&1=w{>G@Lu+Tx!t#phg&pUJfwxZeEnC*z+tagVeRpm7%!purbdsFqee3&H7gn?_ zS-P~Nx3{Nz)$BR(e*V#UsfxtZvh)Psz|iOdjL)89&vr7uKRwXay>dl&*Sfymw(^ib z-=GLj_xMGaL3MIn_1x)eGn6WX6ZZgm^~HU)8(3D7QE>JhOEElEuvhX<50kzTWPh?w&qgp1#Rh z5&ogkM~@vF8ay(zZ`JaiWs92UEm+>Zs3o_2W>jFHPiV@l^1_^11vBGv3rceGGU7t~ zLnC=VFAq1=I1k^1$S8lmpyS7m9X&jFcxzo*`@(tLJa*B81+(VVlr>jGB+Q(dot2rB z$L9S$C%+&+F*-6bz{ArnG%4I47Q8)uqa(wE{R4+i96xsC@PW>}jEw5K+Pbo;(!#!1lX6F=U&tzwQnVFZHlbv6X!TY!e`nWn+xD{jtyF0qMqSE?v{+&#B;L!17M~@vo z*clz1-qcuCRh*lbQ(RfPuw&Jd=8WRxq_o_EyxfeL>3pcGlShoBrE_9)SxTsbv!ioh zkZ(wEa0omY8aj5cE84fLxv{D|JFPfVkykx$Nq5`q+|-1)q@03++>E&R_^9xJz*KLS zg1Xk)aCc`rV=GTDPj7dh;NwHGp*N3gNc7H|Q&>~Qrz#@D;wl%fT+=o?uOdAvEk8Rq zE8aIeGgWa4hjI5oVT|L~~f{q^@;)c49EDv-~EGeo;i;f774UH*Z zwy3?Xu(2*9G^;o!DI-2KBq+P4q97|ZF26A)Cd$*r%E-gp+BC$+FXHIIqnQ8JTvto$ z07X1*B<1HO%xqo0w!SE*w!WseepXUyN_>2BWMo@;{`~CZoRZM+_^`-ecmIf>h_vEp z`SHPH?6K~Fa(hb)JKtDdk(`&9ky6{dbZKMe{ObDJ#_Hxp?Mvq@oShV&ot(A0ajqi5 zJ2bkmq^x#!aRF{JB-)-BI(}kkbGW&+6|MpKgxtKss;VW6JJ+siSTL`-e%`{?`OVEW zO${~K8Lf@WcP$Nc^7o0J+tAoNzalf6_jR+naDqL7TLD9B9L+4P5wSjJPMtVD zbmCaPjoik`*U2|Fr=T%=R?WiJo>d#x?cI{y+*!#d&uOl%SWuH1c#bOahZ*k^@$-f zT&yge3$t*c6PR5(yL5S1fwima*x3`ukDuH>C(v1L;S>-N7BMrgqGdsKX48iLjx9%O zR&QS4)6uRO}v+sn_(A-%xf+S1ZJr@+rYB-6yy((($%A3DCjF>;2bM`%n!NMcrY z`LfNOON#5~*R`)|TeW}p`VCu`wq*Ky2Lxv%&YTFKh%olK9;S<($p3@x{_cC__yvv%@KTD9-U$)OcZnaRZs zo44)QvT9LoWJF~C?Aci}z1#y*-JGn+{7Z(H!x$_rvBZ1b&VBe+4*x?+LvZVMI}o&2U9%U|>iN zMy$r<_2Vc7Zy$&?HZZcV_xBF-3rnh6*xcIMG=D)^X6EdYoWc+%_xMEr#MtD*^7J$t zeO+CB3sXxIJ)GpUG&qf^3&&)~-l(!QG&Z%2N{I@ORxHFl-R5}!Ci4l&v(~hgH8qvgEoyEq z_j7ag^h~lh$6eSc-=MrA8v|WET!`yq0dO!=(YSjK-R$V#dLK(G8^=&Za6(S$(oGwe z7Zv0+HP!mr85>wyIyzcdI5-6HS$UcMdYang`WzRD7+OVR@&=jwhevj#*jUS*y&^(m zGiNQ?xxQm@RZZjEbRXQUFqK=|#U{muhR@8;Pm2ha>*Hi0(_qzAH6~vlI>te_*2YTi z=ti~fX zbqx)iD|F7o^FJLua%idC(akR~Ce%N&u4BdGrn35ZHT4DFj%EhdDd`m}S`yq0Oyp_V z88eK?K~`N&omI!0Y3r~$fBOBIqeqVn?wf67>J}2{9u^v1wQ_Y!aZzn;OVO-wGgHIR zy4sSaMd>r;mH|=e$un$mMarqOYIlhPxE$7fYxp=mI@#N5X6@$h@9O64TG%u%KRMRT z-P6Uz%gWXwq9Si$S!U?MKd?V``wnhVSeeOZ_;~qv z;j#LntQb#gD{E`pkhpZefUuyLGxIkksc z+Pc_0#)d}wVcRcdd9{i=hn>hbF`LO|11w#(zdXEZm=zmjpR@?A?V9g ze^JxWGc?3`&dSbq*LH6Ey&XH}g+Nu_s=;M1lJ^-1nARrPaAdH2BBP!9)ZYg2PePcK({ z$B+n&Z*FF4W~#3NZB}gpr%^);{)w@PWo&8n7w=p+uyyIos35+ozPdET!^PcQZe#E4 zI>SFbCOq3U%*ELnqjRQHddRv75;hF{v9T|oo%Pknm-qDd&dZ2Onq59SC@x-ZZf|QL zcMoxn$%soyx0Bo0nB&~Snob&NsjK1+25LPS_I;WiYv3S^S#w4^QKF1=bUwdvcJN^Tym0@( zwDhz{Pr0qBgOj6!k6);Zvz@K6nSq|Mu8zJQPT|m3!~byG3wI82=NJoTpr@_%?Y(Pz zcI|BRck}QJ5A~aYBfGh+gIw<5WM^k?tY>SkgAz&Zy-aCfvwfmL^hv?eGsHb0eH_of z{`BT2ZwTDW(GdTVTK zVq$;;@~5w#KDcvxzPXjNit+CDBSYLY9$W_By28>YErFqjl)%+`BxqclWknGjm%{XB*!@A9pKDTe-cht&M}XldV@|sH-*{ z$1Wo$U^P_@I}bm(9Tr2!&QTuGYfE!u+&0(KGr}Ew{r6Ap-#f6YeTK7JP>f?}Uc7%=Nf@zU=M@qY z?BZ!nW^hjfhixrwES|cKi=r;o7B|k(cu+S?%uPQ%eGsSCullkQVv-Zm3rlj7vP#pP z-5lM5L&HOYoaH81ySH>rEv5F)d(F#GJj@nRrP|l zMT-{BYe=2pCLPuSVReMKE-_$NX+so8gkKB|&|1mQ9>)7DF zy?gtz;xgtoEpKaWX>FZfnvDA(vEiO}Hr6J%ccdZHm?G_&Reevx7%6RUVrXKBnyYQ? zXyf7V*CD76tW1v1$0@O`WnpVWX;HMRyJxhEy$!irfws)4e}l|5&_TI1z}*uABLn>9 z9n3sE!*LPChZ#D!IGQ?n1pE1ym9ypdD$C0%a-&1TVuQnZ@1W?I=x~1* z7GK)2^YZrgl9PLe|FW=kadvfe)G{)$a*2wMo?+&KJ9ZY>G=8P!m9on3D{{hTxOsYe z1=yKb`Z%~6Ymvv=J~Q_8_IA@zH#Rf3v~zTDa**q5si|rPM29;WTf5j88k*|bc$Aev z|4E6ji<6Uww-@X6)X~h@-cSRN0)47s4~y=`YKCU!*7i=$P7V%+1{}-i1kG^N(U-gG zsj=z?HWg(2pG&;W%$;3bTphe!)K&2?%y*o%m$#R_nwlXts*S6wvy%<0N}lvm#gjAl zxjAJOm6a9cvlT|p)|SqWxRy2~TK8E~Zyz^3Rt?%?W)+mo zDJd$O9c$!fZDL~KQZv)EbB z^4(aXsbS&f>E!P2>EU7q2eol88`mQ0Mrw?vo0nI(C;8&d6Hcb0sxGKL**&LZcHvAi zw|{7PxSAQ*`gnQUS+JUBD(V)d$VfM5T}EcU#G0N(!f9WUL9d;n)+F(a_a2GJxLWIVH0S3TEY*L+vY;!`A^d zjr3jYd^{6^Sv?0lIHsU$#Qs{O~>3oZm&bKsBTVC(X66OJvSWuLt1HFH<>e`07jQ)%e``~O< zoSj?@4b=5ym>ALx&ux-&@^~R8Rxm3`AA;{>W&sX1Dw=vK4)(^j$+2F(!KT_^Pr@@j z%%r%aq%c3#0G98|tb9ZL9Idd6WcY+3EyE+g(~NvkV^Uj-P)mx6N@nHf`4Xyrj9*p& z$|cK~n0x#CMEGl|VO3S}^$`RaiC!_gsJOH!-y7T~9tl}R`PSGs%wvs!(1-v#Q^bXN z#<5zMB-R0@o97hIF3OMBM3}$VvMQ-4j&QMNv{}wHJkrC2#NwHnCX4?HXO^g;mql(9_5DI~E@~qls@@ zX{yK=JS$k6m&@his~I54bhTw_8frQwnkcDwK$lb3Qvv1KQtVbXcgllsG#rgtT-vGW zYiP(&@g`9P4DoF*yg!kXIfHDNUszK=KT8#k#brCoIEa2c%Z?&@;#bZja)zyiimECK znHn>RFF;!`lim67VKR$2@le&#*};%iRg;lt8YfW&EtsiRy!|XE-H8}rWikg194A;9 z$M+;O>~z$~SAFK@<>J0&nmeKB+FBZG$yC%-P|ES(I;Uo-4=azi&H*Dc!H7__tdWYG zicA}8$04cl*@M233Nf^?x-dHFkoTv)kor()*!=Hr(lC^op zLXHQtuwXY;vXU~=!*C4I)mCAwnW?C7F8oXL&@$<&^)$Q5)V zmXR}0-Z|S67vidg3?th@&ipdEp(Z`a7o`Jr2CPZM0kq4@%QI3!4Vh5p$@_Pf#6?FM z6ZqcfoY;tPEdnogm!?LBn-KW=$+qO!aDjVgLB1j;RFz0i%}(aykq@qzpbFV2M@o`- zJ{nb6Xcwg0*kCjbB-pcyb5ijH*`yDt{1Yl_YU&)z!Cf1&XV7^rwG|}cCXoh;=p!{9 zeB`XFhDET(9v~_F-SCpk!~}&8`hl8`1r88;dbm*WWWF28Pf#d$Ibx!3?`(ieOLgo9 zcZ|FB(9p$^k@HtBo;iVAoJWrijorWlD|ldJ*U>{wGdqr5!(&)uS1xV|^fxgwwK8`w zH^Z1X5$l`T%`8fH^jtc0=-8=~L*yD04^SQ)?A?0e*zlE+^XulV>5G})xovc8?85N> zW9clw<4Uf4uiG+|td+OG$Iz{LF&Z(PKu5=*`S#WSV*wO4hfjmwrrcklHZREq- z_wL`uF8j)rtF)`XJA3HZwM*xpJw8*NQ)_n5No{;I@Z`YBaK58GcJpw_JJ>`1D1Z}rwC97W*%m9cb6{rXM4Mb4$f*oI@=xJ% zb+G@}7vNlPM@(A|w@C?iQ37@4dw_-wwI72k3Fe&4`A|BXEvG2W>SmGPMY z8m>LgbGD8)j=+Ivwv^ouUOur+ z73uCBD-j7e_BOC6;50~gLMPzOpi?ZZ|BLh-S1eNa#72ikhDN2NrKN9e={({^moS}; zeDDdtuNZVXn*1&4GH^WDo4qH0!8QPk4rRM)k0UBqWb!n{MMQ-K2874PC8wk$=j3?W z+uJZh^>V40=S;`e8Y&CpDLkZb({Hgs39Im}@^DOYV)M9iwJy}xq%lPXnS4zl(TVY4 ziLT)q2OMtUNfPq@RdH}c|AK11L?O0YHq&9l(n(pMZz%4sgnDA2m>pP@z() zRUqK_e4#`nlgpG`209O~$KmdmI9|fr%@)b|5}liv#Z@JnEoM0reXDL;tNPoS6$x*wggmRrq z3HLQ$Cc?3jg#rXZ4lE(|QFq=5D72e)Ptw7-BYt*X^ zNn70od>)SH0ycw(kH?}0zc?{WSZ;i?*@36g`0BJQI%y7|3UnuXzQM~!E0bwr!;{K# zwt1R(gdX6qSsWb3Fl4OJXn!YW2_QjM4no(6U>})?OY9QV7Ru)LPL9q>FCTA>NRv`j zT7URxC)?SX%f%35uz5T-j|G#?<}a)ne36Rl9~>rQ3E9rXAVO{Vot2#vN9X4s=pT@h zXRd8OacKx>8^eiZO9&8*aj2W+=4C5exbbBI4%fj+9~q}(8-rv_Tc)EmL&!IV`iDm* z#>D1VwCz20XL4G^X4qNV*f@du0En|;^M`g)k%TRT<Y zO0hW?ySI)D*B=kPoSoNmQ7h;;&HDWofGlse*h;;8_zsw;>^X81JSqX9$>kOGJ5Su` z8yK6K7`;?n(QxSM=*;xO+}xs?4gdvnf#sGBo8LOR`kGvYb{L}nX~*GeeX{ebEBBo| zb?!pf)Z+Zi?98j7i+j)9nV4T%T3(o6U||&?7Ut&X=TOMZG;R8)ncjOu{wHITR<<-7O2IamzJ02Eg}4NW_s+(`OCM_@PD)d zYsJF!0^|q07kEvDXL^1?VUBs{*^9TwU(HgpwE3SF$h)bCs1LFI>3` z`QO;$rD|YKU|r};ST7{T*d4ifC1urzI&XGQlLkXW(-z(@Ez_3YFV3%r|c*wC}}-@@$LwO=VxaZp=FDU%V@mirGL+-PoUXgqtn=lMJ;jc;G1Exun~v0R~+zg$G? z&&|AgHE_T4$c?*KAx~NT+Q!Zavm@42o=a@;p5vzux9>i5@JjECdGgjJ(s!r=mpVkXPJyGGe%VHJP4Be*1fJFC^y829BuhW2;=P(YELcx z*F1D@El}qEB{0vAM^SIAOpY>*TXsp)u8t!oZ}f~$&o3-mE~3j&am&T^%hby1GF}XQ zc{$MC{}>g2^sxK61NxipsPOhnsHi`<|G?4n&t6W?kk_J(i75G-T12nmy(_<5U0Hzq zs~1Ck{R4yDPoH#+zMO?mkin7!Cq!;*IdJmGk+Y9qOifSELB$rAprJo4ETQ!+7ir7? zv9h|lFiXODo<8Xw9337W>K}PEGwbNg(z*vEZ_BJWdZzR2srwUCYvR-rwfGjjK1VbT z;!B?`udd7kpr7hFd*fN(&=~flGf>LUow=f*tn~cGgNM&wy3~2Ce=XeQE#@Rtes+eM zd4~_!xcJ%9%Id<@^Ow)NZ{O=5oS2+^IXwsIFXTxv<#pw)$1j}gymqDY`p6W<%B9O!FJHXU`*LP_ z2F<=OKfgA)yqhIe$48^2>6fowOmsaO?HU*vpLp?d2GiE;Y{QXLr%#9Z$Y5AJsl4Wao4Cgx^GJHZ^C zIC=WuwqT=wQ+dPIl=SNTM-QGIe)S46(}+8onV-WnYdLl0)x@ns2Rja*zkc)Xsj~;m zT6Q$=t?LNQZ8~=PcvE^}n74aiRCIVma!G4jUHz_8Pww688=D**9D6l2IR5Gt-apxQ zsG__mzqS#nt5O1W8ns5PHkwq%%!2ITjF_+_V?tz5Sa^POE7jUz(NmR@kdly5Sx{FG zcVL81d~x2+qeo9PW^YSPN{aUP2o4M|z`&_gE7h(TbaEZwG@&YPyPum+WLaZ_xjHY< zGsMH)Jt!(EJ;7HmmPnK?hWL!FX-SFxICklb?(RmpQYKX^6b7tzPHeW2%hQE<3Hb7W z?M3-%neiTaqsEkmH>afrsd#*`hr!i1IzBNp!rRlsQ*T0ak_LW8mD=Eq#j(R;+QFI2 z0nFki!o;bMj)+Z+jPW-iY^NmCJv2RDFXnQ1YK^O3NKBZ~(`3@B^?`a=hLkzcn({$ICCq-Ba)37wU(t7`ApYQ+Q~Ar>nu;Rj={#kZRoh z3~DttoE|tbI57#6z+|zo+Dbir<04aHe7!sn1LdaoH3Wnx6$*{P=ocSpaxuCaUGY{I zH~;9=@K7W0MX9|b<@g!#uE0kE&lg)HmALqYdKvYU{x0^SYPFkD!RJcdOm0CbAzH16 z0o|w5nM~eMN&fymdKr&{CBuo$bjHljaOUv%*s3`QHFEd_v<6qBi$SGT@;F?TL9O)B z%awXH>3&qr-ODJZ#DC?nu+TZs5!l0HVPDVWz?mcFIWZ+NO7;u6Od?fjGzvZld`GrK zDIveqs)3ZLTwFC;wUEKVQs>Ncq_ZV5n7ru}y_?15z{AO8aO5z8!!O3;34woNL+0SX zl?hlZ4vi~kjbSo35UUELY89u3KYLR zo#o{0EOfSK3D`VsfV)y8;)}#=te0#$CPBGciH~5=7++)K$cE!UE)rlXw~j&4-@)rk z+586U3xn_EB*3QDH7X&-;G**L7cy9EE{o2CLrsQ50u%D{Y!02y5z9nE4$xn?jTm%C za%v#}ygl7XD3`mqx`!tu0b9)69_JgV_S5inDmhw9EMTIpl=Cl{IGuChm;(7t&ORWE zvB|n#Fjok#X;Uj5$e{y7F^;kGIKfyuu>8UAic3!)Id%Tr>Ej1F_8&TS z=*aQv*0U$C-n((7Hq+eTwzaJN*29O_t{&Z{v}a>KY)ejIH0!^SQ>V4H+5_yV&*>uw z;ySp$WAEO59aP63TPth#?{2$zwqh$wKef^pk~VOPe+s`M zd~zhBgOp$m(}4@_O#a2*P3&KO>(7gkgo>%OU|mB;s2*#Dgf#G z6Rg@+)|S?k)%z{@*T2Ix=TNZs?3weO`#bivH|K57D=*6pa#gr`xrpJpwP#vyCLl2E z69nI(Y<_gGCM*VJO|x2A(+dYC-9EnROy{**7fY?3(GI@;pwLiXot z4q5C~;Ecqf1Shz4TfVe`bD6=!z;g;HKXCHub?W-x50-}ex`bqB21FPo3^WtW4O?(X zwzQ&I|A;oTu>wu9Zu1*!GGnlqJe@kcao3S^=g)WU-PwXh&TCFqNCZF!pluGsI6!vy zHeiCWJBOs@=8r(9W71;_6jHsLhgVEoSY%wz?!EO6Q4E~s^nO0>ULHOn@cl&1bT&3y96jWG9>*CLr8R>PsVn&dCnj9!tDCIs zVZ3m%qcffPVyTBgEmnEEsr71ipFn@lK&6)i_9qt^U^Y?!tT}`NUxQ{AQ3!%aV5AXA zc}~tipcrhKMy-_!`Fb}Ymn9HmeiMjXr5rwD3UF*E1+1O>){e=WD62o&z|_UnD+MAT z`p$G1-0WEr37|MWrY5$K68=MsgEkwJ5SN4LPRJlb^CuhP0;g^G4;*)GoY(>;SE}YX zISLeH^5@#xIm@Jc21mp}dBB%sY;5}3OpYaoVt+$Nb#X?9sgd}Qzq6GZO==zwQ!IUSXQwT|7XGo>fyov*yP7=tPHZ^7iAVc) zo2~5_QiCgC`4EJ?6xQ##1qufN8&>FQa0xJKz$o!cjLcETySNGtw zj2(sb2e00^-~I63o|KI2%8q+|y@-7p7Na${VDwvV+OYAhttt@T!U?>3UA`UOl+Jf5vJonyyz za%6LaZi$6;hc90^dUa?N0b*lAeceyHdY*On4D=0*3=a;Gh#=ag-;mGUw8?stm6J0A zGqw$^&$c#fO+a>8+s@P1Z#)J?_xQ~48hfpCxc5Jq0 zS`jZfCMYYG0OQduHf?Lo$@9oJFf=+mG%_|mh7At^M}k*x1PM&@eUpHA)y77#tixA$>ixo}YTJ94GSc&~ntK zzgRQb#DIxu7kHJEgy$U^my(g1m|1(OYlIr14Si2aAq_Z44O;g9TW?R#Rr)CGh^$0ekc?WjF^?$N+7T8cJA4gWMUHaav&gY?_p?)&@N_8dWv z{m*6_VnBjniJWqs=q#Z&EFm#5Hoc&w{m6qZ#HP>&zZ*hN4G)h%+H#N@_`bjA-kFx2 zdyk>ozp;X4Sqy{;I1uDv6jS=g#KotiW>xMwbg35&hK9!5e;6Gb9UB`STsKJdzwJKX z(b(8_1mZYeqoo}&UU0%@Ix>|;-;mhE#FV`HUB~W17?CZ*qoZg%YV1e!|629GMISu5 z)KOK}PD()ABb1UX|27T`uCqR=swyWvCwoWBk;_j8QR|_h!C~6)`!Pf~et{4{H2(mC z^=_QlRekVS$C~`FVI)`saU7iGekrAOjn#$4m6aV=o(v9;pzlbtLsuccFgh}XclX@C zdHwvcqX&;2J&Xa4)pL#gbYkj!qjSv-J9joWbzHpDGcYua^aKcM9EI|YjUhnt1L(m3 zVvQc(y54#A03x$bc47ep_~*dqVVrnn7F5=??mB$D^Hy*F2tJx&B?@ z)v;lscs);VbY44q~O0Elj`X}kEerS}dx2|5he&f>lbDeje^)M@Xef=;sNHoTvsECZ3=3Om~Cmwc_0?=&3&~>W+ zXQFzR!~X{@GBz=ed>_xcF1H@Mc=gsj>_hwd`ukzoaf=L#-%(lJwtM%k{nyvRS>6sp z9=3#Ds`ni}VdL;;BjdRF?eVk6myRC4cJtw*M^AeOQ2H1AAm6m@>G^d#TX*f>w`>2M zZVb$?2iLwFBdia-xPF)#q=vp2=za3&&c)87*YDlI9=N-YNdGygsJ7f(S-xxUZe%-X z-+Sd*Z%=Ozv~G}e6V>ysk5qkisJ{n4e%AH$Vdt5R~G`OcFkF5S9? z=DYrIpzmHsO&wUR=89;O$~7l_M^s2yR#{C&>z!v^J!nS+7WEAd^giph?C$S+bfmJP zthx=`_~y2ntirg0io9yi_}tp2y4Ws9cgl&0Sx9Y6bai)kl`1tFC0~d$qd*|Xl4l2miQz2s z(6N{TV{}qNXheVpfuHIyFFgzcYo~XOLZSBw2=efD0h#q)uBO!AsU#9Go+7ym*2pni zaFkBKz}T1p<-T5if!@BZDwWP7C0yeX79i)q;4hLW5KrZy)T-4IvD{6rAU+t0RHoKr z_O=5(Z(}Evu;Fz(t@ZW~i1hZ*>kNKsom^{hH();o698ZB>EWtX$TbSNM5p12H3o%P z%ooeF#KP-{&5#WOJF({Sw0eK<5MRAcs{!pM*DH+fLV-{sR~r1i5q6+aDy1Y$)zvrD ziyT#jJZo&?KXY(|8<Y6R;%1XOj3zfjvs+j zQ@i*Cxw`7*JZA=(M%LCo6oJDfm&>qWlLo?$RH>B7MG|7f5W(H0m-B^kFmPfCEHwyR z0$YqAd`I{pu-`)<0?Zafp5tui#6{>WpU36HRD-ZqAog^wkP8zwMK=6?gF&ir` zINEtz`?bf(E*P5tI*aLO&)~yP#APAg5LS2cVK%m~gFC@CL}zdXLZOr|5c2FDogHB5 z_ybuux!5MNo$vwnc0lduu+x*+Uxovmp^o-6`@h0dV-HKXBiqr&iA85hjA|kFwj2%} z1$;vX&4{WB5lrD==|C~QrlSIU{F;t8qgyF^;?bnGyan>Uu3}kO;RjieI)z;f7$bKR<*Zd@%iXWuYe$pGAJTCz||x+ zh?z1Gsth9o7IeZV<4De6vseTYM)zO~Nw#S?a@p9x6(NwCTs?gKeEbp*wKSi(dal0p zzf^9~5s^WOQT`s@J|@HiXJlJZ{C z*T|H*%?uCMu%w7!N17EI&>A;3JuN)cV6y?w{&}5Isna7&MJNymMM4pM;}$WG>FdD+ z(6AY3!&`gz$RG}P9YJ0wy^hlTtWgLBG{HA~0nZMMrzN$8Ffu=`w;@k+kVuR?qeadb zO7ND?<>8@q7A_Y5U~v>0ofPF-Uu+P%o4owRIFC4O0&5SdLvQhq%_hIF z7+*KBJ-99kDfjWSZ#PQ~A>k2WvNeA29dIRs#kY1Gm4~;NA2c8D{dv6;&B7gk5RXrC zxB_1B0OX=@wAe@elkiHEg`dUG8#nVTe1X>3@ZwM?c#I8zXe>85Xfq2f)E3`T>m3CW zlg0*Q3*nvEGLP6DC1wDP6zy*tH#^9~B9rsdlLVm8tVAirg_ULHH5L+!KU0<%6%1$p z{2FsnNzsmI?nY-#rn$bpp}M?^{C>T&%E5shUfs~tRAVm5jR{T-jxH>(s%xmJtgsMU z{E23*4D?ZlSJq>(X{apD&(6sQty)%GR*See3jrG8@0JXfTSR19Rc#%4sHy~cX^IP| zg11G5#T7NxC3xr$G|JlGonBB}SyuydZBt`SNl7W5Dk>-_EG(%uCnAISUnyQ(MSVkU zO;t^GO+!;dRe8C&j679{vVJZK(V_Q%!~rj{am%f#t*xr4tf{K3X{IM6MY)+Wzh8T@C_h=q;HmKBr7HGSS#S6x54OAo5 z^jTwdc}a0Wes+X^n7c}f#n^u<q7a@`hZzwP-&)pd2%byemnC_$yUinK*t1J&?J zBR;OOs4#!W_Lz{c@W=o!Prrm6CE&dNN?VUGB)Z4;yn=$V+WOksx(Y;8)>T!KcKly# zP8yn8TB=L)a&or&c=$&p#>B>iCG03J!Hn=%YKsGM*yz*qKrxrq)z{WQkxH?Dsj9K8 z`D-mUMlFrzyzK1UV7kmVGzQ_jSw+PqCE(-!LT%mx<2+j&k%QM3R@BwvGfN8#iz*Ng zx}oN?+UAzZysRBt1Jy1FM8)Q+fT-Mhi*MH1!Ga9nL>!-2Kr8slTnj}qV+a(LL(sD3 zlj`#F%F43BZJBX?e(H#%`1Gu;c|~QAr7Zq;3oxzqY(7G1cq~Eijv|a3Go;OHqvIz8 zsF5%JKUJkD4MTKWx}RI3UqnJ`+SctwHPz3|mfOF;)D1fw{V} zyrhr}umzIxth%PMv@kz6KX+SNT7nl027U?2ptZ~D>ubw$m`+%H*!Hybo2x3HwbY%VD($ji&k%}Mm}@$(Ka=mTP+!=jU;G7&dx+-$uCp>AtP zJ4L<2yh&NSS!cD0nUs@@G-vq*`31%1vcl}Ve3X!rp@zL?i?bMUS3Inc8y)y;34)cZ z9IV%anfu!Yk(bdmEF~i`IyomVCM7pFFE1w}l%z@iah>gEkjiV=INjn4L_C1qCDCWe~a8(BmG0Yqc7&*7yD?gJUbvi+gs+w z;lv)jKREqj{QiXqB;*iErA$tU8XgBe%h8D~)M{OPD=!WYO-xdg7hepI^gg@OH$FQ* z|LT>_Bvg8c`EXirqXQ4z?cCRvgh+F-i0woN3oV3Y4WX=J(H<)nb^F?a6_+u&R zt+9n?+K=3N+I_xq_bGVm87xF>IIzTIUkvY$M5Fcb^Qdf3B{?e`UwxV~p1X5u$60J4ytWAB;C>FMDxBz}S=61yf2 z5_lj2gyHBcLY5B7`uBEhWB|i17+WIjzl2heG$1u&tD6X3E;dW3$n1v`^&eBuj_I4cLO%Bi4fXR3 z@Cn|!^YWcpxcFCIzghogetCviG{#=cf)xNavOLwkO`~#VYm;*-x8~IqYxrnUW~gs) zSa6V!SM;7o^V6dXODnHmzj^b)2X8FjEX?&jI(@BcVr~K4#PaHgAHKM}v#cn{C!@GB zcSli5B)ZS3g{sU08X&`ubnui>v(?>vo-ZHa$NNXa1WHK3tuA zbo@X~T1H8JU_{Jz_qe)@t?8lBFrUXK)ZSbE@b&BEnZ?(yQS}c{`R`|MHRR@BoLO`I zFRxOo{|$EF)xMI*m}D=xRPSeqD=aU|^No&)^-114HuL&}Rrst|-@JKEyAU<;NNXtv>Aqp~L zeyS!;z+pJX9-LegUHM{pW$9spmM`E4;3_t_J$pg$oB3}*PK~~pT7HA?1&;I?xQ=C@ z5p%Occ}hN;r;j}{k2hPce7U^vqAgV`)p>ci=)C9V7c3XPpP!zX9Gjed{f2t;4$`zG zU>U3b1PpW~L$8+#75=p&gch+Rkj(P(=;2&-Xtb}7Ule#3QtPR~?uT8&)1;SQ6D9@P zy1M#$X;fD}^ zjZU&$`QKHbRMU^Q>O}~mbdM|So|!^-<7YreXiN8BRitJm2L~+yIe9tKKX~WbwYx*h zYvPbc{ZMs)R5K47{NUte3w*NnpSUniI)q?4%yfcgCi637~A-4+UhzoOT1p1s&#e7OsGjoFWPhR#DiCW!vNi^VJ}m|?b(;l zA3b!T>+$XT51+!!H}+!b4cMb~tJG`DH=iy)3dSO(3`tCFK?awH;~>KpSD-c@19DoK zynN-_rHl7rx*qNu?t?XNe0~+8KjPh}!MZn}zMd>|kt$4~F#+L;+mGGteM!X8@qZ;9 zf^l&D*1acBC#If{kHfS$I5ajzwBiT+2JME)<!caq- zf3r%ub@le0Cw(tKzkD?_H9iJ2{xG1uf00kC?_a;6y`f(J<;_f+kDH6TSAa%hjO)00 zuV-|4ip(*jg=nik-Mc?P3ixtner0BIWMFV)bQ%SaZvC0`z2)mqSI71xnv_blgvWP@ z*>>R$dUs?IqTfO@P>K8Zho`XueLc6lGX08}grCnZL7IjN;2~6CY4}E=Q6h!+pRbCJ z0p)$YyLW1>ecqsRe_FZsW)uNjK2f~hB1z!EmwZCwD`QgQ^%xpB(N#D zN9;Lu?$o2c3A_uvN*;MMjycJ4=Bv2{%rQt;IX*s(l>wc%{O6^``Ii$90y)l1o>pft z2AgYk-5(l%J~;*DK+!);lId(3)YA_bi}SOukn{BI9si#;1LvJWo7#1OVB&hvt*X!?${oT4NBB*pO$z}*&CR%U6lA7S{AK}^(~&`_AW$QnXWQG!EZrI?-SH+#By zM;BEUw4d%lGedlKjkJUK`*}JzHm#uD-$0hO@_q@6!BVj1kEa569?;lnP14!0KYU%sMS<-y~ z?l8};{WtmKxmm)h{t3;F?aV6VKl;T-=*Ibx`+d*)ZjVkcuPze??RVH)5Y~C>Q(1q<|bbGdPXL>Y!=Bn2{o8 z=9lK@R~IJ-?%zCl_&{4uQ2&vlvf|dd9XqPpo?#pfEq(OCNaOJoz&0F(D%iv1?$Pvc z2+f9Ofc*UMlbyRO&z?TsQd3!mgQK4+)kURp4f9kR;3pSDt}UoH=Wh*l*9N-qwJO+7wI&@ z`wtxObw|_y%*I-gSnc7W(W4Gxg-d+2Nu!B~a#M)IeI-1BL2uBwMkJbqFx{FAI#)H0 z6sE+avZ{lJ{r!Ah`8Nb=6OqiX6xlbxV||YE}t(_ z@}&|ftddNr+%2H~fTuPy$wMR*%N0T)Pk;n(hyj>W`iDdz&X_4h_z#N#n#m*=5crIX zy*Y;~Py^n;_L|S+@S<{c?0`g*m;~6%lnE6kSB+eZnbRdGJTf{qCdk9h zfD8^m#1M;wa}9!5I6@JR$#ntj2N;9NR_e8UnO|bCm(e7bnj(^8TqGjB$tS=oEIKwi z5`-T5R3ViKkzxSvr>y5}Sx`!mF;tF}yL6bpl{%S7Vhj!Og)>9#3o0^5@97s9;Op%j z850}q@8Mx`HMnSGQW2Acr4SZzzb)OF#}#`;s^MeCw@D>@y3Qj#BOoX!A}SyxF*!EU zFEBVLE=JMj=+>{7!qbH^UqpQJHg%}wWK{@?57&?#>Ftj_N1`?*@`HNR? zUVHpv`qk*OQ>EqkAVD*V%FGqCieH!HXN3iZ`nr4i`1rbOlzP1Z{sWv#ozbWcj-gE0XW7!>d%NVCd9b#RSbrI)9IVtPad3X_mWCPKoA@l?qVUb7dgS{ zz=rx8w(hxo>)|8n(ZwgX?_9ZX?COL5!NIO)QWaYWhzni|hOb-I$vu^YA@J&O*mOI4 zYe%L7310)5gCNj`Ea^OjE;li`Q zlXIY_gh>KgGmn;cB6JWF!8d`8VdAKOep~GoG{6!p|YiM|+iuk#loLGXW z>+qufqr0=QYT~lA~7YfM<4^8MrY7Pq@-o1A?r$h zb?)}iqkVn7wBA2<-@S3=@~x(hTX%Oy$yjjm+t@LkkxrD*dA3fZK+1OBMx}v`-`6iN zG%+L7+tAQIJktLFJItZM-rk-k4{zLl_~1!zfA6hbS=*gRI2Uo%p}p;$1t`JN`cpTf zr#D87S6D)1q<8uQ>}WI zzC;84-Q=!!cQ+u?*%Vc}=V(7l7@vHx{>A)Q-_2{+@7#aV4{88t`&f5rv_#}UmjuUV zM#gPVmM}@?8+U`r13<3M*L-29=icz>I8vFvKt_1W7Yl<|&NlDweAqwKKR7ZrG4<-{ z-omtGH+^_=MqF%CtU;lXDuv!&CgQ}Ar{3(Dd^OaMZQsQ6e~B+nTx;K6)X>>82##SC zySa%+XX+}pg@vcY8@+s^HU8URiOhY?+9)rfH*4uegEN{xP(1$ zU=#O0a(n;Z@rluHbE>yru#V4@8|3~;X{qrBA74LxaQVHy=dUKC!vhnE02vf3vwIXzgVb@kqRrl)rhki`IqAS9As0}bAj z_W$a|=w(l_z|;3U;gEzAD$V!GNL6I>wE8kz|>Q(RzNDb})!RYT9#HM=G za`c~L;}eq;qwPq-;pE=ZgD+S&_G@4m!`A~aA;Lg|eL^~*WuKx4(2@a2;!p43_{7-g zy3v0?cy#cp7tC}{@-tvSz)t)Y!ea+qv7jJh3|HsjZS={zN;C{g0pEJ>5I%2oJwzwQ zhX;FdgRsch`qexpq7sZdCNIY$ z<1k}>H9GXL!b{C!@!aAn`^VOgeF@+Ow=+Dh3HA3k8Px%pGQS{=^|bTYkz;4OiI%;X z9A7{FIZ|(r_Mh<)F}Q4zXY4)#g%MnYLc5KP4?igh4)N6}O+Z)rdLBQ%d-}-X6IT&T z0CDs;Nn3tsVtj0*_gs_=dkmJwKk;&34`>hkY!v?*8STmnjR-cmjSPXIxO45s(fu9A zZjG(UqX1Np+@Ucx)O&h|fe+N3rH?e%?|cB*3VMV|ftAit<{6Sxbo9clL2@w#HU5Xu;enCCQ)WM{=isA# z`#aB_ID7HfvGaoyNZCJuyC){c*Wo)~4-a-7&sEErlOK5RHQ(jvPIA?I}o@uX?*5+`D%5+UV>=`DhDS)(&bxGI11q2rhD-R?#eQNRn7F>(CF4N}0Dy+h-@kM3N*ap!IiUO-yl zXH2y40DL-e-yEnG3dLL|Q|24heiU7NX9S(|4W={9BjYDd-0lHK^i^N~=y*@pZ8YH% zXb1G0v>*n~uW^&i$nAs4DlQLMt(hVpUy$AhE?wzH{h?z-$B&8lU%GIA*d9y#*>AW|QxLH`gLLJyJc zwg)^UZG7F>e_`T$_VAP&wpGqjsa$DF-&%a~)`Q27x&{%EPX@}OC0JSo_yZlb#t3e?c$r1l~~kz1q}`HJ^+uSMEw2W2yKLh zNs^lUdK`gL&&hIx0g9#J_alQt=s+wXPY$;oIeqHXrK>%oV|~4-CSec9AW!xG1X^_% zMZ89@;hu~auxyal#Ug{jGByfD8OQ9_KY-ed^!E=EP_4hew;$vgh9N279SXqL4u3L= zkAV0~SU_H)373xb-2i200th|$v~bBe~UIiCn4T`7#;SP5iI8u zh}MHe2P^8}-P2cbQ^LI-ypj-U^FY^7As9wUf`$ z4UW8=nwp&+>wcJ}6mSfFAsSU+%Z(m1R0s730B58GJTy2sIr8Y{slyFb=KNUGjmFfB z)Pf!Haa)T!A0das=+vtR1x=v{XJrUPCIs*33eMa{n~^pc8y&oT9?27TH`V2D%S=Ol z5rZg9CK4$e z6SLD3B0bbnql}5P>jJS5g&16>kSjA`?Lg*XmAlXOs)~}> zoE>g@#N05rz8-oJhP1mL7{6G6lc$h`!6L7@N<(lKmAe)!wx5gKoyRd4csSY_BXfLx z-6VRwiv;mGJguKffJYec0RW6-5;jMykxAsJ16Lpm@C8oh?V}QKy!2dW zmRu$mE4>2MVE#oag;XKtu$ zX9s5&1flcg0yfwovrY`@~7<#vnD0&}=qeAafyM3%KjWh(yPp zMv06KpCw{C#4das46Lo4aQFaA&vdp0ScQa-wzkM+$V4O)o592(1F`!&5)RE28$Eq| zy}b-;K~8W`%XvtpL9?ENryTxL2Ra`?4)_|xwr2 zmr;$lE?CatJp|DUPV1l*m};ChoJ4A*E@d!47>fmnqcgyQE#Sz=Z z1r>02)oRoVXcbfp$py$Kd}oF55(d}BTLe4ENhE7T5=(ojCM?|O=H}(&>K+*E=Vfp+ zx%mh9g@*@(1enxHnF_`+u>i`!#HBz0qhSa^!dZmA0H3qt$ys(mC3QumO(#wuFF5W7 z3k~%0_f5d9S82(~alu|LDp<1s7|Idx#&t#!l--X|CTxc(+y4P645rV~wyk~Np^mdp zd%EskY)VN_02CUItG_a68NW_Ri10Kbhz4mb3>pc{Lvk*Mz<5YBh}a}pQ|uUs+W6E} z$rmu~g>=hxtl0eGlA`>~C?}FZ3OTVXEa)VE)VmGqKzV$=!6hmy6FIfAwoFxTjI!=Emds>?kTpkBb0<_QgiN9d1b6#M)%74T#Zh z77$kMXTE^4;3Ihu1<4<5v{?lO2}t+z&MF!R$v1hyxFf{c0g16TTPQ8Qqe&z(#zy~= z;v%Z(pN08}QNckmGE-8T#+Cxg^+(FW!lSIZwk)#}oC)D~wxvbJrloEzEGdXnFm3V3 z&(;}rjkL!1t!-4>XC&imR%}E{2F&RdCFRA1Db}dTZ!8g3z(+Optt~B0E%gQV>;EOQ(c(WG zlS_8)X{oLId*g)k(GhSH5u0sI0){fgpSe3X3Y6nj7lY)lrQ< zHP==|lgwKI*%j3d>l%Kj16373^0IwyX%}8m3A`E|nx9u#*#L?4b>BC(G*(p<2+3X8 zKT+(h)u`TgAki9|YkjOJ3*^{BL6uY`Rq;)6Q4YxJ`u4Ww`Z}tPR{woNOG{O0Nes!P z`11y?8ItcCn`lixHCAnRg5C95nm>QV7hNkLl27dZ+70ikSS(yn&r9vNCjYvwo7HUDH-?kuMX`wesjP`X{Nnve0 z>RJn|9bfaVfTWT8xVEyWU`Ik&q*^4_#x(5Pw+Bkr*3#V4Of?hXszNt%Me^sHY?`aBRVYvw=uyDk+*l>o?TG4oh{(|zHe!4tS;T5qVR2>Q8bMY z*vCfHsHwiDytV>GQWl?>GlXJ)PZtkgt=8MzvZt-BrKPp46_x&$JlB9LE?qXFKfYl3 zd*{~@^#Wd3Rb84$hwyK=>YQZmff^yhNgJAN-m?>es51odPh(?!U8x_*iT5iTrXaAa zwW+SUzPh5ix}q?^%ECg=Shv|VDMHEOc||3po15EqH8;0VEnk!NZo(*Qt1DpOlYd2R zuyZiv*3|l5^`Ygd0(Bypz`cBSv@*$t?G=C2qG1 z%gU_)gbK;l)~1$bmBur4I}o@(7v`rXhlPa2rdQR0sBFYIMQ7ok*7jlty!8`1xh^Ov zE)TzH!l$4!T68XvMDmluil(B>gz(7tgaQ;yS_$*rPD~L$?QBjZ84y<}o(3HmU)>C` zojW1gtk=f@;wvgHt#2;Kjf+W0*$NFc#Dglo+H#UN^e2ZQz-;w4DS&H`U2186*Rz_}RYa2A3YWg8- z4c5iV@ha3z>Pp-Xva>Wdk%?fRZ)Ru!4D<1&_yEq-ds!7 z{vC4(P6SYs+J@Gh%|vG~RH*9T*P1I^cH%~WqV29yH$Qieknn=K#-gH<0uaL0bq%#m zpf>05|FC8OplxVw-?OuQPse`D8_k$zEAdEuYx~Y7b8&GA*5aC)(h{6Jnkq_5i%P)G z*45QCqJR#I%VjnA&KktoG&Z*H>)5q_Kkof$Y1+B7p}Mvn+Sv}cwWMTi`KhZe!ANZe zXiTmp!D}lkOUlYhtLiZyB5K@R)qLQm{JOXxRw$5T9j5-L*(09 zP?fTZV)KqfA8Bz3azdMPOY?I|aF=cE-hKNHA85$W5TT!bW=9pEkv=t}ZW#RdZAC?E z&DLlyt^Fo|@fIJ)s1d-5Q25Q8?1QrsqvPv4_U_<{H48pY|)97X>-*=XFn>TE9PLOTE7UD~4lPnUq@MLUH3w5C*4W;dw%-mnMa)b*AGv?-Xyv*6=Wh>9ErO)!u=vx`-1C=j zrUq|JjE?}un7lXiYJ9lw+0d)`>G9$2XI&2uZ9n~D@+E4uh#JjQoVZbynUWe49FbD@ zYstUb}Ge?1TRPXOEs-KVKdjm2z^=p~s`IULXLk zFC-}|E;BVMFv7>+oshEY^y(|+_A&ET2CKn>1eBo z3=Rkkj*N(mN#B2?^VqI@V|aXINp5&ZR2Z<3$hfW9xcSq~HzFy&7U7>A9sBm5?YwaI z%z>s>OcC|fH9Ha_0z;^f4vXI*gLh2R(T+WB)so=QxQfc`uoypYH&0ic8u3QXe5t|c zolw-+x~J{H?&BBEo;`Q6F~2mmYIjrPj`%rB!8z>VpG) zbW#CQetNM=b($GM}2nopd$aJDuxJ2pNw14+a)wr0jfC#I$(W@8{1Y!|qN zM#hE;_zq&N4EO5b&`1*Y$yoMGbxQj7hO4_;aL3k(Bc%m9G9u#RVpCHZD>73O6L)M+ zO3dDomJo;td6@(m%N%?dEDlTxu;b(MJzOAXYsXfFyN5^F$?_U&%UiZ(<`zXKB_$>& znv2p>;Rc5PG%nQ7#|RSz<=A0yz{wWzS#%}WeJC4Tb|y4Q@XVc zhpqL~DHO>ew%Bf2B{J~Svk@FAR%%o-7B2Uc8>%w4 zc^h%XSaOOxR4LlqFY}&Fy%0T)QM}fhpHvnbzM=;jlF!&sb~)X^3Zb}&zD-0}}=C@!?X-dV!Ig@-x~Vk>_m6(S=)lEfuNh9tJ^ zD$er4q+#;+PHAbXER4d9Yht+*QZFDe;~QKZLDIF_36;1TL~C@{!Pp|uxWb+4n|u6N zZB{};h({o@aKu*C*UMgh|YPabmQ z;0<* z-E{B0_e%HP6WY?2QJ`#85ZQa93|WGph~n0xzoR00+=>&&0rhQ6%Eu0|GEfE8j1B z>Z&NV0}Eje;KNAN(+da;A~8uN{=M|uaPwezcxWs}rO+QDeL}u9D!g zNSr_+n%UUi*-}+glan0-17IX}5K%*e5giPa9#8s-?!^TgHryl>K=;#tyn1$7gEbh0R7gargCbH3+dG;X8oNqLa?|2%Y6x%rqJY9OW;ZfxK!1lqf1Bw8 zMhs@Q+qdt${>EExzW(y_kHrLP6aqd_N`aw~naMdx=|wH|CB>QcNG+c5U!{yFTo7E7 z8{-{M4<=hA5#D~~wKv{)^NrVEy>nxI7@XgPLU^jdVKO?x7MzuZ@i9sfdD_fu}UWa=v)GkvLHZ8B9n3_=I5vTtIN8w zB8+O-`1$|_Lj@wsnfV&-cV~E=zw|O7m~Xsx=g#e?x3-4sBx0ahu;_*+MMtGL9y_pa z*ArVN*DP(!3^Vw#s4S>KyE9*8V9QK73#n{#GG|a7$=tX-h+L z^5ZwLUA=kj%#%;--rAHECnl;g*l`dn*Z&CQdN`mV|3#icg}O2g$|JWmYIV3(t2S8e zNo92fb&W7#scvdreFh?`AR-V<`^z^koH)K?VWK%BT#2m{$U!Iv>i>V_{!b-xl}QCl z6g&Z{A885638`5%Eo=9kzI5#tFxAvoet!AJ#goUj&ky!z+Vmh>P`H0_Fo(D>Z;}rX z0|Y1(DU@=JEd`b@(NQ~#xqE$asx2_ssKom( zLbnYV9_(8%6L`311R4TmJc(Ru2+NGHMp$in!j#u1E#JFq=k}w|+&r{=ZC`m(s-qbB z7O1EJf`+66tnx@pkeTGRN1H_#AH)Y@Q)|sekF^4w33|O!l~z*-xj}nYxJE$MWSI

      <$&L>R*2+={K62FLk%1n6X(4-+fm#otiZx1HL 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 s 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

      yN?`x=jzFkv@(mt59KgV;st74#MX-uUe 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

      F=xAinU`25dHJ>iNZ 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 literal 0 HcmV?d00001 diff --git a/Icons/Places/place_hamlet.png b/Icons/Places/place_hamlet.png new file mode 100644 index 0000000000000000000000000000000000000000..f540b9fd0463ce710d2684d83382db33739605a7 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJ(ik&<|IDnvrBc%h#=PdAuECy0m zAk6q7Ws(R&yy|?LppTFt*Mh&n3I$hsu?<$`74w7hm_*Y$QcI#|c z$r&j}>VFiRdg8GQbrJ+JD= uoWHLphrf}z{;ts0s-`dh*5BoCY8n1N(*8erb8jBdEexKnelF{r5}E-0VrTgP literal 0 HcmV?d00001 diff --git a/Icons/Places/place_town.png b/Icons/Places/place_town.png new file mode 100644 index 0000000000000000000000000000000000000000..c717feed62f9703001b9159b2e1feabae19522cd GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VEX7WqAsj$Z!;#Vfk}U9uEC#B- z4#JF18nY{af|4b!5hcO-X(i=}MX3zs<>h*rdD+Fui3O>8`9|9(^^8^1!siA~Cc zJ8cj5tH(xjYm5_i*q=8ItmCNm;<_2?lqPeAWs|H2@6OOKYgE_Hw0-vD`Evf#l@bLN TCll@g?PKtC^>bP0l+XkK031!E literal 0 HcmV?d00001 diff --git a/Icons/Places/place_village.png b/Icons/Places/place_village.png new file mode 100644 index 0000000000000000000000000000000000000000..4cc46b95dc0d335ee9c0ed6a533d588668977978 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VEX7WqAsj$Z!;#Vfk}U9uEC#B- z4#JF18nY{af|4b!5hcO-X(i=}MX3zs<>h*rdD+Fui3O>8`9?*aSV}| zn*8VgfBWX8OL@Bu{?9klJ6Hd1&YS-g`~Ro>`t#QM^11Euk*oUT?LW0&JalN5tIvz? z7af+D|BCXue^YY7gIl)e=D+^V8C&zU@9M0`_~=#2H=fS5-^9cQ1c3+bb(EOuUF2+@ zK1h7@=+E=Mbqs7A2E2k`njxgN@xNAG8v3q literal 0 HcmV?d00001 diff --git a/Icons/QToolBarDialog/back.png b/Icons/QToolBarDialog/back.png new file mode 100644 index 0000000000000000000000000000000000000000..e58177f43cbd7e3f7d3886fe04278acb404c3f60 GIT binary patch literal 678 zcmV;X0$KfuP)J~2iFzHobR$W9+ed&iz#gEmW3Y&v zZ*1~MdipzQPYUyy_~Z-G`o@qna0>{{%>1pCHZ|9c3=DO#|4^B1;VbnCc=)W9ww8m4 z5Dx_AeopgXzy^VPz%mf{RiNioWwhsV2m3k#e&uEe!zFx$pqOEPVH#0TK(sQx&BWn* zqx`Q2i^!>#*2L)b+g-FLjck4v377E{R4Ncv5S+PyuQ8$#$gRtDp0Op+s|WHmRvNvJ7zd!z7-kcBSVc z_~L*!C{+>EtN7Fen^`C#i@?y-J4A)lg+B1=;Kz4Z%7e*Tj#t0Sg%}Y4<*J=$W`T(0 zfIE{D;0dX|{tEQ*qfOrK&&#Me!Yy0cg-^T%RZ`vE@$xZX5m<3Tf(V+A=3BoNF8s|n z{9Yjiya48^fXk86pr+z#@Tn<20mDERSTVEWKfT8e{7KYRtIBHHAITZSk@xgqT>t<8 M07*qoM6N<$f+VOsGXMYp literal 0 HcmV?d00001 diff --git a/Icons/QToolBarDialog/down.png b/Icons/QToolBarDialog/down.png new file mode 100644 index 0000000000000000000000000000000000000000..29d1d4439a139c662aecca94b6f43a465cfb9cc6 GIT binary patch literal 594 zcmV-Y0j z)Xz`TU>wKswOeUBH_Vo3LZ*V4p&U4v;LVFDq!ObUNJtQHC_UYOy}c$4_Z z287Mpy&>Gkk3$;%;XTGD)-SARcb^V+y#l_lys$a@k{nD+qgKLE+C6xLudGK{sd70w zcE71nDjtqr6rQslcH!s21HbzIZLG4Ku(F%O+U^xp_O4>4nBl-LJ{^?W2788E7ww3c$dW3qz>Ki(HSZqJlD~5#;x#SD}gQ7 zgv0(;bxhbL9Yezjn5K`uZiTiRwq2=|ckJ6DkxX7Tsy45p8>IMse%D zf;Vqf6vh<#P(J!fv{R}3IKcTOvuzkL=(>--JPth;j^KP+u2DCF7oBg1O2Gjh4cJAZUz`NyfQlF14XgvfeqKhRM8=g$nIpi07v2Pm$T0PG z+s5t5ev&IuzPy9iGfJ_*Szxjq-U_S#@di#sMFxj0Y^u zs2IrSA-xLzn@Xv~L10-`OD_1{xQ}!;h8VCMGZhEg7)ve(nH0=Nlth##z-1t-sznz( zI^knI8`}k}=1Q^8xg4a|;6+&Z7-tr^27CjyRJH7a$AX8**swS%Z2U-ZpmSmP5GMj$ z1y+C!prEQ%7kpz7mY14W%oynFgWlfyOj9X{G^0Np=uW$J^8**~h`aaUdlDkgAkhJB z2loJbfPHrEakyVc$6#mx5^=)7buY9XEP!Q$7GNCj4jnzl`B(FVY;?m5b-|rNMD_xg pfC->zKW))&VdLne22{OJfIn@@R^)Beh^qhq002ovPDHLkV1l$X9{d0R literal 0 HcmV?d00001 diff --git a/Icons/QToolBarDialog/minus.png b/Icons/QToolBarDialog/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f233d7399c4c07c6c66775f7806acac84b1870 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6P60k4u0Wb3;FYqWamwl0TmSYg zzPEV)f9L4=uDMg50*&A=3GxeOV9U{Bm1EIh)b!)dNY8G|=4l2>MR>Y6hE&9zJ@3ia zpuppBkxMsqLg3#2p{{ow4y^sCTR&@AtNcZ-!c0XiUIF(fS@*p4-Mvkxubuwr)McGB zHm7G5zmh%w<-tAQYwQ=f{_Q#i|$63?4Gdn(WDhGy5?S*zvKV>UH^L*-tUX z$Jv{I&ffC7bM{5Qj4e}Ezbj}vVjnSc;_|19_y1onFfAQuu24ykUoZnB3o9G9teS?7 zt9NpGMrLu#@0UVzfU@^IT^vIy;%X<}%xf{=arHKHYQL~@ZfotgwYUG*$MH^!I&%2V z@)sJL`rl4pesV%`$+ja*^=&3!b{Hmgs`72G$lh?~sgSmhV3T|L)#5pvnp5W$R3F&x zq^-&N)%9FO2FOm@bA*rKR&a{^p(h(SexKRzobg)f!S5Tb z0(ReeejodN_$Ob%pPGvI-{X5McZ=;}w|{;sE!Zmj;a8K;+WTSWrcUlO+qsq1zw`F> zL$~g{I69@}|MDjqpAy@zuKLv`b1gzCeQUnq?;S;@b8|k;l-+S#KOj|nW)fHH0-#SB NJYD@<);T3K0RYVY#HauO literal 0 HcmV?d00001 diff --git a/Icons/QToolBarDialog/qttoolbardialog.qrc b/Icons/QToolBarDialog/qttoolbardialog.qrc new file mode 100644 index 0000000..5d83eac --- /dev/null +++ b/Icons/QToolBarDialog/qttoolbardialog.qrc @@ -0,0 +1,10 @@ + + + up.png + down.png + forward.png + back.png + plus.png + minus.png + + diff --git a/Icons/QToolBarDialog/up.png b/Icons/QToolBarDialog/up.png new file mode 100644 index 0000000000000000000000000000000000000000..e4373122171599c88b78c884b927c6a8b4a90c6a GIT binary patch literal 692 zcmV;l0!#ggP)p2raNh0iv$(l~TMx4kdC6q9nEA|`**D{}k#dX8|6LB>7#;)I^Ped=4Hzs5}YJfl=IMqVOwV3TOn<`fg+FtutHTOl+p4ItW@S@UCRT$s#e2Vdg=lo5D}~>p3$197_jRp z=YhPc7Gm8z$3=Kf7AcnG)$Gyx5pjP)J5;=W_SftyqWmZ>V+N`!8lA3I}LdVVyM axbX+reAIe(fQ}9T0000`_rCk% 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 voq~H literal 0 HcmV?d00001 diff --git a/Icons/Tiles/100.png b/Icons/Tiles/100.png new file mode 100644 index 0000000000000000000000000000000000000000..f61033a40a5296f081e23ec875d43a55a79f154d GIT binary patch literal 10990 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 literal 0 HcmV?d00001 diff --git a/Icons/Tiles/101.png b/Icons/Tiles/101.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4115ad799263244ed376f5a65019cec52bf4ba GIT binary patch literal 5420 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 literal 0 HcmV?d00001 diff --git a/Icons/Tiles/111.png b/Icons/Tiles/111.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d7b53b8aa3797095c3ac991b53d33c540a04c4 GIT binary patch literal 4851 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 literal 0 HcmV?d00001 diff --git a/Icons/actions/GPS.png b/Icons/actions/GPS.png new file mode 100644 index 0000000000000000000000000000000000000000..434e936dfc974d7866c3c16e46c9cab87302aac2 GIT binary patch literal 695 zcmV;o0!aOdP)8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10yIfPK~y-6wUxVSDp3@M|2Yw-G77;Eov8-I3nG$6$Rk*3k-|za zv9YqS6AKIL)LJO$0}M76>N5!1s03m_P!KPPcSmKVaySQPyg<%hZPsReto853+GsYL z^gr|mS7?30dTF!SsQNe_ zkI8PglOPD^!TEfi0FcRKqS%{3M-DM*t|5N}Yus zW3dkNs=;nyWPr<;dDALhN?*(w~vnx3QtFjdj4-dGzy8{5!YBhX)eVqmC^?LbiFc_4<0PyLKA(?nZf?kIHd8X0q++p1)oPV;xf}%o z0n%!<^!WHl>2&&NS1`?HlWaDdYDbgF1m$uW?RFc(;Sl@%9vsJk=XtnXF1X$9%dPkg dUG?W(qaUJb-hE}Vx*7lg002ovPDHLkV1j&HFvD2&SRLmw(Ci=+sG{Lq)^ zLs3HYsUj*7Dh(1NADL-pTgdkEMQ-Zq=sL4IJCA0e1zRnaiazy&!@2jKbN}~p?%@Lb z=bx}@aVR=#nh{A+b)h&uX&}j4+B`nU*j%pH?0bCk;<38($E`^b6m@^UIYYITS=GX% zWGS2ssrBdmDi#QGde8FWOjF8TV{{ziCD@5O^{vcVDuFPPA@F*99CGUJPVtgt@Fi0i zHa)zvoY8JOCl&~bf^?YYr;v%UVNkfw?DoQJqQMdlt&|9-Iy+<>Meq5OX&i4k(a{cl zlaq5|fnW(N`ot@G35f9e>oyec+LE6=db|E1pa5Xt0=~>nWXKA>tL&M7Im|@-83{ffW?Gq;juy)7lk_I`22OJG3^uQkt4p zRGXJi**R|MS3xi$5CrF|%1ZTNWHpTl7DC%WGdhS|kOl~oCdZwbN$`Z-#((}_C$TMFEgMrP+U6Y5jIUSgOd_dAnc+lM2yf~4)K~i+MB=YHAH&2MJF<=NcW?H!%KE=nVuLlOYdfxX}1XYUps48ET z&CoYX2dM-Gcv&Y mG`3`0&5B@7@rCkc{81!l-F!jKd& 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 Tw&9T&00000NkvXXu0mjfaAqC9 literal 0 HcmV?d00001 diff --git a/Icons/actions/break_apart_roads.png b/Icons/actions/break_apart_roads.png new file mode 100644 index 0000000000000000000000000000000000000000..30dfaae506907f3470782666f76317d744d42cfd GIT binary patch literal 1289 zcmV+k1@`)hP)AW;d4 zKm1`a6eXBoP|>Ck2}Vh+#v%|(Nz~TTE`4lSy4}+4cHg_xo$<_ei^UWL6K`_n%(-{Y zcfWJbxn~$W#E@l~Bc;!oF@|BJfAeAf0Zc{8Nn#}7F&$^K3o5+=njo1X8GX{WXDl zapS;pVwT3T-C^*K)!E~ij!IxPGKre(2}C?S=sT82wuJJ-H)(G9bY!wYWfC^gCK;w} zaP;z>NW5CmX;5l2!^Qc7+LXT?i`KW%$9d>&vcq#?9b(=BFq{Nq@eo$->ws&U5@8p* z-!DetmhE9*@TqY373d3>wl1iy-@;t=jgJmYMjg}AOb$3kM!v~Fn^>^8?_iMeotIFw zUf1tSn$!B z@^Y^j5(_3XJK4qJ~ zU3S@`)!d7qt*s4jZQojS^TKI1la`?2LU7bINY*E6nwWu;@6jhCL{ghA_nZ$4c{&>s zJra;J-HaIA;52BCAKJI4G~cXmxOm|_u61?d4-#EEhRu84M#QW~iKu3aGu#fnvu+tV zM@hQpGLBMtNl+V8RJ%#2j2w8UAHyx{@&)7Oz0a(|T9^GE^Mvy;++9$Ju*!iO{vcXC zW2PTck3a97ik-M|#R0pZIm-AiKig2_+Coizv1l zTjv6=l~VE3q0S3SVz)wSzg>{)`z;XGOv3$I3E6dlShAkv zNu`c0G;t(8+}k*L<3~uT1XU0Vv)cvpn& GF+r}F(=B<&RpsKZuB+V=UnNVbfmG_ zzQbhFshWvP-&{(Ld9&=b_5uhM&xX~>?h_dJtmi*BA>}dt^SQ26;C8vSY&{I_)t}PT zArkAnZBrv8pm#o8+l=1&&8Ayie1_u<@6bm-&D-ejA4+2gKXRj=r}01Xujzjqvy8c1 zwv~`|IpK3GXSE{AO%-!Tk;v&}?p@KboEHBCcfA_CmDP-700000NkvXXu0mjf7OZhF literal 0 HcmV?d00001 diff --git a/Icons/actions/build_bridge.png b/Icons/actions/build_bridge.png new file mode 100644 index 0000000000000000000000000000000000000000..240435187e8cfc316197f216022fff699bcd2294 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fY)RhkE)4%caKYZ?lYt_f1s;*b z3=DDyL74GyW=JqlkiEpy*OmPq4>up9mGX=VkOBKVT^vI!PG6m3$alzq$92B9YKFhV zwYc_$=?SkV-l$?@TX$H>&mpm4!;+v0mnJM&7Ni^5H+g;j@iM0DDMsuozvL!wTJl=x z{LXXJ3O7bP?t8xa$GYc}1-8v#`t?U7=VSMg?eeX?xpDW+)L3V)t=udm@3-Bi|Ey}9 zyXK-gv$drg;=D9DuWp;86zb*KQFEl{-_qON(|=g6+PLp$HP;c_lEurWBn1j4Fy}OK w-H2S8FWQhbW?9;ba!ELWdL_~cP?peYja~^ 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 literal 0 HcmV?d00001 diff --git a/Icons/actions/document_import.png b/Icons/actions/document_import.png new file mode 100644 index 0000000000000000000000000000000000000000..4adf42381af7470a1618b55a015ea5c0f9f75a72 GIT binary patch literal 851 zcmV-Z1FZasP)O1tNi!j1BhTLHBw;%yD%R6iQvog^Q^D06U8xC=I5Czm-)Q2a|A3#sZL~a)Qgps zmA@^^x@p_?(6;Si6h);*qfvKVmzjE#plkuh(g{S}5RCugCQC^fAzxa1l8s;O=&}D{E_OG8_&iNfO!E z*bv|MB}o!Vl0?!pl{8Hy%QB;YyT;?TwYkZ{!UCS>(dl#u!;nU!VT|_F7n#o+Yg{Uo z==b~hzR$tI0nKI;+qR9+an@REiWiy@ytueXyWPg~JX)>RQNv8oG);-3h$xDPh z|L*`_jWr$&1`>v$L{TJh9G|MI)>^dI634OZ?(T~J-j^T<4fB&_J#73|h>kPQonts1exm>3G_HFd&(c@>m zUhqOhh7)T%DaxXyY09^61NQdz`VSvIc-rd)FGb{Vyl#p(i{m)_)rKNMx4YfBbLaMx zUN3lFgaRnTKkp*&7hwMi4txRHA`+imP$Gg-$_6~(Ja8`8d0?vGr}7LFUB>7 literal 0 HcmV?d00001 diff --git a/Icons/actions/document_new.png b/Icons/actions/document_new.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb4ce05812f6c109d7b3bc3fd10900b269a64fe GIT binary patch literal 873 zcmV-v1D5=WP)g!0D0`BB1}#^JwdP| z$k{z-`I?*M-ti$M*I)LrHPp%DQCo;e;9gq@Nlw9S0>OM2p43Ulq$?`{x#RQ7) zg#Qo9WO2*Q0B-tT=CNZv~B2(Y?SX0&*zn%C?Pb z0fHNY7<&!chBP7@pzRmL2LzH+cQx1w=^|9Skfdsj>nl)g<#9dsd2h5AyznOs+D`Cy zf+7&Hvm1VQf)xO~Jdom*?P@aDTM>)Kh_*$c3N!OCR{}+*2yec@+#=xT6HDB2-sAa& zh3Bg6iuo^UUHNjJp7%W@<`Yl?-w$~mDqFzv0Gr7$&k=E67`nQtAug$!+grBt_V8P7 z?!C#Ou0sU&Z)D599aug-)5-uLc1bCK)A;w|qHNswcDTg#>Bi&noD@Qg(15pQcehro zCU;X8*JX8S)5dl?EX$I!skknMrj3imBI$IRrKKgx<+39;3?m23f}3vphr+%|EH5t$ z`vzf}rl?dZPO8spHzGY*#20P^)O{}RjkxQ}tM2>WF@|8I_c;iAm{(iLSj@=?R_F8PY;KhsaQh$H!bUglU zj3(%;5qqcP^TzC@OP7zYCSCu39;Ag3Db~PW-k42K!5=_z00000NkvXXu0mjfKDd*j literal 0 HcmV?d00001 diff --git a/Icons/actions/document_open.png b/Icons/actions/document_open.png new file mode 100644 index 0000000000000000000000000000000000000000..bc8cface23b2518e84b2c35c91eafb39d6d24ac1 GIT binary patch literal 796 zcmV+%1LOROP)HkZUi(4Z(m6oTkhTqH<*02d!r|nwq)|pbma8^ZxCR zPC7Ate+Hy9e9x0_*zRn@@EtZ+d4lZ`mLaO>I_Zd^GDt=U0c+Pal;u8zfLZ$5l- z@A1M~4a~cLC^A%9;C`>VSU*(FrW2rb4X?C^s|DYwt}ebm6r zK00xRxM!fM&@x>K>kHqJeL7&&Tfv$-vKS`@038Lbw4hX+8nD*=5^HSrGIW!?vatpo zklY2*%0nr-`e@ErYYG2Q0<+qcd}nfebGYdbSpX(a(G2}sB2ZrdEDCkv1WIYFZl>$A zbDvM>(D$;}%c(sz62TaQJOf5r>Nl8}+3fv4e@?5}d z(2%iGG$?KnAkX*n$~IS}fHl@Oz>P5I>UI?TB;a%-0J01)3;`E!#h_lKseu>ya7vN{ z+dYFQWC#~TMz^A1MYo&5G682I&mg57maUw=cdPnWk5mzSpX7iHvB?nm%H`e#%MuSY z!>^K1Ovb%U?C@NO+s{%7@-G|fsWbTG5WW{S_=|ybp`69B4(G^s-|b&XzH!J&^(4b&&0*a-&WTC^8HoNnh;QTUN6o+ zdpbUS*F@1UyYi1CS4}%g%=cF>pOc#iaH7#_UD|s%bc`Eky4&0Dg!!QadjQ%vzN~ml anAtCJ<@r?F)p@A^0000Y`4lOaURj7FVz+6kvc%j>7{d$;Qr6@=6o7M3 zX`ZD8my;4$2a~Dvdn*XIc~@ZKFe8hZYL0c*f@VoP%LqJ+(l*qFS9lznloM<_ZC9xv z4r6~tZ>}`fxU%IgX1Ux&FMG=ziE@`C;dMEd>%6Sz){QaKw%fTYUV!(=^HF>2cDS7< zT_>MC)&08a+gne^Q!BEl3o6S3?5n8e)5%pd^y#4cyZzsfOB|^zg(yNoU_k`lGTzt% z_Py*|x^VWw!!nj}PR-%WY6d|VP|NXFXg+iZyxt19Bg7#(Jqf>$#$dd20ve14yfhgH z^_T`;#fN5>{kwpV#5L3IYC88XFdD?`KI|L&mBjES@;q2ot9c^!Kzg)U2vd}#=G87h) z0%k}zG8U1^0MbZxBxJt_NE2-Ul%4S4AF|gr?!!s+ZwCT_%SFNXCu}IRa$-0%oHS$u z+tJbniCCk6kx1KT?t%F%kIlPQRy(X5A>e@r;OUYBg1^MeB;RL7Cq_eUPqr}xjF5tW z%2Au;W}FOmIGjc%nLUrM;zhU$@31UeW}4=DC=~jzpm+sM{vx{A(AXG!q_!SyNE;Ad z41-CV;H~syAuU|OADQnL_!KK%LFC`yEAtC;pC{LoKx;IZf(agG4+xp`P%-F^BfaHX zgI6Q*-@=-xVb0>P49Yaf=9!(`woS#qMyJt3oR^<6X$y2qZN;D9cuCuQD*hLE)9@Us z1_KZ&?CQ35{{h>h?IhxfxV-GW>w(pkPn{0;#zfAqN`7yzVt&>C0UapmKF=v(i2wiq M07*qoM6N<$g27}BU{-@f_J zn*sR01>4PDhLaG(+rTO3`9E3Cvfqs5IotQZZgz-WfeZTcJ>dG8`d01f+Kiw05a<9x z3?X7sCLY0^_8+jJHb4{waLIvl0p_6$L@J;NCFoX_Z@;@$HaxilUj23T6V+3fj=yl6 z#hn-e6@a50umc;M*nt28`k)Vxq*#-?Cbiy=mYjqW&+>i__wgIbYtnd>$xZk5(HIY zmM%&HSeafJr#S~m6QqNgCMFM}8+Y$vD}HGZwFit8n(Mjc8_V}KXq01Atx=IGF7m9} zN)9JzsanFci@k6ws^cOCL%X8zT4AMJDA!U<0R@)Gj_Pb}7FtOQY;8k_cc8%tb%;HM|9g(pdLY?1yJ3ZX3j(BJf2Oy9%M<_7kCvf zQ9mE6PF7D%9i5`uWdiKn1IxE|tF3tBsQ&WrqLaKb3^5dp)X_;Rd3EiVwarLHC}OfBq!P`RyVRQ9f=*pj zk?q&<0)~$b?!$k;rt;L>&EIZ@EMjQD+SR~4j#fIRgYDog{0x5|_5Mh3?)NRnao%75 za~)(PA#J5lvMNlu>Qnq8xdM+9becyBUgsB|{qQ-gyfKb&ihcL5bMs(>;8DTME&nE8 z6_%(bmH5R`zV_!b2LEa7;LQzSZdr4G6?2)qJTR8?Ju&CcoIO7ugFH8*%E$O`LRh!x Tko~Vq00000NkvXXu0mjf8~V^m literal 0 HcmV?d00001 diff --git a/Icons/actions/edit-cut.png b/Icons/actions/edit-cut.png new file mode 100644 index 0000000000000000000000000000000000000000..7017d1b3c05602eae02c4e24ee0dd623a4a988b9 GIT binary patch literal 1177 zcmV;K1ZMk*P)@nd7muDXRbu{1HZCDn+AB-+xJK7@d@6iHtMr8cef zK?O^Tg+P)9v=kwvArB!GKZ3D_k`_~mX^OQEH6J?YG_mrPO`;?5S&M!A__1!#7@klXwfCgN@p>Z!ezjNCo|-yQ{~& z%gwU3XX8-SVeHJ?xi2l4bMDT~aRC6T4jl%7_7oNr#pCgJ%gZVtgn*`Lh(sd=X~FS$ zd}`?WHOp?dLtzT?^73t0zPmiKJ|{CXbMRn!1vnR=l;YOt&j^J=t!cpkjx9Z1BDx-f zloBQT_9Gk)9a&dxr4XXj<1U1h5>FPNARaeX+gjSY(t_Js+8+bBG&nRMolYmDlz4gn ztLW?Rc?19%85utuJyHYCIT&LYy*+|hELxiC9g-_XTT6SruIqt^f8Cda5ai~%5DEo% zU%YgoYx}mWt(xk9loAtn|A4Bhy@_Hr2Pf3{+xQsSvgH}%V0k4nGc!LaC@g}M5|k3m z&CePqo0{L-XdF|5+gjRtEz27H<<4!(X0t(26sW2O!8r&a_-Xh@ghHX}baPJA#6I|E z`fmv$A*Dp|?iUe>gfTrc4Q8`FNVk;$VB08gb9f|BU31j&-_%rPaY-pm(}ZCd@IQQj z6OBzfu!+)DjN;EajQGq9CjXp3ad9z;g+f@GdW1o{y<;;lN&ayK@NUzz4oXOEoO5mO z-j|5q;lRJ+zoVe+HRQx%n4G*XRmOBn%Km_^e^Cd_qy-P!?Tw1f_IXiOR=%bvQ0TLU z#%E_`B3G6b77_q3EepD7;_=Fg&lKXzV}@})r4<7nca4y;b&t!HzZ#4ACw;yZe>954 za2SRVXISm=3x*J97QnAFUVkKl#c;UK z5Te_mC|C#vVF7oK_w+Xam{N!+rip1QlMd7tv^aYOrZOuQ7&*Velm( zhE&EHoOU}XA@e7I>j1Pm;Co8Qywh%n%2>ma5JM5e;2L9)hVjCBYuVZb#N?i!u4AjF zp@gv;p6qN)EG#U|a^45P4L}0GEa$!O`RZQrcy`P!FW*oY<3U{q<-!d>17HFWG;s^H zGj@3{5I}~aFo&w*p3jG6DS!Ql^L_x?iObk1Yj}N13*pe z1|jPfg-sqWe63=VG)_f&`LnWx)TYzECBc)r|Z?9gzmJw00000NkvXXu0mjfHJ>47 literal 0 HcmV?d00001 diff --git a/Icons/actions/edit_copy.png b/Icons/actions/edit_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..03ec4274791f19deca7f6fcb4f7144d1a51df292 GIT binary patch literal 644 zcmV-~0(e-{~)n#E%hKN3d;MvC# zPkT^&1Q(Wt92QMBfkg-!COR`_$oy%mn%dMbm65Qp1;y8suKIOz=% z+wJyOtZ&yD#)I?>KcIZ#Q8fiM{>J=?j6yL8{6C__Hw?%QW(RYNlGod!l-@yxNwZwA ernF{FShF`2MfV|biBFXP0000L=v9o4b?^;GER~pS|em>1TbLPs-IFG2E z3$+M-D77}F(IY8b6fl&+O=+|(wes`Iq}Y~PKjE!G8%TiYf!Syt^s&^hL2M8J#|^lC z-|YKeH~s~?b!dBl2Z0Cimei|)Zb>~K;(EFl584yhospseLk|)U@Y5F5A>NU?Md*&y ztwZenf#S{%XQTjlD)lE2lctu%STML}b_DQ5>KMEMmZlI$1kv4`bSm2IS(<*FKM0Hs zZnzZpO4gz~W(RrB3>e_K)UCnm44`!S)Gap)*{t3+J1jCv!2mC$jtVIkVr($DJiQ;FShb|YsuC&zdKQD>gr-b;NdKFDR4@&~EItXmR;=t|iK`6z`3ukuhi zpRN>A{Umj5R;mP8yJWTxxmw}Dh7WSD`tm2L|JWd^(F9OBil0tUxalZ zjP1|W2N5-j9L>Y6H4v9-br{$agN zC;tvqomPwcbO_M*ci5jH5O({H?Lml<3lSZoiMgD)GP4&pbWn)J>l5{zef>RXYG#5t zf8iW57z_@G=aUnqrlh8HU%hHWFdQX!#*QorBt?(XiUIF6$MA4Jm<%H?v=uBN_NJzMD$+0-4QfWP*8Tf7OPutMIU_ZP6z<#7wt8YPksTe#$ zu@zdKwxz0O4+8rH2R0NJk!!61O~(%OmVmcyebG8(vY0x-Uq|Q%jQU1B=$V*@<*=K4 z(b$}wZFH8Em+_d2vlLaxqu`{)0uI!o_(hUmT^2eiIZ1qiWS~}SZeFhUxxE90LP5T& zdJnT?si6aAtR-tqW)m%w$>#KKL&OmH-MD!jxrUu=PhS_;*WZhP&;8`G{ENgD6coIDKQe>@AsC8klk*_MX!aMpOQT9qG5T}^(qWx#`28ESy@^5ChCOLZ=Xt%#9YM>h!RvG yDE1?X1zIJ8jfQsw_ZR>7`2-CJV{E;GWxfD*w@gy~aFSU70000Ul-pn>&~?PV3@~` z-}}sWzVG+mBN0JdtgNh@&t|jVnHkIstu>e#04{WOb^VB)6bVWK4-E~?JC1XOh%zQ8 zB7a@ieOoLRubvn@Ha2$Oah#DB7PSwzs#z z%n*_AEh1=cZbmwt4r`TCSt6o{WfFpY--l8vEVgYM!^6WMA{e_2*gPi3%orUVeL+O< zecvLYdm&hBjUWg@u;+Q`@9#&YQUMXc2r}b{Kod8J2)1nlz=IGR1OY6|LbSaAfJHz6 z)DblDyLIqrhb4l8AOHZUh(aQQQmO_Pqr4t$+jgB|A_6HDejpAO1E&xi-CZ@{1ZX38 zLy!LlO|s#{R)m(s02AO+1CF+vS-d1rGLbUF~QHUj&ekG8fpEH5wN&d7+r_-U~itqH;9 za{0E_`m*s*L@Z{$YgtxkuCc;SHKC<7kIjvBe{gW{`IWRDA=f8pL z>+9aGF_>usVFNeLuhDdpve7!ISmG0Sy@4NcsPcJ zhOn`*0jd^EOiXxbSzKJi!omW2dU}F^D_$yOcde9H6$g7F=*+qN}S5d3kwgZf+K!H8nM$ z2JxdJ;N?kG&xow7EVQ(=z^K;Gr!(onP zn10MdubkI8XVl)_4x7z}($Z4w@9+CZ>>DjB%?=b56$w7ARx6wl8PK^7VE8@_gT^hY zB{?}6ot>Qmyr7@}_6zX8M$E!xRbF0>j*bpYewfDT^}A3UcHql2i%`t(}gM+A0Nly;Gm0U#e<-o$115%OG870Xj{H0 z8uqw(yB>$uAxwRoV}~x9hWYe;_!2OUO{dXlyduYAAYhip#zrv-Efx!UdwVG}Jsv(R z#?H8-7;a!Nl-4ii!>IjN>Byu~T&^hr}Qj!&HYmk}&dK+n~nmw@Rn@RF97 z>W^)0Z6owUjmpf-+*I$MFYLebs(MwnY#CC;00000NkvXXu0mjf DKYigU literal 0 HcmV?d00001 diff --git a/Icons/actions/edit_rotate.png b/Icons/actions/edit_rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab261eac118c9c889c8f065011eb18ee91c7e65 GIT binary patch literal 869 zcmV-r1DgDaP)lv3(Bpfy)_4}HasH*6s*PuRjAv_&dEbiJvywGYLUy90K`Y{V zh26bFdox9i0h+(PD8|^d@7a^av#D$M+hzbXY(2Y3Lb<81J|=(eq*ALdUT+*L*orv1 z2X^b9x6|i*KV0kk;omtvbEDKyU$FI&W5#>;vi=yaZQRBufnT2~c zb|(w%)o<=z>?E}hm>Z*C`KiP(v2gU%Ssu93{c3GqGD + + + + + + + begin='' id='W5M0MpCehiHzreSzNTczkc9d' + + + + + + +2004-02-03T21:29:12Z + +2004-04-17T21:28:35Z + +Adobe Illustrator 10.0 + +2004-02-04T00:12:54+01:00 + + + + +JPEG + +256 + +256 + +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXzN59/Pfz7pH5iaja6fcRR6Zply9smntFGySLGeLGRyPUqxFfh +YU7ZrMuqmJmuQdHn12SOQgcg9c/Lj84/LHnWFLdGFhrYH73TJmFWoKloX2Ei/wDDDuMzMOojP3ux +0+sjl8pdzPcvct2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K +uxV2KuxV2KviH80//Jj+ZP8Ato3H/Jw5pc31n3vL6r+9l72MQzzQTJNBI0U0TB45UJVlZTUMrDcE +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 + + + + + + +uuid:67a1db2b-6f0d-4b65-99fa-82dd25da8f67 + + + +image/svg+xml + + + + end='w' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Icons/actions/emblem-important.png b/Icons/actions/emblem-important.png new file mode 100644 index 0000000000000000000000000000000000000000..81e9ed29a560c6e478283f003da23194a31a443b GIT binary patch literal 717 zcmV;;0y6!HP)v(sQ968-{g5V4d9iG&ql zB_XjB39*n!l!ZhkMCnD-nwd_`OsDhR&TB!d)krKnt9SFeSKHT?_Q?{SkqPz%HJWA2Gu!d&yZ+uU4F9=A1xavUU#@oV#xN2bEr z(Wyyg?V-NAyj^DSY|t5OGx~O6_hyyOWs#W>LirtI6spysTCLgf7jNg4(7#}!uO1-L zo^o#$c5hN?w*{FFAQa5r^CVBb#0;E)NRUcIHj&ZYyS5k$cNV<$&h@EBx$X`(?PZZ_ z#7gwyB=eSB)^oFk)xB?ya2!A7(iP; zXmwjs5XrJsseXlE4qN#GehuuefEbeLR8oZP07l~2QChPoml&x{5Py3Q#)a?W*y1oK zh05enEnR5sI!e(7V9+YE&AL%R6PYU^jWUQuh93|OKUmUTkoq)IpC(9dssq8#u8va- z$|Y>&BQjS6u|GGr?;`2Tf*Cls{7sD^4C4?O0?A~Igu0`he<8>h{OWkA0^DEx zNJE2abi=j{>obkAl4|Ym>b4HbtGtQQ>ye4RyX;zAvKBcw_UcQcn(7Snnl3PAW$m@S zVbORK#i0=wIJx2$uJ2)>FVFS%p4B~>F3-uNOu}f?TtG97tUohWDm5l6^`znGid$I9 zjlEpz_1N#ZY&4pd$Woj2`S59$C#RosmjBHUh1~=Bl!W4-00000NkvXXu0mjf8+l9k literal 0 HcmV?d00001 diff --git a/Icons/actions/emblem-unreadable.png b/Icons/actions/emblem-unreadable.png new file mode 100644 index 0000000000000000000000000000000000000000..5c08b05c1633412afc03186ca694b6d69dcb7775 GIT binary patch literal 669 zcmV;O0%HA%P)U%q$mJqaU$}#xw-jCXJ=YtC9b z($mwEy}Y=HTUY?qGn=R?p-|w`;9%4I{CvNQF}CJ%IWEl3B3oPM(r=fS@k2u-Nm4Ta z#u&u=qm14>w6&qCDRMcquMaYrln()83;+f|L{L>?jKuD4n3;z6@6f9SwB;g9zd|OT zq4$P~ArND1G;nnVF-9~5*xANZDv-@$CZ3`{w~_Ytbnxmb8UiA6Qh_ms5JHL{WvUM! z!TvrpWg5kP<~9D)=SJQs3o%CGA?d%bp*uTAI|%{5v_uFYwQ#6HM2F)!CEq}rjUI8-wITf5F^r?$8>c8P??zI_uXN1Zx1pV?Dc`h66?3(PFeW!74ve6 zxUoUy!$$yq-MUR?@FoXybE*7e$L8ubV~i=hXYct7G{(jXs-+UuQYrOq3`VuV84)?C zR;wff1E_Ook~H4v9MM{$b0@f@zaLe_d+(fxye*YV_Y0$=u4Q~2Yc0l@22LE=A-wmj ztgHa6Iq&`0=H}*=_4V}|B66hdj8Ii;t^HQ3)gJr>V|Xjma{x>=00000NkvXXu0mjf D01PV_ literal 0 HcmV?d00001 diff --git a/Icons/actions/find.png b/Icons/actions/find.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea9b35c8fd92a290dfbc5c276894f534e92af28 GIT binary patch literal 1030 zcmV+h1o``kP)6KE=l3)@6CeJQCiE?hO5=tfsA7HoG&>!zkl-Oe-5FP;z0!SK&bzN|2=RZ5a>A9)3f>bfddzI z8f#>+7?uul=0u|G1xU97lg#Sh%lvV?%>M2q7nqpP+6} zh0xvIo!{Q)wu|)l_P#wkGxPlJ$|_RnsRYZiWS`f2q0HsFEX%nwHk;inisC!hrl&eR z6&|AL8e~Z(v!T%4LM|6LefI1t0O()9Bf}#fSgpdzR5FDdH*bPB@n9GNj^$n=V7fSt z+g(&-gQ_Wh-o#h%ya@%Vfbp-#QCm~%a+H?7JTg48tK(?LsXxDB;>(FgL*IpN{2Ga1 zetsT`qCl2q2!a4jH&9diFrGT{1Z;wUudYtu)~yAwgdmsCqolY9AOzJ_)o5sJ#QvuJ zZS7CD2N?j6@|i2*o;@&h9ik}0YPDi@Z4HtvfnyoOqEWgLiLOer9E-uiuL@mkXsOC0GhCUKt-9Gm+j8KkB@6seicIYM`ag4c1nS@MZ=>W78;iyWw;? zk%+~O>6s7<00&$Ay2I&Ul!Ahl+bcMB*oT@jJ1mNX>np!tIc=cp+2>wmJ{=nB6WIh> z*)=#)VR+OC4tq>!uP=wHYVbAtz;LX*&7j#sZHJ(!3L0Hj_+125dKAU!+whZBG@D}> z{ABPACYgwr>@{Uz<_uV<3O1WWW_b=?Qw;g6jLFH#pjObI{DW(#^vLMwXi%1A`Usas zVtEd!@B(Oh6Ff`cwW-kM6wm1fRn`@gS#$soIqhI{6?PkgA2tYhi&gn%>f5&M{tR6Y z%>Za?@%iE#D(iTRsPMQQu$g(}GYQPaDN=cjGJe1R^|5t|*@%jCGKE4Rhv1zQrqTku zO-(y)p4aO=x1`z;+)yE9BuG*k-$x4={7FTt|6qVnO40Mei^mt27B4E1I}VeUMN!?p zO>mZzpI!d^i=Ds#&~@yYR#nr6kX*0gv^+6(mCK&G`ZwQw|Gl^Vw$lGp{P)f#2LOZ+ z7JvnSuvN*HD7ohi{C;F80Ank$RVe@oKo)@d8;~D>98ee45&!@I07*qoM6N<$f-+0r Ai2wiq literal 0 HcmV?d00001 diff --git a/Icons/actions/goto.png b/Icons/actions/goto.png new file mode 100644 index 0000000000000000000000000000000000000000..a3767a4536f407d6334ac9b6214ef4d4d68250b9 GIT binary patch literal 591 zcmV-V0oU=tEBJ^I!?;@lSA|Pf6e+Mv+!!R7l z4K_vu2A>S%H4UDSd;ss?0}uf4#I?xAcSS_z=P%z5f?%>ASd#13YPAkmDixP5s?}Dm zSks|1wbwW zltlRJpq@7>@BPI^Q+Alm--fy%Sxf+Ru zt*tlD(z#q)kw^c*p-)RhOz#8IGkf+VecwKk5Rnl81pq|=qdgY^i~%SmTmZ1wb2ssh d0PH8;@ekv;cR0$j0?PmZ002ovPDHLkV1gLX1JVEh literal 0 HcmV?d00001 diff --git a/Icons/actions/join_areas.png b/Icons/actions/join_areas.png new file mode 100644 index 0000000000000000000000000000000000000000..b59b9b4305de6ed9e39b8a163aa1d4005fe94de0 GIT binary patch literal 3649 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 TbtN~@00000NkvXXu0mjfb9VF4 literal 0 HcmV?d00001 diff --git a/Icons/actions/join_roads.png b/Icons/actions/join_roads.png new file mode 100644 index 0000000000000000000000000000000000000000..78dbae33f4ee8a46503cce827daf93dee1024b4a GIT binary patch literal 917 zcmV;G18V$G8D~~rqUe^PP=Cy2C6AVkky2G%JDYemxx<)5aPu~kP^EMNm z%#K9olakT*Q)keLI5{fL3!6vp5+{(Z^D&O$d2<4M!T6B|v8sbObgWV$%0HGMd!G}| zI0ZZod>pXA&5TS)6pNw$Kn8TE7J}VD)}c_+02_k6HgIBnz{7L=0M{EKESiq&6T50v zUtq*)g@%3=96uzoyPd@;7JM~s3GB6j9-<2df#Mpk77Bljb7$aS`%9puOK`1dH-I3< z47-kg#(ws{UfyO#S`7@JYM}pe4nof8-*$S33%^)lxDo_uHP1k_x5~FGI9mbZAT5U9 zhTQfEO4oUKd3LTq%}Rla%z=DS4C@R1FC$+b{&@P@hQ?6qH!U(P*%tAd$k%Vv8n2VR zLBQoS#EJy&xkhgwol&%Hum|3w3=0_#Vax#9udpybSLGKlv2a09lYCJRlDR3ER`0*ny){gM(!+_yvs1u_%jIKC<)pz;)PQ^2bm<&N|T_83Rqz%^**4 zkL}t)@>Av)FzN4|ds2Iy0UY2nR?tsqi&tB3TVP_r0^wafKN9Y}>W0QEmjZ`}hs(Ch zT(k1BQY(1=fyzruEPlzDm_|F+w>s|X?tbkqlV?sg;KIt;L3@cD-ht$au|lx;9v>Eq roMtv6sZ=U5nM{Q&%P!&heJuSSZ&+SRLsPN700000NkvXXu0mjf4l1I5 literal 0 HcmV?d00001 diff --git a/Icons/actions/list-add.png b/Icons/actions/list-add.png new file mode 100644 index 0000000000000000000000000000000000000000..306d3d89291bc35b7515b84a7eb1ff06b1f5329a GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fY)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHisK6gRuhm*3iZ7#JA&JzX3_EKa|jYUs`EDAKau+CLy? zi@+M4HE-T~2{!%fF%eU2Rrtr`$+ht#Kg;butkJqUIYqsDTetSMc0GD4&0VZ$$iDj^ zcSK4;qIlYK+p@Op8xHIdY@M(vte#=X;bglVS!w&M3lo?#x8GfGInN+$f!M>DAMIOA znaw{+m};&Pd|uwG={#9$v7SHQPorKX;p2w+@~lEJGV%d4COG`+yc+pl?Q0p&hhHx% zs_NXCj1!sC4@ru!o$EZ*BKam~ZJRCYgz~EG!LoDAzMqtj-?6)X#if&b4~0HFA64r* zdCrP$A#2v_CeL!e)0TEsbx%m%HuLZsx9@VyGwpQ0G4+|u-1z09ZZGvO>q9>CFZQ5?)tP;KpJ*&bQ%kKV6pXhPsZ)QwBze<6)o`Lu?1IrnmCtIy` q#6K4lsK|Z0yY!dH&rr{xgWTashPVA$C(8gG#o+1c=d#Wzp$Pz5QChkH literal 0 HcmV?d00001 diff --git a/Icons/actions/offline.png b/Icons/actions/offline.png new file mode 100644 index 0000000000000000000000000000000000000000..bf64829ce76b42737024f0b02eecfad94d604858 GIT binary patch literal 807 zcmV+?1K9kDP)5me%)LzfUD2(d*lPb>#~8S zxqC?H(1Rbp$9uo`xxC+d3=v^BhGSRM|M0&Fw>EKAk2-1|-)XI={%de+6IXRAxIS{_ z#E;9)g9rBSSWHCug6Z$?XIoBIR`s=)e2w>3>OGz8xqRn#+~j%QGcz-z7>2Pv^yHTC zrT4hr)9%`YUOOMS_#j*wEEwi_-ZM2drP{Vlk|fc0U8awb?x!1TI$92Q8zXi0+wQYn z1;ISednP9*RZY{#FbuM7n-Ylxsj5n2V`JBe2sbWx?yU|Tu|K`6dEH!%J$d0sBywnC zVnWq4jaF7xC>D!RI-MrVvPcjFl4Y4*^>w{ledD%1Kl5#iZh;2}2P>k{sIs)QM3N+t zuIrS^WN3PNnsi+!(=;g_k5ej@qUi9|X!RdZBHG+;#l^+jZ(;3hHB3RqrMe2}@BFcsw3hmIXyoU|AM8j>F>OB2-m{ z%jH5cnf$O*8#BNE$HT+Jmspm4;rIKQ^73*>k_3mt0hVO}0H$eTc6N5Op`jtP6TIc+ z1%ts#0EQ@vNG6l;`FzM`v(PjRnM?+PAml~2g;S|iv)k=1v2FXCD2lYOumF~2K}49F zn;UIxY|M*pg8hC!7Y>JSj*pL%EX$ofpYQ1M^70u`6ir!{F+V>)8VZF9LII%Y*Tm^` z7BLJH^Lo7x>+9>Y08m?7`+i_xz%R@4>9)4E=Y^s`?(!IhDFUz;KuIoKxx6oz_W)o3 lWC2(Jj9jd4h_wxC)=!K~y-6g;dXLR96)K?yvV=Mi}QM%+!#^ly){1rp7KTle-oBWPFI*tMH3OsK9Vm`VdpAW&? zyLN3601_rWJw1I&DH?_$IOot>gAfAW_d9|BfRqxZX(siIq6kqG(NrpxeQPOh-@d(k z;lhRUj4>F7f&Kk`L{S9OG&`7jo(D=PGMNmNQt&(vOG`_?jg5_+PqaCj9%JmiD2kwz zg5x+aO%s-7b)*geLI^0Ou(!7d%d&8IcnBdx_9zz7T4Qo@l1M2BM@L8h85$bm0C0GC z2-7rSnkMS?x@tC?bpXg@GP!IvOO;Xx!w>-Ac^;b0W>~FOKMaCkdvO5QvXaSUsONbIf*{rijYdO7 zQ4~IT@?@U+zJIE>x7W07n?_LtDP^Lx)*8>AJ*&l_08lEGR(E!GcET{k!NCEflrRhf zgb>)aO>NsYUDy3MN$It+kWzvW0;N<89(A{x@B7kqT^t-7AeBl%2mvW&f}ynrjiP9+ z)oO)~e_u5kjW7(uKN9gc=O@pe zJ^Obqm*bXYK}rcJC4><0eP2C){`_C9H92wO#E@lKL@5Q!vOpru5@%|}tR zH9I@2yZd;(P$(2Q=Qwuk7~1VND5a26CW6K+2_XwG$DjQI-Q0P0*ofSDNAU?s0k9ck_VV)b+Q7ho0DxMp7M?qI?hB=q z17Ht8OKTl;`}6J(N3j8DDJ32}c<@VqfBz}1HQC zwy#P;61I`_!}hME=aN3#P9-I_Z%W#bbUo%q`H_EBRn=;+O;Hp#Z0|{09uJ;s_|v<) zRaJEofOfn64!8yMrtNn^eFr{7e+aw=2&eywJkRggUYB&w_WT*s4Q=m8dT9Gt(nm=z z%d*^<2p(0IWtVNQNxCiRr|n_XfuuK*_IkbE(I{W5)tZt%m1X(|NQ^|zdclZK1>{n>j@degv{~s z@rAqc;iqqGk3W6g3p6|#$Xx-%AAq<7h#7&nk&wYG$Q%zh*D_@l$RBLTC=q@D3gx9=oq!zitC6Qvu=}ApT2ISO5*-{`2?W&LfXr{$G6QE*Kws{ObST zfB!c4`uZvYm7E6R?Lf>;azFzOX9nWQ7hk@E8@}uAv;W_J|GB(s)hdwT>w)+(5KH4S zgAs>#GZ3Ev8ZPnR!Px_gXphN`ZoYexAerJ1;{`E00001tSUo literal 0 HcmV?d00001 diff --git a/Icons/actions/save.png b/Icons/actions/save.png new file mode 100644 index 0000000000000000000000000000000000000000..a81e70d47441476644e649c527eea15d15482ea6 GIT binary patch literal 798 zcmV+(1L6FMP)F#k%HTrxS8FZomuD1#9@{o7DC@}=A5u|o_+Uh zcH`xFj-ybCmK)cuZ%0uy>jysWt~^3nWwp!U0z;BcWVphFI~ln62^io+yGUW{3~MUe)$X`1U5cwOj^fMO0?En zXr5_;XPGkSS+Io{ffh;^!!wCar=!7A=CELzbEbfF0)m#yJ~lpeaTwjaFpnHL^-?I7 zM8WYwb3vcL^A$MoaO>hcT&Y6@FgZ6_s)gn&ge14dv5-Z_1gA@*O)SmuadR7o(Urw1 zWHKkHajjUcV>)2Ks%A-s%jc$G-I~?79om;e=W%Ksn^DMrIL-uZ=Gg4~z+tpFd&+_} zCwIYg2|`e59iN>(IReRz2~#_cxuAXnb{*4PG?2u(z_5g;VOAD8aw7p`WX!N!$7U3y z)%$lahKS`lwxbwZWN_5+_!@mc=*j!5m#W2>=df~K0gZYcdwV4u?C;xtA+jPk|3ZCEM{tNOtp60@AZm~eJ{B8GYng`i3x&h(8_~{NO`JnQcpEFK(TYprhgI(f`F7^;d>&BNJc`>a25kU(u;K6dZ=sKnPSAA zzjgdGZK5xdgGC}Tvjb2K7hgxC^7@q(XOl^_+T(E!27?ttQxfMp9!=%YJFLR61tc;y zDrd?lQzZ08zF^Cm(B|dyX1+8G&&DOUQ);3$SXy>mlBD#cVlLu11cHF1?jUU>5lb2f%}@}KCHQ3#FYgcGX4iml z`Eb>N`7TwNrnyg+5^X z#dHi&7&jASuY`c#3)i9iPB79cHY_W}v8^@OvTi~CbRDwnJzt!7{4AWc>=EH-x#8My zZ40$)Lufr&4cj#DdS&^X-|z1(YItJ_aHnuB2&N5hPJ?JDyb^%J_udYU!f}anbZ$)~ z{cFZ!jk*p>+&E6{Sc(r#d(qxd12LQ60}wus*l6qQhbSxOGktvl6kGhT)6*ZLOwK0P zb%&U9Oy)%M6Owmdr;7SJv~d4biYGNPvwFi+#IKoN<`Cm4tTjeeokDd@wD8zHLhUs= z-SUhq(@c;Stt?tT!Dh3V_?7l<^6qLO?7TsN?HB3Wh)T9?Hx`}oAHx)cI8XD!;o7wb zc{6}Mg2kaAhNG$cx22vpEk5f%x{gEw9QxpcR|E8@dx%`hkHCH5IL@|dOMlCCy^g!n zm<|?J|FdwaHU8e_vz8cd0UzUM6eh@&6p$H<;gFGK@?SK)K(0XkzWWQBzmd-6L=(OM O0000Eh306QPEcFidJh)h*{a}$Ny`_LyWBA zwsW56H_SZqh?y~}nsxaS7^^jGc2tjy0yOKgLA+~$i>=6a)*ANwKLO3Ud;^q$Yrrk> z?#HoDCTD{3I$4^(dRYsd0`>s=fl{qu=Kz8s*atqYoN-Y}^KKg#me_pYi%`60`Tm{5 z)_vLYm8!#3@?PicnrIks&4p1mK7FE;_WNj-;?gB35_TS$j>LPyN|^_9zjX6n=lAyk zZe-ndn7&*h=sg58{Gsmv2!Hz?Oi`Jjzxb>ITwN2n*ZY4cPR{$Nq`K0^k^#E>2#Kml zR7IB`VS^R&&N4w<%A9vUHS4k&KyDuAgovCS+qym6wENT835Ud(KD1>pw? z@qH5pP8uridAC!U4$FdZyoV{)vU_~anizw&FuffGy-yr)i|FY)$Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igV$ z1_3)x8EbF=00ZVpL_t(I%e|F-OjUIl$3N%X!@b-WLwZy00%pUB0&7hck!0Y?G)5HV z7Q`z0$5losluiDqk*=+B%9?X)%{8w@OF=}M&N-TtIbyiNv}{zwi#h|ma4+1qbI;Qs zoGX{BTU)iB?YC#=oagsF-{<)~&-VxagDn7x0p-60eHrjOK!B@2&gO>A^!N88BL9d` z>|u1P4R=#AJm7R)|We84y``fYV;QN8YUnuPA?GuQ>JjR$Vs z7@%f*5QYSn*3{w3otc-f2t)&_D>9+E^lM3JhF{ASF^DJBXRt69Z!!Im2%H^*;N5ix z+HYG~Sz=2Mq9)DOR}2H)=fh$HYbw|lMbJ`oygehdUi=J|&Kpk)aK#e1HR776f zzinv~x}|5TCxzI#T|L>&@g?`6CM5w79@Fr3-@^Wy;y+rplu}rn&B6M|KL!rPz_htk zg@7JlTAv1ZChE1G3;t$zSr<=mru=!9YIFr)oY zQBgr#TN^RPHlR#Vl>G6~H~?=Kd^HHX8~NEv=b{|$N^|3F>*UMZ^O!vHE1&vyTwZP) zOy^-QEY=~a01S0@c3w|k1x^ATKySJ${b=mNFMBuc?tNqJbTklR!^9OXId$^9V_5c9 zgzt2Xr}3B<7Mh(m>wedDeI9U@S(0p^c#V5aDZrHzAMKp{>6>KLYUkc?0Ba;frV0T) zU}c>bY~}$NfS~{kW@Kc{>!fqQUf?a@GSCZ@GdqR#3zilB=mg1D5C_P?mQ^Bp<=paC ziFj&#i4&>;`M~`^F3=9V0DKON0h@dm&j7S%uuz#3vG<2%ZCA_^iVDxgP+X( zpm22|z(c?_Aca{$c`C7PB7$Xy1@Y8=AfIiLJ?|8V)2>OpDpnpZxIqycfy2O~Ca^QH zZX!ZeYZbf%;;G&4PIbyw8xl%ER;mba;{CoiZvb9po=O0C_GZE>B8UhfJ%orTwj@jN zfE|%kq(Vc0?_x2DmIGw|owCPm-WT7Bz|;Tw$`KLP?_Lj32J8d!ZgzuMOwF(Z$>y>H sjyUfyCp7}hm?fJrTPyAG3C=}8{MA~DD3;_0023x# zcbAd%CA)|-z{|M+uMY{4$~3vWwc}E|Nf3lGpU;==_xp#F3Cm)M(P+$9tJU}QdVO(y z%ehT_x{|nO!(<^ME)MQIYbLG{2YEj5TI{`d_czCJ-~0Rf>)?}bRm*^7=L42#H2TiN zhv|oLFRg96EZNlB)lI8UHPV=E27}?zN_rVU6;K{u#AdTyQz#VCy7~sG$O*G~QMjT0 zv@@A#Ch#^k7Ck~470HB6%-N%@aWHjv7@(~Fp3@lo&r{! z%nEzal~uG;N`l-MY?=}YzXx#ScA$3!QJl3ib8~T@JUt`f(OYwX(BWT$&!n5!dh!@` zI2`RM5yog~Zki_SNw7AZnNs|(U@UUf8WTLDMVL=cj6X=3uvV)b@_N1Vq9_i|@WJb` zD~$#4N~-`R1M_uDS_C&6AEYoa$J%+8V;f?v@DF1EMZ|zf=!^gW002ovPDHLkV1h6F BZ%P0F literal 0 HcmV?d00001 diff --git a/Icons/actions/spread_nodes.png b/Icons/actions/spread_nodes.png new file mode 100644 index 0000000000000000000000000000000000000000..653e53fd1d6aabf7751a2ae99ca8c9bdbcde5325 GIT binary patch literal 977 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 literal 0 HcmV?d00001 diff --git a/Icons/actions/transform-scale.png b/Icons/actions/transform-scale.png new file mode 100644 index 0000000000000000000000000000000000000000..4d200f26afe21fd0a5580a8c05255f0904924292 GIT binary patch literal 902 zcmV;119|+3P)ZVZ7K z#4v&j|CF&Pp~hH+y09S8U=h*Q5-6e|x==D$1j(OHQqfu`lWCueci$wFzC@|`;PC$3 zd%ydg^L^(&_@6Fib{q=Un=m(iKvx5t02m$Yp#5RV9%$3?TKh z@_yU>{5xPX@#8NG^yMcQ>F;LX@D~8IiZ?pg1Hh)1jTEOZ@YUBp zF}$~v?2cC$d46Z?!ikgL(Y^i7*s*;>WA&~`1Qn`E`sXEn9e;-Qz9Xb=Y(fY#Fogm? z(7Bo8C#NtICaaA-(sdX6hQ>&&v{MiS1CoZ@a{1tmp{w9SL$663i482N~u&6+xCod`mM)Um_HwanlLAxdbpzo=p+wpSK1BW z=Z~MO_o9h(x`}(9e1}tS?q+`ew-7*3I5vrMq331GW%_GzX??~Q%axFwiA<)6&b?!N zd3YD4(s@kAfrmOUjG5W_+C0TI$Xbk}bel6N?%V$^pBElw?%V=}4xa_}G cfu$(^2E!fjHKHIz)&Kwi07*qoM6N<$f)^>IMgRZ+ literal 0 HcmV?d00001 diff --git a/Icons/actions/undo.png b/Icons/actions/undo.png new file mode 100644 index 0000000000000000000000000000000000000000..d5088a62d42b683d81052c9ea76b116ba2edd997 GIT binary patch literal 512 zcmV+b0{{JqP)pZ86IKX9>-E?MnjEzt|Pbjs8%6apa> zaVdpv`X`8!?ds_2CSo!q+)gcofEbD(l>Q4sv7l4iP?7844ZXyep`cR^9Nw41`JV5b z?;JkGam+&uKL~XKeiU$aV8Sq5w!P5n^$rJX<#PFn?bo(nO3K;JNXpvI*#0VMFN&he zQD6JWE`NS^)Q~y!cGH_C>)mGBrw_^gn0q=k!@B&x_UIF{S-=Vz) z;8VR`FDM9tyzR5(ane`&DQUIa?S8p0W2I7gYI{@C`cUj=18YETL|h)2A9wdCiq6~Z z_6D$>T0R2aD+q#9+eJyS?bvoa@RH7L7dxHK#kd3j)oOLi_O+ysjYi{IlkPSFKOQ&> zASuIbf0zNLlQ{#-rgSzr$QAG#_>*Wq@qOS|qE|P$`B_d@KXt_b0000x1^dcXQ8|&*5+m=Mv62{*Mse#N650`4y$KPARP`it=J)WaR66&7AW`slUJf zO91??+-~>T)YMe^uK!WciHV80-EO~V1_r<>rI&+)gCD#xI2McTiK5sPdL=?gBb7>} z9}P|<5?{;Txz1Bc;cz(MbULAF8eA?HTrL;d+S*15 zA;P`jVzIbH2np!Aj?vLk^z`&#W@ZKeV6)jEiXvoL24n12fp9o%o1UKjyeT-9N_}#6 zc9zn09m!-8-QC@oo125CY4H2~;GBaHa$SHi2D{x3RaHSLh2QU=pm(8@larCt)6B+${(fu*G-tgo+Qb#)c>dL6B;tuRd!oO1|*0GrJQNs=JTGAzr2Wm)c9U_uCn zhK7Fa>gsCk?d?S<6vE2N3bwYku(q~_d_E5V@OV53hr_5=t7tSD007IfP%4$+a5!L^ z<{G(qE7IxocakK%mrN#Y(P$KVdwbZ~*}>-KCJKeZtOeXV=Wm!M>_4TRk?d>QO3fSG<#rF0#%H{HXGlr_Fh(sb6vMj$4MbR(} z-E0$cs$Q7%c{m=vCkG378dS<-2zie-#1ND zs#dG0)oM68I)Wewmyt;1Fc1j*u4&pg^Yio10Q{2A=b!!?@G1nx*cY-apPiqdHxxxF z#N+Xw91h2)k|g~WjYglFruifk3OxgG_*f`_zptCu>lMew#@+^SwIwQm4*^U72tM{R zxT#xv{9gtI078fcAOye*KmtHs=NmUvf2|7uFYoB)dmX^#D;#tMA^Hhk{r~^~07*qo IM6N<$g6t#cQUCw| literal 0 HcmV?d00001 diff --git a/Icons/actions/zoom_fit_best.png b/Icons/actions/zoom_fit_best.png new file mode 100644 index 0000000000000000000000000000000000000000..d364c620fedc9d231bd59f472ac0eea670a3a943 GIT binary patch literal 1203 zcmV;k1WfyhP)+a`7mt?mYD$6PSl1z}g#smkjl>xi0{(#vG@JghnfT8lniyfq zqKW=N{9_?bv&21I_NRjdlx%|Tr7T+(ONWC>1%!@5Zy&T>+uQa&Jxeq(Ar#H@lYIZU z=iKwXH^1}yo`d{fpnrc*tJUcF^A~FJ3ko_ZlBz@jinD2UH4=?{_v$OXx1!Og_^*wJ zhK6*twRLCxp?Lev2OiWz$3>14ki2XXt*Sv zr^kB7@0?h^yHqsqE0fZKBt!#IWX`b+WL%JVy}cqC3T$-t^}Tg-Cu0nXIC|vBwd?nT zmA}wLvi1erX7j-sUR$DNRRwCM!dS$TT6H)S6}TVot*9FIYC1J)_2q{To$*Y@;N;2o zdjnC?a@Wlz>e?EXFAtyA^}Y6X9z&9=QIcGFv*$$NnGZfHuYa*_S<)1H@4J{BlWF(6 z$PNIKB)VsoQoO37bUvxhT|hBH8W=x!bqT?iJpfzl8^16DR61!<#9i_|&&@d3MEE_j z3$7(I8RMcP?FuJxUS6eN^`V%z{j1MEOd>#0M4?(9ZUHYKOxMMa2g9L+49VA|o*+~Z zBZ&&QHXACqtuZ1=6hToOk*#2G6_o@y#)NojGld`?0w5sHOCo%SB$P4{QxHmAB~PGe z3c)ap5(HuUQou=Ct-^pLN+=*OVe*q3pDGEIQxYI4!$CZY0PNR?kDbPGz@q?28YM*m zDIJ6BVi{{3iA27yE~OOAnqMoV1^j6TUVLxz>{G)W5~PO@9sLr4NRkBjM2fN*sA9k0 ze-{oVGWM~-U?}S!78 z-Benv!C|{47>1d2yWL`@fFSepbB|yI*AH6DUTVr$)v7tENQkk8NR%;_rBk*R5Is~w z(B;?1M|g%wkoym`+RS@Q&x@isF*`fUZfgvY=H}*{ckbN2s?DZwHNRO|E{07dY1$|~ zenc!f@7*}_+3*RkckL3JPIvfx8>)szyUA+VcOW-6_uJ{|>BKgN(3UYdR2CF~ia{|@ zA_B45Z073f>TB=>G#u{fLF5$m>)6;>M}L3+;?_Uj3is!($Dvp#>92|P_4NQu-gv%N z+vZ+a(CYMhZIj*JZ8Di|PfSd#XE5Fwuh$#qIBvvfG`4zHSBqtGc~+y{-dkT^KRY@) z`dbF$o$>j6ahQQCX0zEI-rOurCX*B_Q+IQ7vo{`(J2B)L2m}I2nx?N*LtqjsVQ?^u z#nJ(9A{T}{Bf(&hU0PZiwOXwPrBYera5#Q;xm<(De}!JJ$KHXow6tgu$RDpL;pPWX R1)=}|002ovPDHLkV1lCKEn)xw literal 0 HcmV?d00001 diff --git a/Icons/actions/zoom_in.png b/Icons/actions/zoom_in.png new file mode 100644 index 0000000000000000000000000000000000000000..8393e281aad5e679f45139d6d940ac0646072204 GIT binary patch literal 1191 zcmV;Y1X%ltP)GLZP?+=%wwwy}kcD4|^~n6wUOLd|yuP z_nTkNJ>PS{{{;g6hF-5nMn=ADEw8BPqe!X=K@q&b7uM2D`iECv8MwtTjQp>Ihlhu& z+uI$V$CBBzQ}@D1n9j$q2wNprH&&tc4W(f%-_}-28^jkRHUfomi42 zTCc+l8CgNheaEL9M$LB>6jm7j!g~ei2=Mwx@4uZCWIVx&n$$|N!l0!nRADmEmnpi( z>2&(17Bi(`H)2MS7ctlX2}6-W#1{nN#ULOtlm`e9C0PMtE>AgYsH#{jb{BecMS~|M zCPqpLhH+^5HZGdhv%E<1iUORj%5OS7maim4k@KR0b7@XnM#oy)P4a=6ncqHvUa9Cg zW*{1kmhSZ&9YC|l!R3sS6tpV7*4g;bWN%)jSxHCJ8KY^7KJiiw-({{c;PANRSeE@U z7!1nA3IhCo-y*Ew=4pHF^Ihe-cD=_JEd_Ld&ojbR`HI`DiUQ9LB$=jC0JYBD>FA|UDXMX zev8F&dvbDevqw|l_laxILGjy^0Byg$)sGz&X$ z&1$u}w^J!I$8i+grvC2k?npM9oyWiv5Rb<>nx?O{KwuM_U~w>;&DINFq5uY-kVGO; z2!%qUcDubstJSu8z1}|pfxsp3Utuztu=gMykH-ige*p#7_HGjoqu~Gm002ovPDHLk FV1mKNG^+pr literal 0 HcmV?d00001 diff --git a/Icons/actions/zoom_out.png b/Icons/actions/zoom_out.png new file mode 100644 index 0000000000000000000000000000000000000000..f66575efd61b90e4cd8626089d6fafe16a5b4cc6 GIT binary patch literal 1173 zcmV;G1Zw+$)NDWn- z27;nU@0I{@dVh9QG|{V}Z*H~0i~|so3_yGgpshuKq)nhDw?O&D55KS+bVoMCxneg( zdDDq803Zt>u2WXa4#to&w}XI)7>H;mgft5^f`W1iL7o!;$(oXs-NIu8sT$B}CpN0H z;3*|Ew5U)T1nA_Yb00a)glHu(*@StJs-J+Os#BXXqL()WMpF^C&rX_lB0?nX#J#<} zLlh8%=PlTNB&8?;X{i(h5>7zgWP%(;!5s|;ViEvFQ&hslak+)rI5s>oGMH8@%gNQ5 z*_oaupUEwSm-D4h9>s$Zt=pn?5l< z{-`ck@oL>6cjeTQB=I!OA&SsM6%ZRqjfruxO`M5&npvTx#F@+9>`;}buQW+Z8ZGa?y5e|wqE^ZZ?h!-0!}@M0p7z-nvj8vTBsJr;}o zFgrV|r4grRS8g2lSeE4}iaNfyu!vP1sS4IqR~IXaa&v5KOvS-}Bp#20@$vDW3knLB zT`t$_;i)P7aB*>|A+Kc^rXPYmpuN5Qw9%3tQ52a#AOJK?`w4J|hNJzXP#E<$=-ogV>)1o4!GO2i|5LA?gsIBe9NfeqyuIy~qYkTdT z-PxVF_wukao7r7EP7xAUI=VAw?w<3VpSgDy{?9|)?ZUHAXv0%++kOEl4{D`~O6ws@ zO2?9N#b~|YDRoM~%+s*;KLa=e6SigjM#DEsqoaEF7Y?N}yT?f63&eB7v}+r9i&r8L^0~61G+ct9-J4QmI#`K7ZI15FE z&cpRh7d3l{eaD`S<%@;G87Y6(pMh=({s_A>QZ5{Q<$F1~xC9%U1F4P9{kkwK18a#ymFz*&cut zJXI{@l~4-ZYWF&hM5(ukva1)OBa!rnIwd8l?IDCDmmSs~Jk|pc6XLt06ZT`+dj|leR5$WF0XEK`$E#L5y%LMzmMaJ$Hp4YGfPh=g zN+maxjH6qv9gXhfxCgY+z@MK-q|?OiAICKw0xCTKz@_@tYZF694r4Z*P6Gn&i4&dF z8iQXh<6Xawah&cB7xqfe?iblTd-RTjS(yw1K=BTsyu)3Xz5EwGCfUGucImz z{H3MN8?wz-+pp^f44=ud0=3K6HnlOQdH`IQ+1RXG?Zr><{uwq4-9+C5 zWDGK$z{Dhu+p>YPA%Fxp4mBafTg(5P_2qqIc(oeJb-SlqxbuagxV_c(Z_S}zh37+{ zj~&=U`GW;t8s3DGmwr`y|r5R z;YUP97vLByBgAW0-~FJGcz6<%jPDq|+5#pDu8qN@5~LoQVDWFWjuhh6=uzAQ08rQZ zCr;Cy{q*l2ddWv0z@!obsog62o@_;;C!JvE%LiF{Z?5gO+8@=m{waN9U~7L1cG)mr zDCI}Szjh?%oWF#>QtNHFEjm1^2e3;yh7Rv%`Mr5>vsznj!h>6V6K;97oPm1;oK2;Y zhxQ(QIAt0x%?sC2PIKGWFcfPzO=@x+k&5%_Uq5boZhNi`Pd*3Lt$b~JxV;9kF?dx9 z@nU|okQjO7ki>1#y19zK?x5Wk+EWm-kjVsAE=_DKkBnQ~I(Nmd-CFb7aPlPl;0!dj z^RpFz05ZT3kogWwPQ#D0@JKS1P}#9UDp|~852vw*l6X#&R;@vMb%XVrYfaB>S?h4_ zP59N@a0RFXPGsH@ARPb@pni2LBVP+y12hw%QN;oMTE)9ZBJ z_i)~%^Pf@OO$pL;zT3h~q=PvXNCJq{`CnlIqaNS_O*$zLC3L*m@BB^x(dV(iVG2kF rj^lye2K)#>8)yZN-9R_sG&=qR=b8{jvze+~00000NkvXXu0mjfkhc>` literal 0 HcmV?d00001 diff --git a/Icons/dialog-warning.png b/Icons/dialog-warning.png new file mode 100644 index 0000000000000000000000000000000000000000..7233d45d8e6e41ef8fcb318c76303a9b6f23997e GIT binary patch literal 1391 zcmV-#1(5oQP)}piCG~<@Tj_&{ee%V|SZW{gB8?y>5~HGEkRU`Q5xgR16NK8$#%7av&gnyv zB_>9ji%*39&LbK3qFu zI7(%ZZ%;}2Gqh=wf?-g1;X+qD8r}8{{PEcV%0X!tqH%6yq(DC>&`hf#DjvXW3(1702fiEY= zF5vsm0&oGwD!P6+uzb1JdigTStXXLJ`Pjl?)VXtsUA;>7;>9+ps^67D`lthR!lCrM zJiGbuAzhIO`u_b0*{$vea+<+#n+u)TG0)=^W&Y8i0fonJZU{&O3K7Vlni6`w*i02KV;P{rfRu zG0etBGUm-QC7c=+fU_{mF@F3e|CA|e+x6?%3JOrCPscC}T3cI*Mx&UfiIS0lW6Kua z*4E+=1XR`QT~P`vMhu|BsqFlGD_&EBWm!0O?*~ty__PKSBsxE>~io%jH4{flNukRa8X# z{rjXQCrg{pH?0i59u|NFLJ0B8)HQ2(TUCW{yU};B)sYgKfwF=i#fQ*|T%prYYO&>#^_Jg-l9HIC3}~D2jrjDCoMLxDnFn#I<)X9Z#O% zl~TASP4c~kT|)vm3aV6;lT*TB*>>d$((gwvEKE2_WWLjh)9HL~UI>A6!v?geQ)#cO zBP%CIQ>6UickujYfDG8-Td-iF{q<|n@$@N&XN+4a)1MXii!#xt%)zy89UYGz zG12e0NnI~2gPDT@C~$aEUY=^+y^GP-hO?w((CCB^XqtxXDMlUN#ETcC z1p+4hp6CQXDP-AvzM{13Y_09qE$nO8qUGca8odyL^73*nUc5M{b0Gw_%uGDnx6}FT z856u-Rdc(;WsuwJSM3x1@yun*tghR)G2?Oc_3NRv6|2V>LcBLlv~F)$efs`;+#5F% zJ#z;0`E&f~>DJ4JhLgbjz5vpKd|!698oPE4fasPj{qtqSV!U}nQhK`b970DyKML_) z0Ovbsj@-OC=8MgnrPMUAEG)wS)5J22?y+HDnPzw2Z#-bF|D0)J#^W@o@C8T-_3a006Dl?}?!^Gg%N(Y>yRJWM=AgI&$DQBoaw5Gfxa| zHh)H-herpGZf^eM0fZm~A~V3t^_5{65)pllfQ!XK@ZIw~`E}<@e(~uNF*8lPs6?o2 ztj>-!R$YZ#Q@XxxO_e_Y9%Oq#_zDy>AY&Hu3$mMbYD+Kmoz6C|Vj#G>P0frC~Qc7s8 zA%uWG``g7cJ0P7-2aymFY}+1KECNw~7udE9B4O+-D_Fd0Z5LW=Sau@u$S#kdYD{C*72J`o)&&(zUFlO)G2LN1NUEuKh0hq95jXVG0 z{B7HUl;#yH;UH$AF;6 z<+=F}=GKmRDjTbxy4~)B!JDgph#3rM0jg^7z2(K{fBo7&#+023nteo900000NkvXX Hu0mjfy%<3* literal 0 HcmV?d00001 diff --git a/Icons/edit-cut.png b/Icons/edit-cut.png new file mode 100644 index 0000000000000000000000000000000000000000..7017d1b3c05602eae02c4e24ee0dd623a4a988b9 GIT binary patch literal 1177 zcmV;K1ZMk*P)@nd7muDXRbu{1HZCDn+AB-+xJK7@d@6iHtMr8cef zK?O^Tg+P)9v=kwvArB!GKZ3D_k`_~mX^OQEH6J?YG_mrPO`;?5S&M!A__1!#7@klXwfCgN@p>Z!ezjNCo|-yQ{~& z%gwU3XX8-SVeHJ?xi2l4bMDT~aRC6T4jl%7_7oNr#pCgJ%gZVtgn*`Lh(sd=X~FS$ zd}`?WHOp?dLtzT?^73t0zPmiKJ|{CXbMRn!1vnR=l;YOt&j^J=t!cpkjx9Z1BDx-f zloBQT_9Gk)9a&dxr4XXj<1U1h5>FPNARaeX+gjSY(t_Js+8+bBG&nRMolYmDlz4gn ztLW?Rc?19%85utuJyHYCIT&LYy*+|hELxiC9g-_XTT6SruIqt^f8Cda5ai~%5DEo% zU%YgoYx}mWt(xk9loAtn|A4Bhy@_Hr2Pf3{+xQsSvgH}%V0k4nGc!LaC@g}M5|k3m z&CePqo0{L-XdF|5+gjRtEz27H<<4!(X0t(26sW2O!8r&a_-Xh@ghHX}baPJA#6I|E z`fmv$A*Dp|?iUe>gfTrc4Q8`FNVk;$VB08gb9f|BU31j&-_%rPaY-pm(}ZCd@IQQj z6OBzfu!+)DjN;EajQGq9CjXp3ad9z;g+f@GdW1o{y<;;lN&ayK@NUzz4oXOEoO5mO z-j|5q;lRJ+zoVe+HRQx%n4G*XRmOBn%Km_^e^Cd_qy-P!?Tw1f_IXiOR=%bvQ0TLU z#%E_`B3G6b77_q3EepD7;_=Fg&lKXzV}@})r4<7nca4y;b&t!HzZ#4ACw;yZe>954 za2SRVXISm=3x*J97QnAFUVkKl#c;UK z5Te_mC|C#vVF7oK_w+Xam{N!+rip1QlMd7tv^aYOrZOuQ7&*Velm( zhE&EHoOU}XA@e7I>j1Pm;Co8Qywh%n%2>ma5JM5e;2L9)hVjCBYuVZb#N?i!u4AjF zp@gv;p6qN)EG#U|a^45P4L}0GEa$!O`RZQrcy`P!FW*oY<3U{q<-!d>17HFWG;s^H zGj@3{5I}~aFo&w*p3jG6DS!Ql^L_x?iObk1Yj}N13*pe z1|jPfg-sqWe63=VG)_f&`LnWx)TYzECBc)r|Z?9gzmJw00000NkvXXu0mjfHJ>47 literal 0 HcmV?d00001 diff --git a/Icons/edit-paste.png b/Icons/edit-paste.png new file mode 100644 index 0000000000000000000000000000000000000000..f6a625ce0c201664218344077ac47171e3437933 GIT binary patch literal 773 zcmV+g1N!`lP)1v7=gySn zH0n71Btjr4xeIgQCMlI#aXhER{OgQ^dEs)t^YcBt_x%p{6I6JHhlf7`z5AADCnqN_AC@NyCw@QL z@+=O3WaIS<`iV2|rBt4-t`3AqA5}`Ru<#vC6OmLRHslDsn+G`8OVaO09srN_+3qOh zb1A6?_*>hfHMaMN*4D<7idI)6tpAu(CpYJ$0yKf8q;~JchrPD|dRFPyXZdXCQkyHZ z+rU?|lO1ypx7$NoTYFAJT6B6$Bw&5LLsYe#w{@Rc!bQk6J@<1Q$b*+>aX58q>~@X$ z%}#s|pI}4{#>bzsxVThOvC~Ml*zNYR`%0;TNd<7>{>;qGAyDY=_mKF zbM_ZBIXGVN=2EfS6#-HJj$p%rUuzp<=s;_*02$>V}$MzLaL|EsJnCjLO_y(=-W%)|q%c!L_D^^5AUQPCF!# zjR?)nExAK2`;rVJS_E}Fwks=cmERb9>?5AkDm52wwS3`}Em_`*H?t&0ud-?Fq&yeT z8g#2q9Cp7;^`WSh0#x`w2f2HN8$#1wqLimZ+Y;seMfpH%$*RV{Zd328U~p>ZK*Gq# z?JA%Kr~~Q&573Z_oj@Ge0ycmM@CVq;jIm&FN&@@?USWreIVMnR00000NkvXXu0mjf D-0Nc} literal 0 HcmV?d00001 diff --git a/Icons/edit-redo.xpm b/Icons/edit-redo.xpm new file mode 100644 index 0000000..2879322 --- /dev/null +++ b/Icons/edit-redo.xpm @@ -0,0 +1,98 @@ +/* XPM */ +static char *edit_redo[] = { +/* columns rows colors chars-per-pixel */ +"22 22 70 1", +" c #788600", +". c #818B02", +"X c #808D00", +"o c #828804", +"O c #879002", +"+ c #8A9301", +"@ c #8F9803", +"# c #8D9B02", +"$ c #8C9D02", +"% c #8C9904", +"& c #8F9F10", +"* c #859119", +"= c #949F1E", +"- c #94A303", +"; c #96A405", +": c #A4B407", +"> c #A2B708", +", c #A2B709", +"< c #A4BA09", +"1 c #A8BE08", +"2 c #A2B316", +"3 c #A6BA1D", +"4 c #97A020", +"5 c #A7B432", +"6 c #A6B437", +"7 c #AAC108", +"8 c #B4C708", +"9 c #B2C910", +"0 c #B3C916", +"q c #B9D112", +"w c #BAD119", +"e c #BBD11D", +"r c #BACA29", +"t c #BCD120", +"y c #BCD124", +"u c #BED22C", +"i c #BFD336", +"p c #C0D52F", +"a c #AFB952", +"s c #BFCD46", +"d c #B8C559", +"f c #C0CF42", +"g c #C1D341", +"h c #C0D148", +"j c #C7D948", +"k c #C7D94A", +"l c #C7DA4A", +"z c #C1CF52", +"x c #C0CE5A", +"c c #C8DA50", +"v c #C8D65C", +"b c #CADA5A", +"n c #CCDC59", +"m c #CCDC5D", +"M c #CADA61", +"N c #CEDD66", +"B c #C7D36E", +"V c #CEDD68", +"C c #CEDD6B", +"Z c #CCD86C", +"A c #D1DF69", +"S c #D1DF6C", +"D c #C8D371", +"F c #CCD971", +"G c #D1DD77", +"H c #D3E271", +"J c #D5E277", +"K c #D5E084", +"L c #D7E385", +"P c None", +/* pixels */ +"PPPPPPPPPPPP PPPPPPPPP", +"PPPPPPPPPPPP* PPPPPPPP", +"PPPPPPPPPPPP L PPPPPPP", +"PPPPPPPPPPPP Sc PPPPPP", +"PPPPPPPPP Atk PPPPP", +"PPPPPPP 4aDLJHw7k PPPP", +"PPPPPP xM9qwtww>< c #B59F17", +", c #BBA011", +"< c #BEA110", +"1 c #BAA712", +"2 c #B9A214", +"3 c #BEA514", +"4 c #BFAA1A", +"5 c #C4A000", +"6 c #C2A20C", +"7 c #C1A909", +"8 c #CDB80E", +"9 c #C2AC18", +"0 c #D2BD1D", +"q c #CEBC22", +"w c #C6B029", +"e c #CEB828", +"r c #D4BD24", +"t c #D6C004", +"y c #DAC003", +"u c #DFC203", +"i c #DAC304", +"p c #DAC404", +"a c #DFC10A", +"s c #DDC80D", +"d c #D5C015", +"f c #DAC612", +"g c #DEC917", +"h c #E0C70A", +"j c #E1CB0B", +"k c #EBD304", +"l c #F9DF05", +"z c #E1CC14", +"x c #E1CD1A", +"c c #E1CC1F", +"v c #E4CE1F", +"b c #E3D010", +"n c #E8D31C", +"m c #EFD91F", +"M c #F0D61D", +"N c #FAE006", +"B c #FAE216", +"V c #FAE31C", +"C c #FBE31F", +"Z c #E5D226", +"A c #EDD92C", +"S c #E9D532", +"D c #EFDB31", +"F c #EEDB3F", +"G c #F3DF34", +"H c #F0DF3C", +"J c #FBE425", +"K c #FBE52B", +"L c #FBE73D", +"P c #EADB41", +"I c #F1DF44", +"U c #F2DF47", +"Y c #F3E044", +"T c #F6E344", +"R c #FBE846", +"E c #FBE847", +"W c #F3E049", +"Q c #F3E14C", +"! c #FBE84E", +"~ c #F8E757", +"^ c None", +/* pixels */ +"^^^^^^^^5^^^^^^^^^^^^^", +"^^^^^^^55^^^^^^^^^^^^^", +"^^^^^^5E5^^^^^^^^^^^^^", +"^^^^^5JK5^^^^^^^^^^^^^", +"^^^^5JT!55&O^^^^^^^^^^", +"^^^5JN~ECCMh#5^^^^^^^^", +"^^5JI~~~~~~Nlh5^^^^^^^", +"^5JIW~~~~UI8cky#^^^^^^", +"^^5JWYQS8u8iiim#@^^^^^", +"^^^5JvtJLLKnhjzw*^^^^^", +"^^^^6JiJ555:esx0=^^^^^", +"^^^^^5JJ5^^^3rgd;^^^^^", +"^^^^^^5E5^^^^2Zf-^^^^^", +"^^^^^^^55^^^^,Af;^^^^^", +"^^^^^^^^5^^^^:Dq+^^^^^", +"^^^^^^^^^^^^^>L7o^^^^^", +"^^^^^^^^^^^^^9PX^^^^^^", +"^^^^^^^^^^^^4b ^^^^^^^", +"^^^^^^^^^^^18 ^^^^^^^^", +"^^^^^^^^^^^^^^^^^^^^^^", +"^^^^^^^^^^^^^^^^^^^^^^", +"^^^^^^^^^^^^^^^^^^^^^^" +}; diff --git a/Icons/emblem-readonly.png b/Icons/emblem-readonly.png new file mode 100644 index 0000000000000000000000000000000000000000..04666196e552e14afa664f56bd2312c66bbb199c GIT binary patch literal 430 zcmV;f0a5;mP)z4jvs+H&M;MdVlo~3xi*=OJ?_woqWD+!X0r)Eth>zf6~#I~h_x=;wA-Dd z+**KQozrf0=yrP`uv~tU=PNp$9=PN9&m5``MT8K_&{aPpgh0?h*3ZgnLD8Uy3TAf5 zKt#}>1StVDDuN)wzMjU2m?2ivf~uktc>kCKFrUwkT3ak;+}}L_LQ1IyAm|C&2XH%X zK}ArJQpKIZ YZ=>v}zGvq^U;qFB07*qoM6N<$f<&0NlmGw# literal 0 HcmV?d00001 diff --git a/Icons/empty.xpm b/Icons/empty.xpm new file mode 100644 index 0000000..5ca5dd0 --- /dev/null +++ b/Icons/empty.xpm @@ -0,0 +1,44 @@ +/* XPM */ +static char *empty_xpm[] = { +/* empty pixmap + * width height ncolors chars_per_pixel */ +"16 16 17 1 ", +/* colors */ +"0 c black m black s s_black ", +"r c red4 m black s s_darkred ", +"g c green4 m black s s_darkgreen ", +"y c yellow4 m black s s_darkyellow ", +"b c blue4 m black s s_darkblue ", +"m c magenta4 m black s s_darkmagenta ", +"c c cyan4 m black s s_darkcyan ", +"a c gray50 m black s s_darkgray ", +"A c gray75 m white s s_gray ", +"R c red m white s s_red ", +"G c green m white s s_green ", +"Y c yellow m white s s_yellow ", +"B c blue m white s s_blue ", +"M c magenta m white s s_magenta ", +"C c cyan m white s s_cyan ", +"W c white m white s s_white ", +" c none m white s none ", +/* pixels */ +"AAAAAAAAAAAAAAA ", +"AaaaaaaaaaaaaWA ", +"AaAAAAAAAAAAAWA ", +"AaAAAAAAAAAAAWA ", +"AaAAAAAAAAAAAWA ", +"AaAAAAAAAAAAAWA ", +"AaAAAAAAAAAAAWA ", +"AaAAAAAAAAAAAWA ", +"AaAAAAAAAAAAAWA ", +"AaAAAAAAAAAAAWA ", +"AaAAAAAAAAAAAWA ", +"AaAAAAAAAAAAAWA ", +"AaAAAAAAAAAAAWA ", +"AaAAAAAAAAAAAWA ", +"AWWWWWWWWWWWWWA ", +"AAAAAAAAAAAAAAA " +}; + + + diff --git a/Icons/eye.xpm b/Icons/eye.xpm new file mode 100644 index 0000000..be0e8bd --- /dev/null +++ b/Icons/eye.xpm @@ -0,0 +1,44 @@ +/* XPM */ +static char *eye_xpm[] = { +/* eye pixmap + * width height ncolors chars_per_pixel */ +"16 16 17 1 ", +/* colors */ +"0 c black m black s s_black ", +"r c red4 m black s s_darkred ", +"g c green4 m black s s_darkgreen ", +"y c yellow4 m black s s_darkyellow ", +"b c blue4 m black s s_darkblue ", +"m c magenta4 m black s s_darkmagenta ", +"c c cyan4 m black s s_darkcyan ", +"a c gray50 m black s s_darkgray ", +"A c gray75 m white s s_gray ", +"R c red m white s s_red ", +"G c green m white s s_green ", +"Y c yellow m white s s_yellow ", +"B c blue m white s s_blue ", +"M c magenta m white s s_magenta ", +"C c cyan m white s s_cyan ", +"W c white m white s s_white ", +" c none m white s none ", +/* pixels */ +"AAAAAAAAAAAAAAA ", +"AaaaaaaaaaaaaWA ", +"AaAAAAAAAAAAAWA ", +"AaAAAAAAAAAAAWA ", +"AaAAA0000AAAAWA ", +"AaA00000000AAWA ", +"Aa0A00W000A0AWA ", +"AaAA0WW000AA0WA ", +"AaAA000000AA0WA ", +"AaAAA0000AA0AWA ", +"AaA00AAAA00AAWA ", +"AaAAA0000AAAAWA ", +"AaAAAAAAAAAAAWA ", +"AaAAAAAAAAAAAWA ", +"AWWWWWWWWWWWWWA ", +"AAAAAAAAAAAAAAA ", +}; + + + diff --git a/Icons/frisius-win32.rc b/Icons/frisius-win32.rc new file mode 100644 index 0000000..d255e23 --- /dev/null +++ b/Icons/frisius-win32.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "Frisius_48x48.ico" diff --git a/Icons/geotagged.png b/Icons/geotagged.png new file mode 100644 index 0000000000000000000000000000000000000000..0d7f57227f890db8eb4ae77c922715a9c0266013 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^A|N&g8<1QX;1>s^7>k44ofy`glX(f`uqAoByDx`7I;J!Gca%qgD@k*tT_@uLG}_)Usv{89ZJ6T-G@yGywnu(>-GV literal 0 HcmV?d00001 diff --git a/Icons/grabbing.png b/Icons/grabbing.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea4c7455fc3fc749a1a83fd74b84c17713b4759 GIT binary patch literal 3397 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 Mp00i_>zopr0EN@P%>V!Z literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/accommodation/camping.png b/Icons/map-icons/classic.small/accommodation/camping.png new file mode 100644 index 0000000000000000000000000000000000000000..bc3353324f085afeac98c4cecc09cf1905d14a13 GIT binary patch literal 517 zcmV+g0{Z=lP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TC59I;)yBwEzGBG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoS4l)cR4C7dk}+$-U=W7i*oJ~4xG149;35tUWDr~mMLN_m6el<7Aa!zdb11cw z1`&UNn^=U1&`EG{b8~EjEYd;2sZmjyTnCG#`o+H7bk99^!}oz$F-=od?^~^wWmyLZ zOu;Y=;01W|`5rTwY_HdI9A}5l;hGQND;8TS%9Sk39LN2%-7cilX~Qs%k%zgQh!TlJ zG#WidY(dv`UDx5Z>>!q9g+d_!{eJ(LGK5N{0^p42lgZ@&!fLe=1R)%c-<3)LhQr}M zLakN<@X+l(FBTVme=3zaC9KzLQ4}u~rRq2u(QUB^U^E)J3XMhsK(^D-h%}<7*^Kvk zRaIpRo6Sa&Bte#|w!ITHqMJg2NI-Q1t!Pi`F-?Zj)A}W{5?RNXm zJ4`+&k?ROVFv}x(2JeHdy(J=!hyc{h`qEzFWb%=GfDe2FVJf3@0`FI?kd77%3ZyH!%5->cTkYtfpfNW@T|G zy^`NzveiY%&oQ9+$_;^6Nny^Gtm5*Wp7Ywgc70i3JoowWN==5a)uMuu>^XnpUmaM< zrl8chwzoAUzW@FGt4lu_f9|$EeXIR#&vB5*+`L$v9>flVX**S0J7Od2I8Z`Cm+1h7m%lE}E{Nl6tvj80uGRfw7Tg(FmvuUCdwYm$q>zD2%54Ll$J+((F*t>0MxD1V RW(7tLgQu&X%Q~loCIIdf(j5Q* literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/accommodation/camping/dump-station.png b/Icons/map-icons/classic.small/accommodation/camping/dump-station.png new file mode 100644 index 0000000000000000000000000000000000000000..34e7e453ff702ad6c8c8e8b2fa9bec85877517e1 GIT binary patch literal 654 zcmV;90&)F`P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4^ z1^^I)P7d?{001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00GWPL_t(I%dOJSYZE~f!13>HCs}NhG$be{jWL8o zsI;b`2ayH})k~q`KOlG!3gX>^c<4d!BsmBQUKB+y`Ug~MMeyK3S_Dlas5Lau5Fyz% z*_O!ejE8MX7k}-+2akF4hWX4ejK*H1)5+4H5zOH;y1Ttby}r4q0pzpkx%tcIpA=8! z!hV5fv;Cud_xVj7z%T-ZbJNAJ&<3cjH>j;QuzNORqZ!Orhw8_gC(TxendxFs2r(uO zs-M5sSzcZRV6vEJVj@SixM#JYSOkEPWE|VEJ-|pZ zzF&KQ($x6A+>hDW(|>&n5gO7~Dxba-TI~*rqprNT^p1y5Utk0SEL^`tI(6jFK-W@p ziA4PD(yP_7xz&w1j^y^8XLPqM0IuD*&(--0ziixWv^tI>-)j9vBofIxj&mH)LPLZ1 z!iS73z?QZ1W@opz03f9t)^*(iY~Z_PS?{&qT`L-m76L-tQc|{UDX*BOX#z9A8DIl= z3`n0}Mg>7-;lU&fG$H)bovUMhffOj^W=27IuU4-C^nU|d9oTm3EO4>EQ1J->u;vbr ofVc+`K7keB1SAjkKJY){ClHsU1w!Wd4gdfE07*qoM6N<$f`;K3Z2$lO literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/accommodation/camping/gas-refill.png b/Icons/map-icons/classic.small/accommodation/camping/gas-refill.png new file mode 100644 index 0000000000000000000000000000000000000000..38aab88144c85c6f7153c5ddfbcf6edf7f822980 GIT binary patch literal 460 zcmV;-0W`00001b5ch_0Itp) z=>Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TdH91vj*%NdN!b7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io9!W$&R4C8Akw0s~P!vbc%X=@)!$82nrASb0x^yXm7B_dHLl>cIn=jCBlTqBd zwV$Ai(A_D}J!TLK{((FQ4mDuGI`%9V?mck%-77g_JRT>b(df0=Y=-ms{JrWsM^2~T z??1O%t&3i-_aub4Iwcv`bpbe3Qw>xc$2Y)zk|b}-<&yP!jqm#a#Buxrd??^+u~<9= zLGU=4OsLgrY&IKw-=F4r?lc;WL;%-O6nzc`gP>XmP!t8T+3Y(_(>vL2x0B&;c&n5; z4vLhLFbuubYIP~Q-R`truS-rKgaGI`N-515wAR`w%krEvz? z*5bM@N-3c4lT^vI+&R?Cd*Y8k*NZb5=c||@iA0KInYSy{FQZr_}I&t91lhg@SjBzXztvI5? z#p@2;I5?4o?PU6@$vS@|E%-Ypcr>JD$U7HR0_`Sseq|YaW~{z56WiL+~&D2@JFM&wL^7 X_0`v^-5_;8(Ekjcu6{1-oD!MpN;zsA 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 P00000NkvXXu0mjfk97}S literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/accommodation/hostel.png b/Icons/map-icons/classic.small/accommodation/hostel.png new file mode 100644 index 0000000000000000000000000000000000000000..5554a6bf81997da9e479f0a4d56d50b4e6667e7c GIT binary patch literal 520 zcmV+j0{8uiP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TCAkG19zjA^-pYG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoT1iAfR5;6})4Qs|KoADte=n7dXd#G#jUWLrrHyz)M0^cjz(Vpyf{hPgAt?9; zA{G{w1`Cx{EClnPDv=P6CkGd%*_rtmb{RpE_~OX8g`3R==kqz5V2ra~ubIhYSglrh zxm-fIKY{Ib%WO7F00h8Vtwv)^JYcumF`v%|&3?36E#7XoFmN~=f=iOz@AoVe3Xx_% zy4^1C_xlSNkH=gtmn6yS^~!d;{cAG-3L!Wejb1>%-{){R3?`V*=N|#B^=pFFYDFm} z)9Ex%r_=uc*L7Jcl?Z@RN)84CdY%^_@H~&R*^B^KE|>XuJR%b$5()NtJ$5=B3L(OP zF@}{&B`9_rCju0UMUtd3hFa?opeK_FY}>~1c!XtHa9tOR#UlPP_^;k-+;$4b(>95CV<>0000< KMNUMnLSTaE+{P#X literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/accommodation/hotel.png b/Icons/map-icons/classic.small/accommodation/hotel.png new file mode 100644 index 0000000000000000000000000000000000000000..b9edb7b75dd3eba09df1f3d2f2e701593a0cc62b GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMnNVC={IdFfbt9`C9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(Eak-ar*7#ja`QV1YFNo+c7(yR&Z)5G5aR=uaTu*rFCh<62U**j-M36!otcH zDRen;oi175nZHe7+lANy^R?n^?{eSq7?)4!;1FG~vZMdtL6z?7aW}N|x!j-?rOt_vUTy-a1XiGeSq~ zkH{4Ro=mgZbNtk=q-~yfFrnf7?~Jv9UJJL@Jv_flgX@w>te{J`G%~i|{?9dO)vt5$yJa`N^O!Zo9~jCE Mp00i_>zopr0EN@P%>V!Z literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/accommodation/hotel/five_star.png b/Icons/map-icons/classic.small/accommodation/hotel/five_star.png new file mode 100644 index 0000000000000000000000000000000000000000..a7b8aaeb2c907398ef43bd0026ece073a6477a88 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k>#1@?0_B{w*x;UZ-6=WI3&%lP#>U zja}!lMM1ZPR=COK9T5j?;x;x}?nx95O}XJ{-?l;Yy*y9Qlc!yKChKook}&s#@TW^V z>N9TdI232TU}HeJikEKKSM>)xwGzj4*BN%~4ycyRWWU4v?c=1Q>iQ9fHPZ?jq?YaT zv}>HqV|($xC(i=8HGCUC-rTFtGfTqPKvwvN$l-~{Z@$}pT=fbUo48?ZW{QvXkGCK7 qqFUL`SG?Kuv{xWH|H?n}Z+t%d9u+?)tUnG6Q3g*}KbLh*2~7ax0<;+b literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/accommodation/hotel/four_star.png b/Icons/map-icons/classic.small/accommodation/hotel/four_star.png new file mode 100644 index 0000000000000000000000000000000000000000..d2355d9324252d8bc6de52ce106eaa2991d423e9 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k>DxO@5raQS2=r{)!>S}6pSCgo%%yX5C4X6A9pZ!)_L z)c@1d#WBR<^w~>>`Yee8Y!A|}iRK+uD0;QZ7j~e$IF?!xHB707LKkH*?{QivfA0bW~6P-n^#cLi3`Q|*}>5p)> zUBBbK-h{T;gGTo@^r`MiW)Drdari_yPf*FHF29-j`&cTU8vomW>8*`cs df8T$=T-@&R=o8bcFTg-x@O1TaS?83{1OS$MuXg|d literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/accommodation/hotel/one_star.png b/Icons/map-icons/classic.small/accommodation/hotel/one_star.png new file mode 100644 index 0000000000000000000000000000000000000000..017a59d9da79954f5f2a938e8ae74df1378ef16d GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k>btrP-ElX5bXUGj4iGxNCQH<{fA z>c8me;uvCa`tC(TZ>K^L)(`hLn_szhLt)8{2^OZ7R~7ndI|P1-HFY;znEh~MddbYf z`%X7sxM<=7-L`~pML)SeR=9Wxlsq`Ux7^}?^*P%=Y?oZLePiAo?seXKjH~~*md4V~ z6Z;*+&r7^c^i?dUdl732M!F%$mCAk%;URt_owGjeUpJv+q1$4Bz1_-`>}qKp6l literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/accommodation/hotel/two_star.png b/Icons/map-icons/classic.small/accommodation/hotel/two_star.png new file mode 100644 index 0000000000000000000000000000000000000000..e59d0f80cbba14382bdeac571d15460faae46a4b GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k>n}QX1BFaVTq8=H^K)}k z^GX<;i&7IyQd1PlGfOfQLNZbn+&z5*xO_5`Q}c>btrP-ElX5bXUGj4iGxNCQH<{fA z>VNF%;uvCa`s$^PUd)LCEDzp45?$7vkf^vq!e!&8O`9i7DLWX~vZpm+vXhQ(jeuhf z!@)zRjyf{6BATQ2AV1X4WIF>>q!=m95$pa9k_yV^8Xr4Nb{cyne+M z^c6~}B+EQxtKQ)te%rogU*~I);vWaZrXBikrFZdU|5}%W($|FF9Ao7(==`a!x+B8; z!dcNfi$y=HP3+zgF+XX_`-G0~lDhR>sk8fU{#V<_@NKc>KktN?Mxb{YJYD@<);T3K F0RVHMr3U~2 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/accommodation/motel.png b/Icons/map-icons/classic.small/accommodation/motel.png new file mode 100644 index 0000000000000000000000000000000000000000..cfda5c29d74cbbab3510215e372707197d0189cf GIT binary patch literal 535 zcmV+y0_gpTP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4- z0vHT$RV}mt001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00CD?L_t(I%cYXBY63wNMbECIM6}pqSvIVo5U_|K zsVw{h5r4$OQY^L+{0l++5GyMytri7Q6f71J!gf1RwT_|)-}lc6 zYPA}Z$poboT5FV2H~d=n`+d^s^mzuEOom)87i<5;ViDW6F{G3_iXvRsP4tmO5Ckk1 zi$s^J)hgnPx#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0Tc=a5WV%hZ2$lOG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io)k#D_R5;6B)6GkjQ4j|3pYPSkA`rc%wdfWS5fz0=3kgD66$F-xpaMgS+lQ+{ zP>P_Ws6`)(OAv`r_BRCn0j;t$%V)TaNfpQ4B#&6u_F}QX*>+WF-)!!ruz?m;}#C%GCaW{ zd`O5t@C9>qb#*hC!)N?TILncZZ(;b3*MTo2#l5002ovPDHLkV1guN5+?uv literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/accommodation/shelter.png b/Icons/map-icons/classic.small/accommodation/shelter.png new file mode 100644 index 0000000000000000000000000000000000000000..e12eff23cc5623829f5e55be1bd2009eedee3b04 GIT binary patch literal 1032 zcmV+j1o!)iP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0Tc=a8eJe&a{vGUG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IqT1iAfR5;63kZ(-XbpXac-|zk5?r3oG&ml!211zW;5XYa3L9v>#ZVg?lm4(F^ zM_Qwrj2d`HwoDi;3o~_MI&;~qRYucV!r==8LkzY8YsRh!^+X^n;O=+7Z!eHp&#ULf z^Lh5{fg37+KTze`aqfA5``Sldc5dzI0?2LrRxD>Kjw(~h_Os_p+lJx+ir+X>DFK|m z-n@mW->VX{a`zQ_d$YCqSqCT|z);(Rs>s`G0r-2gZ>NfAou?afr<_|)#pzn8LX>rm zKfZWv!X2Kwx@EBa(aA!e{}mNpJdDYb9?|81NoubtB|=DIP-?p0SKba#)Y^AFkeh^%KU#0g2~7SP*f_S`u^GVCaiK0Ucj>r7e^>}nr0c3#2+<(>pA3|vf*aT%pntH}P|TUKi@ z7*q6!whaKMx2MwS^>;15y<&y2zNwzkQ%6yMjS2PL$0+Y6&S$ynhOz&g@zDNDPXQFY zetL_j_+Y#<7z~AnTQXk)+${~lTi{UnrB0ZggT)Y7qQD*_7(S=;&xbO!j=iZnRyUpS zTNZy?BQib5_T<~UkJx@WuBGgqv!xCfKahNG+rdfI0}wSfWT4 z0+LoD0d{rLw0k$~*+(-#`f79(m`tpK`K$lTvtI&+)K!=O6ods3T3{+8jar9`5`xSX z6mzG`#pVm6%n1pA22l9`HVH%me-dV?L0F=o^(`D#FYv1CI)svl&b0oHWs^4F698EMEtM7Xy7MZXQ<~3 zKFxM9VKHz(N&=BSQbRh=ss;M`zM{@-W(2@wM*kNxyiV+_I#xyi0000MYOhkANaucr`nd#fx{r6K`?0j(Bu zb44+0i*EDttgg~*Qm=D(SiDDhPM!l?U(;wXJBx&KIENHUCAPN0$By?t0N#hhTIIPU zEi5R@w6dbnNH;eEt*t3Zlx6z$Y`r(u%37m1ve@MK7>RnFy*+kzSXv4aCntIM`C&5p z4ulZ&cg&G#w@Fis!5FN`-?zbk`|nI|^8f$< literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/education/college.png b/Icons/map-icons/classic.small/education/college.png new file mode 100644 index 0000000000000000000000000000000000000000..cd899a9b07092cead93c1af42867b1a52e46b416 GIT binary patch literal 549 zcmV+=0^0qFP)HesiTKX%^Ld{4g-0kjvkA2=nB*Vk5(KMo!`Ot{J(z!3t>yq}=@{9{ z3B>8+q`NKb$2*`D0BgP<05x$N>bI)Z`ClR>CHogMx)|wt_&=Y3`6Tn?z5y=vJ(uUb!EnOH(-Z zA-6RhAm3d^Ur4YYEQ|-hnjqd!P%oS4uMV*9w$N-fG(LdXfET})NlA%FlB3diHxsg; nM|<7+_LHQ&n?@j~00000NkvXXu0mjf7B%bN literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/education/kindergarten.png b/Icons/map-icons/classic.small/education/kindergarten.png new file mode 100644 index 0000000000000000000000000000000000000000..ec40f8fd4f202b25427414281e9066e4c8b71346 GIT binary patch literal 679 zcmV;Y0$BZtP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L006Q8006Q9Ym{i<00007bV*G`2iOP= z6frvM-EvX@001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00HMoL_t(2&z+J#NNNET#=q-BPee$Lz5+ae$ujUtI=vk8E0+Z-Jo;dD9)g+fSTWo3nWz0Tg=9+^xA z0Ehm{Fbu7&t!ZOpLybm5p-@Qc>+5=beN`%zk|Y80`~AAQx>C7Z)^Iq~pD#cnk&xHx z)y>U~c6WDW+qMkDkR)wwZGE+=-|s6LjjG%2%IS1U0N2;oNJ0|Z+uOwBaV{<{=03Dq zEhOP`xya>mizZ%PUJ?uju`CNoxZQ3Bg8`Oh&6{p-Z`s`3#Ih_*)8ymh;~Vhw^u+u7 zJC#ahenq?8Uf7b&X4&80r{C|hy1Gg}pJzIqE`H(e?hey5iN#|0d_E2j59i4{K0YR$ zP6JRV6!3UF7=}TySo{Vw8VycQPnk}qwA*c-pP#X98vwuGPqkW|Uo;+%DV0jZVzF<) zJkR&}_WeG;=Mf2L3`1}aO2{MHAl?D}#xMkD!Mfpg|01Y)Iw59u=@Rs) zY8(iP5r_@D-PWIgT3ZnmmB8C8SC_B4B+IILW5_1)^Jt%|(_20d_i|d%C8%p}LYi9z zK$=^n&eNQgz^Iqhwl~q%m#6{W$NHeS6r|d}DX{r^F*G=dnO&)8XmDcl_2pL38aV;r zZa~90G!Fhi3RKWFh_kZ==%k`rFmICeEgX1VTm$$6$dL;aubtzL9i}EULXLFPraemc zg(v$E0ZhXD4PMdk7s?s6Wb-ctNgEOpyRrj-$A<)z@wZ<%@TRw}S9xYlHesn0`R@V1 zbK(hr#WI=c4<(}(s*mQjU=bD+*`CVJ7-dFZ6z*>mlvfEB&eJmxTX2@`m~usrs>Ubb dM*R1jzW@w(b}q~MuYmvn002ovPDHLkV1mJ?*H!=k literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/education/school/primary.png b/Icons/map-icons/classic.small/education/school/primary.png new file mode 100644 index 0000000000000000000000000000000000000000..9144f716d91b6a7df7afdc25f79c57483c99015d GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zu)P6cM!8Z8Q=p(^iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0vDo-U3d z5>so>8S*hQ3ba1VciAX3^^l^;BQ>G+0;Z>8=N<@oxnEd$=YXV(@Uli8^+0;7E@lnxl##q2ZN`ppUXO@geCykQdhD7 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/education/university.png b/Icons/map-icons/classic.small/education/university.png new file mode 100644 index 0000000000000000000000000000000000000000..288046443ba53ceeec6c0a9911816fd99bce6a47 GIT binary patch literal 432 zcmV;h0Z;ykP)0003`NklA$l_v{Q& z@8a?o3OYzNWQb!+gIv*4OG86L{RQoQU83z@QMdIDV3YBo@kb&~-VAM%fLAkwPGaU{h7u35Di>tzeLsPKWkr z#It41=$Sx(H7TiD7S(C|GM(l;l|l+J2LMF;ehRwIYqv|t=i@$~C#PvlCKGDiE;o$^ zL)Yabk(d=P0FL8v9$PKWl1cUrgPf)TAcWvB7Q-(kcg-f-!Qk=^01Q>7Hy(4H&0?tP z(y|UB5jIqHq5HxWMy|`}c+7jhkMb+&M|;z${+wW4QFtg6{{IhF2Nc1c8UwFpDuOLm awevSZ=3-Eqed@LV0000-Z@vBk1*=&P?6bH z8yf(jOhU^^{tA&EtAs0zi}?;j@}2OTFjs5$!p4W+-cH|cE-@jWar@jQT!-t}*wn;; z@N09=i%&g^r(SfhW?*0rG|+#0^!YEKbM2}^B1)X|b8}PkN*EX_ZUqCq1~iNVv= K&t;ucLK6V>w1k8J literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/food.png b/Icons/map-icons/classic.small/food.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca95793bb11c24f478d592bbb6c78807052a9c6 GIT binary patch literal 817 zcmV-11J3-3P)5r00006VoOIv00000 z008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_00PlTL_t(2&!v-3XdGo6hTrecd^4N* zv%AS|%r;Gvw9!aBHIyFoBv_~fs)C9NEuMr@6v6i7#fu=~trrEMJr-K3&_fT>gGGg^ zZ7m}7U`w{H$!2zUc4s#`GudzE`*{+n*FMMh@WOL=fG33gfB5dFyQt5U{co?`EI)eK zqFoKFtu3)L?{37sC>}j~XzB5T&L9?A=hH+K>HGJJAH)23HyWOqB+=r{CE;|J6m`_bacvUgfGdeDsC+(P(suG1j?!7qvyX!{p`6e#{ zMkZip;_ED3vz2_M)8B1JZBo~8n5Daw=OnDVB z&XMOi3^BkIAd{mo1j|w|#GrvYJ6p{`95xwOmK154-exE+M8k}fQfM?5;CdBU!h#SM zY}x}{lU*v>@f)q>A5ydm8@sx=W8GS@nBneyd&8};(=77r+z0Qyb;VYavP|#whw0tNTKMdf&(Ur+`O%k-Eyv^R)rXs*XK};k v8uig6^SqBSb<2#(|-tNiE8@LxtdmTIB*%>P|?NIC4S=ap45VfhbbLR7SOm z(t0Uc2U}?}d2LiTN#i`4N0ThE9dp_ZiGBC)`!7F%7hryV9sryGSi9YxSy)&A0096= zzM#wk_z=LyR;!f{27_d;nd2MZttJP{Tnx?}%&p##p zYmp>LO4BrNJRV26TxKRFCcY#H!Xru2Z>p-k*J`!;yQz8frm>uIadY_g7>x8JVW(tD2_mQd3h?BR-$++r7QL zlih9?moLAL8`rL&Pnkmx_hZW1Ic>}7r)=R1AzT~{Ks{pxjn?%W=PgYA5pa}Fd0AB$8yjQeOFshuXaF!x z6BJ3oVp4E+C}&dMKNc$o2d+*nR~1fkfA%>qGFPr*K(`CIw%dO1-gh8L676;yG|%(( zd_Hd$OGTpUK)tt?^HBaX+^QHb_^j$4U=7R8&NiMFiWnRmV(;JIz>`$+I1mVIwOTDu zsKL4unFXl;7{a-D$TU8oDl4E0sa5(*f&npr?m9R#o*IS(ZQHIPQ<( f;bBvjWdOjx$?to0KoD=}00000NkvXXu0mjf=}xj! literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/food/bar.png b/Icons/map-icons/classic.small/food/bar.png new file mode 100644 index 0000000000000000000000000000000000000000..11c97caf7d59b14002da70c95e9cf9023a49ac06 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE&& z{KWE%%+qFDCuT@Ha_7dbnihZ!g|@3#P-!*4j;dCK0hWs&8xns=+>i*`iXCX zWCVN5E*vgYJCQ2mV4-)_-kNdGjG_&blay@@4)aTYF*p{mFE>EvDx<~|@e{i00iDy5 zjadX0r+WtMWt~$(698tup;rI^ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/food/biergarten.png b/Icons/map-icons/classic.small/food/biergarten.png new file mode 100644 index 0000000000000000000000000000000000000000..1a1eaf5af5e22dcb261e11c4b490f09474322cf3 GIT binary patch literal 946 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 M07*qoM6N<$g4OMvrT_o{ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/food/pub.png b/Icons/map-icons/classic.small/food/pub.png new file mode 100644 index 0000000000000000000000000000000000000000..3ac26f3f2edbf00cd160e18f9a4b17e08c28f7fc GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ z@c4l+V|{s#GEh*m#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWIYao-U3d z7QJix47mU}Ex9@@9$!t4&|v*_fyw1#x9NG}wNo5tdJ=S5hx zf${cZ@|UayF6YLuh{&ckC^2o4XPSBQjQio^XWt&=FIl(q%dd|&D&9x>KTuT5_IlP--fS#5GMANDeLy;oH)k6XOvGc zKVW_4nAZ?^OKu5cS{lF7hg#v)pZYv@|A~1nylrQ+ncU~uwLrHqc)I$ztaD0e0svcd BPS^kd literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/food/restaurant/japanese.png b/Icons/map-icons/classic.small/food/restaurant/japanese.png new file mode 100644 index 0000000000000000000000000000000000000000..18d8336c2bfacfdb738b3b90d654c1ae334fc007 GIT binary patch literal 933 zcmV;W16urvP)#=kc++1<>W z*<_OK?(AlE*Cwg#5YrqMNvtI*RS9iDB2>j&C_VI~f`U+JKr2E|RgZ$X2tg26#Zxd! zETYLCa&VKdS(0d~q)BadCp){dot^idhe%D(oB!MY^5gq`e8B%aa`f5T+k>v_($dmW zVry%wIX^#Nw=65B>v}C7k9Q{$iTgniu*u2E{{|F`MMR^~3zbUch7e*}2w^kEMttA@ zR#nx>d_MnrsZ?^;*Vq4~l(MO*DM&{FK@gzPXpB-yYn0MW#@MBFI{hW*{3Xu0IX5@= zf#-P(6B83>hKGj%0LoDSV+@>g;d!1_E|;IJ*X#Y8o0}i{zTazEmJ*N0E1^)x*x1;} z5ONq^DHIAwCX@Qi%uH%_cJ>12{3%(M`zfV2Iy*aQPfrh;%_a^G4j_b34Z~=erfCL2 za0t+K9pP~Jm25Wq4(I%YVHmRGIB*@$`#$q5)gdp6nk!9xdi$o%Kua`&vQ2>Dcvr%-YGVZN=UDfRe3Eu%g zxEWL>KmdS{P7Fp8>AWUCa2ZfOq5uG6mrY!{b?R>R3GG^!)v9TcxOjcw^WM|SYucc22_cXo0){Q`oP185HlLB+So!5nqsOGj zJ9uxXC<90WP?#@7-*`yVGSZceLaVEDfJy05`t#~1&2L0oB1(ivfA>}eP`kGBI1~UX zfad{31Q6UNujTHrJrIswo(u*YW&`SpJBY;H!_zNw1MMjQ!;q3qb0491= zSad^gZEa<4bN~Q&+H)>SO)N=GQ7F$W$xsN%NL6t6^bG(2Qs)OFkjrIo00000NkvXX Hu0mjfDy^?= literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/food/snacks.png b/Icons/map-icons/classic.small/food/snacks.png new file mode 100644 index 0000000000000000000000000000000000000000..0c610851f7553bb5d31524d9e72fb3c317be0eef GIT binary patch literal 827 zcmV-B1H}A^P)qhO-_MD!!r?AuC&x>_&5$=30pFE%M^A7*h#D5*{m;mU&`nJmkT7%BB z1&r0;pAK3gWm`V>f^FJ*O^P!MGTBWkag>Yi;*kmJmb*u56<@=`}FW?P)dmq?eQqZvXnweg%AQW zxrywp%M@;ZAJq~Yw;V}YJ9HrgQp$Ex(Psax0t7@mbE9{I^B&UN|}!?gBKb3@M!aQek!o&EL*mH8oZg*=UB6O1Si@806~sXJuje=+0a zx&K?1>!C7BNvRIrSE00>5eVdCa2pS%=?$Jx z33pI6Lg*{!taF3M$IAR&p5~XJ%3!s~yd`NqUnAx}P&2uldv>kKdc&X=3iF<(lLPhw z1z_o^Z#>!qNaBQ97mu)HuHjK2i2x0tV|jT5-(;5K{{f_xPJid}mNftX002ovPDHLk FV1jG@i0uFX literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/food/snacks/pizza.png b/Icons/map-icons/classic.small/food/snacks/pizza.png new file mode 100644 index 0000000000000000000000000000000000000000..83383b0470c4206ad27ac9d111ec2ca78f445771 GIT binary patch literal 958 zcmV;v13~42iAB-`<|I_#Mz5N6Z^;Q@JkZK0LI>?A&yHv;otGW zSuk{basyKi3*IItuL#DX@0WE6mCR80=Rq(_A3M0Sen@9?!+mDoJjy zq!>Ecg3>ccsaT~!Dw~=Gy;p>`y9wr{2Up?ww?R)bG09*TD^QytkzrCAJ)i6qIiNiIPRrmbb{v^ zGwkFVFpL0 z@Y1c6xI1@;o}dMb3EVc`lqLteNUzr>L;Wo;Yjy>_?;>5+JV#v`J=SLYS_GTRM7NSg zcGOv3%yPEdK{}toDAml85ZmNLuKm@b-7?zr(iI{x8#QbwTW##!EU`SlMctOcT=;_@ z7B)DrwlnNf5eg}yX+xE-%Jw#!s9iF9dx>mj*-fnBIa4KmBaJDUVLy>){#GLkQUf2q zdy>vG=Ml7hVyOh{TiNS!`Bdyvi+kbt^k!8g@E8euH!(PJihhn}4<=`nnk$w?h9#DzPQ)(bM>L zdTv&&=GB|253xuns*alcTtivHT# z(x=lus@KXUwyhGz?2~^i$VJbIkzVg92Et9c(4aq!uO?@IpIO>jd9?9;b9Z?vXH(v{ zE5_}xw=n+U7~hz!7{j0che>YSSqf(l@?SpO7L(Gm#B?CF7qclCp%By!zWOVkk_?@K g$xKYIlR3=!Z}kdx@Uq3ou>b%707*qoM6N<$f`1dig8%>k literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/food/teashop.png b/Icons/map-icons/classic.small/food/teashop.png new file mode 100644 index 0000000000000000000000000000000000000000..4345cec624b06a80004292629819207ace8404d1 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^58BLiW1Qt*0GbY_@0D9o^T#SL_pO zc79%iy`XKMvB>jFmkx)=1WkM-ccf8w^R@H&p{Fb}Vj?eH0XmJr)78&qol`;+07r>T AfdBvi literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/food/wine_tavern.png b/Icons/map-icons/classic.small/food/wine_tavern.png new file mode 100644 index 0000000000000000000000000000000000000000..b9df314b37e41c79791ed2a14edec9e65e079bc9 GIT binary patch literal 854 zcmV-c1F8IpP)Y`Re2|f{uH`^LT0qZY% z3jpZ*0a#9hXFzlp?xZ0S0Kc(+09yw)0$~6R6AXE`C;xBw^|2zi?_o$2j44Sn5-=fv zH;Tp11#4?-0BPVAAP(5TSHPW5XJ=_?#4`=f_WK-J??DK~S)c)Y2OvGq!?LWGOw&AL zMx!ST!#Gpj{^u>%b%#HipC5`Rll{q^aH3)=;phq#s^NA!9B;S74h74$sW%#N75GFv z7ugO-4-dSPNF;vI;m2bqKA6dm{31QK zH_)aZCjas?$uKpL^jr_eZjC?p;R~T_Z6Sgd0)?&|l+ZZ(1?bH`ZXvP*+`4=fS=}Ky zI7lLQg(!kXcQ^H*Nh}+~ZEWMTs`!LdRSQk+*(j0;M9jRZ?j73leKlNbxh#Bqf%tlr zW;%s&drao04`dW_NlZL=T-2>+MQ{Au-*2v5XnnRm zn@H=lg@;q$;l|1aW>mkM#B#YzKA&f9Zm!q1?PmM!Cy&Z<gwp?;^N6dq3~Wdn>{I)EBA%FUR61sEj5W08d7RVO+yMeFgp6g zyWf006NaJq?-$CB<6M_gei@6!{wfp>CX@=F+NxAk=HQ{9cAGaWJrKBNXRVn^J!aMG zU7MSm*YwHBN%o?7sZ=Um5<-kcBKrG=VLabzIjQ>}pI%y6T0SL(c8*YW_2zOM7#X<| gi^Wc7GMT^s1vdjYP}220+W-In07*qoM6N<$g4F$fg#Z8m literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/geocache.png b/Icons/map-icons/classic.small/geocache.png new file mode 100644 index 0000000000000000000000000000000000000000..2946da3feb8578188e2e7593e27ea8bf2847592a GIT binary patch literal 590 zcmV-U0tec$)JH%}ZMq5zZvApk(rpxF%ZvUIWd3NZ8aefzu(u6K_D zrf=ocgb?7m(C-JRR^xO!l5of!IY6S4U=o|qzShQBaX{k~b6e>3B!xl>fNa*}-rjM! zv3FcHvnBwkLJHZF^Dg*Kjw47WM|3)pN+rR@IeRSt#9JYxB^f102uJt`d`(rJquY3uQI&zwWBPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L003eD003eE_>!^E00007bV*G`2iXAu z3jq*xz-Lwf001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00G@eL_t(I%axL`YZ?I*#(#HLPY6`WP?EHI2uW-R z0SEVNh8rZ4ql4&FkYWiA-SZz5T(USC0wDpHGl77(1P8MSrO9xDctOPTBxdM|*P(Ej zda>=dz4ze9_r3RoR4Vo9{{H^+Y&QD%$Ye51CKHm$B#A@D!ot6>=atE($~J|DNYx7fDL<>e)srY(&T3}3RiR;z{M{C7?XhQp!T8;{2n z3I*>odI3z+q*yGvy?j28uIt`s{8Oi=r&KBxWLXB_btrP-ElX5bXUGj4iGxNCQH<{fA z>i_QP;uvCa`sk&-Ud)98EFbP46;bojatyHWkrojAxH#aA%8Xm#0y(vex~(Qn3+!4H z!ZvQ$>XEs)wL`(fVXuf&2*;=GokA`q(~qs3mReSxR{k@e=g$P~D;3g->&|5?4Vu}z zXvGwjlNMYVkN!@c^EYfy<0~~I5kvXoh2Iull+a6_dt6knJ)```^1DY}w`>sLXnY%| zld|j4!M-im^uPT(A{Lc<$Zq=$N4wm~F$!}Eo2*vtjrws)_TdCWp9e~3zu2r>&e1(5 z*>vrnOq1VxnPMKwWt~abG~fFPQ)0jLo&{6NI@fPFW;oCK{cOJSH+r92m|a%tCU6$& bKjGI_wBGR~{6qpU2pBwF{an^LB{Ts5{aCDb literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/health/emergency.png b/Icons/map-icons/classic.small/health/emergency.png new file mode 100644 index 0000000000000000000000000000000000000000..804dc0af5ce77c46aee540ec51c440abfa715ce7 GIT binary patch literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3HEhl+{lMQjEnx?oJHr&dIz4a@dl*-CY>| zgW!U_%O?XxI14-?i-Fp&gD|6$#_S59AbW|YuPgfvMhQ_)mN2s#kWP~l*N775{M_8s zyb=cIqSVBa)D(sC%#sX+kc?CXcTe8{E}zWg)V$(UD}{j4q@2uTm;Bts%sejnO=h=& zuCVrWaSYKo-`Z#B!Ia3*x_|$ngNlYiP16poT%ehGa#>LZSJ8@{OP4LUJi94}v;1!9 zh601Rx1I6~b0>5}XPx%x*z;)lx-WhE6=P4mYCc~5;lW2113r#@KTcO0T`mZ2+A8!x z?UQhi4@@4LA9gjY(a zMCxHq{kC@YzAaG&)yxl78Mv0Wa%-mY9@wO>na;= vX0467n!M}o`)v*33G@G-WYRxibU^*h{pmqx^^^I4(ZJy8>gTe~DWM4f9b?v& literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/health/eye_specialist.png b/Icons/map-icons/classic.small/health/eye_specialist.png new file mode 100644 index 0000000000000000000000000000000000000000..0f99357f265e401b67629a134be4520ad90e9ea3 GIT binary patch literal 873 zcmW+!eN0~j6k-MwEFF@lgX40HYZjaV!KK{$fI9*@UhFp^}ITCK_F^AJ?IdzXPmM`uJ) z%w$p{BcEazgySd-Ltp_TNr_sm>g?>8m>7#hRzTY5=q!BpY@n}Cq1Rh$YUG21gBFX0 zrs;CIJUct<_umNw?(;kc$TFEc7+kt~H4UFRGeZz_9EW?op9q2g!*Hci0h?4RMG(Zo z!h+A|%VaX?boSDvbAf;Yi$ua>W3STmGoUI+U0z<^-rf#{LV&QcveMq(J}@v)EEbc= zv{tLVcaOz%Ivq{#i$>R2mPsTMfEEk}jYgAHO02H3Q&Ur*yxnd$o6R_ma~zLtZsu9` z;jLT0*VZcM=jMk_pI%#MB@*=L5tj(<#G+}PPP@3YWNDQYi*;ZaESKAe$7ME~?fWa2 z!>bRS_O^T;FFf8r;3`4DMKS61dL0hO`g+`EGZqR3)ZusyL0F&f=jlK0B%|eZxXax3 zN-gQ>k)1o>*Lb5DGH}ePfbk{wbCIeBQt?;f98Wmriu)^-W*~K@c%ySKH9R zgDp><9O&q1P9%~*vp6Xp^&HvAX7&0v<#H88DJvBo^nw5l19`h#&+Y687=~XP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4^ z6dybN3XU`Y001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00C1;L_t(I%azlyYm`9{1@PbZnIf1pX<}iSN}_@X zDx^IzHWqe*jis$suoFS8ERBMtX>3H(L<=#EP5c9{O=TBEL9qxviyO@vE-?-ayE`*G zJ8$M~XP;!eoW(L0&|w?zu+=$4!m02g+zo>;8;*xFVI{l_=MTDkIjn`bIuF8T>7}yG zgs0*9q?gyivBowGDZSCyyRaIT{$Q@M=k_I?n4o;q;Z^ASYS^gbvm;8!54^>2s=B=% z2L7(%T(e&c!{+=Q>$t6&G8^7ECI3rD1^sznbN=Z+h4=i^Y&qas^dY5kerP#ImeT z-Lfq9_V$>Yn8v)Sy-DtrW6 zTU#6+9x^a6fU2t3dP0b6dDq7XgbdYxA2&hN{rh}%=MHavU8nn22+ikf6G$o1G>wsw5n{0z ze!ri|$w@XhH~H`QnCQ)$j6Zn5XM=;>%KS@q<#+5V7!3oD$MgOQilPt<2HD@=r`2jP zJv~i2okl-8!lh{(KY2p4$H(XY4C4CJMf!&{3qLKiH7J+Mtgo+AEEYLEJ!NBKgNus` zB9RCSj~)>ZhiT+;eE0oB94QB(u@I5%2+wAowVkLa3KJ6(jE#*UrNr;|V_6ouuH*H3 z85$ZQl}h2&yc9eI+~2tAx!ptNw+!Oo;6RR!j#4U>2!%ov3Izzv!K4<3J8D777P5H7+mu=fL8V&OKJb^#}MNz0$tAxX0Y}-avRV>S*R4U=~ z`9QWmX#DH(_7#?vmIwp_9SdLmf|RlouWGh!lgVV5ot^Et_8n7@FZt+Jkxl>r002ov JPDHLkV1o8!f{p+H literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/health/pharmacy.png b/Icons/map-icons/classic.small/health/pharmacy.png new file mode 100644 index 0000000000000000000000000000000000000000..f08880dfac853bc89ff7c7f0e5aaaae9efaeca52 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k>ezRtf>7NjaIxF8R5MnR#6Do6K$l z_5bvAaSX9Iee{x{A5);fv5)d?hc0pPIXJO?IS|Cqd(FgTi;7I6c7SuL(+Ud~(H4jE zw{pHoY-?N7x~b4nSX6lb%Cu)^|JQ#0RCIL7j4N0ExUsh<+X+ZW-n{)kW5>$OEG>R* zZQ;pVZeF`~{XCD3Zf?${njD_|hT_l=9^UhB(-_q6?g(1hyl&klBMugE_UI@f&JLGM z+w0y{o}QkrM-M!R-ma%}Bx&M{imzP%`90(d^YXH}t*qw%Yu;+waa2kw^1v_K2iM-R zCZs>Vm^^DfL;dzc?yXM7n|(sZ!_X8UH+7Jtrhwyz>c{=fkC|erf++ c_~8fFn(5BZmwt?A2L=Lzr>mdKI;Vst0Q1$ZX#fBK literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/health/veterinary.png b/Icons/map-icons/classic.small/health/veterinary.png new file mode 100644 index 0000000000000000000000000000000000000000..5fa2c64d1d70012afa674d2704ab25a83e77a78e GIT binary patch literal 1019 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4^ z6cG+JI%k;x001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00TQoL_t(I%WacgOjCCl#-IPcr-$;Tl@Ci#yNE49 zS?LEN3y}>N#1PFkgcuWIc43rov3Oyo)0t^BfthH$a52V9%%Z|(;y}|VQMR~F##})` zO35f&X@hturO;AJPfw3G)Kuql`M%FDd7r#_2;PxfYv2IXdx=z$)_$-$-gR?|i^ekS>>=o#uQ~Kxs?n>{Z=*CzWl=lTXys3e*u^y zgp89E_-g=`RVg8B;XQRrkTPnU_hxacYp>FkO4czrxT)on8kAeD005Q6#241ps*)G9 z0?yIr)SUoit5qgkx74>JdMy{Cqt*a49(7F=+MaT0KlwgZcIke z$mFZ@qL{fRNi;R9BnXnY5D>(LfUrI?yR`-l1<(NCjrn6m=AxNZ@JIZ<8UT16jVR-g z2>ve$pq>ISzPq`atNHtQPJsgeZUy}%`}vs~ykADfUaG57mz3lP6O%#1%hkWX#>)1G)N{c0>+ z!Sg)%;P$;C(^`BH0A?vk*L7X1-OO>a{$nR6${b@)C;+Frt9#_xz^~z|<|d_k?{4!} zIlF4i$npcg{m8P07vn4dM2~&-QIV;PwRiutP~6u)24I{57}!XuF#FBvKLdWhRDJe4 zgIkrC*RiSKDF8f;gjC-y&Xtc^Kh)KLg+YhaTcc~6}SAAhmy@D_`uo{2>AK`BXW p$o6}0^!&2ZHQlZEx&BM_zXp1}Q;S)2JF5Ty002ovPDHLkV1jtH*oM&M5;qhQ- aWoA&WWMutyH*gnF0fVQjpUXO@geCw?fOBWIZtor92&<4oI_7RUS`b0-i0dl0I+CR5ASP1pv&1kzvA^DskyFI)IZ5x6iNtbZ z7creet`Tiq#DaQXI@j^&Nh=voVg;jUX^3D=H{&l-zy#65IMx;c zU_J+i=Kw#5kz{8M{S#1&_7XQA)R23`5^kWa83cCh<5QIw-~+Zc3qZ>vE)5XvRQ?A@ g6nb$5U5)bo07X6@ILF=%h5!Hn07*qoM6N<$g1r#qf&c&j literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/amenity.png b/Icons/map-icons/classic.small/incomming/amenity.png new file mode 100644 index 0000000000000000000000000000000000000000..f57b55460c80c711cfc6a48806def86decc0d24f GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqhMq2tAsjQ4QyQ9>d3gRyPH13e zW>#iqp5idwCG1Ftw-DQm51v8pjEU}tEM9cUESSZ(!jSXynv-RxftndSUHx3vIVCg! E0PooyDF6Tf literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/aroad.png b/Icons/map-icons/classic.small/incomming/aroad.png new file mode 100644 index 0000000000000000000000000000000000000000..76d8c6096c28fd0fe418cbc1f9998315761bf700 GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=L_J*`Ln`JZrz9l&IN!iBL*fEM bA|r#N2qXKFsqWK(3K%?H{an^LB{Ts5gOd{v literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/bridleway.png b/Icons/map-icons/classic.small/incomming/bridleway.png new file mode 100644 index 0000000000000000000000000000000000000000..b706da70d34f898b695476487875d8b6f75af258 GIT binary patch literal 77 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nR5lnIOqt@2Yv;YD-0yKJ78W*6e0QFVdQ&MBb@0BW5S5C8xG literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/fwpbr.png b/Icons/map-icons/classic.small/incomming/fwpbr.png new file mode 100644 index 0000000000000000000000000000000000000000..f40a104e7ed1b2a26abe68708974328647f3eabe GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nRQBN1gkcv6UfA)7hv}XnaVP+8q Y2F>kEYqm*!0jXo~boFyt=akR{04z%o+yDRo literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/industry.png b/Icons/map-icons/classic.small/incomming/industry.png new file mode 100644 index 0000000000000000000000000000000000000000..89729a68dc7568131b224de3ee733aa06a5bb1e1 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`nVv3=Are!Q6Am!eT$TLydzJB@ zASQbC`C3^}^Ky zyb4G6pU8U1mb35V0goQVEuWhj8xPihX*kSw;p#(Q_9G3A<_ruECu;V0Mz!t*TFT(* L>gTe~DWM4fX?8wr literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/interest.png b/Icons/map-icons/classic.small/incomming/interest.png new file mode 100644 index 0000000000000000000000000000000000000000..b090bfe963b4d4f7c7a6933736b7fe11247125ea GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr*6y_Y^VKXT zhQ;5kdwNzoNfu=B#j;L}l0DXOSwPKc*2SAH(hfQjrVZ2B6pq{OD`_xS41B`G#^%9v oXnMy7DT5E16JIziF|lT5FppKSeKu*zopr0EbO300000 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/london-tube-24.png b/Icons/map-icons/classic.small/incomming/london-tube-24.png new file mode 100644 index 0000000000000000000000000000000000000000..04c17956f70ec3c4d6d80bfa47d112aa1a7b9bbf GIT binary patch literal 621 zcmV-z0+RiSP)>M^E|zxCifa%Ytb0)gJsT2p5PL>q3YOdHVicf+&*$m*6V7m=4KEAE_d1+%q+T4^D7Np6^T|pSj`zjd9V(@z` z`TRFkDuL3pvLd-|BW6++m~;cU*>>{9ML!kZQnjj%PVRLxcn~E{Onm7HZ)s{Oh#5SI zGmRvSp#oeu$A`0)y#W9Q2cb}iwk-(ocXp`zK7s4vTFXH6veAI8EdYLy`~Hrh_rM#8 z+s!smE&IY`j+&%@?N{+9+8V|*?gcV|KzRmFS3j3^P6hT|5}cn_Ql40p%1~Zju9umYU7Va)kgAtols@~NjTBH(g{O;S zh(~8~&Wzdxvl|;1wlw}*(9W9mv7XOtn*WzgUyrZ1-^0VhqpAZWc;>v(sXvvp_UFsg z%GZAm&;R%5@A2a<`rI2E15dl_%5SZ?@+t6iCR2n25bXQ^=kTSSFJ8D;MgDsJ-ac-| mQ(KTR_H}<3Mz3XKwPpA%BX^%sBt{wN1_n=8KbLh*2~7Y=3s|!N literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/motorway_shield3.png b/Icons/map-icons/classic.small/incomming/motorway_shield3.png new file mode 100644 index 0000000000000000000000000000000000000000..56d7ab81c3eed35980f3d6c7a58d41c6ac067cc5 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT=!3HEZI^Ek1q}Y|gW!U_%O?XxI14-? ziy0UgIY5{(GpgPRDA@1m;uzv_{Oz@ayo`Y&tq=e2`7Sh**Q{#>mxEbvl)%schs}SpL>mdKI;Vst0J5=F^#A|> literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/one.png b/Icons/map-icons/classic.small/incomming/one.png new file mode 100644 index 0000000000000000000000000000000000000000..7f19c4fa4dd12624f6f15145c1b53c2db46499e8 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqhMq2tAsjQ46A}`BoNr(^SfrV7 zWVys@PoEzu6MO&kuWJ(2I^LppqT?A~Oy8l`#v-i@$x}Jl_Y|`g12r>vy85}Sb4q9e E0N5WO>;M1& literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/pbridleway.png b/Icons/map-icons/classic.small/incomming/pbridleway.png new file mode 100644 index 0000000000000000000000000000000000000000..58d73f3b8deedb4972b2a64df3f9441b0dbc105a GIT binary patch literal 70 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}1TpU9x<|Idmp86oqz_Ob0f9y_E Qcc27=r>mdKI;Vst0JymijsO4v literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/place.png b/Icons/map-icons/classic.small/incomming/place.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9b09527dbded4e6cf1a0eff3f8aa92e2971794 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Are!U20QW{P~e!IV*l{J z{iW?Ygt@b$3?w_Ji+MT97N2|Ve}|{!d+&{?>@7@zCnkxes~?qgFF!UZ#NeKjsAu{8 z!T^C;DF@0RYE%FK0SZY( zK~xyiZP2|+!%!H9@&9|?lhfL0QfQp@XY;V6Q+o2L}~gybqzPu1EazY zi(8=(Y7m;%lGvE!94AGj&-|Mn0w8SW^}4W*w<@(W03LurFH3JfbbgDx}PU3B$jqx0on3cm4+89p=qQST=*YxkxIe=9FZ@nzN b`T6t>d7Wsp&j8-200000NkvXXu0mjfV_cr% literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/stationnew.png b/Icons/map-icons/classic.small/incomming/stationnew.png new file mode 100644 index 0000000000000000000000000000000000000000..d8b5e320907bee637a3404a279e34c8374ff5934 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr*6uPP)k3pupp@zQy+q zOWt!3INzymf~NkAAK&IHf>y$c6HOSFI=w~ z1sOuN=X78F#=^MC&?f6I?=!{}q5K&>Lf)GF2N}caZ%^kJX!@qcyu|eH?}f{&Ur8?x XGk-a+XZ;?a3m80I{an^LB{Ts56M;mr literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/three.png b/Icons/map-icons/classic.small/incomming/three.png new file mode 100644 index 0000000000000000000000000000000000000000..1e318d6bf5bef311503933b8ce4ad9e092abb414 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqrk*a2AsjQ;_U{yAP~c$szT(WK zmpsBuDMwEDzMn13;CCUCSBP##^ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/incomming/two.png b/Icons/map-icons/classic.small/incomming/two.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2a7750473eebc6316c4888331385e94719c5f6 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqI-V|$AsjQ46M*2y`2!#3Gx8>M xC~_xUW|)3J+jGjt7fC)5y~<0ZBl{L`GCY4L{?>Zw22Y?q22WQ%mvv4FO#mUpA2t90 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc.png b/Icons/map-icons/classic.small/misc.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba567b890b82f896e2cceb6af8325c0df0f91c4 GIT binary patch literal 831 zcmV-F1Hk-=P)IV+ z%;?liFCnB10vClv3l|Y$EffkWt9^^gHr37`cR^2zD5&T$MF<5!M304K<{}udmqA3O zlcqDy!*TRK)8GF8|7kG>Jtz;{#ku^>hjXvum)f%r3I!_bS9&&u!wrY3{LWgBCk{Ya z>Cp7&7?+1)a@^-*^uWR5jQTlz>LjEygc{eW)3r-0S_A&NN{>gQb(XTSF%$(RvdG(a z&h6(foc+~RjJNNf1!LG4ntvpN6> zOdG6$Zk^hBVe|MikM zs`wlcn3)0F#sF-X1xiaHlZM!!@MTaK7$EWN8SQO5wmb}lLnVlS0`oh3`b6U6M-BsV z01Z%6LoRa5IW_oM{7Rwn1$nW(jsBL6k+Un7xfg(9YFdcgv=fgW(;ka)hksQ^2ej>? z;=w)Ft*NATq@cyjX}Nq+No_61zK;B!*M9;lmMg;ZWkcOE)#~#p1u!_|@cx5fniwsu za{zunm@{g1FsOW};xEO=1;YTx!LaQ)fT65ZC|!07QCJSad^gZEa<4bN~Q&+H+0GEJ;mKNUBr_NG#1! z2+l|?%1z8uNXsu$2oG@1$t*}LD$!90C{4=AOjdBo&rQtC0|3#+5)1e(stW)B002ov JPDHLkV1li3cvS!Z literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/bunny.png b/Icons/map-icons/classic.small/misc/bunny.png new file mode 100644 index 0000000000000000000000000000000000000000..a911997e99ed54145cee3c1982a378b484df0914 GIT binary patch literal 760 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4_ z0URGlbwAhu001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00KBkL_t(2&yA8lXcKW1$G<=C`b#e~wdF`_g63!g z4M@^Nf`Y|DaL5!WIFz8HLkEMCxW=J$v8a$mC=MwZibYBk8WN;~SI7`JN-0OL85|Pt zniMV)!$~N)pNoe6v--C8;CX<}*zb z`}_Ov)9G{)0J{vpyId~1xVZSqpIgkttZR!b~c-RC-G9zK@g_P<#JBf^;SOz#bWW} z?Ch+2a&qzxAp`(WsZ>y_)j$Y=D2n(q=XsutjEq$C`F!P64wA{_^S!-2!!Qg00HqY; z_xXIMjICCyXt&#sR#sMqPXb0mkx-U`Mm^U&-!?WjUYe%)VrFKhRVtMfO6iYo qx7#!f<7=nW84U)5q4o9kx4!_zWZ0NcGUf#U00005r00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4_ z0VE@Eh5w`g001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00MnUL_t(2&xKOWYZGx0eKYg>GD&xBLW(Tg7Sq}f zD7NWEBeYN~y$FSZe}M{uM-j!7VE+L{MK8VdBHmO4p@Vy#`OR;vVH6npJZwOS=>?UIPBG4ofY)H5*i7JxK! zYwfBrW*ESMUB$h|m?2}#z1>`9eha14!~?NtE10E*VyNs^@5Y&Iv$<#MCb z>6Dty=7l(p4=SY|d!DzyUay}@lB5?vA|h8dH#gq^0A^-pAR-TlDE58-)cpKB0Ki(i zY>ZjXmg#xkX=d(-$fG|FJUTjRi73%pzZ@DG+6MsB)6?vnyPwPDZp_Wi0RTouMyxUB z1rhxiA0Jl$AOMggNhyk=Geo4@?RL4_?XGn?oxvnYc8KU*qtS?>DEbmb(Zz1JTT9ba z0NiP}+tKeXL}V2}Dk9sy?;i=naB5*;0kv8UeSLk$eBZB$$OizaQfg(-pIU1dcYRpX z7;`Pdj4?NvdFK}%JLit?5eR~yz|0?+d7GK*&bg@!bIu)R<_0s@MPxe+L$gOfYkfAK z&rbrt?CdQ4jc2)BE;p^UKKHK?Zcj{12>xS15cpc_hgtj+Pt3u_UrWjX00000NkvXX Hu0mjffg)ih literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/construction.png b/Icons/map-icons/classic.small/misc/construction.png new file mode 100644 index 0000000000000000000000000000000000000000..9760b12ca5258dce77e1761046f68f4762781ff4 GIT binary patch literal 456 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p!3HE570x<=sNx`ZCx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPSqp+YL2k+!|H=vM7iEBiObAE1a zYF-J0b5UwyNotBhd1gt5LP$ocg1e`00GCf@a%x_2s+B@OX;MyRvP*t$VrCwf{3f&8 zKv!^hx;TbNTwXfC*86aRgsXqNkcJkQ>=j2AL3Z||zTA9GO%|FKqApiL2cvD3Yj3Lb9+y>TFdCM|MFRP{rLeQhr+%G36pIc zCOLea_TsTLb3$3yyFgB7&5+l;$EzMNH5?ZDc8)FTsRu)3oWuS*54yWs_zJ(a+~3Hg zsPNgC<_t zvv{xB!W|yR4@F0xarpR6>t1-XL(G%sGdFDNH@BI=^v`mJ%<}48?U_<9B&;_STUx=-xdo#~TJt-ss=hAD%mtDnm{r-UW|UR9`1 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/danger.png b/Icons/map-icons/classic.small/misc/danger.png new file mode 100644 index 0000000000000000000000000000000000000000..47a89444bc2fa75cff04e908f0d9e1fe06608f72 GIT binary patch literal 644 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1DaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#S9GG!XV7ZFl&wkP>{XE)7O>#2BWZ`fTe5LHd~;ONr`JjiF1B# zZfaf$gL6@8Vo7R>LV0FMhC)b2s)D+C$Ka_at_J9lyfA10djolX9czxMox_}F<5|Ig*+`LC?p6!-blCoZ89$C8qg zWjyB#OTBH`*c9v7*uuov*it3g*g_9FD`jS8idOInh>3~)`ti>-ciH`9HW1Jh1S$*b zh-v#T-B!L{{@JQkt4=*OQLwSu;}-sB!G=jDE&7^=4jeexm9U!g%>y28?(Abyy}y3_ zTJx}kP)*UoeQaaS!2n4M_>=+QR;kJ7|x3aP_^WpjXIgawa6v$WT-nhxY;6-O% zVufDl?SlsnY-pYcRD1H~&7Wra&+{XbKA+fM&%-lk&!qnFbulYXbvzL@6Z(8hpN*}p ao+0T@nYPf<`455Vfx*+&&t;ucLK6Tq90iL2 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/deprecated.png b/Icons/map-icons/classic.small/misc/deprecated.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd581058577553ea148e7dc88870397d6f36c3e GIT binary patch literal 650 zcmV;50(Jd~P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO7- z3mO5_9~H3x001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00GKLL_t(I%cYaQPg7A8$3O4A(!7RJt8Idf8W(>x zI;eyA55VH)Bypi}aMXcB6E!YGWoCkbFrr~`cF@5vwLoH^1Oo&xG+KR{P}YU)TkgSD8)&Xwa~_}x%)n<)r^jWR&Jo2gBJTx;WcVjyFoVY zqpXdp>u7EcjgA_-?R!vOg5*OuKW)lgz6O8Z2Zxo+08QBY2RK!ARj@Ladl_nw9poB7Ja#3hSiqE82a`EHTJvPlaST5&VuSH k)V9EhL*zQx?$NvO7nlqpy0=XT*#H0l07*qoM6N<$f+Z0ZQUCw| literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/door.png b/Icons/map-icons/classic.small/misc/door.png new file mode 100644 index 0000000000000000000000000000000000000000..15e9de7a2de9c9148c26d4e3aa1c8e07663c24b4 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1DaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#X#-XL734=V|E2lkiEpy*OmPSqok<3=!`{uD}h2LC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(2!q=W<648~g1J1-eXR4_+$1bv;-*!WPDnYmeFC))=D1A{-Umr^7T@E>h95@5f_ zaLhRU+?uvRz4(1={s+BSs%4k_Gw#D)6Jrx=o~Qqq8R{HG>pL4CqygQ+;OXk;vd$@? F2>`Ef4F%}28J29*~C-V}>VN3FMcLCBs z@Y8vBJ&@uo@Q5sCVBi)8VMc~ob0mO*>?NMQuIx8BC79GzEgWaB2b!Ye>Eak7ak+Pb zy*E=KgTwvzCVOo@tDODpHL2&2k$1b#tY0j=jwW9jl{lh)ac%vg*|cogvjuGmznonY zT?1w`nJk$kI=$%Ldc~}72Oq!Xw{m%sww-VDOo@pF3={r)Ie4tNW@l+vd*p83?c!Fa znR90wOh{JWm-km27)lBPN zt>iYp@6q*LAF{PhdmBeg^Q|#Baw9|JGS8==RZI)mYczWKyC1sDNIA8{J^Z9Ue_?I( zv%MdAnPl99R@W~qSsi=FcF(3w+q{`p>Ha&I>)uywzN%s?_|uxrV*k{psJGmqr56qDc_NY? Tx>+WGVu8Wa)z4*}Q$iB}7on?5 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/information.png b/Icons/map-icons/classic.small/misc/information.png new file mode 100644 index 0000000000000000000000000000000000000000..f9c552b334db6ee4921b411441428b9a5267cabd GIT binary patch literal 495 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k>ezRtf>7NjaIxF8R5MnR#6Do6K$l zU7_#k;uvCadg&M!>5r?*@_BtQ3Lz0xf1@{fmYpWA=GQ>`di(pO2mw`hz`3-zyrt-udI{3_Hi`3!1ldmpJ%d$k?kA)ws{0 h_=4&Sjwup<&7+(+Y_&RdJ^_QC!PC{xWt~$(696BN#WMf^ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark.png b/Icons/map-icons/classic.small/misc/landmark.png new file mode 100644 index 0000000000000000000000000000000000000000..09bb2940893f708838c965fbc79ab1aca8114e82 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k>I>20ScLvxJHyX=jZ08 z=9Mrw7o{eaq^2m8XO?6rgk+>DxO@5raQS2=r{)!>S}6pSCgo%%yX5C4X6A9pZ!)_L z)Su_+;uvCaIypfi;{ZqUnOUaZZH;?lFJ?!P*8LZ+HoWF|_e;K~H{!@8rKxK~4a}lLH2K4qHAyC%dDmpoby1LA*$h zVY`aRs@0N)I~;S$8`p6P^VazF`#)%zep|Lk`?`huK8EgdOH+Ss6F$LF|6n3hbPE6X ziVde2W!HXM7s%1B^|3YG=4ROzpBX`MANi+z;l0u^i`isr!RL<)8K!q`xpRXxeTU|Q z-!IQIe_l@Y+uzT$D}Sbs=JGD> g7~MPRx9xtg<-GJ;^*qMG2N?7Wp00i_>zopr0MYEksQ>@~ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/beacon.png b/Icons/map-icons/classic.small/misc/landmark/beacon.png new file mode 100644 index 0000000000000000000000000000000000000000..3f91777eb323bd77db7e3249e1c34d1182f5a2df GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bA!2~4z?+a-HDb50q$YP+lFbFd;%$g$s6l5>) z^mS#w&dx3-%5a!1+5;#gTjCl~;+&tGo0?a`;9QiNSdyBeP@Y+mp%9Xhs^ISF8}L3w zH4mupmZytjNX4zI7Y(~w9e5fZKFLg0jd;z=BDpL$aAuTElY&`O>piazDoVFbC}>@~ z=isK(raSNGJF(xd{+@oK>>J?4S^tfxVUy18b=K#LXQ>^Ncpk%H$m1Lu%CLZ`Vbv|*S z)QRJ{ji=D{rUaeZ_g-`9yyuc_4|nB>xZd8jH@ttxx@?)_%Q7{V=H5Q{x#s?N z{*QT)V#jXmT6e!)|Hl=3(Tt{an^LB{Ts5D1D7? literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/building.png b/Icons/map-icons/classic.small/misc/landmark/building.png new file mode 100644 index 0000000000000000000000000000000000000000..757ad1dca592d485604f5f1cf44c1c4a44022776 GIT binary patch literal 434 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zu)P6cM!8Z8Q=p(^iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$QVa}?`kpS1 zAr`&KKmPx>XVyD&;J^VPVd3Nse_ml`z5^#toVarLuI=^Px2w|~9UFP|N+Wm^Qc_ah zym>Qc@xq0I#}6M?&dST%XJ&7If072Xgrub8?c2B0Gcq$(4;`tftUP+=?Ahzjo;{l- zWU^rE*3z!NK0m2l7V`4*m$bGX-L+?rjq@C~E!(#FUATJn?4f5NY(P*~S0`y~yt&uX z(sGvs+l|||wQGKUYMnT7qTuv8kbK+v`2G9-|NFaJt&NeLU#{lEySuyRR+JhW82tJ9 z`T5g3JBz~;zcN`iBr!*P@QmAARcdQ({hM7*PR^Kl?>Jj40V1+mkUY-X%?ocH`lA&-MZTL(v5B11x? z*t*wB`#WD$%5BSK7GOEp!;vuSS(5maAdRIA1v2Ridy5KgUE;5l&Q7?X)j#dizPDc{ z{IZhX8oQ)w)2i;Gre5FXV?n%DB`+@5Z~nH!=;E$5|Go;xGkBhfi8?cJ&Te23GkCiC KxvX_9BQ!3HF6HKu+5QjEnx?oJHr&dIz4a@dl*-CY>| zgW!U_%O?XxI14-?i-Fp&gD|6$#_S59AbW|YuPgfvMhS5R(P|g*c|akP64!_l=ltB< z)VvY~=c3falGGH1^30M9g^-L?1$R&104|@*~WT^vIsE^j@zm-A47NZUho#n`eFEJ=xr6W)tVJ2Y3}T!OAx9JlqsbDUc?l=D3A z@MW5=a_i@zhX=kF)fw3)^{BqnD0UW`u~=fVf6j(elS)PNDp~}xJk+nxSoo?*Y2x&4 z^LHt98~PO-QEVyj?SFnFsWbEcW~TH#8>N5Vk=v?oQqkLahyS0(>}_l{3?^SB9KWuK RX$Crr!PC{xWt~$(699NPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7% z3>X!`7y>W=001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00B=)L_t(I%iWSOj{$KI#ee^`|Ez7dAw+xuonGxj zXhgQxNqh#aS|JiqDTzXYtO_;NN`#=rO7Zd)>@rX5PGcN<@S=VDKjX z!2t7nFc=J2uh%H00I)2JTrP)YS(v7Y)*7ufwr!KiWTFE`qY<4>hvV@GfYzF7wMsgj zCKiif7zUo_Q7jfIl}Z4p@EeE2A?v Rv$p^M002ovPDHLkV1gnH)2#pi literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/farm.png b/Icons/map-icons/classic.small/misc/landmark/farm.png new file mode 100644 index 0000000000000000000000000000000000000000..5d10bf7256272170028cf6531cd6e13979994fec GIT binary patch literal 651 zcmV;60(AX}P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4^ z7bY9Zrkx)E001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00GNML_t(I%bk)i-U_k|42&JonJ9QzbTXE+?vQ|(LMcf4{)rEH9CRJN4Dt5F?CO?yz z_gvVtoiI(syLs>4ckbbw`!1{cr+?pV@yF?;Y z<<%VA9D0u?1$Q6k=sofaYqk@n)={uwbB&$>2YsQPvQbAPx#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TU4$3vP8jb^rhXG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoaY;l$R5;7+(6MUUP!tB>|DG#Zx@k%sl-Q;w9_p>8Ah4G}0$B_R$ukrWeSy42 zAE1-_B3@J|xTaXRgNG0YqAbZ0;#?)MW#vkzQ%yUxxNGS@o#p@dIl%w?0};OO7u)Uj z&dX|b``P;XhH~AiT_`*^#wZ~K34n8EmPCokvUv9Rcpb;_-Q?`-rq}CzwqmW{z486` zYf6cwN(3n-hzQIK1|W%G=Q)&8@HRJ5Dwp|F5S&<3t&^{VfgmYybbP$>bdplsPNy>x zLg3)=5V6*{j3T6I`d2@oAII+A9>(J_q9|IanCCf!5M~K%*J^0CS{U^E_}J~j81qNK zWZAC(08}a!yzO*QDwXi1-$ytc{(gZmVCE-DMAnlr`}c9|I*wyIj)PbAI$jiu_%<5h zb)&H?rD=-mt1Aw}a25o?>G@>xLHvYnd7js_EUQ*<9M`rixmYZ0S1H5H`FuX-Jj))E hB)QO9hX6DHdJ0z@ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/glacier.png b/Icons/map-icons/classic.small/misc/landmark/glacier.png new file mode 100644 index 0000000000000000000000000000000000000000..d855bd0cb3d48ea80b37d6826a4b541dc96494eb GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=ff9#7nDN)-?Yn`3>?NMQuIx8Bd4&bc74N860)=*Yx;TbdoPK+0 zqgQhvPus)gi!5fIYpo9`&?tEoYq4{O)h>}P5wG`WPZtzjar(%_<9F?vUiySf|F<}~ zGe;Kf)2}?t`9HAtj7-WiU*Fl;)Mc^wYYmew633yshTe~%Q#VYoigbw*L%1PB`>sDpgJle+m z`&g~Z8(9u_+wW}#hkx00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7v z6a_mqBe}!?001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00CJ^L_t(2&y|tQN&-xcvh2_LR)?4G;k-PbWsEWW zb8>GFV+?n`kJkFfWu+7VmNCX;S;j@9!SQ5*?>L-!9zqB_&!gY(lcp&EwOWmKyNv*d zmtyRh8m_9v`Bne6>=JPpHN~DyO zN+p2xPf-|B)*5V^ie>Sj6z=IMLI?(f0li)ifO@@7v)Nojqu~%AD8Gu_iz2GkDz59| zy6zVt0wA+(E+-QTg#rMbPG`6B<#M?J-t_N;J}+68^|#}GoYiXeD`XjC%+>ihh1=Ur zI664sy4(E`5&-*Q$VrlH!kakWT~Ck4TVeJWC=0{w&RYL!PypPgDHMyF@IK3!&1N`` b^DXoOyBn3D(}tq#00000NkvXXu0mjfkILQ% literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/mine.png b/Icons/map-icons/classic.small/misc/landmark/mine.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f1cddcfd182f6a2a2df7d5ea6478335946da79 GIT binary patch literal 648 zcmV;30(bq1P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z762G24?@!b001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00GEJL_t(I%cax3YGP3ohT-M$H;5J%>J?bnNRC#y z0An3N1se+yv=fD(H(;xUrMUu8QrH9%2sU~!lf$4OL)9J)$H1hHB z!E(7oRaHu*5&-MlX^?Lo%aW`Emy2XF$?afZH0000Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8xF5@G{MjQ{`uG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoO-V#SR5;6>le?>bjk9IX(_|%9&v?vuBS$F+9(Eng0=rF&qxX@pzQ-%79cVCAQn`{{Z{_ zUJM2UaXz2r;-9_pvOC`F#FXC*gS><#L%)sf4cU z^m;u2TCEngZ4<}w$1D9=;eNjZ&}cMp9Eas{`PJf*2D{x3%d%Ln*GfMkIWd_`ibA0v x(&@C4#U+5IY2tJ`slJE|NF)-XSS%_7egXZhOW>~Eg<=2z002ovPDHLkV1k!9$j1Nx literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/peak.png b/Icons/map-icons/classic.small/misc/landmark/peak.png new file mode 100644 index 0000000000000000000000000000000000000000..30d086b62bd266f213f5215057e64ae5e108a508 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k>{CzR-D1bk3#n@ktP@<3bfUX0r~Fze z+tOmaT_y85tIB1rH2Li>4PZLf9Q~W6=W;F6o5p?Y)y&5@pWS%2fMWuq+X1Z?4i`i$ z7!FSpjBPYIIOomL2Wu_Zw|%Ip%G*-O7GnQfpMQak#~eQX4tJo-89ZJ6T-G@yGywpr CPl)RP literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/peak_small.png b/Icons/map-icons/classic.small/misc/landmark/peak_small.png new file mode 100644 index 0000000000000000000000000000000000000000..3e0d2ad8924f1f69d2ceee9f41efd3d8ac8d281c GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^+(691!3HGtEm%8%6k~CayA#8@b22Z19JVBHcNd2L zAh=-f^2tCE&H|6fVxacxAk65bF}ngN$X?><>&kwEiHk>y_1(;ZYd|5B64!_l=ltB< z)VvY~=c3falGGH1^30M9g^-L?1$R&104|@*yNT^vIsE>AtRk+V5K#O>kYBd7Fyk8$j1)_bhcP&^r)cyH-o78M(gJM!rl#!{A-qO5Zljb^Q%MkfbtKq h2q!neJmxchHp{Z_4rJdjc@xOh44$rjF6*2UngE^CWjp`? literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/pier.png b/Icons/map-icons/classic.small/misc/landmark/pier.png new file mode 100644 index 0000000000000000000000000000000000000000..54d85181689cc602737256b12b645d4a77519305 GIT binary patch literal 532 zcmV+v0_**WP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4_ z000)&9IzGu001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00C49V z*7-lc*~O$|fX!?Ey`A{MY`uaoSr5f*A4`=kj?)`&9YONV% zooo&(;O6iYQ7O<{JR!Ea+klh+_{Rba437cu{`yQdm$9}`DU}gr9XC4OHd>#-=-f1# zFi0HC@c7*QD^L}aXm|&tM9P|*pVtEL2Pg1oRj#+!xV`JI3zQ1c@D7<&l1wVuPPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4< z5fL;Z{QJQG001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00K8jL_t(2&wbKMOq2%{1>kRHetu=3p!j~&1|kx{ zSE3jaS*WXO8cjE?@v+gwr7IUrS1#(VapS7pXyS-nXcs2hZrVk=XzC+18Ze3&q`n3M zlmNrL{(rh~Xvd~{R`;IVdvbH`NvOf0E!It~@Oi#b$Kn_MNKg7EGpOu6NWg(ztJhmmhizDQNBVX*qOqWD65(Svq2L(@)OV6|7Ij zwk`S7&C)`vgM#$)O%^X7wyP&__5QfI)EPY6=+wP^w#O-zwz~@3esHQe>s%b@NX9yg zvwB)4WLodJzG_ghw7}M>k2yAj;lYuQk@{b62t`*qh=4!VRNFAj6G!x$RVbyj44 z_X@A@>)}pam4vSo72QE4skb?+W#={D1|?r)9+|E&xlr|KA1=(3eFOTBZE&JOQ_wJ} zxBWL?$~m7I63-7E-i)H&YTH{Y0GA$niI+kBjI&W_vTsPGb|6{Qg1sn56<6PtgVgIrRuJ%fI0Y{wr8LcWX9hO%#h#Nnu0aAe!+4Pw)$J z|Ky+sA@*QHh4$fT!N|1a>zr~Sl0b|I&oJ|U0x|OV5Dmpxlq;JmL`E@Ied8TG;*DpC pcX;ywTCuiT&mxPbn3!LNzX7)x$z)!hVaxyk002ovPDHLkV1l9>QD*=E literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/power.png b/Icons/map-icons/classic.small/misc/landmark/power.png new file mode 100644 index 0000000000000000000000000000000000000000..7e275e715a324059b07c5db79b0f3c9ea1309650 GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4Mr(ZQ(+!?k0_v!Nr`JjiF1B#Zfaf$gL6@8Vo7R>LV0FM zhC)b2s)DtLeUm?G3DZPB3B7-HFWfOpOzU9}>{jV!7%;tRY2D`u}tPuq65?&{t5?hgH> zvA_4Zs~B>;+GTfMc%s(Q=t=Ii|goLUkyB3He-oqYehiSN{J z3?CR7QUXJ#KCfgrAkn?(g@4nOONBDmOD&%tFWe)%LE-#oozoJ@P8_M;{0Fz?9yT!X z6+XT(uexjDWEIKdf$9gkU+?NGe)oIdy9E{tbxx;7^8EkgG2^)<2a}hk;e+tI+uqjR gPiT2mkXFO^;pa`uxs|F?KuPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8x99^07zeEb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoUr9tkR5;6}Qz5Iu02sVIwG3I`l2LlM z4341&MX?EE8&laC&0en;@WbK2N~J=>Fz9(6m&+v`#|iXMK)2iF z@pugQXf)z{K4%nOcCg#+U|AMqSq1=1CKE`KgkrH6y~Uqt)oPXJ^O>&ek|b4CWuwvH zZwMw>EEY(mQt0>lXt&#cK4TI9Znqnn%_a=PfGCPsuh;Pc#^W(mRmFC@MJ|_vqA2kK zYPA|H%R-@0z+fbS!K`jV4CKOIo2;s zr&F|At&g55>H9ve*DJEwY)DL}(?}!|5CkEliK6)2fo7xlAiA6t~F@0}0 P00000NkvXXu0mjfa;@Bh literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/power/hydro.png b/Icons/map-icons/classic.small/misc/landmark/power/hydro.png new file mode 100644 index 0000000000000000000000000000000000000000..d3cf806b320b9be422675bdc9a9e323a9f608d60 GIT binary patch literal 462 zcmV;<0WtoGP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8x90?(PFG5`PoG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoAW1|)R4C7tk1>kEP!vV4$=C={TSdf5qD{Ii#md5U*o!-G0lETHx{?sk9}q>0 zFNB!n^A+zDisB4oGN*XOB(f`c^(S@l1i!3X!MN2kV;WXN=dD` zUX!E{yj)1KL~=f#yRK{7_PwO07#M~ilQGylZ08u>y@Vy$;Z6&4RP$F$uD&VPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8xA7%Sjw2><{9G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io>PbXFR5;6}Q?aTVK@>f+vp$tYA-qZuNfp#K#6U`aAcTOGgcMzCMyJ!kYPCY6(Lkkg50>=_T0cFlibOvD z7Jxc&5<+~1G2b9aGLB<-o`-h3jm2UCl8ECtGfs#d9OntbaDpUxl<~P-F5SdjE{EZ8 zhk&XZaou2fD7yFdSxcr?bDL>$*G~4m8H3 zDU3!Vv|26H>-DU=F$O^p0QdqSA^;NU;@SWzC>D#5Qo=UIKq+OQpA yFvh^LEZDY23Z<#PE>-}x8k!mIU4G7^{o0000k}@P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8xAF=b7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ioj!8s8R5;6(lfR1cKorGK;xHeFa~_Qfw^67Z4vH zAW7rfFz28t)xAjswFmkjZ3XtyZf607yd9Gyp)k zT*gyOFdmQjcs!VfZQHbMJE0{ySg+UUbUM&={l86(Jy1$vKA&T`Tz*Urf&faX#8I^8 zHO^);n5GE;D3wa+cDru{4u=D()hc}7N2OAEc_5`^p-`Y{nrt?kR7$0Ku-$GcrR09U zk2R3wXf)zrFkrD*i7F}9EYFyx$Dod4gi*Aq19@|CjJE-02Ye{rqk)KiD4K*2mv7kuGj199Y`tB zZnqOZERAe7i+a5d0LbNX@H`Lsd>+{Cc8sEk|H5_ML@cEwNqz&`HJsUk5YuD;0000< KMNUMnLSTaOtLcXT literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/power/tower_small.png b/Icons/map-icons/classic.small/misc/landmark/power/tower_small.png new file mode 100644 index 0000000000000000000000000000000000000000..87dd9c5bb32a99cb65a34d73a6f889824bad9ecb GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^>_9BQ!3HF6HKu+5QjEnx?oJHr&dIz4a@dl*-Cck* z5d3uBT@R!<3p^r=f!eGb+Gfe9>}8i<7Dy>69e*77$wpjIFuCVQ;h#Dthgr)smU>KLY0x>%(Zs;+ zknJnc=6o%0J9EY1Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8xA1EGbYb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Iop-DtRR5;6>lRt~|q(h3!^i?`y0?n+4&0 z4`aab4+KPlW+RhH#JR5!@}6w6yS!7Lx$|T0nR^)#5&ly|ghJlod_Mp5vJe8k?*o*f z#bQB+!-4V?$1%CCOG+s!WRchFHB8e)R(DD%>~=fU>vb^3KE7Z$9FpgGB&DSNeov0$ z(003}^Z86lDe^pzuGec?U;LNOIY$_VsMTr!0L!uf08tb{2m#JHbX`ZKQh7=;Rj1RT z)b?DP`{ezx{rr*I%zhL?ndxn}Mcj7>~yo3Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TdG&Ejut~9RL6TG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ioy-7qtR5;6(lfCXKQ540O$wWco1!(9*Ny#e^1yRtLcmfhS9UVh7bP~x##Cwnk zrl&w68iiysGs%oux44)1n1AlQzwYd{&e}O2+e4CgK~+^KiUP~BpsFe?%R(ZNfGCQ{ z=ktii<9LIA&~=^ldYyy8fV!@eB>Vk7TdfvJ(l87TheKAYRce~{*hW0WN~OZxZpT+- zS!TQ4eybf02TGFk3;{_t8V&CEdw${;K$54^iPdVABq?mSTLgnaL?RLVE1^&b(P$Kl z#R9@~Iz_o$#{W_(l`x;rA=xNN~hCs9LH7jdc6PualKxn*XzOK@w^!dg#yCi zFaY3sy<#$%e0esT4aEEX4%0NhI=!wP$AM{@Uv=BIfm*G`pD<06hGG1u*J?Eif*?H8 zKN*ci=ytoVnq^ra2_cuuVLTqYnn-?~`+=e;$Ye4Q5{U$MyB$ualWTw*m&*m~^%|*E z>h~;Ynnp>Icsw5e`V-IRGt1>NZ?_vsQUn0M-w#=q(QGymi^WhZ7N76@dgF?sV6|GI z)9D}(2mk;)pX0n-E-{QL70(Y)*K0-AbW|YuPgfvMqxoAq1$(K{{w|gN?apKobz*Y zQ}ap~oQqNuOHxx5$}>wc6hbmm72G|21Gs!LlT-7GQ>_#NN|SOjlU?$26EpL;6`57`>FCGWIK6+J#)+ls@_)%(9coUGuvhLJP-(R*IXpo~mkoN}8+tKZc>Q%jrc{f-jX5qH zCzpoYvtOXWW#ZfX*utKR=kS9J6D3c((p`7ru~1m`0ph~1{v8m&Ub?zm)>uGz3Zd#zsvDIST0^X>L8((y#*L044$rjF6*2U FngHWA$BzI2 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/spring.png b/Icons/map-icons/classic.small/misc/landmark/spring.png new file mode 100644 index 0000000000000000000000000000000000000000..a73efdf7fe2f53c03a3a8c473e7b8bf0aacf7985 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngf!3HGX_LqeNDaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&!~b3p^r=85p>QL70(Y)*K0-AbW|YuPgfvE*?&9-UZ&gOh6%%64!_l=ltB< z)VvY~=c3falGGH1^30M9g^-L?1$R&104|@*$Mgla)Ugb^>|w3niu9 pu6Oj!{9q|6-mqH!klAEzh6$aAKF*XdVFnt<;OXk;vd$@?2>{B_R6PIy literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/survey_point.png b/Icons/map-icons/classic.small/misc/landmark/survey_point.png new file mode 100644 index 0000000000000000000000000000000000000000..64e8b7d2680ef152786b4a7439da864278fdd84e GIT binary patch literal 430 zcmeAS@N?(olHy`uVBq!ia0vp^oIotV!2~3|wGN2@DaPU;cPEB*=VV@jWD7hZiy0WW zg+Z8+Vb&Z8pdfpRr>`sf4JH9T1!lS841S=HNr`JjiF1B#Zfaf$gL6@8Vo7R>LV0FM zhC)b2s)Dimw=i&o0)=>E4ZI~f=fUf6HG>bSpB^Lo4ddGkdq|4)Bg z9V!3#Z{bp@O8x_%p1k=Z)gp=Cwn62oI0iZjw1>o1npO0Z@6UcRwy z?U~OuUMsigoW5idD&`s(Iqj0h(s|D{H|wmk44ofy`glX(f`uqAoByDx`7I;J!Gca%qgD@k*tT_@uLG}_)Usv`UjFODvA~wPHvw=b;C9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(|T2%JDp3Xu~^c`GO@2inv5rRCb&!-S_)28t=KOow>0<2QYZL`njxgN@xNA1-oi# literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/trees.png b/Icons/map-icons/classic.small/misc/landmark/trees.png new file mode 100644 index 0000000000000000000000000000000000000000..fba2ccb701386ce7dbe0d5b6f5859b9890a371ff GIT binary patch literal 819 zcmV-31I+x1P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TU4uBa;~%ga7~lG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ipg-Jv~R5;6}lFLt%K@`P*ojw9zX)U%;kP-vPLqee@C}jbHL1Q3-CK95+#udh` zF8mYJuyBn_W8y0$h7cDxZ!itvKak0+rKv4C~B3nk5OK$r9(=8QQjRj#->ptiJ}W ztBK+HQw+uQXcYlJYDro>yy?v6`uGIzMV2fdqS;^0@t$Vtv)D=0p;4eO1^dukcO)q;=c~l%NM# zE2C?m8r4D@!~SwC`wdVo!YBZKRdOM{bIwL7javulSgqjfe&Vtj$lC-lP=gdUVaql` zg{T)>xupvewz?s2V^>r=0V)MV3aoAjn?NkKa5Yejaj(0(8Ha6-kBJP74i3=(rQ$`YO0Qn(IFSH-S`YNF_41b7>7+8sFU1lAHgn+YxoPk zp&0#;y9Mfa#^kq|1I2EZr4Ub7>QI`VWa5Mhh?|#rSm0&o`3rukF4rQd6pq9s>>|be zcrH`2m2pjiM9F7vCv<3KE8V75MnnpaY~|9}tKHwKd9Z*2q#G=l>}E)WNK8)g5?J2h z#7}QADkSa#p0J0dy>ZpRMWD4vqEoBJl2*uHl8FL^KoT$;bqp3rbgSU#b^^s4!V7F= z4bA|Sp%|qu8Qs?)>qYc0Vl9{JkRWf@Q x@EVv>pu!(P3d9iWQC2-6rneJ(P~a1g`U3^5?Cck>eYOAq002ovPDHLkV1fYCS?2%% literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/volcano.png b/Icons/map-icons/classic.small/misc/landmark/volcano.png new file mode 100644 index 0000000000000000000000000000000000000000..076d4c719afab87c147cfd306fe096f4c3af4330 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85r1ifiPqLH;+D`AbW|YuPgfvPF`UlagCNVpghA8PZ!4!i_>=} z8*&{okZ_wXCdjfdTK~ZVO`E3K)#}UF$sM%jxOYgJBkthEv!OCqSN)Cor?b#-o0VjR z_lfHN6IlLLbBf(Rp?omdAX7SmQ{~2%iN*(yGEGgmW3s{I=EgiFe%5sT0@0Mx=etd- zixs|p`{nTQmdKI;Vst0LeydEC2ui literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/volcano_small.png b/Icons/map-icons/classic.small/misc/landmark/volcano_small.png new file mode 100644 index 0000000000000000000000000000000000000000..62e1f5e52ad8427b2a7db00ab4467fddce0b54f7 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^+(69E!3HGn4-}Lvag8Vm&QB{TPb^AhC@(M9%goCzPEIUH)ypqRpZ(583aBX4)5S4F zVruQVjl72(7+4OTR4C;1_|lZY*%>6Dt03<5z-77yciY;aVd*-Eg;oSq0Z`%QWFU-Zgg*f9sBHea#;seJIMJy*yJZ{MZMs^B*+k a+6kRnb!h#j|6V{#89ZJ6T-G@yGywpL#!eyt literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/wastewater_plant.png b/Icons/map-icons/classic.small/misc/landmark/wastewater_plant.png new file mode 100644 index 0000000000000000000000000000000000000000..46f76f1c14abce883130764205eea0bfebc09797 GIT binary patch literal 654 zcmV;90&)F`P)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TdK9ALO(dbpQYWG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io;7LS5R5;6>l1*z9Q51%s`Cz8`Y!Yn{+NzCBp=m^L;ZTvfQE;QXQgE%f3AGCm z#2-)uQQWu?q#MmrS9MX*7PL~WAdZFlNo@nM#3Uq`nGmPb>7q1_&6J|=>K=ISbI*Ox z5wtli4=DVnWMI!)MOBt=WH3IaXdj&Az}N%=@crgRs`DDbw9dh+cacLDhsyg2h<;YZ zpA^C+WPs({mncsU15kK0fYMQP8KNg=ux%OB%&_Iz zDFeDLJf`v_Ppqpgkx2oOE-nsrMB%0SFznQES-fUz^+%k^=rQnICOw*vhyNl#qy2J9Pt oh;2rIMWEmbP~!RB7wKQM0g9}h1(Wn^IRF3v07*qoM6N<$f)o@Nk^lez literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/water_tower.png b/Icons/map-icons/classic.small/misc/landmark/water_tower.png new file mode 100644 index 0000000000000000000000000000000000000000..eac0bebd7363d20c054db62b3558603681811574 GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4Mt%>VX>pDZY&21nUuIjlsM<-=BDPAFgO>bCYGe8D3oWG zWGIAWq$;?3`UY_MWG1KP6{lJ$1e7M_WG1`h=O$+6amjBoyA9O8#?!?yMB{w&pa1{u znKc_&&&{%{J=iU7KXJ)FV?#p&BO@b&Kc`N0i3kcdavpA2{J4az?f;Dn$CmrgKQz_w zAg_q<;ip~O4;?yGz~|Jw!=mizo;~|-+`Q>|K|$%0{O;v*=kRE2r5P9)=)`aQ^zd*y z4^NMnm{{4ivPqM2G}!(eXYkY0<2iE%h^Ah>I%AU$k4n?S1&yr19>Kw%Z*R}%;o;e2 kWHe(_&yrQ)78&qol`;+04>mbf&c&j literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/windmill.png b/Icons/map-icons/classic.small/misc/landmark/windmill.png new file mode 100644 index 0000000000000000000000000000000000000000..76d3ae243ef6cbf224bdc4e60f16ced682394aa1 GIT binary patch literal 554 zcmV+_0@eMAP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TU4v0DeFFF#rGnG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Iod`Uz>R5;6(k}*%hP!xqv3pUVz6{EmR;=qE&$uMf%g~h>v4Yo4z3mh904kiZLqV*e3PQG{F%>|jmFbtw73R#AxX|{~U9MkC( zg+c+cEW=8*T1B~Bw&k!Ihr=PsWHLmOq@S!*Dv@Hb=r|Qc2q9MKcsxcvpGP8*z+^H( zFc<{S^KgQ83Mq<$@jAenaEi*sIs85b%WxEkqKNjri1=0n%nERObNxR-tyV)c%;ESX zhjcmxNou2BuR98CI}ii`SC_ssHhtH39Ja)R^BHPI2a!4kV%O_A(6|qBX0w0qK-YDcGh-oRSq9HN z+1(PG%_cTN>_X=C(9qPrJ3*^;hxIkqRvhXBcLKTl0EY3}iX&ZhCs6uNj>U;Ff@zwz s-1gM|;Sp3#!Tfp96phW;_laBi0+Gz~{By71^Z)<=07*qoM6N<$f|yw1oB#j- literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/landmark/works.png b/Icons/map-icons/classic.small/misc/landmark/works.png new file mode 100644 index 0000000000000000000000000000000000000000..ce4d080cc6eb598c4976f6e2fb7a406fc3ac1b65 GIT binary patch literal 488 zcmVP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TU4uFPg7VuK)l5G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoI!Q!9R5;7UlCe(0P#A^3dt0zY2sKo}1~ef^BO(bHi7>dh7>tXFII{QxF8T^A z4nBi%cGAtwmmx7}7*y26IzUOas5B0q>HPQR|8j2b5ezj0%#OSZID}NER7knan&r+V zwO*J-)iaH%MPb>%=?`%FgQ)>Ba3X{ZlR)xE1poq+e@-9}zEJ_$+Mtlej-_ zSL)eJf@nm!Xt(UsM%5BPy<*Sb9PQc3NJM@vlBaymh*nDrd0kV9=_;LrwT*l($>Y-- z>qT?xuw|o25p1HTX3ZM=@`^e3x~9@@*+?lSSNYfP`mz`RJUGw9w5fT#yuN$I1E2)# ehU`!excUIARxg=p(r0=A0000-WCMc0 zz`*Lfym!rxj*h%8GjCkKe%+x*qKmsv*7}-3`nfs3d4Y7#3j{nE zqEa-7cnd~LCa)d6`5Br==;%Gh1{qXJ-N}?VX#y?%r{ll-xc|->h5@F^vg{cEAW4#^ zX%9^erPP{Ix}lVAlv3-ffRu6-hT#?=h=2HO4$dQS>sK&F;>w|K3D=-;ax;ctw5R&y6wd zPs5{(F>T-XbELK2S!<8C0Bh}0YrQ*r>n;61fTu=X*KcK6J^}#5ahwN1aDR0JLg=Ha zszX&(2aK`(bEMzh(6;TT=XvjAJvO_p8=9s$@xK5_9%S7=%AnT(0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4_ z6gCP_E_Q$b001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00FT{L_t(2&ux%TYt%p(#-EwYOlFd;uv?*QOCt-# zO)N;kTRln9OHmM9KZpmv$NC`_dRk$zmp$ax;z6rW*HkNFl?t^Uwwt8cB$Ie)VcYne z-apTe_u(bDre3eNwzSxM@o6-=y?V#{e)8w61sBv-8KB57xWg?y={2qH@V`oW=2YT>t##XnPhK zyzzH9=M%?q+zKRwP^M|dK@gPJQ`GDAsMTtz%br~p>-U!DZAr!c&emF%Oi|_@4=T+#!1|}>(QBbNOYc|B34Z{$aCQ%h4gn|hRR;_`ICdgO{AqBWlpp1ht^D5MC zx2=Q2-=iogw|@ROQsG%-rb%XS$@Sa~J6*mN#kRyd*L7<_5QP5#l6#?o&(mru00000 LNkvXXu0mjfjD;0R literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/lock_open.png b/Icons/map-icons/classic.small/misc/lock_open.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c2648d0856809ce160199e4704af9e2a9ca8e1 GIT binary patch literal 653 zcmV;80&@L{P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4_ z6f!$yoU^_F001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00GTOL_t(2&y9~wYZFlvhTk)HK9h`JR3!tpG(keA z8=FPf{sTc>`U^yHkslzgTxvGmXXC271d4TCLqnm67PWCzT9Ft@s<)ZknYs76sFoQ- znzK7Eoaa0*VTNh7T9t+Q8&5v(?=Obo(z{-7=VhbO_yGXyyyH%%vm9J?H^)ca_SW{^ z`pxUpO0cl>V(wb-s@v^Gm;tbU@9v%Z+3fM7hfkZ$<}&~=&I1evgOv|^pI&FP?cUC2 z5Cpeo0{p2dvw@T{EtN_P0L;H(_stq9l_DCA5pe-#6E0r4jQ58zJkS1zDuh7J!1w(v z$FjJLk2$43IVC4N;zNFWwLHJ}{6XV?fHMQr^4vH&D)7-)OvW6{HsM{m0H_$2?OEC5 za=HAaUa!B+0c0u=O-9ffAR-thv`_biv=*#K|JMgMnDtM!CCcMtp*}uQfW$* z10FL(69JZ_C>RPwp#a08Fbq%4h;ntPTCI|8+urKRV&(hrcy1aAKTV|zB7-qQIIhcG nhaG+f0Mg4wXX92$fj@i6GP}a^600000NkvXXu0mjfwAc_f literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/no_icon.png b/Icons/map-icons/classic.small/misc/no_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c6050d89473070e763f928d74215adfe46e1cd9f GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k>btrP-ElX5bXUGj4iGxNCQH<{fA z>hJe-aSX9I{dTf7-ys75m+PA|m3O*LTRNpi%0l3du6w7C(h>dgj-#57Vy(2ej+e&S z=P#2C7S5fy^R7iX6T>M7mnXuHt(TT4p03$nHdil|!%_G1DD`2v!%Cz^RuubZA6AJ1%hOk^G%sak-&;eSEj1Kf6|0&yr9y`>{!H=DhRqZuO_z U6O8qGfKFrZboFyt=akR{0GiQvg#Z8m literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/no_smoking.png b/Icons/map-icons/classic.small/misc/no_smoking.png new file mode 100644 index 0000000000000000000000000000000000000000..1da7808fc1c18afb511424d9e3be4e2549250219 GIT binary patch literal 867 zcmV-p1DyPcP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4| z0WK%H*&_u2001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00N^)L_t(I%WacOY>ZJDhM&J3|0pS;lJ=Ksn3{tL zVnnHp6p3oO5QG?UNyKGAgIFN!T%&ObaY?iyX^>PJNf9ipER=*=aEyO++Mq`Cf|1Tl zJO9jQVcJaEzRB5~eBXO=zW4bIMv+!lF5m}dX0F1(Tb~_qhSwUy8cpB;a1baOR@((! z0cw4ABr(E3D{Bhy&@j#NNt?DYam{+%-r2+x339%FCHn9IzwX>7ort#r)jm5C$$oi^ zR@O_cED5izlvFGxA|ee94H66nrKzb&VzHPc+H47}SS(suty)=m067_t{f23lPd#^; zfiE3&?%#zt4m~|RD5a>Xs-m&65x2)nN!=ZC^70k{hXHc6vT}gN$(y(57wq20IR7HL zuU#V95ylhP%JmyJC@U+Yxw)CXzCPwGE+-w25r6Y~{@#N8ONLgKA9y?c{$ujy`vLg- z{284!JDId)2YP7*T5C+xq`0`4WHL#mZ#LoT3V>xUpcKIEoi#L*{FRjyov0;p>=5$` zrm%c(4I)B)eLWtJ2e)S?Ms6;WN|m|>lj!a3<@EXEq|@o4<1H*<)y1>4b#-&E`wxLY zfWpGU>;Mf{1`^`-C!*0Pj^iLA7>2=nHJ1wi0w&zO#l&d}$JszCm13YHjHDcZunTwx z{4ig=D5|Tg8;PX|-;bCCo-|Y9G8k7{O4sFDfZssNAO}Z3&YK~L&?gy9>10yA?Aa>8 zg-W7NA4$;f6|JmO*&w;KvfhN2mq~wHXjGF_JSOcMt3@kIw6Z>EWsM&K$!ACUf$C)E zx7PM`mHfPLhW^hsq|+e6KzkcKH?PtkvH>)(+Gj`lMq8$_z!9JZm~6OQ|Ht4s0Dpk% tz{$bp5eC^`0+wVLF)~TDWN+c1{sDxfQ5Q-(9321v002ovPDHLkV1m<|dB6Yw literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/note.png b/Icons/map-icons/classic.small/misc/note.png new file mode 100644 index 0000000000000000000000000000000000000000..84a5dae880a8014eda8bdd17922daa73b6c06a34 GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D90{Nxdx@v7EBg&@32t_6`=;A3d|Jcq-)xsBl(cPp#&2?1?vBe0-x&{HuoRukj=aP3@mD?DYB8(EDVIvV>QCA5 zO4{KPr%be%mgEADt}Ed)7X6c){v{?aX>*nQqO-sLE5?8A$(=aii&ViW2bFE*`E!

      Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO7- z3m-BOxPamS001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00Fs4L_t(I%cYX9OG8l<$3O2mkqMg{vaZEsuxVQm zix#s%WWit%45CHQqDk?`KVY&c8fJDA=Ejl?(IjqS7$`he{4wU&aG2YhPY^uth3`H0 zp6|Wqe6J%R{t@nP8^t0dlko81&mSMd#>OuKjRt&v8c(Mon}v%Dzrgb|R4M@ir4mFU zhIkx4K45VXrlo7M5S6AkFSC<{UyMz9INF+KGC3JIxVlh;$ zqJaUlvxCmh(fYdena!e52#t)Odfh)0B($)AmX<7WaDY-NC}EZ+8fI z9*W1&{kBN!it!9i=OuMghdjIXXjCgX3pR)dw5 zw#4Qp%H>*$r4pK)M41e7UH|P(xGpLb?7UN}p>|sU@_BRP_O{I~$Iy)7Vf*%999RO_ T`2qvc00000NkvXXu0mjfb;%A$ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/surveillance.png b/Icons/map-icons/classic.small/misc/surveillance.png new file mode 100644 index 0000000000000000000000000000000000000000..c45b9d9e21bfeaa6adf1fcc0b86d2278505de02e GIT binary patch literal 482 zcmV<80UiE{P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOT1 z0X89Sv%>!X00Cl2L_t(I%bk-yj{!j#ho51y37MWt5S`CJ;S;Pzf2CS?g+#KQT%{3T zKy(t7M5WLQrCN|}#Ae$S_Pxe#kmcMx$*-81_usrTFMtNV0S5>G31!>1*tRXVdsiFh z>Z1*y4SexF3it?p62ND4q7;ARGXZ47m1SA|(z^k&>Uu9ysT9-clxnrg@pxo7 z9J1ML@O__tzyC6d08+2l<#am9EuQB|x7(F`J}*kC$7Y5?wAM18&*d4e>q@87kwT#m z7YHd9i?UcO~=d2hXdQ~ z_Pz(9wANCq)nqoC$>nm1vM-lQ8IQ*@nM|b7XhinWD?DPFCY4HsX0yp^wZb$_%H=ZY zbQ;UDa9uaPf@e}nNvqYm%N|w`T)*e97=}SInZ)<~+vGU!RuLm70Sx#*173~u6WxvT Y4_m7h>K{-^cmMzZ07*qoM6N<$f^fag>i_@% literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/misc/tap_drinking.png b/Icons/map-icons/classic.small/misc/tap_drinking.png new file mode 100644 index 0000000000000000000000000000000000000000..609c2590f1267207c31b120729c4851dc7cfb37f GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eK!3HFi66di4DaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#X#-XL734=V|E2lkiEpy*OmPSqogPo@1E)puYp1)C9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(EaloalZHBUN2@xfde1!XRb346b!ndu|zmY{o5k3sNZVS9yv!u-r%}*<3^WV zqf1loMuCk2f-cNnNl8iPl&bG=IvE+fId|q?`97ukr9HJ%HneEZd3=Lo<%0+N9YoIU z{gBN#dB#yAy$_vHJH7{R=uByeOV&GE(4kZ%!P4ur&B)A&Rk_+TRXe3pRy=~oVf%!i zS-V5R1o^+(F52a`U*478usx07rDL{wjY}(-;Q}8 qt)Jokc&*~h<7Q&VSd-2u{9|>j^ojbyBb5paQU*^~KbLh*2~7Yqeyywk literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/money.png b/Icons/map-icons/classic.small/money.png new file mode 100644 index 0000000000000000000000000000000000000000..9fd4add95d037af4dcc595a790787b6e972875ba GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*bK<(E-n9)gNb_Gz7y~NYkmHh^zq?k6_(t@U&Kp~S7*N775{M_8s zyb=cIqSVBa)D(sC%#sX+kc?CXcTe8{E}zWg)V$(UD}{j4q@2uTm;Bts%sejnO=h=& zuF&&zaSYKo-+O6e))Yq()(840yQH0FIXI+AuhlU-`_4y-oBQA?BmW6koK~6qVoJJq z*o#~KfSZe=!Gv>%whGDa-Y`Sqq?`I#eVy6=!}HCb-#NVZ`JIJ}gS<{_E|re`QzRak zT^o>HYb4b>?beU%gr1LL^BxO^86MpHvgB8i(abH}!Crf#URUQlHrERKAX#2~ZvVe8 z-^8wY_r8$v7yQ6z|IGDzOT_HM+dry4|Fh}r<5Pc<4J2yv_ps(DwhFv!7qFWawC}I> zoYFVR{N++V)Zaaw(;uzwr1^Bwluu?YA68mkw=ydX@~XW2%JA5YTekJPuL(_8wn*~MRoJ-sM=Xycg;e~bk_czM+6iz6%`?_B= hIYzes`0Us}qJ694WP=WR2mnK#!PC{xWt~$(697U-&3OO- literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/money/atm.png b/Icons/map-icons/classic.small/money/atm.png new file mode 100644 index 0000000000000000000000000000000000000000..c211aaccb05fbdf0c0c5afdab44ee50e9b4e4b69 GIT binary patch literal 606 zcmV-k0-^nhP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4` z6$lZC`C-Ta001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00Ev!L_t(2&vlVKZ_`i|h95gOO=VX!2nPa6_>#I+ zRfVERQH3G~1{nAY9hjIIm=I!SK#VW}RR{h7bOgZ^$WRbNK_XyolQtw#gRgGv;LBhs z#6mvXd(YAPKIa}wN@;q%9$IU%%C>E))v6Hy_aAO^xO92ejE;Qr$0{>@wD*!%&+Z}s z7MIJMS-k;(>bz#~*T zhbLH8jz4-tzIZO%dExj)#L{V^@lW!_3wRrM{&${E0)m6RgnR8Kx$;LAPp+cX7}S{X z_b&h}DWz$*+YAPS%nJ%3Xf~V41%(iJo`*3pT2H9g>-fHp@B4|PW&OjDQsOucVHmQ% zFR9gPlu9LB*G&!E0LB>NI3|u`R-SJ$olfcZ`zWPQN)ZGBVHl>r4&dIcPdpusXti3Y s_eP_UEZFUKiK1xMs8lMm=(#d~0oiJ&EJU|j=l}o!07*qoM6N<$g37o4r2qf` literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/money/bank.png b/Icons/map-icons/classic.small/money/bank.png new file mode 100644 index 0000000000000000000000000000000000000000..13635cd3bdea8c2be4cc9b917c9383ad369a7df3 GIT binary patch literal 672 zcmV;R0$=@!P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOV> z2@fw3M~UJ9001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00H1hL_t(2&xMn}Ygz#i$3OlcFBDV=q@;6Dc#${M zfI~nGWN@;Bi%WFTL2%H)#m&{tA({LGG6V_1twRDu2=Z(OLD1oCEkUiIB*EuXdtFQ@ zF_MGh;O;(rhx?vQMA#5^KmlgJ-}i>^g<_hf+VA(nz!$)=wjm;KQ!!059F0c5tE#F$ zJUrw@WLHFN|L?6qmSu%wvDghT1uRX|ehvnMZzA$(6R6DR^Kd*Ke}QC`vp^v5V>B8a zi-__TR2GXxIFU%aLaM4tCX*4H%_hJ!7!2Ny$KzKR5mA=QWjK{e-2hXE!y#v9XJVSB zh=}xhJ@IrL55WEXJ@tAWP19(#S^#L8_UGi}1r;P)00009a7bBm000XU z000XU0RWnu7ytkP^GQTOR4C5{!OcpPQ5XmC|MPLq`;N{O5<(xA5M~p)3ZX?e5!9k~ zbq|5Npc`@9qD>bNQ4}poj3{d1Mr{y6C-r4!d_T^4o_;?Xygbi>$Q)pSp@pcj!lEJu zFG?>1g&;9_42S`mqGs}xJaf!$m^qVcQ1figW(*jJ5J&_}u62*^-Kd|eqH4Udj3$5i zC*O_=hcLA(^BxLLT}NI0$L3C~RG)(m>I!4K8^;w@1sxRpmBA6rJl>a$0bfOlQ-$`PCnOvaL}f zqH9r>qFsr;+>rE**p-0IuFT$6{hi-Fo>6j+4Bc3=ma@Ris6c%<(_uNd zJMabs(6~+qljg(UqF_$!4KjTnO#+h$lW+@Poae>JwNYmD2?t&Je410M6XG%W*oa0i zw#qVu7`Uh4d91JL{p;!uz!GwC5x)S0L&~$qg z-o0lTI|l*@puZkG)2@}ABzK|fa=D;Y4xrKz66&%)cYCOL%5BT(oOAOZpf3#BEnPA{ P00000NkvXXu0mjfnfnM+ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/money/exchange.png b/Icons/map-icons/classic.small/money/exchange.png new file mode 100644 index 0000000000000000000000000000000000000000..aa83e87faf0cb909efe113b5645e2a0fcc405c89 GIT binary patch literal 629 zcmV-*0*d{KP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8xJC3Xv=jsO4vG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io$4Nv%R5;6}lfA3rKorGKj4_oc(N3a>t+j=M=|u1YwNR`D!NSTyL0iGj%KQhx zBAuXB8nLj{R-#S74-geBECju;*fnoOWtX=X28KB^zqxnL9fpVq{}I;BW`p^B{-eW^ zBmwjEuZR}OeU~cEO0m+7>~!FAMulrN~N$~uW>jWkjZ4Q-|xXN z4BT$_dw`~CU|H4_(&;otqY-$Xhad=OG#cPI4uL=bJkNg<{>24`VQ4rUQX~?2bs?Ed zV!2%6cDq5-G}!HSgu~&dG)tutj>jWJQA8{jgDlGc0I$~z=Fy4eav6dkV6|Ey8jYe_ zt(pMCFwkr^!Llsc?KV6f&o`ZZhsWcg!C*kLER!Tj^k?Y0PUrKP-i2vnFc^fYs+dlv z2!%rC1+`iYi9`aqT<(3#KS-z3i8`GQ$+Aq>>y?Ozw%aW+3`2^dP&^)|N~Q9WfoY@D z=|sI=e}X%mPKcrim&=9w{SLq1|B?Xnx9>ciPN66Y1VKQn)q>4td(yuE=+6t=WL33| P00000NkvXXu0mjf+7k^l literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/nautical.png b/Icons/map-icons/classic.small/nautical.png new file mode 100644 index 0000000000000000000000000000000000000000..f728fdb44a1c092080f096500711d926450b2454 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^(8<%qF~s6@a)QK}12Y;MAKFh*ezRtf>7NjaIxF8R5MnR#6Do6K$l z^zlY*C7Lu_Wdl50xeo`PW}(%U#NKHCmuX%Eh0Gmp5uyG8`pNOxiKMM zB>bET3pNyTm27A|!f&MVVc(xm6@v4g%f?)n{m^`#y{SR!QI7$S{;H<$(V8owzBA2P zd1RJFb9$EM4$Y434vLJ4dN<@BRai(eY3OogAa1$ zO1)L#yh&@l?|TSADRr+hxCs$UDMZ9MzgLIelJ}m75D@^h);Z^#GXUhAg%H--hJ9V# zjR1gg9Em8UbbsMt2IpL@HOA~TJEe3SM^8kpRckG!yoUT6!e-jF3#j^*00000NkvXX Hu0mjfK_rkq literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/nautical/aqueduct.png b/Icons/map-icons/classic.small/nautical/aqueduct.png new file mode 100644 index 0000000000000000000000000000000000000000..6fc34f64f260769f03f06a836a9c8168c137e694 GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4Mt%h1{t?&=Zb(rCMB*BCC>S|xv6<249-QVi6yBi3gww4 z844j8sS56%z5!f5naQbn#i>>b0i{VfnaM8sxrv#1T=JXDZUgnt_jGX#u{iy9(n7vN z0X(kn85&(|dTW=>Z&1EH-^SMbthvvZ$FqEV?HylvOiOZ`EGXnMG3M$Q6ZPCn$IkFH zz7aU%_}Xz((z}}?( YKDFY%*F=#=K&LWzy85}Sb4q9e0Ceek4*&oF literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/nautical/boat.png b/Icons/map-icons/classic.small/nautical/boat.png new file mode 100644 index 0000000000000000000000000000000000000000..8664a89e903f28da445922d99c3df6ec1510566d GIT binary patch literal 559 zcmV+~0?_@5P)L-ZKzX#~9#R3Mb) z9HW$Z^Iy)jsW&^ld7fUM4+Q{8y9LIT#MsGGVIR@=f6d=pQUM^7`|WzV_>et69hYWr zCNMM%bUO#w-fdw36U0d#GyuHq_V8ft&h>Gpb0PI3|6LTrN-P$~*3S&sl@M%jsxsi4^2sgy#D%^o{?Tny2Kgvu3ZGQF1NygYaL zY$QA*?<+|dB_diiSVn1M6{< zvQ#0;zc$9WBj~7_wOrb2O)Sj1T$dTJz(l z9eW>Gx7srV3Q5c4w|EQ%}0#agnp~jzJYDhYf zs2Gz{7B7R7CN3Hm69>fsp4*B|*A{5rp`XXjRMCRgCYM3h9%z|@kSp=VR%6g>y) zYPL6sr!sW*d}gs&OEj6KRwQX`FmS5L#vz-ryg@jc;Es2Mw9d>zEWuGrfv$@#b_iwD zqyiusU*+}3Y5G3R;C}jr%x)Xu$P(uqI&NP&rokSM2O$JP2s|E7DM37y;lZm>tX3-{ zp%_ZlekQ+#={Tcu`f&Y*6WiL_P*s&=GFdVh3oWACQ_1YyEV1PR%Y{5QPS$M-1Ni-Z zB9RCVhodxtX|I9wN{o*4N2se7tchLx%H-EU|Nb?f&xhCR{VTfNZmB4WG&?WLai(eY3OogAa1$ zO1)L#yh&@l?|TSADRr+hxCs$UDMZ9MzgLIelJ}m75D@^h);Z^#GXUhAg%H--hJ9V# zjR1gg9Em8UbbsMt2IpL@HOA~TJEe3SM^8kpRckG!yoUT6!e-jF3#j^*00000NkvXX Hu0mjfK_rkq literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/nautical/slipway.png b/Icons/map-icons/classic.small/nautical/slipway.png new file mode 100644 index 0000000000000000000000000000000000000000..c46bcff333e63286e2e532c2231fa89a5270b22c GIT binary patch literal 432 zcmV;h0Z;ykP)$s0003`NklAt56ot=wFId6t z4Wb}Ix@2?-q98a58JztiZbG0P939*R^CO(HXc4!Np&$;9Ep8I&U?6fjv`B3%M4bA; zg~x?^-aVIl1xex#B<>`$K$0W~f&in@2%F93oHw!x#Bq#nw+q|0k;~;^S=MbG6bc12 zn@yOeiPdU_^XPa3gTa7GDHe-G_WOO3WF~?2dd=~8%zC{}DJ7LsESJk9$gTrRO#EFgYv;_-Nd=Xsb+CeT`=)9IkqYN1xE zVK^KD0IJpMh2;x@!{LA=Nf1R5JkNuaGF9*!^eP>{XE)7O>#2BQeCItNcm$vmKtNr`JjiF1B#Zfaf$gL6@8Vo7R>LV0FM zhC)b2s)D@(@g)cZ#v*78vf|>P- zM`k2V++fHzqa;oL#-mvqisL7EFY;u{i88C`6>xpDQ*HPEC(5>rM?*E*b{1}*3v?iZ Mr>mdKI;Vst0K(94(f|Me literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/nautical/waterfall.png b/Icons/map-icons/classic.small/nautical/waterfall.png new file mode 100644 index 0000000000000000000000000000000000000000..4f75c5689f4758996784cf4a86b919a9bd43c8a4 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yMs=Ps%(fW|I8&HtF#M9T6{RStuxHxau=Q%z=A=whwh!W@g+}zZ> z5(b~lzlI*C7Xi*8QfgET!YocZvvB3q?X zDk~s(EB}n2F{d^?a-MhiVZ!sLLdTK~o}FdAKJ`I0Yh%gI6$+0njPJgW)J$3~{J=u7 zkf)n*SlV+rrC06oj#>FVdQ&MBb@0Q}sUg#Z8m literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/nautical/weir.png b/Icons/map-icons/classic.small/nautical/weir.png new file mode 100644 index 0000000000000000000000000000000000000000..bdf52c5879f30a4d99b8b2155299d6dcd639dfce GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvCMFSPKGRdTK*pGqxJHyX=jZ08 z=9Mrw7o{eaq^2m8XO?6rgk+>DxO@5raQS2=r{)!>S}6pSCgo%%yX5C4X6A9pZ!)_L z)IZPD#WBR<^wUX(TulrjZT6~}g*kJCxs8VIULxQd-uKR>5{$w1Qy&fk!q{5=xI1=z3jDA*y`1jHJVm6=~TZ= l*uxODyz2jl&Up41hUw2&bZ%2)D+jui!PC{xWt~$(6987sf`I@4 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/people.png b/Icons/map-icons/classic.small/people.png new file mode 100644 index 0000000000000000000000000000000000000000..8d4065310aa00535d1b7faa4e65b501d7a5f9345 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^oIotV!3HFcc!W9wDYhhUcNd2LAh=-f^2s121s;*b z3=G`DAk4@xYmNj^kiEpy*OmP`J1d8XMCpMo>wrRgJzX3_G|sQRXq)8}D8TyQ{O@^- z_Ij92Xqa$LYe&->htm^cQ=(V$az>;uE9xCk<8tB>{iEnwZ_$K tvmkT4MO@y;s3ni$_a3c|`Psz!hq3sFwgFFtry|fJ44$rjF6*2UngDt&ZdU*R literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/people/friends.png b/Icons/map-icons/classic.small/people/friends.png new file mode 100644 index 0000000000000000000000000000000000000000..52a64b8181e3e276a91b04301fb0ff1033606d2b GIT binary patch literal 517 zcmV+g0{Z=lP)_>X_`xP{^BIs##9Nl_&Y{V6t4ow0bR1tNu3I8h&4S}q^FegI0r<~_ z*ek&7P0o&FnGwfjAEZKfmjtQMgd%zpOCvk}g86cb*8sW^V_w&Ao2`L`Y)}y8AOoJP;vBkP?u51CR=pl0@R+mLrH_1ob=U*+bOQE?j;Agw+)L z#WAF){h(S;UH1Xg^Ezv*3APsB2TULXWbXo3y|_9>%J69+=@P$pxx8rL%=J{Dwbly( zN7R5pUSO)N=GQ7F$W$xsN%NL6t6^bG(2Qs)OFkjrIo00000NkvXX Hu0mjf!!+GJ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/people/friendsd.png b/Icons/map-icons/classic.small/people/friendsd.png new file mode 100644 index 0000000000000000000000000000000000000000..33963c866d530be7f55a99bd3fda7e9500430617 GIT binary patch literal 693 zcmV;m0!safP)L_t(2&rQ-@OH*M02k`&%oR^)Q z9p}_@wk1hwUf3In=~FG4WYZM1KtJ&Rl~sMRums2k<5Ov z`25W2o+tP3%_d@rC_3A^005jI%e~a)nrZ9ok$v7Ks1k!B3LqQ>2!Wz_QMVoC)7saw znUX$qb?Syu7u?$;6IW{QUeALM3gk$1JK^;o)}fU$XkPsS6AVd0VTms2f((HZaiUVB zW~?xf&BjlzudfY{pBsMg`1Y+FFT(K^6LGp6d5b_Xi;!eN69w1+7#M5-78tsj1BU`e z)sYOV`A$A@(Bo=tyURW7KYG4{BCLrb-K`kV^)hjN<`9zzDz?1EGKeigc+= ze{FBIC)25AzM|`cQO5BVNrs=#<8yf*UDalc1T;usAeIHwGGUq~GSwR1yHyn1+fYu& zJ#s!Xz*SlT)7sG3p}x=<()Bu$*)&!RhHn-WCMc0 zz`*Lfym!rxj*h%8GjCkKe%+x*qKmsv*7}-3`nfs3_LZl2+hS?oENW_kCT8 zG1O`#aqyR%>EwBGeh2<>O7nS8f>I{aEoCxYAoy!I(7JcfY}$in(*|1imPypF;Pn-K z`09D%#ZILvwPHzDv$@7`7(R_><`WSAPLP+4^t;XN`pb>_n)GwG^m7ImtjN??jo~z` zy2yS6%pH)rC-CKUp>@<2IWng>590ha&a;Ro;@;{OZ!Z0xuedKDuQct?`#iA~`ff;P zw?|aG1q6Iq=(`}0M5sxHt@0)kf>;l5OTWD!aGqmehj=0M?GT%?l)q>SCt0q(8YX`d zM8zqcz4wR_oac!1*Hn(nOrOn2)|XfCfim#OozGM>oSO)N=GQ7F$W$xsN%NL6t6^bG(2Qs)OFkjrIo00000NkvXXu0mjf Dq0r(~ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/places/island.png b/Icons/map-icons/classic.small/places/island.png new file mode 100644 index 0000000000000000000000000000000000000000..1e0464c2dfed2f86d40334e330790d5ef7360fcb GIT binary patch literal 602 zcmV-g0;TPx#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TU7i68AJj^8f$b7eXpP<3K#X=6lhZDDC{3LmmI z+W-IotVu*cR4C7-lFdsLaTv!xzu(MnXJ&VH8EdsgbQMY@>}14B9$Zm`C~7<8EimZh zAte6^!DAOsiUb{ku2B?t=+Gf3Sr8LkcZs%FcVQBBUz(W?x`LP8m7dGh0(Tev>kwd(YS{O{Sr?Px-!tAD(WRuGN85j%4+ z9i1!Xs$Qg1AJvrjrYsq3y>jmr*ALz|MF4p2*V@jxexpw}Wk#8jQm&f+u(CV6_oKek zas_~)+s=xUG`e@UE1Ts)?a8I_=&jnmzvUL|pW7kLFk{+%z`iyU&jaBrnU1;9*{&C7 zqJHR(^Ef@9c-HX4=k;kowp*{?TSc!|1M{fi6EjBaUl?%k9$}l|MM5wH}81+@soI6 zEFTRKK*x=7<}*_~Obv4(Y=I_0N+19~IKH^eP>{XE)7O>#2BV0eton3?v#WqYCMB*BCC>S|xv6<249-QVi6yBi3gww4 z844j8sS56%z5!f5naQbn#i>>b0i{VfnaM8sxrv#1T=JXDZUgn-_jGX#(Kw%+a)7C* zxHx>*jvY6Yx?}g()keFzx^nG`63b!x^Xu#DyU)+hKd;#R_vh#5jLaJkT)b%56|vQa zN2Do`c|`)lwvq!s-rjb1w9aPJ*Gy!~3`=X{_m4N&u&3^H!M{(sZPF55k`fXUTT&%j zWMm{Cm6%BCw6;p{JW-JlQB{?Qh@99{|FiAk`M1A$zT4NP?Wp_7c6g%jatX1ydk%e= z6c|5w;mu1e2hX0J*7*5+Jli$>c*z-wvwl=a{4+8({*#`R^dKQ6DdG2*nT?&Ttq<+B mxerf2yj-GA#^TrpR)!g8oTDCHp49;KDubu1pUXO@geCxn+?mk; literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/places/settlement.png b/Icons/map-icons/classic.small/places/settlement.png new file mode 100644 index 0000000000000000000000000000000000000000..85ced63a30e0df2ac707e0c274b5be4cd995aeaf GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^@VuvsV~EA+y^}Zc9x@PcoqySNlX-(+M}(4gz{E+M5y~^0Boo-9 z!aTg)Riu{qI|}tAPibk=pPMrO{r}H*ZyE?Q{jC11eRInl6`oT|CfV2vr@T6$rX+S` zp^w(>uc9|y7EHS^`#CpDN^P~mZl^Lvjk{KiUfkC?d8-sslFg%&W?4Nl=e!)iyrlKD z?A=@97iOILThJ~4#rOA``ZIke*8N_Y5>$Hdt@^YpiJ#@N_f#g#TKHbHnyD<9^-t!{ zy`PpP%*xp2v&v~w`o!`NvYY>%{r`dGp+wG3xBYgnfL>Fp3W+Fj&d<$F%`0JGsJKf9c) z-8#PZo$H&60;(FPY!-@dY?x6HloK_h!e`qr5B76=CE|;!T<@&pRdNTqS*mdKI;Vst E0Q2Z|X#fBK literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/places/settlement/city.png b/Icons/map-icons/classic.small/places/settlement/city.png new file mode 100644 index 0000000000000000000000000000000000000000..6546bfe9e7b11199bd456ac11062a4ba6a446272 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^u*K8GF~s8Z*-0CDTMY!9?=MZ8mUGZ$&BXnpys}ARRl$G$tnU^Q zSaN96QjzrMZ&>2mHB^rkGG19MzCdH?{hbGy!Xz^+wr}5ispX#TZl1JESLVQ9TOMh+ z?{K{yocFKshkpRWjWf&kgqiE*uY932!+6K$I~}Zw2J!e;* Ta5}XBsDr`N)z4*}Q$iB}r;=zh literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/places/settlement/town.png b/Icons/map-icons/classic.small/places/settlement/town.png new file mode 100644 index 0000000000000000000000000000000000000000..6546bfe9e7b11199bd456ac11062a4ba6a446272 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^u*K8GF~s8Z*-0CDTMY!9?=MZ8mUGZ$&BXnpys}ARRl$G$tnU^Q zSaN96QjzrMZ&>2mHB^rkGG19MzCdH?{hbGy!Xz^+wr}5ispX#TZl1JESLVQ9TOMh+ z?{K{yocFKshkpRWjWf&kgqiE*uY932!+6K$I~}Zw2J!e;* Ta5}XBsDr`N)z4*}Q$iB}r;=zh literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/public.png b/Icons/map-icons/classic.small/public.png new file mode 100644 index 0000000000000000000000000000000000000000..4103e40567b10304c48d302be5ba29bf6c413e1f GIT binary patch literal 1166 zcmbu8&ui0Q7{|ZKo4iT8)wZ^#T`Jlg#%@+oa0g*dJJupj87g>l-j#v=1@q)}-bC5- z;z1bbLA>lBIz$ldNp@&;h}%kwEd8;TWKH7xro+=xR(-?!yy4CB{d}J%@I1UaJrxS- zK>(qAE<3}{2;VAY@p!|XWe2@|X(|hsKT9hw9{7X(zdWgY zQ}skN_3?G<86c(d*@c9pp>EzkH`H0e_ME` zD2Ltv(f5?bjCg!NqEvJ&%Vi4A(2nj-eB}4=Nhj4?{Qw8 UUyzr^Z&bK@esVgyeBsvoAMk#$i~s-t literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/public/administration/court_of_law.png b/Icons/map-icons/classic.small/public/administration/court_of_law.png new file mode 100644 index 0000000000000000000000000000000000000000..f893ceba33fb349c56bed885eb99b5b7b36543c9 GIT binary patch literal 535 zcmV+y0_gpTP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4` z6($t(l$>h-0019!MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3JU9)Zeaib z0c=S`K~yNub&WMSUolG5Owqq2%ZPpY1uP_ncn9zv%b-wr&3@N$`g6`-{b5I-R!L?PM~kX*aE}Y&N^w?H-SZXxnzF zRJz@6s;V}d%?~#s8itX{WIWH)b$vdcOQvbcvP>yuj9Hd-I-O#%*ekHvY}V_wVHoH0 zSy7bLY6Xttq*5sW5Jj<8t9`tQb6%}h1wjCScs#ybF5$VM(P)gvWBiA~U{J5ux7#fu Z{s0FgAw<>VvL>4nJ za0`PlBg3pY5H=O_8W}CLhNRjbS5SPg-l9ZBTAg}b8}PkN*J7rQWHy3QxwWG zOEMHfGEx=XJ$(bXd@_?$^NLfg6aq?Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TU7k8xU*J*#H0lG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpA4x<(R5;6plg~~QQ5=Q8`)BCPw5ER&Qkwt?ab@E@4yrI4koa$ z8+74IxI^9Hf~B^kX~32-bY|L_dw(tl1!{=j>YmNHC+D844tIEhqOTMiT%p7exK%V3 zPf20U5aqau2tN>ZEvSA#*i&c(Pf5;-TjkN@4Wa9in-SkSd!+iDi+L9>0a_KbYU7@! z?At(x8(p>th$%=JbA-YYx*m~RuM%NN=J(k@-e;Px(+&r`di*lzM8gfM&;-P+s0IjB zNlJ1v0w6adgc2tq(|n!tY!d({762=F3Q`a#ND({>bH;IJ?^Xv!^=O9!0NUXIqsl7X zhi6)%W*cn`-Z`>lig?d5&fDb?o z+xD-vizMgd;0wxV#CaCU{7wVog;r7xs+Bm57u5Twi1H9-par~wJOa@-R;MgPU7QU_ z>K>nuF=at>=CJ@_4qKl!ai&Nk;b_Z~#W${wyDYZfLSv1_<&c$6uTitpY6k$?L!2oZ zv#LP7{E8}o#v0t)yw+D(0Iwm9s`AoE@OsHW3b-6r=gVQG|9Btn@LdbNFemt52j~EN z0ofRQSs;uouPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOV> z2@Wd{F?_lJ001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00CA>L_t(2&y|m{OIuMG#ees4MI+b*Dr8Y`mAbj) z72G;V>ylO9l)*njf=j31Ac9bYY$dw|M{!V^$!2hI2tq(Xg=jE&n8!=*Jr1oY=%NSC z@Ey+i!G|Q?V~_*+>uY&Q#`X>m-Nng?;h)CR6hATXeDX1yC1|zqNkWjxaJw;Se$;aC zrvTrUu-#_U{0f2*;6uAjcV=b;_;Pl}{Nf_nwKaUN$Nlau8^2fS?e8P^8Os|qxV$7e zJ;nF?3~z4mam-{G@_2mg{sO!om5oH;-2b&iXK#;or9zO&;QM_ZYBl5>`AWsu@g(8v z&JJU9bNn=hyEtY&m&2W(17IcmV1Tg}4Tm&KB@Q|rO5T$P?9}oyv#l0a`8?a@GLl%? z+~m{3!mC&8^fcd(j%YL*j7Je$g#t)2l1!SWCW<0oEEW~VaqyhKbhTRbVHm1juS-(! Y1TWpvhi`7TJOBUy07*qoM6N<$f>?gyLjV8( literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/public/police.png b/Icons/map-icons/classic.small/public/police.png new file mode 100644 index 0000000000000000000000000000000000000000..d165e78d15961741c325164a3e285d0c5f7dcf1f GIT binary patch literal 761 zcmVc<1fR^PFR$B$7I- zb8_D&Ik~SKqpGY`m7?iSl_bk_Y%SgYX^b%iRm}j(WwYb>2$#L5(7VB0nw{4-tDXdC zsj3=PrKiX2IJAc=D}hg5=@{r^XrLED#Mh=tCZ-r)X|b5|48IxU;?xg)Wq`iJ`?z-Q zC>jE;-NLuq_!#gZkPBgTj^sic|NI^4i!shwRh^lb;#%W7`4I3DaUwWT+^g5jiego< zBABd&o1W)tmg$5A7_am6<0P%v#>I$}h?|+F`QY`Pof5GkSQYHdJj);IJOr=+sv4Fv zezXGabB&*qlPur5JF<{+a_7@0e5u!2nro0YTcoO*{*$VO&e+D?ymunZa^r~5S%AEI zRBN8{wff=!yGD2KZ&r;lMpf0W##}7ssEFV%oPSUqqH;!}=P zhg|2K3#Sh+^l@x-^x0rT0yfEEw^TR^V1V4&1Kc0(r=p6Dg3U72d-4*nqWCOBog-1f zeV$|C#TWMbjvTxDyXg%PL@+8?XR$HjRDUydZWT$yZt9}jWsJCzkVeNIRW_@TSc3&z zl;1o>a53PPSMZG`;-@)Y)~2{_R25^40V>_=*jg&Et*6Y;#u5jOk~EfhJiEaAti|}( rMJ9l6sw(DxZ)J>G4|r8=tfl_~Qqw)<>&kwEiZMxW6wEMX{Jn zLNZw+m-}Omk6ZME=I4!y#X!Cv3DlP(Baw2sKx1R3*E~08lt@%$+xpb}#-Sm}aVi=e z?KV-N5XiFrZ+@dO(!@jnV6?L0adL9a>gqSXf-r27&1Q{eX39J~{O0Bc4iDk%3|?RR zn=A_o1=!et*;#0}f7mpeB`gbWZ^3n8c^UTi;qA=MWY;JZN_rvfoHojlu`T0BPG?dGOC6G?Xr|Z^?78gCPuCCeL{aTC%2Tc-* zY<$DX$w0;o{*gfP{h<4Hu4^5r00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4- z6(b(GHwG~P001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00G}gL_t(2&y~_$Xw7jL2k_6%v3Wh)SqEcCQf7?{ zFKxDR!IkV{iln?;X>s8aEs9LuN>NgZmfBcc2+0a*NkXxOl}&ABGcTJ)J4?>C<6_6( zIp)Uq?)QCpo}TCTWceE_Rak1XcAw-bRcvlbNosRelZJGARz`S|8TM;eC@O)guGwO< zoRr?J-*Jl!%fUwoWfa(?R-q`!#zJwg-3#=&VzzlDSHW*;LLg36ti;aX{n?N^4vUCb zphbSlJM5P4T7TQZK_KC)5nUq6L`6Ju%nLV-Di^cNPlMj;Rd0ug#eV1=3+Ae_RioV+ zZFd<3);fSG;}$$mk!rV{lvHZ{*a&gW=DTFR7#P&$hC}1R1LPn3z$YLqcg^Ibhfo>%{+TISn};+G9{MV5Z3r>(FYt z72<}xQRkUD2|XFnavKbY>h@TkJP8xM_0o0w#=4g|ZH?-2J=iW9pu>F^6{|KPB-=M%bZS=bzpzAw$twOO{Q~xMhXABPVPpUR002ovPDHLk FV1n3PA{_t# literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/public/recycling/trash-bin.png b/Icons/map-icons/classic.small/public/recycling/trash-bin.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6bee9bef8e370c3e4efb598f3094895977c6ce GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+g!3HExhN-duDaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#X#-XL734=V|E2lkiEpy*OmPSqo9Z)OZmd@|A0a!C9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(pN;zsA zX;ME#*zy)MF~3?>5t;AF`S`+Sokgs?p(V2aoI}n3%kau1EvlLLRUz&O*RgtMxx=Qj zX1sAV=xJ3j`zV>d|HhT+0(?pAxpN+h?Y{WCEp<*<;P--tg@5P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOb( z04oJsS{RN1001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00J3FL_t(I%Y~G`Yg$nh$G_K96EL)*NJQE!mYNiV zG*D^mB0}h2P_i{+aC#jglx&%bqYe?W2l59L+Reez6r2i$7867ArU|Ly;hbSUXk5>p942KWg4 zX*3${*4CEmIF6gmX5C(|_Y-&tgaJ)+0Z)PN$H&L6{R;;N2S}pbZvO^e1JPN4keA8H z$%&uUWHON?jYcCQDJ03v(!dAY-roKThC(vN$O=5yd_XJ~^MmntT=jZgg+gH=z}H}N zbJLaNW-=KU7ywtm2OtM5E!1FRV?&ZO9*@1ym87?lI+7*}OUUJNlBDbFYn`8;M)9$?u9n%!=9 zkV>V7lJ1N#ZmCpq^Z7j0YL&IMHMY06>2x}MPoJP5D?kbOa&d7nj7FoLs7N9biEwmu z#LmtR$z*ac4Itn?@CNwSYPIeXiG&aEd~a`$TCFw{5CYPG1GH~$ZU+1N`>d|65)Owc z7K@ynoe{iZGv&c7NqQjZnWV~;AtO7b-b?yw=DfI-8DlOu>IQ!SWIz(3kTza~00000 LNkvXXu0mjfxQ8$x literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/public/toilets.png b/Icons/map-icons/classic.small/public/toilets.png new file mode 100644 index 0000000000000000000000000000000000000000..1a712bb3841ea59e1fce789842e8cec399b5dfd4 GIT binary patch literal 683 zcmV;c0#yBpP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TU7(CkU}iN&o-=G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io{YgYYR5;6}lRaxHQ4ofov+gcxmJJcoXc3~Vh8Ro`Z1bTTg>

      21F3SB307l zCup5N5D+UNouDZND-k7?MgD;wpg1YK*+dfWE$&oj-otqgGxLrT5#c{V`#kh|J&MI5 z{eIuQEEEb{TwJ($yWaZ&@I{b6aeaL)fZW{Nd`gndW+f7dxOp;}6hQ9p?_JFW zG@DIHr_<7EwKf8p&8Fn@c^QpH>ws>zE2&gU&d$!{^72yN-{02&i^W1prIH*T9?HSN zfg}7Jly1v$f83bz~kd1udlD{?d`FPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4| z0T?z}b&`Sr001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00KoxL_t(I%bk(UOH^SL#(#IdF3n7nWmBOQO4A3J zxQM_+qG0F`h!AaASkR(nt7sz>F3NQwwNWbrD{>)0izr&yrWUR$)A6fja_-!@Gxz(x zZ;NhFGA`=3c{!Z-JUr(-3Y+jHpI0k}F|bxDH5E1O@dZs=1E{{ctOjn~-F|9J0z?4v zuY1n)JUcquHM(yuH=MbCWAL!LBa?ZVNu?gBiNuH>1RrP4pXl~J-=2x8X-oRn{I{u| zZh%<-^0};4sZB{CQl8~vSIwbf#OxD7bSjF1q9`C`HkZ%6m4P2cN~92N!ZjxrMq3WV z)UC;5LWq=8vxup2qKO#kn$o#iDq%VfHOnHgGeP!HJnCqR1dc)AR0-T#yY#HRG2eEV z0@p_b0a6H%l7eEeTrA>x9%WsJY=Bc)LW#r?o{3*y$2T=U@XShNeD|Zd`no>t7#5!8 z;5#nw_vp^@kK+7Fu}E3hDK8j~y zx2uU{WwRbfIC;EX zeRDV8`{~ZF)kst7#KJ8s^m=GTYS#seO#jHKcCD0!q+jEiG{iTe$ia94`>C0r>mdK II;Vst0MLOqPx#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TU7>3B&mMegFUfG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io2}wjjR4C7V(Z4IiaU93-$9+%9K(2GrQJm!#17)SeXz;7f#H5S{6B7gffQ1do zC>DcB27^TzC=0?ykwQ_H_m$3%_x65$UZ3~p^?ANiepU-=@Q$0%mQah?(EqJT9HFa1 zAH`UuIrYncHe6s2Z=ofq$0H{G8qkbZl<<-&U@lg5j^)_I h_sRy3TqIt=^%p^GHH^WSAc_D0002ovPDHLkV1nSXv6KJ+ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/recreation/cinema.png b/Icons/map-icons/classic.small/recreation/cinema.png new file mode 100644 index 0000000000000000000000000000000000000000..53b91aaf648db790f00b15d13d5add750cdb2be2 GIT binary patch literal 721 zcmV;?0xtcDP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TU7=I%PAeDF6TfG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpBS}O-R5;6(lTBz7K^TVL{M5MFCfdy;n@!RfA&N*%tc_G#(4<(kiWWgZs$K*^ z#FOI9i&R7rJbClyP?UO=_Fxd9hqh^2AxfbwY83@rqHVItn$6~CGagDpC`pa)>6`iH zd71AW2B;%1U?40z06>fXk(FibgxDTfi7k1iuaELZV}C;+F&YCl-tn67jx-s#p>WTl zlp7qT{`SE9Mx4G}bO(dsnI^tPIe$w7ebd^enS;sZaPbUtAfC-m)iS8eH#IhPS--k0 zRbT+16yNmb=0K?D)jw|#m*tU@CVe5Y^cAoO(2kF&+R>+lTt2UxkyG1R7{;BKC^8+?9WvH1OyDUnziU2mYNUT}b!;kcA?MGQ8G)!FERbq4Gt%NU-6PL2w<9E~*>QC+V zdN0<^pe%u9j|IBA-b}W3sx)*~hs`Vi!18ke%`fhLiM@~RsF^`o%b83#GCLR5yLVP# z09bYIf?KeAoP>lnGynjPW$V4Yi{laiKvkiceoM8t&xz5z8TJOwX+kd#uc33Op00000NkvXXu0mjf DgbzS{ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/recreation/common.png b/Icons/map-icons/classic.small/recreation/common.png new file mode 100644 index 0000000000000000000000000000000000000000..9276d246ca1ffbf14987b9489a3edc2d89942055 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp@KrFz)1|-ie{%Q%N7>k44ofy`glX(f`a29w(7Bet# z3xhBt!>lbCYGe8D3oWG zWGIAWq$;?3`UY_MWG1KP6{lJ$1e7M_WG1`h=O$+6amjBoyA9NT!qdeuMC1I_ONLoY zfdcIx@7rzXkecZ5Zo%9MO0iuYCp0fD@e=lM*f3>pBa2QkBX_?-m}U-BCKF?K!|?#c zvux9j*6xZoH~!x*DW@-}T-+PF@N?^Rg>ySXzF*9B*>)$nWAmjH>DwjE=N3BpRIQY1 z>AJk`!m3G^oIc3B-6M5$ok#IQrs6wRe%2Fr9^qkD7cy9>{KuRB)kgkTpCvxD-4|}n z*O~O^Ymm>!5|>ve|Fp#1dMGK+-XyK_vCmXx>HG^v)n~Q7n|o%F#Bb)`wK8{jzJA&U P^b>=ptDnm{r-UW|{*jL+ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/recreation/garden.png b/Icons/map-icons/classic.small/recreation/garden.png new file mode 100644 index 0000000000000000000000000000000000000000..72de705b0116dd9af3251495d8677bf54f02db85 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4Mt%hRWZL0-@AcACMB*BCC>S|xv6<249-QVi6yBi3gww4 z844j8sS56%z5!f5naQbn#i>>b0i{VfnaM8sxrv#1T=JXDZUgm)c)B=-Xq-=u+4I(z zS+k+D(Z%3~>5+MldToz-uVLE}^rvdZ2CYMj+jZ;{O!=p)s@y(s=)i#uH+W`Qy({}@ wWMH5%z4lm^w2Ne-^aZE>i(hv=SMZi%*lZ)dOsd8{1ZX~kr>mdKI;Vst08BMgIRF3v literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/recreation/music.png b/Icons/map-icons/classic.small/recreation/music.png new file mode 100644 index 0000000000000000000000000000000000000000..62493063c2ab6fc5b2e9463e28f3fea568139e9d GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~i!3HGN^yhQ|DaPU;cPEB*=VV?2Ih+L^k;Op8 z*Fl)kNn>^eP>{XE)7O>#2BWZ$riQZ0QXQa>Nr`JjiF1B#Zfaf$gL6@8Vo7R>LV0FM zhC)b2s)D>96Bnom&5Jnnv@(h#!Z|p8zlU5aViPNq5mxLU5#^InVd(?uTUE)-`AXsR~Aitw4Mwju5?}qm09oq}0 zi7aoBlQ~*6y*}gai{6y5)F}m$@edW&Oq05?I#@D(rg8IGpPEVeOckDw6m{C({@d_p jIoC&byN43BnFq~pU9|0;6PgkW3|IzFS3j3^P65 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/recreation/nature_reserve.png b/Icons/map-icons/classic.small/recreation/nature_reserve.png new file mode 100644 index 0000000000000000000000000000000000000000..fb0e0f130597794a581582616d7f17c4cd1ad5c8 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4Mt%hHG}OJ6t@C}OiElMN}Tg^b5rw57@Uhz6H8K46v{J8 zG895GQWe}ieFM0BGLuvDic_r=0!ou|GLv2Ma}zW3xa2pP-3IC}^mK6y(Kw$Rv*)cb zvt~nQql>`}(NGyd&(wf`%^CgEobm_^>bP0l+XkK2sB~y literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/recreation/nightclub.png b/Icons/map-icons/classic.small/recreation/nightclub.png new file mode 100644 index 0000000000000000000000000000000000000000..68154a8621a39ea7d6c0f91e813199fdc5c2bc51 GIT binary patch literal 673 zcmV;S0$%-zP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iFS* z0237IVSN<<00JRNL_t(I%axN~Xi{Mq#-HOkhSPA)Idx+5M3#ikY(?!1YNIZqAc9~~ z5p@?uSLZgm*j?Q;Z@LMht|}T`^bbNPt3_E+iRosutW7e9xZM16Jf3s(>ta-E=(6|v zd4JFQyx;fI_(vT*b70u!bhwkTXvuwW$Vcv8JWS@FohR{|r^q&!m2{dq$a0;k8DP6r4XaTL zrB(++$rx}OQJgPg--*3kOMtE39;{ts0VokFnubNQD9xoZd`p1-ojXF6>3D zQBa!iAQ`zecKP}}l+~+o`ocrBQ3_Z`HyDP7qSU}p1fufyUt*Tz=Em+n;)3rpn3yi0 zSQ25|+y$mC0syMjDi#CbP0l+XkK%>y3F literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/recreation/picnic.png b/Icons/map-icons/classic.small/recreation/picnic.png new file mode 100644 index 0000000000000000000000000000000000000000..15b8828914a39ec60adc2f3c5bb1c99496676092 GIT binary patch literal 565 zcmV-50?Pe~P)5r00006VoOIv00000 z0RPlMRPq1-010qNS#tmY3ljhU3ljkVnw%H_000McNliru*9Qp}86I_GUK9WT03CEi zSad^gZEa<4bO1wgWnpw>WFU8GbZ8({Xk{QrNlj4iWF>9@00EgvL_t(|+Le>PO9F8i z#y@w4;gv3D5f;!O@ z9FC%f=!=JxX|(YrQ!QKZ~QY9<#q-@RFoUMUe{m}GQiQ% zVjn=LR$uy}C;(8YT%l>@Kgro_)_hNWkpUWw2FJ(6i3G&)LM*n9s;WdH5fjH^>t=m_ ze-BkvEn-vSz~k{S7z}B*+W@3eDF9AS&j1Jn0))d076I{ld!67>s_2qC&6IQBqx(wpBC=# zo7~+sEXumxMc2EQoM9N$>va?NdcDsMz7pwl8cjQAWo4OsK5rqH%Nm(X27p@a`sW#F z+BuRWv9Ymf^SZXSiY$i#C=?2IfnxCl09lqPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOb( z0Sye`nn^hT0013yMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak?_?!z0005s zNkl5Qo2e{dZ%f2rFo`P(xTz3%7|y$gbGh_yU$zb{4@V5Nz@Qc0vk^ z?UcMgLbOOy#595+1i@GsB1)obym-BnBAP6_UJo3YIp@sGZ$8c_B7((o0Z)MEfOhNr zHSh-b34n+k+b$7#CL(V|Wf5$q=_zW~z1;gEX0PQTwL zl}h3Ddd~po;jwBJEFzgsr{iiio0Li=qR}Yp_4-~l)uM8y+wE$VN=3`%a#}ndm(6A) zilW>DcDsd#dtjNtV4&4%HS+m9{DnMmyWMD-1|X*tga(6wtI=o>i^WJLlk|E$Ow$Ym z0)c?0X#qg7QUE}!)uK=+uv)G7HXh^i`IyaS560uMxmYZA!C=sm0RYqKlwdGOB9UOZ zT49(bpL;zF!(g}Daf$%|x~}V{Y2x?$l{25u_3`=|Bb}yPE)x!i0e%2m%LERGW1^}m zcDr3UhsgNmhNsyq=NA`S;LH9eem}rGs$efw@q|Kpwp!)!fPA96W z0!ZZQ>V4$@)hplwusO+Kxm;ox#=)%uzxMXzZt&3r9*+l`&GxS&;OpK#I<|KcY>UMr iUayz^xNc7c1N;Ghq|ritet13r0000Px#32;bRa{vGvuK)lWuK`{fksJU300(qQO+^RT0TU7@0EiMGSO5S3G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io{z*hZR5;7Ul22$8K@`S+vyBPSgOpmSqJlXTj3A0avXzY@4Wjg-Ian>$f>5G} zs8qA^oIMT!Tr;u<_ukbr_z=&jbGV!^77&%Ya}|reU(6bjwZxA$S&w;iSkBh1}*?6P$X(iPQMGa zop*vyPwHQ);UaHlBA*3Bx9pzZI(Rk^(>AVW zIC+qraf5(T?ieC4X7e?BgNN+Mz4NbVNon8x2_UGV=|X1e`Ms;Y(qQUvCx;Td@i#R5 z0^N?>y$%+w|5sC8ka&-Ba9W8zj>Flgj>mXv@;P1aG)>AY+sUD5ux6y=z#$HJKC8Dx03gj zUQ1`?$xa_p!~8|f&B+Kb0-*7a_5TBWwHJ{;2iDV-R36*?f!(fAuGb5wr~d?!v)4TB SA7n8A00005r00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOV( z7aAI)O$|T*00SCHL_t(2&y|x;NF!$$hu`_WNit)y+00~CYireQI;?-E6&GPZ=A=YQ zq*}zD77Ct&)RXqM&>qA~y;vhCBE1OGqZjcYM6neVngkO}N!U!sU1N>ej59IG^zCJL z>8;xbe%I&pdjJvP|4!4i+1}pXuMsiG0st@!LjmA#L_~PQ^z`)ix~@O%@9$5ot*w0r z0BkfGeSUFq@nJfheo8650DvPF0AOHX;76CsU>6@5ZvM7M5jMNs=D1002Ip??E^m&SWwfkr0w`xm;{6mt%RJcek~*-K(nV z9335DtybesPfuk@l8T05@PZ(G!~y^iLIPJ;SG``Z*FQNq`C3)ghH0AKSS-fp^Lg6d z-tJOW)z)>LM5ECxrL?fVzW#&|@)@;l`=@fb+@Wb&lgXx1 zsYLyLKe@fVCBwtRcgxGmA0HeXJQhXKYHe+OMF4;c27}e>>+3)$6l(14?LD$>+Y^t+ zy@f)7m1Wt9#bQ3gFxWsK;8ZFVwpy*Slv42f{aFA2&)C>l5)pS1@z+QsQa(I9e1V8B zve~RYGBRTI^z__|qS#niSkPx?W^$oW=th?1KLLOzhgp;qH#fgTM4JTwaJ${5a=DD#+uQB4v$KD! zuC7X^X_DRDU2%MTyl`@I5~x%v*4Eb6<6tmY@pwF@rfI(b01yCx&d$!`^Ye3GtyaUi zxw+5d@%RJ7Fr3lR(X*A66Lhf2xT2h;vo8JNeFo*~Y!!U}X{H7>M zA)n8GYTGuaC`xu?W8;grSC2#@KbxlMmL%!-ot>Q@5V7%2001yCG4VW^OnxOv(v4}F w4^yesAR;>OU;Mi=0N}&n@G}75-nYzu0Fb7!o_2c%(f|Me07*qoM6N<$f;k7NhyVZp literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/recreation/theme_park.png b/Icons/map-icons/classic.small/recreation/theme_park.png new file mode 100644 index 0000000000000000000000000000000000000000..4fca5eb04c3335e9bfe958651781f76b366d890b GIT binary patch literal 871 zcmV-t1DO1YP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7v z6c7?XB*(k}001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00O5;L_t(I%XO2#Yg=~|#Xs-+o+Ujcv5B1EU|VUR zbf}xbO9l^J;!+ZmBD}Z|4K@_Ibm&%rphL)z)*cG2AsGJ)o;rjy(4`o+6ar4F#c^?M z<;6B~pQQIBKk5DY-VW{HVD)T=d(P!v&b@|+2m>H-O!L_@{6>SZxjFJeDO{0^Vr`jY;Gha7Khv442TQ55mXPd{?$!Vclluf)Am^6!7a zP~iiVuYFdIAF(g{II+X`zkSO$kM0rGY8ZxrVHosJPH;C@(49X)G-+^5YpVhX)`31i zE-HrnELL_1Gh^ZH>~MHeBnU&gy&jn>8Lqx(61EOV!wzZa6SWRVx`$Yoxl9@*=rl#N z1`+B;2dB{>ies9d2UkgL1l(flh!0R(<#DEkGL0-gb^<$`*;`g zylFIOdLG_UMAT^$Hvb}Q)rtH!*w^o(GM7*Qm3P19kQ&J77-EW#1Rn@*Ks6lwM0ZD3PbUZ{t(gW zS&OK%*)J_E;kqt`3kAB}E-zla!Wte1;4}yrzIGFgw=BHH#>dAgm&VB0pX>oPhzO1s_0w(au`;y9*StpZRk zm(g0YxVXs1#s;}u4%0Mo9EXXCiE|SufFKB1UtdQl#q{(vmSvI4h7S^*TwC zU>L^W6-Guza9tPEGy&M%-DQ4$p4r)1DwPV^Y?e}~#6ZXZtgWp{u~?K^ttQ*s+ma-S x?CtFhl8W(v?+l=|Mk$5Xnts1eKA%6Q`3EW&lnK+E&t(7r002ovPDHLkV1i{Ah|2%~ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/recreation/water_park.png b/Icons/map-icons/classic.small/recreation/water_park.png new file mode 100644 index 0000000000000000000000000000000000000000..f84f32270f43e6b4aa50b5fa1cf6301c66f4642d GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4Mt%hH6@qKfWJT?lM>g666gHf+|;}h2Ir#G#FEq$h4Rdj z426)4R0VfW-vBP3%;eO(;#4bzfYPL#%w(7R+{Da0F8NJnw}JYnc)B=-Se#D&^Z)<< zdNwWw?vGxQ6K`->&+NE*hT|&#LP<~4hDOF`fhGLHxeUt6%!hAo<|&vyA>%-O+yDQP z64%x=?qqn#mUe<6r-E)pW_T9PCPZ z&gXs^8rA%%?{a*iv&v#|(&gYqcdP4f6|)`H@%*${FxEKq5+j2Uv(c+1viJ4?-N)eR L>gTe~DWM4f|E+Hg literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/recreation/zoo.png b/Icons/map-icons/classic.small/recreation/zoo.png new file mode 100644 index 0000000000000000000000000000000000000000..f1840164bad0b2ca8115e2d32971982f760dd4cb GIT binary patch literal 723 zcmV;^0xbQBP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOb( z0TCMVIiWQG001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00I+9L_t(2&yABYNE-ndg}=KbcmxwTbG4edoDm!n zbZ8cb1ez3F15FWH=_DnHa|Q;OLzJmAuIp%;#`N^`ci=s+ z5BxwxitTpWot&JM@oN91s;aWNxhegAzat_?BJv6mDIOjky8koZ=luM<)a!LuMD`Go zVlJ0+0ns!~qS5H1LY9}8MMSGgWwyo14jo12@f zt*tF)W@c0odBP*Gw6w%<+1VMvV9=VIn;YHU-cl$O0BE&Zbh}-=nx^d^A0GqwOQq6|ZQJbb?vhTY ze+kde&#xWF!8A=478U@AL?VPjAynW9_yk~@CI<%xtgWq4tyW1UlOz%e78e(3wOXGW zjmBlO*(9A#lgVTN9A#W41$YUh0MB2JemegDH-8lF^e6tH{hVdXVeS9`002ovPDHLk FV1n@ADtrI{ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/religion.png b/Icons/map-icons/classic.small/religion.png new file mode 100644 index 0000000000000000000000000000000000000000..a992a0266087e22a6297128b1b525e35aa512e59 GIT binary patch literal 794 zcmV+#1LgdQP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0t^8m7@VFzxBvhEG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpY)M2xR5;6pl08c+YZQf_M5oY37)`8g63{~MqlgHx6R{BNEL0HGLefb7gkYz( ziej*k6v4*MK!_orQJG>UHU_^^7!foQC1chpF3wd>;H+*xn|Hr!Z8rKL+qSj2xv6Gq zG#X7gKa2hSeHn(KMx!Cubv>TT<&?=}yt-1UczwQqZf|dwVHg4gXmoT`l2ol$6^%x{ z$E8w9y}iBOKqRSFtEo^ZXnlQMfE>rs{r$ZpDV0iTe0=&s(fV`IF(zY~kaa9!8qPft$(wEk;AS63IiySvQI z&2e&aLNpqsUazybxJV!n;8%pRvolRkPpej|{bjXWE^BXZPl-fAl}e>~gu%f;N!rip2q^!oZL zNh%hL3WY*)97h)y7n+=$lx10(pP$#x&W?tLhBQ1ptnKY>&CbqBl6;bs$z(V>IwF-y zvAn#@>gp<6TU!7uEG*zS4hIJZyu7^N^ZDrL=wN1MhJk^B|99|xK;OsIOyAcR2n0O# Y2Lfg+pg|RLUH||907*qoM6N<$g7EWU!T}{`sf4JHn8POhb!SDXh5nUuIjlsM<-=BDPAFgO>bCYGe8D3oWG zWGIAWq$;?3`UY_MWG1KP6{lJ$1e7M_WG1`h=O$+6amjBoyA9Mo*VDx@MC1I~ONx0+ zfdXs~-sfg>@`Xn_H!WP}uJ9r*QO}V{D)7skhJub;a?3(_cio(IH)Zn#-Pb?P&ffD= zP13N(BeVNVOSsO5-u{jsI}gl^eAuzw?|qLhpCIF^WgFi)&UhfZ``hB9pBqEXXa2l% zG?l?V;p)-Sx=v{-d*MK*QEXH6`nfRBhP0{{mXcF Xh0N{G8a5$7hcbA&`njxgN@xNAYf*sj literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/religion/chapel.png b/Icons/map-icons/classic.small/religion/chapel.png new file mode 100644 index 0000000000000000000000000000000000000000..812f4a1947151dafbbbbdaf5a924a25f488f6ec9 GIT binary patch literal 505 zcmVPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TUAd2hDM9sQ>@~G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoOG!jQR5;7UlQC)nK^TR<88cA?SyKptNE!u0qL?K|2sZY63c(Y20}mjW(lglE ziJeEV(L(G56=8JuPqm{4k_Zy=s#gpj@4cT=H$#_(FN^Hix2w@xOL6pKXwCX)&4^_uy7&Tu#+ zpU)En!3hu#CSQh&eWTHEzSHTj-|q>6;QBLew_A3*9RTC;7;7yeay{U9JUYMGY>1)= zrPO5wr4(9g7gZ^RQVM`XBH`XyYtdR?j(9j6SS%KJp639mREp(t>9&Yr=V=_k_kCuw v8O9g~2*Z$eyY12d^!t6P)#@qrzyHQhNFd$R3RmIt00000NkvXXu0mjf@J+`4 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/religion/church.png b/Icons/map-icons/classic.small/religion/church.png new file mode 100644 index 0000000000000000000000000000000000000000..1728f61d6561bfe4911edfe15fc97542b05d6761 GIT binary patch literal 261 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 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/religion/church/jainism.png b/Icons/map-icons/classic.small/religion/church/jainism.png new file mode 100644 index 0000000000000000000000000000000000000000..004db4bbb72d34f318c1cb09ca30237017172556 GIT binary patch literal 526 zcmV+p0`dKcP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0t*%`GZ-lZxBvhEG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoU`a$lR4C7FkTJ`GP!xvGy(Nhv1k%!!7-maLV>r|wsL8z_*4$8AV?*Fz)D$g2 zR}3mG-{AImfk4B>)2rick{Nzi_=W{}c zBuRt8U_2hDi1Yc}@ApMfEEEcakWQx)hGB}ZZQC@>OeO;Wgb+mhXA2?ZGa%w-vl$MD zi^U@45kr(xM7&bUe9&iVzD@z%}S+Gx7&R_pI^dt-PLNPX__DiQ4}%8cDr4Cb2heHE|-d; za2%)Wx+sc*AUKXANmAlbsZ;=fG4^`BJkL8GkBl)&sitWOp{i;ahSh3yyWRS}@B4na zTz)(rs;YiH8jS`3)a!N6^9;i{oldn{Eji-zPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0t^8Y5Pvn}`v3p{G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpH%UZ6R5;6}lRZeP0ThPc??Xu=q$w&K44Txi!5aEmq$R9KXb23XAtc-?TAOPs znsXDH3k(MdA?Sx9TMU9|NE$>0Yw#1~dm19S-Fvyg?Z6q|=e)e<90Nc#1TrTVM z^i&%g8w!O&ibkUv9UWC~Z?9UdmY$xTR45d5etxcaJg#IiDTl-HK>(;!D#T(j_V@Sc z@9!rZ4pXbu_^fKRie*_e8V$C#wwRopq*AE>Aj`6tnVI47@sWDHj@Ro&6057L*tX5< z>nlE=54YRR+S(enZF6{d$jHbDmSv%xogI#jjsQrdQgn25aCLP>DwSevYz(KF-bT@A6x+7Byu8FTO~%K^+twEs7r%%lvA4Gez}?*)e!m~n;c&<>3~g?1 z%C>Cg?=nC*IZ7rHP3NNm3vX(8I%nG&?&>tJT8e@%%CE_nw}f z=K1*Q2Bgb$H&K-nwpY|#Ujhg%K(&0 zrEgtGqNk^a!NEapZ*LJmI-O>HeI3iP7#bS-7GRnt2L}fqckr2bE|+6|exBXkU6z)X zaJ$`q75jWXa=Bc4Q*8i1v)Lq*$&g4S2m}JSTrONL7Xt$WEG#UL$z*6Yo4-mhe)`Vu XpLnKGblzU900000NkvXXu0mjfk)K7G literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/religion/church/mosque.png b/Icons/map-icons/classic.small/religion/church/mosque.png new file mode 100644 index 0000000000000000000000000000000000000000..c33e86e36a6292606dc038ef4881a884ad938bcc GIT binary patch literal 494 zcmVPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0tgm62&WJCr2qf`G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoKuJVFR4C7tk|D2xP!xa<@aD$AOkf5p#f@N~(6q5xD9+975AY|@EzC-i*@z|r zh0PhnX@Fu<117dCqZM z8NA=`HQ|RIgpk2tpsH%O+pRvkuFLcM?RFcF$Bjk<000pYaXy~|Kpe+dVYk~Eh5-Q6 z>9hh($07*qoM6N<$f>CPDz5oCK literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/religion/church/orthodox.png b/Icons/map-icons/classic.small/religion/church/orthodox.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8df9c87c2019d8c2584ae970bfc00ddc9e54c5 GIT binary patch literal 493 zcmVPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0t^8YFhpC!GXMYpG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoKS@MER5;6(lOe0ZU=)U*Z-|J&ASh@P1X*%2>$=rqvf4DL-LxNNFqjM?tSBlL z|AJsqnD0&3>)0l{51e#fUe0;X_Zdkdh3$6BX0yTbJY3gJ)L49BwOTQqPFb(l=^`c2 z@Au_6j%u}<0M+YtIgX>jU=Y(L8rZfiAXe>mJDb7rcvKJs8jr^UG@H#71c6ScQ%sxt zScT{F2|%OK0H9K-08p(~v27cG$KwG&KA*=J^OwQ-d`=uYt*+OrB7>2st zZjo9n76Rn^eykUUVKf8FvM7~G02~enhQlGnViABsq44fydI$UcKC*AK*_7}5y5H~F z&iH!0wA<~}>-8c=m&+ynjGq`|a9tPA^H?sIj7B5M=kx!6rYw9l j=ytnICKEcHPO9byxE6JnNpgKh00000NkvXXu0mjfyTr`s literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/religion/church/protestant.png b/Icons/map-icons/classic.small/religion/church/protestant.png new file mode 100644 index 0000000000000000000000000000000000000000..592ca6cd72a8aa8253c43ede7e97ecad4001094a GIT binary patch literal 448 zcmV;x0YCnUP)`00001b5ch_0Itp) z=>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0uT-<8mroSh5!HnG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io5=lfsR4C7lk-bU-Q4oc{dv{47LDC2@*tkd_tzu_mVG6Ik(xe{KCxe-q*R`7iY5>?RNWz0U)k|$z;NG zI%Tz5k)|o#ZkOS3xE1wHk|gT&dIHq%_ca=gBuQo_sz8$F^SSowYCM2*4uCAn0Lb&4 zvMdh|-fFb~h@$BDc9mdeb$0+KN!K@byf1ITa^kqjW)raR$;;CPZIcByq qJ=|ZhSUl5cH0tW2C>RVL0r&zmdX$a+2>ay#0000`sf4JIB&5xMJUBCLTzCMB*BCC>S|xv6<249-QVi6yBi3gww4 z844j8sS56%z5!f5naQbn#i>>b0i{VfnaM8sxrv#1T=JXDZUgmi^>lFzu{eEqvMpDO z15fMzNRjqT+lGYnr<|86|7k84$$6ur+~K0;E{FqJdj!Rma z&*hSpJ9NAQLYehuu8Mj#XK|)fTVlez^jEu>UsOO1T-d!7JOXz0T^%+-!AJR7D= znya`prJ?i0v(w*nVy{np{_`Qr>s@tSJIZ?=SLF8^x`lkbkkoTu{lh(BCySKN_x}Hz v@NdCEwWQnI7?v~bOIF(SlxfHA_kUPc%QcrxfAdES=m7>#S3j3^P6Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7& z6bLqhH1xgz001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00I9=L_t(2&ux;uYAR6_h1WPYN5M|~DHOC&P@5>R zu#iECVktIuf}{y~lvH_xL5V@IGo%PaB$FplgUXD8AZVIs3N0dxSt%|VlH9w>efG!Z z?EOh3iC=kseugZ|h{xmjC;Sy%*Xi^5==1q#7{>2sTEK3%<8rxVsZ=5W0${mZ=3=qn zcDwxvTwh=F>gtNcVv!FI4;JwB^u%JZ$ji%1-rU^$1q{PrGMS{Rs%$o!G)&|$K#yMX0)lQibNs-UDuIHr69{Pj*gBXga81XoSa}XnIMr!Kvh-PCX)%? z-rf)h1Yj5jNWwHtn5GE;m`)9K`FHe;bspswrIALjG9RdYBT ztkr5ntJNX^Rw@;aMkD5OISa_=^Bj#v*5=ynHes43Gnotl@Z#cv-ENmc2-@v-YMREg zvoivqq9{BZ4wOi8ykj$H&L$^?Go*T#&xhczu0^ zq9_Q3Lg@GVkYyRsXcVi}3Ywk44ofy`glX(f`FeQ1ryD%`U z>Qy!Z@;D1TB8!1quY)k7lg8`{pdfpRr>`sf4Gw-09`@ppePuu)lM>g666gHf+|;}h z2Ir#G#FEq$h4Rdj426)4R0VfW-vBP3%;eO(;#4bzfYPL#%w(7R+{Da0F8NJnw}CDY z^>lFz(Kuf^ajmyAqsYtX(>$M-=`TdTthM~=51z~lLM@*4Qo}CJ69!IV| zw<&O6dRX!512ZY-G6|(6E>@p7BvdbiuKOXqc}?TKS)1QXw(MUM{r$oo{XEO3?NS;! z#a?ax-#i(8#a=#~nEH${Wd9tq*S)zhvr7-Qt>SFZ+vPdo-(6XzW65&COXnxKm}(jw zvR1!XyvFL`yzgmy4NSJ=95gSVnbP0l+XkK Dy3(z$ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/religion/church/taoism.png b/Icons/map-icons/classic.small/religion/church/taoism.png new file mode 100644 index 0000000000000000000000000000000000000000..d093193d5ab98784ebce3f11d925f79eec9aa15d GIT binary patch literal 615 zcmV-t0+{`YP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0t^8ZIdaDBPyhe`G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ioxk*GpR5;6xlfSCsKp4f3G2RytK|!rdVP#>VAXr#g7_5B;>tG6dpTgExu&_xG z1VJVE2h=p0h(bWHHqo=iU1wLX_wN2+ihRR&&YAfpA(F&jxULJ&^FR{ea9GqV%R-~k zfTAdPg1@<5uN)4CJRXmH$6~QyG#X{A)#CMf6?HtC2ZI6c_d9>0)9DZZRaF%tAW6e8 z-ZrbM%37@^zUT8f0T2K+P5TsZ9EXR);jLpXmt!`Y72=!CMhM8V%*|#)+4DT)^Le~u zGMNAXLZJ`!(uIq~Ui9|v~Gz^2|@%U|gS(a(rHl=hrjoogC$5B2$K7_-1y~c96 zeCw`h8Zw#8=fB|lK26i){eEY&+5GY10I*)K)A#*9PnjfxAmC^;qGefB6y@94x~_}n zCxHi!y81WB1o60fqcLT^vI!PA8`v zU`#tV=coKJKY#!9BTM@_8=V|BGWP74)9deFRrM?3>!Axht%(T?+(zoUy1c8EQa(m* sPJ3v^!1>3%`kM}yeE1ap8VLpl?nNTIl1-U7+Pa0sea)-8Vw6f!AsjVN)>&&^HE zD`9XhN=+ZWOf_q z3QC1Va59g7p`7> zuEDafdojzThyYGrktg3uGLDLg{@u=e|Nq|t8$recQMZ}$8U=QEPD){X(8+P_7RL^D zy&F$BclbsmnlYyr;QeAWHDdA{PN3E#yh!N&!ib&GP&!O!6=q|X4C!m z-PfXO?oUtKtQnOp$-|b^Gm&9|2G^Y84vy7VyLPS9JT1g$TYh$JU%Vk<-wOc~yA$`$n>oaN zJ+WGj!S(9jn+iW}e>0Sw`Z;QQWu5hZqc_{SUp@I>AHiI@ICq(pkD(DTfEhep{an^L HB{Ts5@mjaw literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering.png b/Icons/map-icons/classic.small/rendering.png new file mode 100644 index 0000000000000000000000000000000000000000..331c522ef5335be74f32fc8f701f8260719074bc GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^5hT|5}cn_Ql40p%1~Zju9umYU7Va)kgAtols@~NjTBH(t*47) zh(&L5&WzdwR%T{r3+CJdUSe!)Z3SUs%lH>D-SJ<)dkdRRE>6P%~H@wf+1zmn{ vU4Ea}VV#Jdzt8Xgke+YH9dMaRBZ8Abp-3go`JQJb&>;+-u6{1-oD!Mk44ofy`glX(f`uqAoByDx`7I;J!Gca%qfiUBxyLEqng6t)pzOL-od02(Cg;uXhum%b#dAc};NL)_- z^S@A>Iq$%c262a_>1%iN>u^0c3OfAZ;0qH5*R=vu_UQc*2C8Q8boFyt=akR{0FE>- AH~;_u literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/cliff.png b/Icons/map-icons/classic.small/rendering/cliff.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc0528bc97c6d225e1842cedf39a417c254a3ff GIT binary patch literal 26214 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 KvgG*Xd;bT<^zthJ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/cliff2.png b/Icons/map-icons/classic.small/rendering/cliff2.png new file mode 100644 index 0000000000000000000000000000000000000000..790c7ff0edf0eba7d9a9b6abd4b30fafd9b1652e GIT binary patch literal 26214 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 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/quarry.png b/Icons/map-icons/classic.small/rendering/quarry.png new file mode 100644 index 0000000000000000000000000000000000000000..ab5088e233068d201ae5a6aaa2a078468af8c20c GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1SGcvS$+jloCO|{#S9GGLLkg|>2BR0prEOz zi(^Q|oMej~_4d62hgV!&?A9-_czx{NChm);t^zqywpk`C-Gt}6wg-PS$@;S5qVw$x ZhV-{@(sFaP9DxQfc)I$ztaD0e0sz_1DkA^@ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/quarry2.png b/Icons/map-icons/classic.small/rendering/quarry2.png new file mode 100644 index 0000000000000000000000000000000000000000..38dcfac9a4287c5eaa252bee7ffc0b1432b91c9a GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1SGcvS$+jloCO|{#S9GGLLkg|>2BR0prEa% zi(^Q|oMelt9|pYwhgV!&?A9-3n`I(#cV8j1WZ=z=HE#kJX9`_QIih0O+3#_g-6|F& g|7FF+5(6oQ##N$A+4`g$fCe#my85}Sb4q9e0OK4gga7~l literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/rail_preserved.png b/Icons/map-icons/classic.small/rendering/rail_preserved.png new file mode 100644 index 0000000000000000000000000000000000000000..85729f7a4e1f7da0804a2a8c1934aa2486e34d8c GIT binary patch literal 26027 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 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/motorway_shield.png b/Icons/map-icons/classic.small/rendering/shield/motorway_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..331c522ef5335be74f32fc8f701f8260719074bc GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^5hT|5}cn_Ql40p%1~Zju9umYU7Va)kgAtols@~NjTBH(t*47) zh(&L5&WzdwR%T{r3+CJdUSe!)Z3SUs%lH>D-SJ<)dkdRRE>6P%~H@wf+1zmn{ vU4Ea}VV#Jdzt8Xgke+YH9dMaRBZ8Abp-3go`JQJb&>;+-u6{1-oD!M-G2e8a!(h>5R2aAoEfzVs?5yJ63jmn zM7co>ZSKqLfsF6cm%OU``*8J@_xAq}MMwZa%8?%ukM?}o>S3C4aa*_iJNw@U4!Epx z%SpI0A<)@vfuar%5ctQ{Ce7IU@Q!Ja>HdEoLb=jTth!(Suhq8tb7X^0`x+(&hT|5}cn_Ql40p%1~Zju9umYU7Va)kgAtols@~NjTBH(t*47) zh(&L5&WzdwR%T{r3+CJdUSe!)Z3SUs%lH>D-SJ<)dkdRRE>6P%~H@wf+1zmn{ vU4Ea}VV#Jdzt8Xgke+YH9dMaRBZ8Abp-3go`JQJb&>;+-u6{1-oD!MhT|5}cn_Ql40p%1~Zju9umYU7Va)kgAtols@~NjTBH(g{O;S zh(~8~&Wzdxvl|;1wlw}*(9W9mv7XOtn*WzgUyrZ1-^0VhqpAZWc;>v(sXvvp_UFsg z%GZAm&;R%5@A2a<`rI2E15dl_%5SZ?@+t6iCR2n25bXQ^=kTSSFJ8D;MgDsJ-ac-| mQ(KTR_H}<3Mz3XKwPpA%BX^%sBt{wN1_n=8KbLh*2~7Y=3s|!N literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/motorway_shield4.png b/Icons/map-icons/classic.small/rendering/shield/motorway_shield4.png new file mode 100644 index 0000000000000000000000000000000000000000..56d7ab81c3eed35980f3d6c7a58d41c6ac067cc5 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT=!3HEZI^Ek1q}Y|gW!U_%O?XxI14-? ziy0UgIY5{(GpgPRDA@1m;uzv_{Oz@ayo`Y&tq=e2`7Sh**Q{#>mxEbvl)%schs}SpL>mdKI;Vst0J5=F^#A|> literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/motorway_shield5.png b/Icons/map-icons/classic.small/rendering/shield/motorway_shield5.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc5d35b1a79607a1d1ed1071631a873a7fa96dc GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^x6I7X*oh1%m zU|by`At7-nB65aZ2Umf;bjEc7ruFtUQ-A$^9xuVo%*@=}BO&iRXZpTt4%S@)5nJ9q zYX5!S&cJ|oi}MM_#eK`fB}z^99$2yXC99jPufD;njH*V(ml+KBB+$(r@ z%fY%$pyKbt)gsKyM=q|e`~Oq?+nclLjf`c&8xuqs-1jJ_wY04Z2D*>I)78&qol`;+ E0PWOC;Q#;t literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/motorway_shield6.png b/Icons/map-icons/classic.small/rendering/shield/motorway_shield6.png new file mode 100644 index 0000000000000000000000000000000000000000..3ece3f0a231f0db055bb2bb071e944fd0d735b92 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^CO|C6!3HEJN%rRfscD`rjv*eM$vHD>6I7X*oh1%` zU|1a?At7-nB65aZ2Umf;bjI}nrnveaT3>&k-)|ts1_Y9Zc5N2=wQC#8L{t+lZtIqR zXaD=a0h0@S3(X|HUPxeHEGP9Q;fiy!Y)@6jhUP$i-ZFzXHb)K}IB?*@ldI}&H>J^5_ BPUrvt literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/primary_shield1.png b/Icons/map-icons/classic.small/rendering/shield/primary_shield1.png new file mode 100644 index 0000000000000000000000000000000000000000..f7491b672b5b2ee05ef786b903ef7d699f65e8cb GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2e8GEW!B5R2aAnn}?+CN(xH_B7UP z=xPNqCeQrXEMWfIIH+|0?_a^Me&7F}sKWyUPJd*0czD-FEs;{X67cuo%iZsJe3oP# zVRPe^G)-ZVI&|p3fde1jJ?3XyIBQk*lB~M#UzdxVnGkya|3CifUoYDkX7WX{GVE4T WEMI$W#R;Gb7(8A5T-G@yGywoFNk%FF literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/primary_shield2.png b/Icons/map-icons/classic.small/rendering/shield/primary_shield2.png new file mode 100644 index 0000000000000000000000000000000000000000..520f8f48e696b2d4ca6a1c03d39c04d17430ccfb GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^5+YD)uy* zC5Un}GdoMD8$V`O%=?yp#pLJR>+^%||NqCIoS2Z1An@pULPAEy)kVu#op`Ux&)fI= z+yNI~=Z%el+-|xOTNAD@DKP*IU_QLN-(I36Yt_2I%MZ%q>%9)@M11}G{{M#M^XoVQ eE;DIFurlZ~Dwdy$?FTx8fx*+&&t;ucLK6VtIzb)) literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/primary_shield3.png b/Icons/map-icons/classic.small/rendering/shield/primary_shield3.png new file mode 100644 index 0000000000000000000000000000000000000000..d4dd8e35d4498fe527e6d0fe34d5c8a4eb07cc6f GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^@<1%e!3HE%my~+~sTxlg#}JRsw`VumAvOwWNhWqK&_qHFHzGeF+Mww507-Q-@s;aH_ zExl&o<2pw?o#BmT^RLROr*i+k*e&3>^pNhX>~%Yz&3b=`q2+wX+IRXZO?ZMop0AxF he!cd1cgVlT;fpRRmWxi4i3GZX!PC{xWt~$(699laOJ@K8 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/primary_shield4.png b/Icons/map-icons/classic.small/rendering/shield/primary_shield4.png new file mode 100644 index 0000000000000000000000000000000000000000..378e737e4e978cc118f253dc18f285c48e30e3c0 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT=!3HEZI^Ek1q)e3$N6K7v)$r1DwG?h5AV&#nbCiVJ{7W48P65?FhTh4CE zsNGqWmCbPJ_vZ75C1e`zuUoiJZc8A;zIC_MQpIjfsF(Dab#MukxRsO0r?9u`&(oUg r#}1T;8yrlMJ9eSuuiwot(SMl4HYk>>Z19r;x{JZn)z4*}Q$iB}t+h+s literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/primary_shield5.png b/Icons/map-icons/classic.small/rendering/shield/primary_shield5.png new file mode 100644 index 0000000000000000000000000000000000000000..dc59c400bb9d2bbdebf93b2ed09f1fc04028713b GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^xY@8I?mPS&6L=S-V)IjAVg%g_5{rsifJ>4p#Q xHeUbiY&}_M*TRc9V!d{={FxdU(4N}#(KJYD@<);T3K0RUE@Nw5F_ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/primary_shield6.png b/Icons/map-icons/classic.small/rendering/shield/primary_shield6.png new file mode 100644 index 0000000000000000000000000000000000000000..606fc123860d85790b08e7a8ef62c6b3adcc70aa GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^CO|C6!3HEJN%rRfsXk8^#}JRsx92zV9x@PNxX2yB zT|1;VIbKBq;N;-nCBnj_CW(PdP279h5%s_L^(* z_u2g=zFil1Q)SfC8QvsvUwy11JM~c5_GNq%rbP0l+XkK_0UXy literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/primary_shield7.png b/Icons/map-icons/classic.small/rendering/shield/primary_shield7.png new file mode 100644 index 0000000000000000000000000000000000000000..9282fc025ea5fe5534fe87c666050933e411c74e GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^)<7)C!3HFgg|0jXQhlB-jv*eMZ_jV!J!BxlaFIKr zse|c>k+Q*r?F$z0ieyT#@gHGnxx_V5N!?Y1E6pJO*AL%k+Q*r?F$z0ieyT#@gHGnxx_V5N!?Y1E3aL?^S4?>)zQx-`duc)IJw zpS;hT)@_{7w(`_xAsL1rf5kHL++S;O@7r0DdnzKb{SQ~K0yfCb@Y42B{Ok78o>mhd o(GRkMpZBzEljlF?JM9ts)BlR)_4f-G2e8d`}n05R2aAKfCSgRhgNcC76FE zh;oA%!rG77*#y6(t7O-I4t{n2{r^NA9uT-B!^6Y%HcCbMP~6YPhX>2q)FzoGF)nWF zkuqZ9ZA>|^++ISWE-Xel^84)hK?crYe}DhA?|Jx>pV3Hm6Bk3NoJ?nMR{Jxc)eN4l KelF{r5}E)@oHb(r literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/secondary_shield2.png b/Icons/map-icons/classic.small/rendering/shield/secondary_shield2.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7ebd665c95e4fa6ae1851a97ed3b10a27c5e6e GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^5s6VVoh6ua z4`_+8v9%efg&pJPQF?QJMb?+u^Mn4^{pU|kOaOuj&k_;>GOjOL#rkHdyo6j$dcvYr z3nLD!U|lTM6J?OaD98|W!}jmN10Oa&k_z>$`y9-bc5qew{{QWUHvbhJLb(+ZL>Ue~ Wlj;1mWVIL20Sun5elF{r5}E*zc|N}Y literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/secondary_shield3.png b/Icons/map-icons/classic.small/rendering/shield/secondary_shield3.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c995af81598d7667c967ef790d7f9d30be53ad GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^@<1%e!3HE%my~+~sd7&j#}JRss6VVoh6w6 z9@G+JV{0=|3p>Woqx9zdi?p}1=Lh|-`_G@8m;eM5o+Ts%WL#e~`{|ph@)B}2=?RNw zw?-UT@pSRD{wTYwpDUi4Fiz-t`jVfmZNBLB7iq77x(!Z;|NZ^fzUSdje#Tvqe2l9Z Y`1ZFVdQ&MBb@05$hR4*&oF literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/secondary_shield4.png b/Icons/map-icons/classic.small/rendering/shield/secondary_shield4.png new file mode 100644 index 0000000000000000000000000000000000000000..dd9131758da53aa3421fd19c5bf2158c5f7c66bc GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT=!3HEZI^Ek1q}n`P978-h-(FP|YjO~AxX8}V z@7B!OJ(KmU*_sVZ*B<2@ik+dGrFbFXoXi1(qfS3w3jd2fn5#cqe!KO98{zvHV(Lz? zoqOsY&Fmn*N_E{jh6hD0+2PuggHo+ONS)j&8!hQG>);Y7aVsw|^U-@wr_UkVmi!8E kZ2GCXuJ3(GklNqp_0g>|o%pn?7xa52( z@QHk`?-sKumkoCFG<+7+yBa!EM8CddPu-GReY%oSTF&0787p~or!HK2OSMXJSvmj1 te<9nBWIJ9pQ{yC3K%22WQ%mvv4FO#tq%OA7!1 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/secondary_shield6.png b/Icons/map-icons/classic.small/rendering/shield/secondary_shield6.png new file mode 100644 index 0000000000000000000000000000000000000000..e3dcb460ad6f68354c372131b9ac94da85e54da2 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^CO|C6!3HEJN%rRfscugf#}JRsx7YRxHaUp6K4flY zR%{ehJ0`LvcS08HwMS-&;>XmooE+G!dF&Zgb&TKhe%{CR?qr_P-dXAoEZF8V>e;Hw zKL4Y>SItX$Rb@;J+kvGGuNRBW6H(t^UQ-qHQnq@t!do2=YwkYVXTGihkT>n*6rt{YMl^21|V(@hJb6Mw<&;$V3wMU}> literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/secondary_shield7.png b/Icons/map-icons/classic.small/rendering/shield/secondary_shield7.png new file mode 100644 index 0000000000000000000000000000000000000000..a90b58736dd449972b53dc8c1ceb414ea81adf70 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^)<7)C!3HFgg|0jXQeB=djv*eMZ?A6@Y;q8By~xeX zys%MF<(Sx(+zDB%*B+TAiXT%;aB@(y=ILfMT~q(;w?FIqHvMS%yRro@o^u~~nrc?K zhV7;4$)1Isr=M{#+>-L!zWKwFl2xydymr>x`*^xen0EKoQ%PGlMXc2cTfM*QZoh-Q v^A4NV?MsZ?*uF)`Pe1!{9{-`qL7(Ft-^g?>C{u3+x{ATm)z4*}Q$iB}1e{I& literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/secondary_shield8.png b/Icons/map-icons/classic.small/rendering/shield/secondary_shield8.png new file mode 100644 index 0000000000000000000000000000000000000000..71feabff008addda83ac7ac0094d9defcfe2e8ec GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^PCzWk!3HEV{i-$ssfnI0jv*1PZ?A9UZAy@6c_`j= z@X{eJ>1_62*Ed|{oZ~vJfIC}y>%s-XP7K_6?dOkFtL@lxH}&z`3Ra>2YxNqYtlu;( z_h(m}@S>NiGiL-d9?0YUeOj?1sOQt2Pd_HOzyBf1r-%)nepyv^Vg9>=(Mcw?tlk|} jQqPX;zRlv_6;jXGw?(EiE&UTC&~Xf&u6{1-oD!M-G2e8a!(h>5R2aAIhMuGyx7><4A?#$ z)Di6$I`tv>?xgG`S#|#&wu_vZ5W4^0AMWZO&t@~szopr03wD%^Z)<= literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/tertiary_shield2.png b/Icons/map-icons/classic.small/rendering/shield/tertiary_shield2.png new file mode 100644 index 0000000000000000000000000000000000000000..4952fe73b454d41a023cdd168ab4a578222324b8 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^5rk zHH7N$@bDz&==jL1uv*Luy!_<3e4WSNU!V1RS{oZ19Rqu2AH1g?)ICc~=FX-+htH);C3#bP~C4lD_Y2?+^1{=d>b++XUwF7WaLkO>EMBEG&pzkfq}{yxrt e%S;*(tPDoil^Zf2dzAwn!rr! zHHYf(@bDz&==jL1uv*N!c>3CN`8tokzdq~tv^F+2ItKR4K6p<(s5@?&{GCmI4xde* zFFE5ys-l@e*3T7B7f|Lj+%&uYADp?;ey)nI|JQ0; i^Vzo{ZkqE!Ert|F<%TF;o=~7u7(8A5T-G@yGywpiLqi$> literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/tertiary_shield4.png b/Icons/map-icons/classic.small/rendering/shield/tertiary_shield4.png new file mode 100644 index 0000000000000000000000000000000000000000..b5ddee2e06d782fea82db072d19b2992d41df73e GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT=!3HEZI^Ek1q$Yd1IEHw1zP)D1b;v=$;bMM- z%LY%?Bj>JpS1`V2?ccUn;pU-J+!dS$y>gUTx>*CAI1VcH_8twHob-<~?x(t9i_nLj z)h`(AOCz;DMJ`>-Sg|DSX4&3yhSf*soGsga&5d!6e|yQ=xRhHH>Lq<<9b5t>Ze=9$ zJqX*M+4sBKjIC{V1EbjOb>F`~R}VM)E4F{?YUPHB%7Udp=P`J?`njxgN@xNAOz%-% literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/tertiary_shield5.png b/Icons/map-icons/classic.small/rendering/shield/tertiary_shield5.png new file mode 100644 index 0000000000000000000000000000000000000000..1c161767702b1fd6acd934ea3f4985c7d0e79553 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^xzopr E0BAu`ApigX literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/tertiary_shield6.png b/Icons/map-icons/classic.small/rendering/shield/tertiary_shield6.png new file mode 100644 index 0000000000000000000000000000000000000000..87b8dad90d6789a18195062035e672096e7c88f2 GIT binary patch literal 206 zcmV;<05SiGP)%R}1bA?@;z zc6ms{`5~V6SLv7(O^6lzhkV=h_VN0b!c9Z)KlpzmfJUcb0000007*qo IM6N<$f?0N1IsgCw literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/tertiary_shield7.png b/Icons/map-icons/classic.small/rendering/shield/tertiary_shield7.png new file mode 100644 index 0000000000000000000000000000000000000000..8f3c4c54b2b72cd6fcfa60a5f74128ce6b16dff6 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^)<7)C!3HFgg|0jXQd2!$978-h-<~(*I%FW>@GzZI zX-A3Bn`f_7_cRnASez<;gvT%LfH#NVqf1Q|EK5|U1j*Pq^ZfaDpYz^qi|2g}u6Fqh z)~2oz(>7a``)c`igxdF9V^||rY_)r wF8|AtOmdKI;Vst0LSA|p8x;= literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/trunk_shield1.png b/Icons/map-icons/classic.small/rendering/shield/trunk_shield1.png new file mode 100644 index 0000000000000000000000000000000000000000..bb849c22b9f659e8d6e80d89b2b7c0b965a11a7b GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2e8GEW!B5R2aAHTIGFCp9)I_B7UP z=xPNqrcV9Xyh7u+aZu_0y1&k^zQ6yUsKWyUMw?=IJ}NDZS|YV+!s6eD|5nFK&hWU} z!P_Hcly!o`qy?zC@!`qG`8=EJO5&75Kfk_iza*h;&9A?|>u+pMzt4K2FVdQ&MBb@0C_}5`Tzg` literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/trunk_shield2.png b/Icons/map-icons/classic.small/rendering/shield/trunk_shield2.png new file mode 100644 index 0000000000000000000000000000000000000000..eb81d8070bd87a4b64241e54fdafde03e582d2ef GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^5ZW4D3t4V)FCrYx$u4_5b;k6B7~=CQN*q)FG~UbDyk50||_cQAOm`njxgN@xNAenUYa literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/trunk_shield3.png b/Icons/map-icons/classic.small/rendering/shield/trunk_shield3.png new file mode 100644 index 0000000000000000000000000000000000000000..4e6e9763702a4f9100d8afc75344aa1340af4cbb GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^@<1%e!3HE%my~+~sd`Tr#}JRs`>R literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/trunk_shield4.png b/Icons/map-icons/classic.small/rendering/shield/trunk_shield4.png new file mode 100644 index 0000000000000000000000000000000000000000..733d5d0f8bdc9f89920aa5b14fc952e01596d8d0 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT=!3HEZI^Ek1q$Ya0IEHw1zP+Z%cgR7&;bQzI zUn!9$DJJm;4%yXQC8dXX3p~E5#V~L(ZCbXB?N*AbpsB=>6)R`dH>uZ$#lPl$Ff;rh zquu$<>vXzTtYyr&ojCc@3)ur@+m}Sif4im8P+a&%?z=g6?uq?8YG)HJL5bXL2J9cI w>MVHA`bsljjy=G_t=VgLtZr$}FWnl(qfeAFTh6^a4|E)Zr>mdKI;Vst0QR6vm;e9( literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/trunk_shield5.png b/Icons/map-icons/classic.small/rendering/shield/trunk_shield5.png new file mode 100644 index 0000000000000000000000000000000000000000..d6700e74ca0f084486dcb1d00887610708cc044c GIT binary patch literal 202 zcmV;*05$)KP)w1kNb;*-(93LG0yoGzG)M}q^*6|!lz%E4~jz~X?eRm*Z=?k07*qoM6N<$ Ef;xmxT>t<8 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/trunk_shield6.png b/Icons/map-icons/classic.small/rendering/shield/trunk_shield6.png new file mode 100644 index 0000000000000000000000000000000000000000..053784ef574173858d1e17dd4e12019eb40a14fd GIT binary patch literal 205 zcmV;;05boHP)4RA<$6E1)R0ja5(0h&|{!4bNof0lkHc&`|) z!v)YRgHeDk%VKPr%BHS~;hb+nn6v`e?$&ghexEuj#<@CX5nRA?fmvba_a+ zJS1Hnl5TNB3gGqpaPo&+>X;bL`4;{|CWJ{_`>hi<&B6QtPNE`dr{q*w00000NkvXX Hu0mjfV3AYX literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/trunk_shield7.png b/Icons/map-icons/classic.small/rendering/shield/trunk_shield7.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8a555b98285a2549aa7c1fb43e3ebd27e8ea5a GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^)<7)C!3HFgg|0jXQjgkO)`?tTIJhSA4{?y2|r`Cj}hOIVQ9Xj*s ztMzHT2Oj@>Bv3B?az>0(hipxHtk>kP|Mm*xojO~~Ak3(gx!Sg^0q8siPgg&ebxsLQ E0G44<5C8xG literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/shield/trunk_shield8.png b/Icons/map-icons/classic.small/rendering/shield/trunk_shield8.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8f1b1ba0f237ee8e5b58d88ac1dfcb54e2bfcc GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^PCzWk!3HEV{i-$sso9<`jv*1PZ!aw5J>($M`Z2u7 zS4yO57MobYg3WW8VtsEgv_CORWK`ieG1J)efU0`egSQ{lAO2PQ@hS9hr3K@MANdCv zKa|Gy=H7OBEyb<*blsGb)(jDApTC%XySH>oYw~9K{Ojsz*A(|VDSKdnCm0Vr{&z_6 vz1}rLv7l43A7ll+X4dq)Z!Mg>^aJDdK&8y$Yk{&rXEJ!Y`njxgN@xNAK3h?7 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/station_small.png b/Icons/map-icons/classic.small/rendering/station_small.png new file mode 100644 index 0000000000000000000000000000000000000000..6c3b03b3d43dc5d047a946252213793c43e3d179 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=wj^(N7l!{JxM1({$v_d#0*}aI z1_oxJa^@gL0R|N>pdfpRr>`sfbrxApHS3oW|Ez#QC7v#hAsp8kGa07+XH@6pF|^|q z>5yXOuzL3U$FW17-&C;J^NMt4i7Pn^u&^?H`19L^k%6I;Nt%_@3M9b9z{miiL42mC zzrP;?s`&R0=nfDK;xm8w_vgy1-#?Y^{`e}f@6+ppATuW?85r5=S=9jTXYh3Ob6Mw< G&;$UWh)s#j!3HGb95Tg#6icy_X9x!n)NrJ90QsB+9+AZi z3_9K*%(&Ec+Df3HWQl7;NpOBzNqJ&XDnogBxn5>oc5!lIL8@MUQTpt6Hc~)Edp%to zLp(Z@|NQ@Ne^^6-XU2-mh`5WUo4Ez$2-x@^^6&Q7vXrv`22>dyJ zK%vij-o%IhPyheW@+H2haiZhAi4z+?{;zLSj2Dowf)d)VA zW3oT)A^TMx`2>fcE+rNTNeS`)KR>D$-!i%T{fbGs0mG_gD<1MNn4B=~iQfKQ6zCBK MPgg&ebxsLQ05`OKU;qFB literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/track/arrow_back.png b/Icons/map-icons/classic.small/rendering/track/arrow_back.png new file mode 100644 index 0000000000000000000000000000000000000000..309ca5da4299fa393bdb9445890b74c515c0f868 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^UO>#j!3HGb95Tg#6icy_X9x!n)NrJ90QsB+9+AZi z3_9K*%(&Ec+Df3HWQl7;NpOBzNqJ&XDnogBxn5>oc5!lIL8@MUQTpt6Hc~)E_dH!3 zLp(a)PTAPSu@pVVJ5K3le>&sw%5E~(4sgU95p+K)?9xh@%} zMY9*5h>o~8L1%gTTeUB*Oxz?Gwwk;)S712RJjo=$TsXW}y!(ZE`BQzh%WkT_WH`6% z;OBH$wEO$^JB)rS9|u2=6*0=a(%XMAJX*+}`B4{(+v~@5;ry{*e_uD1@-?41;fem& uy*4Hq41!DS|GZ%n(tG~-ll#<|oeYtYHmo0BTfG4Kl)=;0&t;ucLK6UK0f|xo literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/track/mini_round.png b/Icons/map-icons/classic.small/rendering/track/mini_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a7d2dfc7b52ab2b742d292360ab52d81379cf5 GIT binary patch literal 26852 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 GGywn|aY{J= literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/rendering/track/station_small.png b/Icons/map-icons/classic.small/rendering/track/station_small.png new file mode 100644 index 0000000000000000000000000000000000000000..6c3b03b3d43dc5d047a946252213793c43e3d179 GIT binary patch literal 231 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 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/clothes.png b/Icons/map-icons/classic.small/shopping/clothes.png new file mode 100644 index 0000000000000000000000000000000000000000..5a8ee3fc4c0ecec0e1ce11e81e2a95abe0244526 GIT binary patch literal 653 zcmV;80&@L{P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00Aoi00AojR?C0800007bV*G`2iOP> z2N(=&^vdS|001*|MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>MoV#s2^R0nSN8K~y-)jgrf26Hye#zjNo#IHpcgV{WQ7I!*CG z1w-5wY7oRlMY^#IK^Lyv3jPhcanrw`Ah^+m2)c3ERjCgYvZxp^K2xI!NjsT5N;8?` z#>R=5Owa0`bIYj78AL>C5kQf<^>eu{g zVeQd8GdCpwMAg)Sva{F2#Q;E1c6P3{_2VLd=K=tfeQtqB=>KaUw@jQr6UU@FfPKba zepF3g1ppxpbNb-nlk>yowYR&Nvo0zhq_3KtVby*r_Mmu^scPnu`vp5XU^BJof zK;7{M>Y6mhI&O7K#FFX$^v!ai6ZQhldTD2O9aHI?EPs4;x3=*f`z@6gn(hKPI|}f# z_ni|Oh)B%jZr%?AL}C+9i*KLZ+s*rCVP;?ICWU^Y5aYpI z3~p*hD1bzCD8TP^C-z{Z*a(1^+`|=yp8!BS44`R7B$y9)zft}4#_x5%OWjl?M3RJ- n0LTNg%it!M8!e|?32J@=)~%Y>`R)+t00000NkvXXu0mjf(~KK8 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/computer.png b/Icons/map-icons/classic.small/shopping/computer.png new file mode 100644 index 0000000000000000000000000000000000000000..71605f6c953372dd3946ad78f0622880113e1f41 GIT binary patch literal 664 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 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/florist.png b/Icons/map-icons/classic.small/shopping/florist.png new file mode 100644 index 0000000000000000000000000000000000000000..757e158d8397b633a6af126331de5a26512b1ac2 GIT binary patch literal 737 zcmV<70v`Q|P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L002M$002M%6+~0b00007bV*G`2iOP= z5-B_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00JRNL_t(2&vlYdNRx3K#-H!+_j})Wo73N=k&EeP$>kDam+hlK}^ z>!eyj>4woPbliu;7B1t14B;$k(Cs{)gYk<5Qf?W?)pC@MyE25M0Kht09UClcu8^Q^ z89*NhU>Xls&%KXH0c;nP3RRq#1@uho+Lws5hFq?S1`1CCB_sOUgbO3G$f=!w3MmNRg2C;sd}O#m4ee@ zgjL)VRemF^_F6f+GtjPYjqLDt3PrRyVf`*nS{J9&W5dfUwG4Ij>mhl<6H(hpz$pK* zXGoA)DLCV1)*i@R`jV-;bdAVha)TC>pWyPz+5XS(SAES&Lu4?iyv^E6Fo&npWBb>7 zGZh(3Mm4|Kr+i|UzfJFTEM_xnAH+H+PgEUK4dRN>C|fN$Z_KQHd;ap*@_L4UnwQeW TaJw6600000NkvXXu0mjfeyKTM literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/furniture.png b/Icons/map-icons/classic.small/shopping/furniture.png new file mode 100644 index 0000000000000000000000000000000000000000..df58c1f083cb9da8dfbfe815ded3e522cf49e39d GIT binary patch literal 864 zcmV-m1E2hfP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L004Oa004ObIJJlp00007bV*G`2iOP= z6)OsS>(UYc001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00N*%L_t(2&xMj(NRx3G#-IP^w@s(hO}A2;CFDY`Ir$?Y0Se+=Qh8c zbo&nfZd!x~df>Tv-uK}LFE62#0syM3F0d=n*#|ybgj`C3Qbpch(|h~k1U3;%2w@A) zR+LbE-XYPaPFBS#vjOm{ob?L;<7P#MQYz@9)ds56#stZO6aVBgg(|Y>-^GlKjL_Dm z`edW=gd6}^0Epn{79jG`k|bG!b}LY{G?qSlgtt)h7iW@(n|i7P^a6|M<}KEXnJ_5?q*B)tM;CT^dpz| z#Ag-UWn>{40I)a4(>`Efbv#j|0FY5hv{EW@3;?vh?MsQ?64_nY@aA-4&M{M<1V9KT zK9Nwt2S7n3$pOO1SGlDMh7iJXE@xOyRwj`#C}+ggZ}7W6QQkWY!8ak}os!(|;HV_b z0wAJgPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L002|~002}0qpidh00007bV*G`2iOP? z6Bh^HEn{f_001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00G!ZL_t(2&xMjbXj5SnhM)7@n;4=usa25(LM4Jk zVnORr=-}p9DAbD3#UGR?b#&4XMi}{ z^T>{m8;Shf^y9#28Snu`37UZ}a2IG}GU;)p_br=eWA4Qx=~_q?WA!>fvd^SjQta~= zseFIIeF+lTI8XuvAwUtpSg}EVU4Aejj8^v%W`P0nrr*Z zPET>pEi&wmG^W~k6Mkz{tB$defv{nHRM`-JSyaX`6l&O yD}$Lpfov0Se3elF7y>FlColy(A`^UCZukXZh`RKz%sUSN00001OFFwm zAi)jc5RQk{A{-`kgR2Q$gAfQg_T&Nm7yR97pbAkBV%c=@;^G7V>eDq;=X) zvr$H^a)m%J2Cr`mY0Zy%RiE)~nF1d^G-u=j9#h^!t#(MUiLC3t&rEa>=6!* zOK>S#6|C;ldg5_a}4Cp=o_P0kOS3CRaxXu*O200004nJa0`PlBg3pY5H=O_Ur82V(iMn&QAk@Lb4^U5hc#~xw)x%B@E6*sfi`2DGKG8B^e4K8L0~Hp1uL^ zQ&jVS3ava{978H@9i3#z#bCh0bpC?;v)Mlv&)qD_)cZh5L+R8uNd<{V3?5lYp|&%P mi|;8gV}m-NDGZ*jelF{r5}E*QdO3Xn literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/groceries/fruits.png b/Icons/map-icons/classic.small/shopping/groceries/fruits.png new file mode 100644 index 0000000000000000000000000000000000000000..c57f2f606e8a3b4b93d011af385e844f0004b32e GIT binary patch literal 621 zcmV-z0+RiSP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iFS* z02mo}B-mpB00HeuL_t(I%XO16j~X!$g+Dk7q+=tcw5x<-uS#>KIVloGqGZ#gB0pg1 zLwc5<0Y4zur3iF6$)-xPrb-ivQz~y2UBO1WL`X@o%idkYKFN}0`@MNHMe!{WYCBcOu=COCj^SEm-3bAtuwUSV#}*)&fI++g=D2EGmQzFImsU>KqS?$6i& zH0x}Zkp{kv_3Z~I-CxYg7qimUX~Zma%p&=J&ya*6x_gBIXw{KrD9okofrU_tS$Nrl zHGOwCnY-th+j9oBDacTmSVc#JeSm!H34*-_jJjiREN0_TRHL=h?7-s*yu{%c#}OA! zkh+YWOab`d-&DM2Nlr%7NNb_!cuC%Y@l>HgMPMJu??go4B{2(g6sT$tT*DsNhAHo( zi0m3N@7ZbaxhEoG=~nb*kIZ|09Z(k|0Z#f(9 zh*iX=oyC(49P1xd4Pq8%6h`_Y1dB&xg?bM~>N2)rN|;NmcNUm0nN|=D=3PV zsJI}J(vc7fNiR~cg2XLZGI{d-TQLhQkc_7a{ax~LyFzM7EF$d2kvS?sD0=@y0MJ@0 zatl6#+=CX1)Mi);%i#2q$;s(##4NN#m@Px#24YJ`L;wH)0002_L%V+f000SaNLh0L003bC003bDRV$Fa00007bV*G`2iOT1 z1{@V7Bkbn@001*|MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>MoV#s2^R0nAB6K~yNuWs<+kad8;NFXsq@JQAg3(22u91`CTp zXEd11$|Q?HMs+e+OiE$#9~dk$NSO>6D2oyX!x_&a()A9{>-)Uk=icu7>iT}}A77B9 zuIn5O1{@BD+-x=^$oiT1Bx%Lp zSglrwMx*Z(e!m}+$pra)9_RBJPN(x*coQO#2os3}2ZI4g@_0P5P$-ZjbGe+L2|_#` z$Jf^vg25mFKv5K&&u18hf&2X~$imQQG!PDl;cz&FXqqOv-7aFWn5c=CBuSzqNvzlF z0-sDKsj4db{l2IP!+1RAcDv>6b`xT;SftHnqhT1LCjGmm#bSZWGX4k<#Nf}?MBlyIiJrto6Xp4Hd(1u z_-rBtmStqKSp)(B=(>*edJRp}Aj>jRsT5A96J%Nbx%7U&7hCgsy|`Yls8*|p l$KxoKN~qOpuv))A#UCRsfKw?kcZ~o5002ovPDHLkV1g!_7RUeq literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/hifi.png b/Icons/map-icons/classic.small/shopping/hifi.png new file mode 100644 index 0000000000000000000000000000000000000000..75db53b0b31e6008190a5a15b4db8791150b24ef GIT binary patch literal 703 zcmV;w0zmzVP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00AZd00AZeU;7d$00007bV*G`2iOP? z6BamdP=6Hw001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00I9=L_t(2&z+JzXcKW5#-IP?y~~|mFPBSIOk>m} zrKGLmN3=);2@WDsT?&HfD1soOlc0zh1Sb(Uv5SKRom|AFE(H<9#cF6%V^E1hO_P*d zFS)e2yT6m*2T8?eeja}B$HM@m0oVXK0CWI#050defF5E11ONoU1;9Ax4*o%mbB_NJ zZDe>heLG?p!K_~*GZ0W8CR15=L*j#bR}Ksh#b@5V&l@6fM58-OvJyCWeEf2wCovI^ zUY{>~G)&WiZLgwQt;7chM;-$h7rHLb7zAKMQDiWycibz`C@aourD zRox7;z6{stz;y-GYIPg2uy(EGT1G9x6p0OXe@lc zSS%qD8Q|+37k-JLC^CYf?eIL;@a1y3UjvNR@)wV#56P0O?z(yB>AA5~BA!a^A65Hw z=>6NE>09x=QhD*)I~Zf^L?$`eFxw|B%L;kin^RROf9XQ@YB&>XUQ33(%CbI?-FwZ0{Lt(!2tkG l3kZwF&$nh~7b`!#KLBZXyg$WVk%a&N002ovPDHLkV1lAM8+-r& literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/jewelry.png b/Icons/map-icons/classic.small/shopping/jewelry.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d558447fbb0a77bf99c248252a4e31c03aa159 GIT binary patch literal 897 zcmV-{1AhF8P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00Bh+00Bh-pG#M`00007bV*G`2iOP? z6Bre%3=Zx9001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00O~DL_t(I%Y~C$NYil?$G^Y-Hm7sWEoaNTjHT(+ z6wOGLJ8Wd3b#A-UG|IzJBW5$g+(B zjIs15_r*P)z(y7<%>x*NW6=P?%1KYzk(mS{viS1+jf(s8a5Y3OXYb502%MP(0Ia&g zkfz$s6&22022knCbG|`*e1P_-E}=joUO}Yn4(xUtW`9gTE_#SinH|--UD})+N#!3c zFvfTl74i=amkKgvTbvjj=|phwHhA2DU|`^QOPF7r!j6~>I304_xZYv7b^Cid5xGG` z*pnr^`)R0*ES5YfFAp?EM4+a&R@(FQS@>$(%LrFPLx?FsjkCqYqE6Fb2H7lHI;ash z6A>T~K=ZmijYh49NT&;!03aYD{2ngzR_TpPOZ^R2b0KxT&83KN97bk3S}j9m^rk~i z0J6RCzZ`(7wOL74a|LONSUVT57Uc5y67=;>c>wfc6C?VK^pTSA<^VyZACjOdjB#tJ=s;K5f$Rq%f_mET<>mr9wpUD?8&IW=BpTD{=Htt#T zxQSFMo}V&`4<1VdNR7vjx?Jb$Y-%DJ_g#;&s7S8Y>krV}+;LiPXvpc>OG~b7T6Ab= zZoZnjyGux`RlEnF^ydBTH}2CED^8{E4o%$|D~sas7)GrNUyMe(;l=aG#`Sg5`|`g4 XNMu*u(J=ne00000NkvXXu0mjf`SgsQ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/kiosk.png b/Icons/map-icons/classic.small/shopping/kiosk.png new file mode 100644 index 0000000000000000000000000000000000000000..c042d47d744098601fe4dd207c1f6a18eb007f47 GIT binary patch literal 609 zcmV-n0-pVeP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4- z0UZnwWM`-V001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00E&%L_t(2&y|wDYZGA{#y{`9?-|>kF;@>G7IE+g zp{<@A`bc@H{*Z9OGn?c;i9#?z!CHlZ%t-pji!n8%eO*$=(_2T$m9pXBzsJed*MzM9(YFt+~-l@*#keF(%HRH8u`ym_X)# zc;jn4^5t8M)?gSAb@UkpP$(20=kxiO&1MtFagb7CbrzVuw%LDPUGHWM0M~WBVzEfI zS|toa%H=YaW$|oH@${|9=9UIP09L6~YQ=G!lJZ{!(=>7PBD2e@Oxb(v513q6(X4V^ z_qI|h<@-KD2mrL!+{#HFUG4C*t++YT<(IFO@;q;<(P&Vs)%u`q+vuDmKPiA1fDa#s zCRDv%-xWd-1VKMcuh(O(vW;x-b223eBh8=IU|SsM!@!a1-@UNr$1cm6Xisz661@M^ vy)P0Pyy8up_ncuP<8Q^=E9LI%<1CcFXmgLwF#i$700000NkvXXu0mjfkWvYb literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/laundry.png b/Icons/map-icons/classic.small/shopping/laundry.png new file mode 100644 index 0000000000000000000000000000000000000000..005579059b73b0a71b23ae34e7011fa00636ab92 GIT binary patch literal 527 zcmV+q0`UEbP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0tgonD{|Tqi2wiqG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoVM#%)OwA8bct6AWDOX2yT3@-uQNc8wXs74#FT}Z(Q6K z0%GDHSB#MKVrD{X4>WU@Ri}!o&ln5_uib9<1t16ls?{q0VzpYmGaL?oq<>hi*Xc9k z@i~=cz~bmdhnU5TLb2Yt3Xb!SlRK&i$3I*DI!JqO}I#cDr%8TsR(&*%_HE zr6frbq?ErKxg1i;Z0m#Ux-PX^4coS{EDPJV>GgWJuKV>t+qUU+I(VMPe!s_Y9DLuW zQmK5E0m|hvrBaDTqk#|t!!RDQ7SG`uhLPRW7y RM%n-X002ovPDHLkV1n45-L3!t literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/mall.png b/Icons/map-icons/classic.small/shopping/mall.png new file mode 100644 index 0000000000000000000000000000000000000000..b3c977da25aa369ff47c96282f61d644852dfa13 GIT binary patch literal 679 zcmV;Y0$BZtP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L007be007bf2AvEY00007bV*G`2iOP? z6Br9o12c^P001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00HMoL_t(2&vlSXXcJ)+g}<5nnPlqZ)uc^BAHKy$ zQBlEy;8xtb5XFrPaivSKMF@yO5p*HqR&XJLpc}PrL>Gz_L3b@8lB!K?+9YOZOlCTh z>%vJ1!5;YG!sR>noL>_WI$EBLj+C9~`HCA!^o6{iN0QZhTU%ogri)x=D5)-%=)%YmEY^!@DZyR^}q#Y){{&YhoW9sambRkda9_rNMq@ zAZmG-h(NRt3m;8g8_2Y?B{=d3~yvVlt_D4hfP0Skx%S^zp&iV$IvLCGB(e60^S{GrA( zMUjUjnIh5UQw-zyhxET5ua;k6?+!MSqc z)4OFMaxIfO7X7W~4P;5IJ=Wgd?jG#rx%~3Nu+@SrjQid*FPP$V*+l2`Ap@SUPLb~2 z&(|Lo*OTHsmD=sK)JdW(Vp?nFtS?ozn{K{2#dvn_-ialr7Tn#Ja{SI?O^y?}`4{VD z0=D;is!hKC^k+@qV+)_j^UR9B);o)2e)g*=eJZ|L8hfSa;O&${4+D8)um3#Fe*N;2 VC-croL;{1G!PC{xWt~$(697|3#ODA2 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/rental/library.png b/Icons/map-icons/classic.small/shopping/rental/library.png new file mode 100644 index 0000000000000000000000000000000000000000..711109c194ab5a61d8ae7b10f81b8b3d6a795143 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^96&6@Z|n&~+;}jlcf#`ov>}GH-tK9Z0ybt+#TX{J&ScmrXXV%l>@rOu@YL z!_I~b0!|C=Y0E2Vo$4y=n4n^O`F{PDwm2D{y&f-DJpHR9|MB*sISzT^CO{W6c)I$z JtaD0e0syLUVV?j1 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/shoes.png b/Icons/map-icons/classic.small/shopping/shoes.png new file mode 100644 index 0000000000000000000000000000000000000000..dde6a8f80243b73b7b20b316edb5e6bff3d9a41b GIT binary patch literal 722 zcmV;@0xkWCP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L004FX004FYPJ1Q@00007bV*G`2iOP> z2N)WdAb++1001*|MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>MoV#s2^R0uxC@K~yNub&*dBum&?PS&JXK_PDA=up4i!?-XqSkDmO+88L%{|`9?JBvrdCvQ zf1keh_VzkNLQvoP=K~+Ul%gp3->f#)fZv$uPqv6&Z9OA~vL77OCH#bi7Zo(KZ~ z^)Eqlo2$OEruJq&o9(r-&GIVGmkDcv+EiJMjIJJyRV39^S9N}DIB-w>2cjrSx5e%t zPVb)EjM3EZXm`uru3qh0A&=0laWDoGe1`_X=nW90qDGNr4#020z{xZFBJUHAjSMkJ zG*K-rC6QlQL1JMZubxlB*3yRV{y{X;KkY$tg*k1o(Y;$=a ziXuL|iy`uG02boTjCF4RQc>3Q4V-xLW_IBV zLul^EQLcifD3lZhlB}%505Educ%e*7=C0g$5MuPktQr7Vt7SIN3p%MNYl0WfaWjwZ z6nF0KQG0uQXtX<^luC$2U*i7tpy2TbLayy>+{tc!%33YSziwRqo+d*>rw`13n&a}h zoKut}i2@U>-!Yy9Hq*yPrRnpE9JvjPCW0HHq70pij#Z2$lO07*qoM6N<$ Eg1j+5UH||9 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/sports/outdoor.png b/Icons/map-icons/classic.small/shopping/sports/outdoor.png new file mode 100644 index 0000000000000000000000000000000000000000..2d649b958a2a62d5ddb3d6895b88a5bc029be1a9 GIT binary patch literal 868 zcmV-q1DpJbP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4- z0WuABe{WL&001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00N{*L_t(I%XO2@Ym{dc#eesC-p`qLK4TK+L({P) zL~BbLiv~3bx>MRk<4&j`r5l%mZp3{H{Ttf9prw>93T?51R0wTxk&u-}#EglV7?aV= zyfgDYPdAN?X*|1oIpD?%#pF@R_HK=^@g=8c;fx@;j4&yRC69A0^x$ab=~;iLH&F zE|yb>mxo6D7&H5;CEp*|+249{V0cRo9}DgCXFhNSxDB8utBmD*ekiz%6*VFj7S>?l zaf?RVO$b7ycC;fSV;Kn}VXLX=w3=+J{S2V))tR>z1K?|_-t(G-#+MfCYY z5V`;Vldgfe2K=&Kj9dM+KLtnup8(@P7Px^@w^GVnA0LET4qOe!!lMniSBE$u2Cf3% u@D?1G{JuxPeV_@f19SfhJ_q`@iT?oq=+0Y0000TxwZVjmCLzKW^}0jH{kn~3pDEW507OhCM`P|t9zU}ta`Za z_R<5hWAEK66_?g?o8fC`UVVFQef!Lpi;LH~jlFa7Hb6!P8IX3O)w7>&)qJYeDt=GU ztW};-dg2KuHTKQD52nBP<3|3Cm8EZoOS`{4H;_&g#a6%l)K5Pb;3riRZ}4g)%!4nmj!n5F@M zQVKR2XsyX);;CA_j@Eq;;)-QiKgb_1e1|sUjNf%PI~zIT$r0LKz|4I!_}xC`oBIgU z!uMKCPK;2@-yjTph&rz8x~?2d$xf}+@_oPU9KYuTjxCYSAWm!$-&c5ENHU$GQpzJ# zfDQu;0a996Rs=R%Pmpd+oRvDmPSW2bH4AF#ed!Y;N#B`s84%= zc%{|up%e%KZLf`1eezqs(DkY%$BxW}N|oiE<4f1BBTe&>ix)3HzTwvRvwT3%>mr0f zW@L!@`G>ew+Qc-a5%wA>L)vBYPQcXhS={{IspaLB*AFTcY|$hZ@kuy+(n*8;n&gZORHnID51P-&N60=0`R&K0YSX!^1P( z_XoQ!=(kSX@)Ca4K%W8&V8~lG=6lO;YRfPQfGTzcg?fB_NVkrX>X9+|ad>^-1W$Wu2+6$qzu@+6tMk-}U zohBfl{ea|3j_dVxY~@M-IF3!Sp`JpiirU#j9sAWI4x&hNcc7CeBlq|?w@h}sOnXZM zH?Fp`o-H%^`u)F49TU(8e_+?!d|u4rdYV`~#&)5~!nYh-+k51T9#PX@Km(X!nue8Z zP+AIfIxg{rcg%j7!VoY-h_ogP_+do9u9A!eXcShmQ5mK({wtHWUnbeNb$Fjxrp)-n sn23y4`UcvR739xd=eZBr%*4dlAG4_SBmfpj&;S4c07*qoM6N<$f@M7)0RR91 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/supermarket/aldi_nord.png b/Icons/map-icons/classic.small/shopping/supermarket/aldi_nord.png new file mode 100644 index 0000000000000000000000000000000000000000..b314c29e6e16d2533d50f230bf84e19ef10a1032 GIT binary patch literal 791 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 DEBvlH literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/shopping/video.png b/Icons/map-icons/classic.small/shopping/video.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b4e80a0ef64815071ba5865749c562b81cdf15 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~h!3HEx)yO>uQjEnx?oJHr&dIz4$s~EZy8vk* z`02d69!PN(ctjQh>4hN7*l!u>4rH*Gc>21s-{9aE;nL~c^k4%}$fU$IqQp5rH#aq} zgu%HeHL)Z$MWH;iBts!2BUQoO(>H+2Co?%UuQ=68A)quVCo|b4KQ}Qmk4t`&*=?XJ zv^-rLLnJQSb{KXY3SeMO-_QATft!#{i$ar_*fgai{kQ|lIZp#~j%weiV%*z&(+ez_0i8im&C2V{QB#T7`-h~y1VY`O+MN3wd(Bo0*fno+Ygt<##~oDZFK6X z(J_f0!x}sJf74TMe%J46I+$?4Ux1~`My|w4_K?Anu+@TXif_xLlX?0cC-gW970Lv! z46&GhKF3VD=Kk@Q-+$+9k8V;(*cibuVVUN&s2;;T_w&0JEzsclWTW1tRC9lM)Y_!A bPx-9{r_EWnd_oB@)EPWo{an^LB{Ts5Oew>k literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sightseeing.png b/Icons/map-icons/classic.small/sightseeing.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9298e789dacc34658ad09425db9c23c82b949e GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k>P$*pBTAg}b8}Pk zN*J7rQWHy3QxwWGOEMHfGEx=XJ$(bXd@_?$^NLfg6aq?l9F!hUofYHx$f_eLm&Q}lVo#qQ)`=l-)?eVL$Z^4^Tu*9W*}(Z z&|`JDFEesUYa@^~M^|O7UzLJf{NblaIe=C=-9V@iK#3&CQt;J3AX28z(;e fzkk04F9U-_sF{K5LD6kM-!XW)`njxgN@xNA=lzpj literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sightseeing/archaeological.png b/Icons/map-icons/classic.small/sightseeing/archaeological.png new file mode 100644 index 0000000000000000000000000000000000000000..826911b8153c2db4281f0a80230c2cdc6250ad93 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4Mt&M6aI<@u^ga~Nr`JjiF1B#Zfaf$gL6@8Vo7R>LV0FM zhC)b2s)D<&8! zB_t^bZg?Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0to>nF^!&*;s5{uG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpM@d9MR5;6pleekt{2%TyhJn2%fDRwH6K=`0(QvK2p3<*LE$&ncSk}gSFsh8h$c=^50c`v+hjii(z zDdpYkJVHuo01`+8zm!tFWYgpE#N2N8$m!|nqEf2XjeCKIKuan0-2*(Hot=H}^?E53 z3csb47C;~nSX^0IF~uN|4i5IqTwh-gYOPld!@w{M0MhAn6~F~prBbPHwk(TeGKu3jfBO`I;o;$aapSK{yxACfNN`O3$67>+qMB%US8(l;DB&A zd?h54$v8l~*8;%XR4Uc!4v)39HFCM!rI32Pj&0jtlv1TWKq+NqGMPlJR^ui}cRm|E zV6Ots&(B{a5{dp#mqE1FB$LT3@S*2(_a4z`G+!>4?@don-!V-SfT5uwrlzLY-Q8t$ zbd*>uMzh&`5s$~M{{Y!+mS{BkHJ{Hvo12^S4GawY2ML8j6pO`2V`F3a!^6WL7XV#I zV`5@rC!5W#j*pMu^85V&6pKYtsZ^$1E{{Ya5&zNA(R4T*{!}WJ>f(wcniN934hDm= z-EKRTO68s7I4`x$;rv} nfXg&LKaUXNDNx_r+xz?nHBcHz%b1xg00000NkvXXu0mjf^+HXx literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sightseeing/castle.png b/Icons/map-icons/classic.small/sightseeing/castle.png new file mode 100644 index 0000000000000000000000000000000000000000..19effbc1fbb85361e2f76c27e2fb885e7aa986b8 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CN!3HF~3v%Lt6lZ})WHC@o7=#%aX3dcR3bL1Y z`ns}TXBXoYl(fF?^&BW9TjCl~;+&tGo0?a`;9QiNSdyBeP@Y+mp%9Xhs^ISF8}L3w zH4mt;#nZ(xq~g}pz@36e3^-!m-4QQgD_P{{Fn5RWoJ^gQd_GPa^qE6LA0Gb0pkSPs zcH&I$hNO^CSC{4uZ0l~^Kf}XN^*-S0!;*RGQP~0$8#_7rcF*4J|NAQ&gMgsR5w{MG zjuUzb&p3BT8-CU+_+FUc(qp1DOH0n*cK#%_gVK(n=EA>zz2yEH=*}bT7Q7PZ9tKZW KKbLh*2~7Y&rdgu^ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sightseeing/memorial.png b/Icons/map-icons/classic.small/sightseeing/memorial.png new file mode 100644 index 0000000000000000000000000000000000000000..0949170c714daf7a43d863c4712db9404e212f77 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^>_9BQ!3HF6HKu+5QjEnx?oJHr&dIz4a@dl*-CY>| zgW!U_%O?XxI14-?i-Fp&gD|6$#_S59AbW|YuPgfvCIMb%16iK~ia;Tg64!_l=ltB< z)VvY~=c3falGGH1^30M9g^-L?1$R&104|@*jgO;ss?}rFVDlUd?&9^W3>T z4TXk$`xrV+3b!oT$v2}(psH|z$Rw$MPyFuNsvlSMb-8sw`NHSg|FRBCFR;cn@_kTJ zn$FPI5yM>Tu=y;LIoA&MFP<-FukL2gnp&{=qhIbmv(@rHwkywiXCQt4gU4A(oBs*Z zKika8?A^Yc%{cnJfwfY{Im;F5J%_^N-g+7G+=l7x^qTc$i(()w$QS zZkF*sZ{{6OIo?;CQPNy+RcLn+$D(UezHbtf^vze^xEy!IVbZ>sdfmltdIc=+L4nKQ M>FVdQ&MBb@035oeCIA2c literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sightseeing/monument.png b/Icons/map-icons/classic.small/sightseeing/monument.png new file mode 100644 index 0000000000000000000000000000000000000000..68e4470665dabf448a445874f58f3b35563fba79 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^AhrMp8<5nmf9C+C7>k44ofy`glX(f`a29w(7Bet# z3xhBt!>lqPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO7# z79Adt1;Nk&001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00DAIL_t(I%f*v1Ym;#h#(($EYsm6KAVFwIGe{z# zLw)5)hdMcQ5TsG<#Hdx zFeIDJ{?lrU#e&&v#(X}16#$=$#UfD@E#*(U-DWTt90foU$MIFS+s!N^5XW%>TuJKo zE^q)m0d|2Gz)N5c2!S`iA{@4o>f;8)70z-7vR0zXpz8;Aki zU2o<83y7+Uh_sw@+amJC%pLezRtf>7NjaIxF8R5MnR#6Do6K$l z_5b&DaSX9Iy>{Y8Z>B_vWA*c8=CG7Hi?wv!eIV0h@|EA>iiC-V<=n}iuV1=Uw8LWe zo%;nQZ97cZS@YO;vRn#iQku?DuBUz{;aBCaL)_;-?6aTuy)yB*khh}lXQ2#+^JVD| zRxt$`)-qpdyk*80^g3qclx0>Lx}U{%Fv-0+m#|ArK{uFvR)hFyXC~DHtW~pRVihAg;cTF%bUb8-3as~-}2>?R)Ac_Uiwvm)!WTkiti&A1+O#v;;p zVM?Tq)?b;^HMe`$a%uZ9KMUy;PFfVY;MJlO79YX=5B9edD5;m7KV2BSWKa0Ua7HyP x%QutPPF=k_U{hRJ*y6DNr#F3CY3(m~Us~m9vt4MXNh8o<44$rjF6*2UngDZ$P{05H literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports.png b/Icons/map-icons/classic.small/sports.png new file mode 100644 index 0000000000000000000000000000000000000000..335063b93353765c58fcac9446e17640597ba43a GIT binary patch literal 801 zcmV++1K#|JP)5r00001b5ch_0Itp) z=>Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TUDh8}|})pa1{>G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ipb4f%&R4C7VQn5=LVH|yTQIU`mFI=QCXmJ%xFi0R|NP|LjC^|%u7zYPe2@VR9 zKOmD}XdzRVTxo~X1lmd3=@y41lWpk`PDOAqq1=!=63@IYO-L;CZQu9(-sAV)_ke#9 z9UUDlEG#ViT3lST1VJzX`~>h8Kp6jl*YEeMD=RDZ-Q68Y(lkvT9Ual>baHulnb~ai z(dY9i0Ho*SmveJ--_z+dtJNw8admaYd_LblS1J_-0)Z+3xknZNd<8%NJU>7058JlQ zd_K=&u{b1}%jF25+!IIwumRBP^>TN2m#I{WnM{V^aF~K1aCUZy7#Od6vuNp*0mn zp&$r-f${NiDvH9Vrzc)qTu>B60;rE{ZEa1sTrRX)t$v~;VHgHvSw^GL07*onQEY5% zKomv9VlgC>N$9#RjTnaUJ06eAg+c)&(Q37j%jGaLGlSdPTio2-Kvh+^-ENGHjR633 zT}Lby!}RoY6PZk=bbo)(si`S?JRVAtL{(LX>==f@gM$M$n@w7l#cVc9!!WqEwpN5B zNpBK~ggxjtl}fSQZubQ&%i`wdCIvyD)9K{S&JHgxFCRrweBHDCc`$KVmU(=9%(JsI zUSD7H^z@Vthok>4ieh(ia`NL~6J-Du01O6$tkr6?ZJYIaouyKVp-^b(O95yA+|TPg z0pR`N;bEuK=?rC{X&PNF7Xh>ZyaVuJu*T03SXx?2MPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L004Uc004UdM@vha00007bV*G`2iOS@ z6%7wqHbjB|001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00IF?L_t(2&!v*FN+VGehQGZtyF^UZ#v*GVg^)0b zh%;UcS}0oxDoQL;_yE3y`wqT>k06MZg;=Bt2ol|mGpvv`Nf8mEDFVruOwJa;3F(&g z@6LDs4-S{}Noy_qXA~dE$K~niY4Z6z$z(Eoh{xj;3I%3nWil43Tw zfAu`bWcb`@ge-A+2`ekSzP^s-tmA;|^5x)QEN^at>ylVs2S7wH4-et`n#IM%v1~gI zSQg*+_lZOz0Bme;gJrS0u>rvB>@2H0JCI6Y+xAF~L?Z0&?gB71HHG6iq|<3qsT2Tf zYilGD3AENIH9Cu}tu2&Nm`h7b#A2~<-R0%w@K@iH%jL*sv*A2HKTkTHMhymoiDIwU z<6oHX`7^*&d!F-X0!hnK7Qlg0I6|i00000NkvXXu0mjf#(6a@ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/archery.png b/Icons/map-icons/classic.small/sports/archery.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0ae7b05f36016c41010217c018d09c093f5a6d GIT binary patch literal 731 zcmV<10wn#3P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L004&o004&pof14q00007bV*G`2iOS^ z2LcAMs?a_F001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00J9HL_t(I%bk-?Xp(Up#-E?gRsNwJ#-M2Q$71dc zdQnL!y-8REjc&1nMU0s9HYf@yPX^lRxLm<7(~CPd6wQ}l~RTbJ^e)~)8|a=B>}KdC=5*` z$#go+a=C29Sg+SPKR-`lpQP);4Nl4Td2HH8Ap}=fR}aTXlC4&YsZ`1WkfdQ4%x1HU z$K#Y`nTbS#s;VC90!D{qGRe)&&7+rTVPOHCPUq-lYBrmQL?UAW{sB-?+MJrn5x)Qc N002ovPDHLkV1lTsG`|1< literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/baseball.png b/Icons/map-icons/classic.small/sports/baseball.png new file mode 100644 index 0000000000000000000000000000000000000000..1f20dae72753eeaa69030a0b281e5e53b27cca87 GIT binary patch literal 951 zcmV;o14#UdP)5r00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L004Oa004ObIJJlp00007bV*G`2iOP? z6AuC{To1nh001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00Q?(L_t(2&s|erXqIIhJ~7}&en{Wn>weC z@6Y?a&!6A(JnyfIU2JvW+?{hc7w3SPv6_9r_TeZx_h>cyC6RHS$T;t+WfM}yM*-CT zuNTY=01!gd(nO9%LL7d3{kqE5`Y<-Vup6x>`*3|~5?8NY<4fO6n6l*KDzD38+d89}Ju`AX517*m-?p`u3Qy?ocFz*xOaB zzV`9a4>DCWpi~n|HKA1t-JhKUJ$wK%1*}ydQt+N|_^p?!m1?q22(dTH(q#YZ`(CLE z;ZPI}DBXfqZJ16I?VfJ5duuROflL9i8jcJS3B0&_b1h5dektR4Wb5#d(7FY(29B1i z_M9HW!mA^2q!7GCC<(rFD78k}%rT(7NM*Dqvd#_kZ|H?C+Az8eV{(LryRfYsN_beS zL1aOW;5!QL)c0_SKyNBx$UhZjshpd+`8N#ZFt!7-9r)XKv3Otv-WvpO;e$o+4xyF9 zJ@+)YJ3(XcF{G)Sjl3_f{BivT8?$V-P9Yxu4dKBOyf^TH5Q2l7o`?Q@4)HUO1I(D6 zTVfx|E0HBPcIoR0owu8CPQyEk#>?A4&cOR+bIBgItq|2Wg26CE`1XexWvw5JnEA5S z_Nz}%Tr}hjd@!Ij6}Xu@Fkk!xf4_l;C&v*Du7&Ka0HVa1^FM22+(l--yt2epPHq|M zf8vdUyQ+_LrC??R;}EokNFv1D3G$A{g)e_qfBtoEktnPzapeo~sEEWndq#$`!HsL9 z{{9{Sz@3E#Zp|;1-;Lk2T=H>p;lE#44IxBb%IHv*%IC?2EdY=v@suV1qxa=mX1=ys Z|1Yr%@hQ0Fl==Vw002ovPDHLkV1n{KvIzhH literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/basketball.png b/Icons/map-icons/classic.small/sports/basketball.png new file mode 100644 index 0000000000000000000000000000000000000000..73fef4c1457d162c842654ab371f09c5d053c3d1 GIT binary patch literal 934 zcmV;X16lluP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0uT>765KcGPyhe`G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ip_(?=TR5;6JlTB9>kxH8qsM;7>0ugn90bDr)I{J*AVCKD%KIFz1A8hVic8jY}W@mJ@|`LF690N?e3Mb8|6@tMqfuRc34 zYv@8;TlXksP4?tt-~ujuxKvjQ7q%8wZa8y*4WR$K{Kj)br{8{g_-HOC#b8!v*I10( z&5)HfmxuBu0+`+r7b&Ul-7_3JbpCgH5%6_@*&~_v-#RgTRK^8ZfC*?Ybe|;OFZt|J zgVBt{k{Y>$q+e=dh9(M^tL`b$7t^N7?-Z}>9*+quAl@YiIYNr9#Wgiy+w>_{7|Tz6PmcX*C_nP6%=jA4&d4sVL10xQ0sJL}A;HSDr*jC^JJ`9*T2Of;$*%8I8!9>oQk%z~V z#iw^Ax4rAoAA>?tLIDUn%e3LnosjcuHsy*#TIi%qZKpIM(ebLf-~f=FPecGw_bq?{ zOXu)-g3wWvvL>Id-a|H<;W{o46ZH`2-4-3)&i_PmxPWo-8F1A)NiWMLh^{J;jeT_pInMw8`>p@yhO8OuHLKtp4R< zhY`9iI8chyXKI~O>smSWLxZOtNb<=yTk7>Qwf(vusoI4bPGK}5({(48|z+ zn;3{~RRMf)t;J*cIF=@uJN@Uv`j$Vh0eoL`Un^IgrRjo2Tocd+yzL{xg|%v%w62ko z8gDNDyNyzPxDY&%ZV7C=1Q&T6GZhidj#oNcb)c;9i zCsk5RytFSfJC(B@Z?#qN+f9f2(?+G?Md#)(*FUoTXtfvr50LCN@T4Nw?*IS*07*qo IM6N<$g8UP#lK=n! literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/bicycle.png b/Icons/map-icons/classic.small/sports/bicycle.png new file mode 100644 index 0000000000000000000000000000000000000000..22150d4186a35ea1b3e7f046ea7e96d3e693238f GIT binary patch literal 565 zcmV-50?Pe~P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TUBDI;pG9fB*mhG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Iohe2` z(&O<6f*{K>P16j+d=4Z@s#dEAAyE{Y&1S7uGn>t-s$Q?x!C-JYopQOHMx%*Fqv>>- zz!(>cMW4@Su~<5t4oQ+Wn@v#^f*>G-E|;rbuNMl1U@*w@e7RgE0RV@?A(2ST=X0yo zy4&rJ$K!A~gb-FLmF;%hYPA-Ng~?<}rBc)Blm-A$6s0IiKA)E)X}{llyAm01!f%OeP+W-|zR; zYSr)eKX2V^HtY4;?RNY9e()EB(0Dv%7$y>l==J&+MRCpGBLQdP00000NkvXXu0mjf D*^u!= literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/boule.png b/Icons/map-icons/classic.small/sports/boule.png new file mode 100644 index 0000000000000000000000000000000000000000..50a95086cbf963992f1b2c017fc3be3bfdce1d18 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^MG9 zV4O=>BT$61z$3C4sA?(*GxGTMbpQp~OFVsD*>7+%i!n21&UJkS6f!AsjVN)>&&^HE zD`9XhN=+ZWOf^9 zww9-hV~EA+t&?_l9ZC>r-Ty*uiO2V5*9{wmKXU2>E#J8LjPOsXWnmu}Kk=C{Dk@}5 zPEc%F(D}(aT4z_cInSo$QWoOp43axK0+>@HCq1`Z8^+zR-s;)iyyGQSuGzlZZy)_^ zBPIT6uF~tTQfo~aR$t|Mpq{WZ#%QL`jPuW@r2aHnaQS7zZ8L_war_L4nJ&oY_XqrN>KR2`#+l=7IXx4-OO>@d~?q%{oUT7p+d(u zF3Hr|ej{&tl0+MW5X(W?{ymK!D|Gg~Kb^F3$K#$|^#$E*@{j&Af3kUAV`u*~eqWJ@ ztBPmSV~ZX)Wu4Pi`wxDsQ1KLE=vtJp`R0}AgPU}2z5P~N7W;kSyQh+_Ejp(Iyb@b@KY0`s|~|z))xKboFyt=akR{023F+6#xJL literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/centre.png b/Icons/map-icons/classic.small/sports/centre.png new file mode 100644 index 0000000000000000000000000000000000000000..e2944e874b0c7d8f744d1f2b66779643e33df141 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4Mt%RZe{V4ZXiu2C9V-A&iT2ysd*&~&PAz-C8;S2<(VZJ z3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(iNc*PTw5)vL%96LMh{OX?f z_W%DK2(d~&#?!KVf9rn1C(r(A{+s%ji+}g;`RnuYKeh-dTOQHC56GTrk>vZ~-1($}fgyT+T=DCa83A literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/cricket.png b/Icons/map-icons/classic.small/sports/cricket.png new file mode 100644 index 0000000000000000000000000000000000000000..a41c8591c15f1ddf89aa458b2561a5711c2bf681 GIT binary patch literal 513 zcmV+c0{;DpP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L0034100342+*1df00007bV*G`2iOP? z6AvR{H6P&s001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00BWsL_t&-(`}KzO9EjW#-DrdP+#?~P7N_DJ1A(; zp`jnp;u4;=*Axwn?fnUDLD3)396=By88k#qxfxB>l86O*{<=Fk_3j#smxz1T56|a; z@0W937yomSN@Y#UIuYOznbIwj=Rb%S9C4i59}G&wL%D7_&Ro|pu85biGaNn~wp!n8 zb6ZsctIPA3ixK~tE|6;gV9kY8R83CHh5iH|o!!su9_(e(tSL{13Y7X_uf);T&C1z% z<%IyiPF@itiRNg?k8pYlx?$ZhtuhnYlq2CJFYp-IHmX(ahQU}&%m;%$IIe?6v-f&* zT7CoolG{jdl1THE`r*KV(H|=TfMk{u*=S5uKmgmZQLD9!494S9fzq+Esp)U!=g)fv zC6TIuUuc+C>GrA4-b9)$^SGh)-nEWV|N80{|DN&($YplOhp%e900000NkvXXu0mjf DOVQSt literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/croquet.png b/Icons/map-icons/classic.small/sports/croquet.png new file mode 100644 index 0000000000000000000000000000000000000000..f9c7e0a5341ebf653255f33cc2de00a73566769b GIT binary patch literal 521 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D90{Nxdx@v7EBg&jeo+I-V_Z9PfkGxFt`Q~9`MJ5N zc_j?aMX8A;sVNHOnI#ztAsML(?w-B@Tt1n}sd>ezRtf>7NjaIxF8R5MnR#6Do6K$l zUE%5J;uvCadg)~SZl*wyqxE{PYD5BCesZwgR1mX2*d%d9mu>bzg^sI_Oq#=vrd?cd zQHf(y>amo~99rB~>9;qWw?BMn-t}|V-;Y1OTdh3li2avi_M)|E>#k?BH8V0y`cOOn z_FFf*`Rdb8&rH0#^8WkPmtVdp+9|Q`{covWw=A>SZTSpon`cI?op#7XuK%gUIpqg6 zcB@0QUg~F=NPV(7&%)F0tULX*Ldn%o>0FbmA=Yns8lG2XZNIIyAZR5^HD19}@!uIXY zX}Yny-2Np_5YusDfBx?tL(I;iClXv11r@vA_>Xu@11&Yoqi-?xGLl@qia{q zr=I~ii4Pyx>`{nVmSQA1!?sF9!yvJ#ySw)+yZjQ*;`#p><=sLzG6e8h0waaN)78&q Iol`;+0QRNHw*UYD literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/cycling.png b/Icons/map-icons/classic.small/sports/cycling.png new file mode 100644 index 0000000000000000000000000000000000000000..a24613ec319f78fb8a9744998ab7277a104ae1e8 GIT binary patch literal 700 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 X_=3yR>AjbMPG#_P^>bP0l+XkKt^Rlo literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/football.png b/Icons/map-icons/classic.small/sports/football.png new file mode 100644 index 0000000000000000000000000000000000000000..ea7046341941dba12f66af838322168625a6df08 GIT binary patch literal 661 zcmV;G0&4wPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO7$ z3kU^)m$_~L001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00GrWL_t(2&vlZ`OH^SP#eeU6=gy4bG%cE3IEFO_ zMMaRcN(M5D{(z!r6XK#$1f`%|5%eVq6$S%B+g1e<6qOOR(j0|f$H(g!;_C}#%R7D=U z($V?&l*e_f!Ud9a!0#!Pcj2tx~{+405sHcwQaAse{Jwr zNQNT3?`fgw%yo>Jab!4(ZyETG&D7hcwDx^uY+}m4)OPVkZkaow9W}If9-yx=7NAdz zl1!gPm^$MFUHmUq!t$S=q)(lfmk%np?|t%F2hm6*; ze`kWz4cwBBhY_rYUI3P55%^wJfa^L~mW5D4NI^ut%hUa15#RAai6yXB$~fg>Re-FC zW0p(&&d)QH=YcHQyv$^2|F$TsNc}#Fxh$4t;rdXyEC|5$!SO+@OELQC4VmwDf5D_* z0We&~hBf(mp=2BiPk&BE=d+0Qm%LyNq)1p5Q9c;;+Rffa9g_>?-c38G>_Q4!k0iK| vij$71G)hoRkHYKR00000NkvXXu0mjf42>Px literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/golf.png b/Icons/map-icons/classic.small/sports/golf.png new file mode 100644 index 0000000000000000000000000000000000000000..73e5f006ddb2ef284ac5722e50cea446cfa32892 GIT binary patch literal 587 zcmV-R0<`^!P)`00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOb( z0UZKO;C62S002pJMObu0Z*6U5Zgc=3WMy(`c4cHBW^!+BAZT=Sa5^t9cXxL#b8lp6 zaBpO3E@N+PFKKRMWq2-dXmB$>b7f<6X>V>lV{B<~VRCdJd`&D~0004YNkl63A>+y_CxcDu!K8~`lKBA?Gc z1zsTOizKht>xJj@`B*NO1t^orXt7vG(#!y!&1N%>$K&^8G8t8?RROG4D_qwFNFd3Z zPN&{xv+*Q(l77}|H3711TaxAmU`{3zGo4PGzzB!{T@}V?G@{jN5yvsW9QegwF-oNp z-EJ4tH2GidfN?gPeVl(>o_lKo-UA)rCGY`A91e$npeMjPpt4*pUl$66Oc;hVo6Q>t zfFKBHG#aE*DTc%0X}w;b9LG7`K=b*WIF4zz+wAxIXfPN=l}aT7l#pZtAAwg_XMDTr Z^#`8c&qZvecw_(o002ovPDHLkV1mNM>OlYi literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/handball.png b/Icons/map-icons/classic.small/sports/handball.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc122b898d4c453d39380886848b50f7a5169bb GIT binary patch literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yM^l=boOfs%i1Txr5Jbhi+Z*U5*Tk?N7(!L02O0}npV~EA+xs&a? zUpa^zJ%5|?h~Ed{2p%6{gRQkWEcOjey=#2~)*SIyi0Fvu@>NiX=$zWxyCCderb?`p z^lKKG^I_UM^drCTjjw$-vzWj5e~+6o9~(1=;s^bVwGVgcDJ)G9arJprVPn**(WSBU zNxJ~kvdn*950zNCuD*Kc@ka)RH)YmWvP@&vhch%}&Ju8Xpsf3-Xs65On=TSLaVU#_t$iSr-p*7WF{`q(lFU@6AHGw)}oDB>a5^U{UX5cg$j6ewlOjSvCfRmWJn*8q-ft2uj+0*RIs<(uViHUzAu$ z^dCQwwt0gN_e>wQzQ+sV)-S%8v1B^XuGLqy4jZH_4O;mA_e$-5HypR$PThU?-^PTc zBEsP_&ZgaX|2;xS?EU{Q-&xuZH?}%8Zol38-XrGVw%mE=)Bmw872#cL`pBa0-r=mR vPI}X;XWR58XRJ-!v5x!nrhmWZ*fSp9@X6q-&%&p`m|^gA^>bP0l+XkKHN@4j literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/hockey.png b/Icons/map-icons/classic.small/sports/hockey.png new file mode 100644 index 0000000000000000000000000000000000000000..d01fe1c8d8f51a5844f90d7005369cbf5623cb81 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yM64oHhc;DQ;3Mj~4;_2(keuI-=)L5AJ6Y~b3P>ZLFV~EA+t&<)3 z4lD4m?A8AFKV@0_v=dH-ik+{xh1w48He>1#e`u80z9gN&laWPW(xGos3NI^i*Eru~ z2%Qi%@%bn1)wi^EGJoj1?0jhE%5{1v{5kj6D@f07+^+KFUjMYPi($nE+smXUe4T&t x)bDjA;SYZHFg$y?d(Qv(@CN+{`uhvb?E)5u>l+78ECRZR!PC{xWt~$(696VcTr>ax literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/indoor_pool.png b/Icons/map-icons/classic.small/sports/indoor_pool.png new file mode 100644 index 0000000000000000000000000000000000000000..444772d3413b62be5cf347c82a18e70fb680b653 GIT binary patch literal 650 zcmV;50(Jd~P)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TUGnDn$CnW&i*HG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io+(|@1R4C7tl1*z90T70tNp_nrle9^j53E##f<);>(Sx`M9tzUnK@pD@e?h9f z2qxW%7Z2tic<9xOZKNoO;2sn~=^?d(#e=8?MNG44w!2xwdT zhXR}fiXcV61Fr_G0Iz}WUbFZ)2~7WMQZGTqhQw1iz5?3~*qi~Y2xcDstO7OQIbiw& z4mBb58PYX4RfF;Ou;A^7yK)THieMJOIRm$j_`>`c2adU6SWsk8dsWjWfE&P7;7Q3a z?)DBgNOK(61U>-wfYqKB7-T@nFj~M%-`@g0RyFN%pTNhP0hUXK@$EkZQ$P%u0%n16 z;3BZxTfqS?01v8~_7+$I9s^n6K5%UhZ4NjKtoQ%m{N%&a!1Zvz?qPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO7$ z3o0Y@D0;I1001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00C@CL_t(2&y`Y7O9F8aeQP8ZZeo#t=nx6kxenbu z2oXUMre+=b2I3+51VNV|iM~ThnFl@8p+whPnMN3>xhr1!v-q>3Xcye+&?O>G-*IN% zn>WMjLkD;^7Ca8;_)Mu-y=gb2Ys*fhMyDOdgV`xl7}=~Hy+U8FNAK2$>DE6)1CkU+ ze}4}SMA17Z2rG7T1EZE#%%{_fD3{l|Tb)i@peRpqx0~1==phVBxLgE9ks%1Se|+l! z#*WOT5><3MsvLq!$Dk_5(MYjKVC)1&V+Vmm!jD>wHbWsIfZp$+yw&kZ0Br?>gj$V| zOa}fYXEIhO$}`t$QO@CL%D~QL7Gt?9*dBG*zMhz9aIIFGQ+OU=ECx*@gDCFD0Ml>% zD8L)4)m>YP}L?RY4y7x2sX&_1qy}9u0xW~J0Z*G u$YiV>PEVK6Y@WgA`{*fYk;ouSCifSpE2tQGG%HX50000Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TUG%5x+A$6951JG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpMM*?KR5;6xkzGhrVI0Pv_dT1(dA8hU`*7-9(#ni$nR5fRl*30)OkBtbVB6nzMNkTn7&?Bl|k;%Tf%x5}NJ_jD!baBJ`7`~H6q zzyI?BB^-xd+~F(}h1K4;65wW=MR>#*s(5YtsFCYDYUDa5GHeV0peqJ%bcWrQwdA6@ znES|a<^4HTU1zfz_kT~Ntx#~~zXpd6@8W&!^t#*2h7(`2T$P>b2vBXbvRWh8F`mkd z$)pf$=g)#L)(l`uRt6WB?j=d$0jRH^s*TPXGF5E%Z4SMtdCcO4VwSW3+)oH3XDzwk zlm07CI$ z;vK7BR-{=lVNH{t9{-Wl#)r=r*X}Z6CYC!W{;Qd*}0Dkj>Ypzlq3nCCRv-3g{!fJK8r>pKbHmu2Bfmd lw`{kmlBo4w@+AL9{sAYf#8m&|kk$YI002ovPDHLkV1m+SOIrW{ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/multi.png b/Icons/map-icons/classic.small/sports/multi.png new file mode 100644 index 0000000000000000000000000000000000000000..babe40ad22a29f8f4d46e965831eea0f3616ac11 GIT binary patch literal 743 zcmV?P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L0074T0074UVl#Om00007bV*G`2iOS^ z2RJb-zN<(800L)8L_t(I%YBniNRx3G$3OGkJBMPELZT84_sUDmLP+rtp-2n51RaE~ zi{&YZx5I8h-hvK7C0?Ram)$}}Z9-6lqA0;~Zki~}rNY<*C)?g$efM-Ir%UZ~`u(2Y z@A>lO`QsQH8h{R%V#Ih_gO;a>Y6Q`mm)YsPou(q~FI2@+4vy)URMIaEMwY3$I3g7_1wks%# zf~u-0ibCB{tC2_quh&a1m!rA4nTd%BtY0M-r$3TSFH*>Fl1a{!%`8=OY6P54C++R+ zba!{-^Z6*1O00hW!mYcHQLF-~xhM~xjFV1IALan;ZvJ3rJ%y%e?CmnlZbN+)w9{I#77UW-+=3-+0jW0~S7khtCL_~C57w3V{rR#Svx3`#i z9pq*xTr&rH&u!xIIJ2{}*tU&&ZWUeEj~CJFe}Jd$3d@m~)mXV)W@u=LL?Xf9;2?g# zpUKHd5{bld0f1}wpRtokkz1MpAQ%i12n6Ws>#P3p`Fw0`ZJjIt&@=pswNGyuees;O zwl=(8Z}qKIDiMuF85kHiY-8=*TSTK#65Fk07ov3BxJM`y!tHj`(a}LmOA8|-BdDrc z+l2!nk%(+;Y>0?RF_)3}yQgv*x~|KK%XE}%a!RtvugBumWikwduCA{CuJcLQwvAyJ Z{02nkk_jX_J=*{P002ovPDHLkV1gi|Ro4Ij literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/pitch.png b/Icons/map-icons/classic.small/sports/pitch.png new file mode 100644 index 0000000000000000000000000000000000000000..6e54ad5b1fca4e31dc88b8de72fc401a909df2af GIT binary patch literal 773 zcmV+g1N!`lP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TUDq17qg!IRF3vG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpS4l)cR5;6>lg~@j0T{+VU$<{_{>UYnBTJpS%5pZ9VIazi5LSo6j^!vQyUD=l z5}5yh7jH^3hJoZE@}NZutss{)q1=ki;ToE_veo=<>3+Hnb(!vx@9}*fK0NR|ufPBe zcp1ZwivO7!!kpxm94}+MrkWl;{1;#ZJzy1R}Q@+Ezfz#An=h=aZ@Zz#*sH5CYr523HO8p%On123fRB>h`fLXw6opfTx;lNG zXfl}qsI9GKVqyZBOs16Il{Z?0RwrtfZ8jZ}&&9S_^j8dsYtJU&oWSGOhLtN^-C^WwdA5kU>#HH_{YzJ+2&B2=M;dIF&+##jjz42h_M< z&Jx><@k71-b8im>z|1E)@%Yw#vGh)w2ECr7{sK#hVq7m~NkkHa%N22V{l?nf82>?{ zjnQDg)E~qN59W2Px^tJ6@|cgPlw#|6am;%q>e>?H$-gOdaFeH;qJ?0tR*UH(`Qlrr zkZvfCc(l@*tK*kXD%g(a+wz-Ix>QhL06ku;`+es>Dlq1`U@x_|00000NkvXXu0mjf D$SG1P literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/pool.png b/Icons/map-icons/classic.small/sports/pool.png new file mode 100644 index 0000000000000000000000000000000000000000..7c36ed00f7bbc4f37fb496a9fbf2216bfe39fca0 GIT binary patch literal 610 zcmV-o0-gPdP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TcinG#6oXasU7TG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Iov`IukR4C7tkG*RXaU8}!-@D%>X_Mw+Dj`L!ingFdg!%%aIqIJv=psTT?ZcY$izbyqfh9|x`j=lY8^a1EFNu1H@r37iK` z16zRGz(YU*w}68{6Zirg2CDb#r)Hnk%1CKqeg?P-i~~;veL^GIq!E4$3(ST& zoY`*UN502ODxJzGCR{*SHO%s{<-)!Lm%av?P&)>?bLk+G#)+yIyC#fxBK%rj(nrU3NYnT9cdaS@16)U-dLN1~u>b%707*qoM6N<$g5s+M^8f$< literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/racquetball.png b/Icons/map-icons/classic.small/sports/racquetball.png new file mode 100644 index 0000000000000000000000000000000000000000..6f6a10e1897bf1e089ec69c17060a4d5daba6ba0 GIT binary patch literal 762 zcmVPx#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0Tciv2rrSe4gdfEG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpOi4sRR5;6(lV3cboTpF02=@8Spu(}k2unQr?z#u6T zMg7a=aRBUAYEBS(PMJWSt55PoEIJ{U8Ac#15%u2d9 z*3kdY=yVcr9D}A^12CY8;#mM~IcO;Wu_qjk@Bpx$@CVn|5CnjmmJd~OnX&}N>Y-^{ zjM68XD1J+uOz(1LlCas_Tq^bbMRW5HE-&5lmHg)Ygv~acG@EY&un% zoXqt{mS6LUL?~8KVcrMWsi|3fnrYhvNW13XNv0 zv1LZm;uirRQ&Mt+%Vac8Ref2We;<|QF?S%au&X5n#-;%H!U&;+F#ym2bfrzEEme|^ z_s`BgKX8#A*VY2SBLFmMwT@&YsgH4-3PN7~cDaK2=Klbtdi^B;?W)nZ^sBXX@Omip zjAXMPvx2~nOqr{TuJX8|904$z6~%Z|mb*MYUn=)imlcFh$t0YVdQTP0zzsqiahvV# zoyp0S9Mk}yT+``hcXqrJ1_MqAf>${Ra5Z7Eyo$86?5(q$QHq$|{uThXx4nUe21E;9 s)x+N2Dv!rQ_cgVn1EZatr;AR07*qoM6N<$f-PV~^Z)<= literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/riding.png b/Icons/map-icons/classic.small/sports/riding.png new file mode 100644 index 0000000000000000000000000000000000000000..2313ae4afac59f6ef5aa2041c14c249998b47425 GIT binary patch literal 543 zcmV+)0^t3LP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT2MiZ4E*b7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoaY;l$R4C7dQLl>vVGtelWd8&=SX?n!wJ9uuaob`L{DB}Sg3+MGA{L_-{{c;! zEsBCsM9>dpi)Divz91re?y|fK%N=rucQ4JGdGi?N5&pydes4CLgTcV1^tbwOI7A{5 zBJz5@-EJ3v2LKV7rny)wZnxWfK35c_SS-flan5-%nKTT8zR+kiJOECoQ?*(R1OlVc z=zA6n1|7#apU*Ds^?I@_U$0jJ&}y~%{l2DY^aipl3nAPiy_RLI*Xvv^7mLN-Eu>N@ zNs`>!cRU{R`Fy=zpG+oxzu$43LZP7RI_I2o4j>c?F~*+HXCjgC`Fu2;P623|CWL6W z+lr#NIsoJGI2w)Gw#^s|hr^rA2Ed1|>i}%qmLw^Y$?SGJ#+a(AM6_D1(&==k(=knR zHk-NsB>?4ec{m)pu0jY^RhP>pfJ&ue7{+$HeNBb{JRXnN*5z`^X0!YKzE-RKj`D5N hmSvSnr5|1ZJ^}gvXKKkTK$ZXi002ovPDHLkV1km{;Di7G literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/skiing.png b/Icons/map-icons/classic.small/sports/skiing.png new file mode 100644 index 0000000000000000000000000000000000000000..76bf2459162f1a169cdcaf9faf3f1aca4e5d668c GIT binary patch literal 730 zcmV<00ww*4P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iOP? z6bLk^=o(}I001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00J6GL_t(2&yA8#NRx3G$3O2}ubaZqnUJ<@PK_uM z6cGO*ZuiD z9ZX4c*5~?tzC6$KeI89jge+{ve^Tho%O+#VCVbm8xN+qXqtC+thzO}v=0J_M*ZKR} z8fnwSSyqN=rnq_aG0O{^=y_IrW4C#5e~g?Q3wQgQ51P}-B=;H`FcJwmeb0FH`U?e4 zou%kDPY1(@RpSH}(rHEi!|PmbJ`aEuz+$y>vZ8{o(J0}7pVszvib_fVxKwkR<=8s& z;W%#sa|GXpxmbOQQda@UZ9dL;BLy%C_^0`{Mgz;DTPvsl}H4e%?3bqO*xuH+ub=bImwIOUJTQu%IoFB$OtLJ z!0K>tt)~ZF*I8Ry!rRtHzQgf%+Iyr-lfl+jVxbVW(o*h>j^g;kaO|D^eSO42A@bdB zZVeA-H6CfU=H>!W>Gk6BcsQ2BiKdfD8S3nmZjVP^4h)D=N<>6fW@qJ{&nKUP!Tnn8 zsNYWQ?C_+ki@EV}F0`~z`fW5ews`~oInP5=M^ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/soccer.png b/Icons/map-icons/classic.small/sports/soccer.png new file mode 100644 index 0000000000000000000000000000000000000000..335063b93353765c58fcac9446e17640597ba43a GIT binary patch literal 801 zcmV++1K#|JP)5r00001b5ch_0Itp) z=>Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TUDh8}|})pa1{>G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ipb4f%&R4C7VQn5=LVH|yTQIU`mFI=QCXmJ%xFi0R|NP|LjC^|%u7zYPe2@VR9 zKOmD}XdzRVTxo~X1lmd3=@y41lWpk`PDOAqq1=!=63@IYO-L;CZQu9(-sAV)_ke#9 z9UUDlEG#ViT3lST1VJzX`~>h8Kp6jl*YEeMD=RDZ-Q68Y(lkvT9Ual>baHulnb~ai z(dY9i0Ho*SmveJ--_z+dtJNw8admaYd_LblS1J_-0)Z+3xknZNd<8%NJU>7058JlQ zd_K=&u{b1}%jF25+!IIwumRBP^>TN2m#I{WnM{V^aF~K1aCUZy7#Od6vuNp*0mn zp&$r-f${NiDvH9Vrzc)qTu>B60;rE{ZEa1sTrRX)t$v~;VHgHvSw^GL07*onQEY5% zKomv9VlgC>N$9#RjTnaUJ06eAg+c)&(Q37j%jGaLGlSdPTio2-Kvh+^-ENGHjR633 zT}Lby!}RoY6PZk=bbo)(si`S?JRVAtL{(LX>==f@gM$M$n@w7l#cVc9!!WqEwpN5B zNpBK~ggxjtl}fSQZubQ&%i`wdCIvyD)9K{S&JHgxFCRrweBHDCc`$KVmU(=9%(JsI zUSD7H^z@Vthok>4ieh(ia`NL~6J-Du01O6$tkr6?ZJYIaouyKVp-^b(O95yA+|TPg z0pR`N;bEuK=?rC{X&PNF7Xh>ZyaVuJu*T03SXx?2M_YP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TUDq77jZU(f|MeG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ip4oO5oR4C6?kV{V!Q2<8I%)K)}3vKCOc~lT$00mUU7{kKEl^R1r+-c%ZaOd8Y zf53%n|9~175Lj3OL{c7N0HK&dLRy0aiqMumnYlAAFc`l5IXU^XwZ+NH{`$}zY1Z7A z(!3$0*(HRqbY1#14FkaQuw7S`T;=?6oYRzY>~;IJGFvQWm$mfvN-P{{AC$5ts0$%9 zO-IuJG%n7=^T6|5TvsW_uI7$2yBqQ(o9Q)b>cVw(4G6tRf^Ueg0jZzM-t8iTfpd>)0 zQe|p(3CjwSPVZvdivH`}T1wS0y$&O7-dkae|DCICVF~!?=?`dm|usOd>HQLMWdJ?zR&+zjR zdT#f-Kn_@wz{`&I=HVxg9z3Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0Tclr3>A#^7ytkOG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ioa!Eu%R4C7lk-JU;K^TR<-5oB%>@0`~UZMy>ysUIep--U3My-sszJoTtgfHMD zm>3IVtu{stEr~QHS_rry#3)#-u*9fvs>z@8&H3ky#_x&&tH3+(0$lzy=zoB5U=bJt zmVYy7om1gppY+-xtrk>Ef~V^QY62>yI&-_PXd1jcTye3t1t2i!2F<2BlM>899dkVGB?h8Xm{Cboxu(e+9G$oqw3=QWRshl)S?-SST`;$46H}n+ zo~d1%)>XU&;`yxi9m#@?MQ=$Uoa_SSsEz6q^jp&&7>F$No#+d75`zS+=}x2n$9&2CkFGSy6pkRss00001m literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/table_tennis.png b/Icons/map-icons/classic.small/sports/table_tennis.png new file mode 100644 index 0000000000000000000000000000000000000000..8372aa7fe2b4b435087dd41833b213d8daeff0a4 GIT binary patch literal 715 zcmV;+0yO=JP)5r00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L0046U0046VW5GlI00007bV*G`2iOP= z6%8pJQXoVC001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00Ik1L_t(2&yABmXcJ)=#-AK%VrmjP9ErK1G}Jm= zMa0R?f~9t_Lx&CyV$nfxXfucoZbETzaLFP_=n_1Kh`QKCrI=`11BRME&@_c3B*t7J zLA>M6Tzwq0ktR{|gKvAE=Y8Mj`#uLrqKm!VUA$UZ!Dyj?fUe`CAi%x2h`C4vJ+O<7 zc${m200|sAPeUQvw%uLMLk2IRQRaQV9x(yFo1EnPocecz&*d_sBO`sq-vKUNUZ(R_ zgV!ItWV_w&7zhWeWMeU0ZMD#kPt&tVj$Oi#)xg8ODcrc9=*?iKSY$hqpf*3x=J0T* zyL#aw7h)O>YoF2B6AE{9dLnslZ0(RF9S65y+cpG2fFKAc=kv%te}fN4PGD6VMavV$ zz46!J$T*faj{^e`GMNl&wHjnu zhA4{YXsXpJ)9Ew^LDMuUibBIM*l09Jl1@pIAW0GiK@>%Jy5r00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iOV) z0uLWX!x<$2001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00Ll1L_t(2&yAC9NK9D5g%okLQ zqL&W|B{pA(0-+az=#zc5f~adL8PXeAh^2v{mXefIToPX@u~KtTnzh=}yXz#Umf3V> z&g)(G^dTnAZ1li^KZnENIsBeKLqzzOrk!&L4he)W`FS3T7x4}6_;st!nF>!lXz{f` z1pq&0Bvh0(HET3l-G(h|#pD#-o{?c^008})9x>+O-M7M!=#V0#SK4=G$7QYv{=*d! zq3^Z5()iLeNkmHd)#mp^g!y?lDz85matvikD9b79ql%_B$6aVo3@`5K>#^}f1S0x< zLVQwKZr`iV69Az0XIZz~4YiuZG;sOMj__45E=*cERW{5WGTKHV68 zx6Kg){li{V{D=s)!7nr@+7~z$T+G_hWj!r zit^VfM1=HBWx|?eoYKg5TAfoaY>d8S)v7sHcZa#fivq(iONJyNNh|$y1BuBxDL5n$ z*J}2P0E08foAk0Qdna)zrKag+MFH8w2>`&>)ToTSQ`?QE-fx;ax4K%qFfLVJ$G_)k z)%nv^H=ca(^kmtM>}?f7N@S5RJ3H&!!D>xV>ApiLU95_%3)xq(sJeI19Gjq>9vvCy e8DGEgfAkAiR&fjU>i`sf4Mt%RCaIZxrR6{&lM>g666gHf+|;}h2Ir#G#FEq$h4Rdj z426)4R0VfW-vBP3%;eO(;#4bzfYPL#%w(7R+{Da0F8NJnw}JXwJzX3_G|nfB*d6{b zztQJFlkbPMoXm&+|Nk#3Au0KA%LhrHQlA|@uGfD2w=X;X@JdgfaTxc8pFe?$!qSCu zjSU%ArzPba<#;>yslYFv7d&i}uS!Ok?kG>%D7kE+fJ4}EjheQH_C5?ZL!4&awayew uIKot6Bm6o&<-K7dw`-EgBcH@0ObjQK^n>m4-`4>h#Ng@b=d#Wzp$Pz=_h>Ev literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/sports/volleyball.png b/Icons/map-icons/classic.small/sports/volleyball.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a41ef2df7a6e74af28b2a4c511a84311c0bd07 GIT binary patch literal 1103 zcmV-V1hD&wP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L0099200993pO=-x00007bV*G`2iOP? z6Aul&;}R|a001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00WOnL_t(I%T<$YXj^3%hM)I6=j0?OALrzxSvu3L z?K0Y|mKxN?Kv6+A)1gjhQP_sibqqfymFchj7#LJGEBa%gG7%IJ$_BN|t z4Q=d)sa@Bae#NzEa&nrJ(zariJ?}7V%xOpxfL@9-xip64HZ7y-)kI6w>)Rpic z1XM8DmG?ql4y#+*7oCSYwVi&vbGUPR>{xC(9!-68_Jr%k?QosYRF~EN4K1lNhgBof z6=)0mwJ^W%?#>LVHW-WDIj2mGcdtd>X+i+7``l;atw)bPrWFb+nf!XXSS(h&uKK-7 za-PgZ&j09$M0&&FFkt}zre|m0VD!@Il?(4TAV6Sy<>Ywti?6jJgurIEdqq+70svGh zl~Tb|ljI0_z0lXU0O9cGXfly#u!)XX?9=m^?d$zb*dkE>x6!+HQ3A8sEZeMBnPC_} z2>oBXq-nYM8RmKMxhH=2yvHJmpMc!AWFgEa)X-BZ#@wT{p0ibC{PMRLqqUq zA_3WK)-AhS{>{wBRWS5ZZD5qJl6lg1HTZBMll_^{z>DJo-Vhiz7Zh=WupvzzxA$-tXPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO7# z77ZV*z~dJH001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00D1FL_t(2&wbK8i&J3~1mNfH##_W9AVxt~u}ESH z(MCi_l_t%K+$Pxh(fAugQrTG8rSJ!cu-F(BG+GO;M8rxK%?D8u0v187G$dS`cO|-U z2ZmFsBL!2RMv(_CbU#oWZNWZQR38+`w^M!r37B4Ij|PPJ|fOa2uzB@H1RS z742%ZdZ1RT{n^^-bhKKn6xX9AHwW<^MLfqQ?lzmvTa`*>kM+S|pkA+U!BJenQ``?H zeGfT28V-l)D$HiHG>+pp!p1f_A(PXX<3cu@eY;pJ(*L1cE`QCSi#qNg#Ya5EdE^_7 zhPAb|l?_a%)BJ7*8#oaJqLB0epKx-&8h52PF~T^^i};nxW1$GoR1%qtR$1d>Dwv<1rk-d6mzX3n#oN@ELuG0Vj002ovPDHLkV1mn^>OKGf literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/aerialway.png b/Icons/map-icons/classic.small/transport/aerialway.png new file mode 100644 index 0000000000000000000000000000000000000000..264187f0153d2486d0ef9b1f8dfc6b7afa4fbe8d GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+g!3HExhN-duDaPU;cPEB*=VV?2Ic!PZ?k+$Y z2!1;6t_M<_1s;*bK>8pEGd?n~-34T@mw5WRvftp4=hiY?X5I%9GAVJ5C~?lu%}vcK zVQ?-=O)N=GQ7F$W$xsN%NL6t6^bO$h$xKeoD^9gi2q;a;$xL?1&rQtCU$P?9TtJ@l$O1Qmdjr-CK-{^;wZ+o|&}jG3T<_>6c$l zxtTNVY0=DOnMGTpYS(b7{H)q*A;B}lYw3*~vr4=9st2aq%=DSzqjvLUNyXl{`wVqY z4&-f5wvltUkeT*az$sy4M1tAuhebOTggO<(x)(;RRhoSA&lz9QLKCS%3z^I1|68p$)k}W;smH;obvAN2 oTcfU+_@?=&2)+4QC3nYsPKw={fSyo0V5Bj4y85}Sb4q9e0F#8=IsgCw literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/aerialway/cable_car.png b/Icons/map-icons/classic.small/transport/aerialway/cable_car.png new file mode 100644 index 0000000000000000000000000000000000000000..264187f0153d2486d0ef9b1f8dfc6b7afa4fbe8d GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+g!3HExhN-duDaPU;cPEB*=VV?2Ic!PZ?k+$Y z2!1;6t_M<_1s;*bK>8pEGd?n~-34T@mw5WRvftp4=hiY?X5I%9GAVJ5C~?lu%}vcK zVQ?-=O)N=GQ7F$W$xsN%NL6t6^bO$h$xKeoD^9gi2q;a;$xL?1&rQtCU$P?9TtJ@l$O1Qmdjr-CK-{^;wZ+o|&}jG3T<_>6c$l zxtTNVY0=DOnMGTpYS(b7{H)q*A;B}lYw3*~vr4=9st2aq%=DSzqjvLUNyXl{`wVqY z4&-f5wvltUkeT*az$sy4M1tAuhebOTggO<(x)(;RRhoSA&lz9QLKCS%3z^I1|68p$)k}W;smH;obvAN2 oTcfU+_@?=&2)+4QC3nYsPKw={fSyo0V5Bj4y85}Sb4q9e0F#8=IsgCw literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/aerialway/chair_lift.png b/Icons/map-icons/classic.small/transport/aerialway/chair_lift.png new file mode 100644 index 0000000000000000000000000000000000000000..86a175761152e480912ea8b9e87ca50170ae4664 GIT binary patch literal 614 zcmV-s0-61ZP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L007Yd007Yet0XOO00007bV*G`2iOQ7 z3o0Qc_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00E{+L_t(I%axKbNCIIPhF|Z*pg4)9%A7=ya7kOr zcBiC?h;VbcAwsGl$tjGZr5u{142up77ZI$B^WKI)5YMb{{U4tH z<$FI1N#dW=Xf%+?WMH@30sdpE)hff`Fuh(c^Z7hAP2-;g<#L(9V32`8fW=~whGF#I zMhbLYr!33#`Fsq8LabCOrreOA+wC%&&C=uXFcOJSmgQg5^#!d~i^*h?E|-h(c$})L zk|Y&HAxYM1HFH6|US~8KrQ7XhDwSfp-5vlGMd9o7GZWj}rUGlJRD$2{M>?H`&1N&L z?egFNixU&(osMgukjwExk|^)&m?s!_G-{!MrA`N@kB>M>B+%0|2o49fVzKcF&X10G zEs8vzn&OEh@d4n~Ss;U(8%R5)9c}FdK#Wi=jV(!Hn6(BK7I$q!$aNy zOw7(w5d=N}l$}nhFE0b!$OQcOK+9^yJPFA#@C88J-Nl^KIlu|OE%4gmz*@5j0JvXS z!RFrH5Hqrcr}uY2*KxbBfKQ7B%lrEfMRADx2Jrkfa4I?fTL1t607*qoM6N<$g8Kal A8~^|S literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/aerialway/drag_lift.png b/Icons/map-icons/classic.small/transport/aerialway/drag_lift.png new file mode 100644 index 0000000000000000000000000000000000000000..84c00a4b8313c8182c7592648160fce656ae308a GIT binary patch literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^d_XL~!3HGNrubO_DaPU;cPEB*=VV?2Ic!PZ?k+$Y z2!1;6t_M<_1s;*bKza`dGoF`KkpnW=OFVsD*>7;jb8A|EUcK-LP{^djHKN2hKQ}iu zuY|$5C^fMpHASI3vm`?yBqLS9-P1RK%O^8AHLp0;N+F;$DJL`8B|kSYGmlGtli6*c zE37?T978nD_fFPd-xMHmY<{dD2u9#t7;V#-leWD)OXWp8FI z-z|Ipz4`9{p(j4etb480rF3Ik@8y>)u7UsfUTekZiJyC3%-8Px?t8VDW~Ggswxy_n zr_i}HqTtlyhSg?Fucyty}M_SrViNj17pzgE@iu4d_8wBUJV&T64A vwez>%UTeC7p<#;9TtD`|b^G7)AJ(6+@1b_pM)Ci^XkhSk^>bP0l+XkKuoBJY literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/aerialway/station.png b/Icons/map-icons/classic.small/transport/aerialway/station.png new file mode 100644 index 0000000000000000000000000000000000000000..82c1aba251aa3b0d0bb5af4fcdf211b73bb1b4d1 GIT binary patch literal 416 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~e!3HF=pW8M9DaPU;cPEB*=VV?2Ic!PZ?k+$Y z2!1;6t_M<_1s;*bKzacPGsf2KUJPWgmw5WRvftp4=hhOMWs;Q*6f!AsjVN)>&&^HE zD`9XhN=+ZWOf^< z|AD8AV~EE2`UH?F9tFff>x%k|^`&o68tvuE=e8+`6E=s2Zeuwi4d zflbwyj)lvYw?BM&c{xvOYb%eLnOVVBokvc8c;3jYF!R=0VX%SA!{E-2!sdm$ch7!! zykDM2RaKRzt*uRBUCO~{UrtZgGyZZ$Bk94TM@bsm+Q|Xo;m4nPzhPSwwR6(K#fzIA z{rvhG1rB666lZfYuWn#rHf-o@bTY_dU}k3cJ=Kmqg?-&wpkEn0UHx3vIVCg!0FmLB A=>Px# literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/airport.png b/Icons/map-icons/classic.small/transport/airport.png new file mode 100644 index 0000000000000000000000000000000000000000..f709dd5d54e81ce2079a7dc1bbd259e1fbf18005 GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMk!Gp;py@Zoq$3nC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(Eak-ar*3J#r{JM0Z_E zchMqFA*X%9;wKz;K07h9`ee%Fv$MAwe@=7dK4g$$BDFPeL)O8(?U!GcWG#N-Tz|w~ zY)9OBrgzW#D@<>mO>>rL^KcS6{BXkCvfr0l*&82!Jdt8_P@>p>U+eQqpXI@;R%LO` zIiH@kS#qx5@`*oW?&gUF)WO2;WJy3*!#nC~4g+au%vAEBoZ{xLl@TNm8q#e|H(b6T(@go==H6iZ0hs*#kyJNJ-3apn18}{`sf4Mq`0Nki#g666gHf+|;}h2Ir#G#FEq$h4Rdj z426)4R0VfW-vBP3%;eO(;#4bzfYPL#%w(7R+{Da0F8NJnw}E!@db&7vw`afq_U(IrJy~PvhZ;M@r7_3npJ#vn zUD~PR>lx2U0u27kFDrfK>3{5Ty_B z`c=S;?f=u2jL@U!OG!-5A-i)JQks($}%+r213qK(Dj{O5>JQQylc*Gu9= j?z%klP}%NSoe$EBJ`~+=dM>pW7_bbUu6{1-oD!M`sf4Mq`0NllJRZ8w2JCMB*BCC>S|xv6<249-QVi6yBi3gww4 z844j8sS56%z5!f5naQbn#i>>b0i{VfnaM8sxrv#1T=JXDZUgnVdAc};Xq=xKc#xM_ zk*E8z-Vv)eLM=yRY9iY^rS3O#DMrctc&f7Lk%fY$dBu9xhLdM=CIp?znItkv<*d%J zACV40p`P!21wA!8J+j|!WoX#VERlLHGPK-#f5G>S?I|1!zyI565||y!sw^}qxO2be w+UxmMw!D67Uri(~p5FVdQ&MBb@0G7mPTmS$7 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/airport/terminal.png b/Icons/map-icons/classic.small/transport/airport/terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..e13fcd47ac5b88e224848dac08fc53e85ede7d1d GIT binary patch literal 557 zcmV+|0@D47P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0uT-!E*fbs2LJ#7G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ioe@R3^R4C7lkTI&lKoEvEn}rlhqNE7MLWz-R5k(J>B3O%+mk_Vw0mQ;yOAnC7 z)*@9@kf13Q!6I=Znt4Thc_8xit7dlR=b!n}>2z{kmoWyvBuTPfuj4p|cMy#6X0utX zR<&BqG)+Q?<2V4IX&QP52LSi`eYsq2w_A?m1VLyt8mg)m3I&8v9LKlYO%%mUfDuB3 z5X-U@MF9XxsbLtcR?Bf5gph69l}aUwqD(+M&kMtFzu(KU{CGT~D58|k=ktEQzgR33 zMLD0(JkS3*lu9Mv_lw1%ZQIpql`)niiDg;S>9pJJGRDf~@^Co3UawCD0C=8vI2-`r za=DDh<1h@Yn)Y&LtQgb=FN>**L8j04}w6Fqz?j&u^ezRtf>7NjaIxF8R5MnR#6Do6K$l z_0RTnaSX9I{r23#bB>G*M?c;-y=vYhc*DhU6Xz$x!e!u8B9@3H%SVmJfnOa@O^KbLh*2~7ZWHG)L| literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/bridge/bridge-car.png b/Icons/map-icons/classic.small/transport/bridge/bridge-car.png new file mode 100644 index 0000000000000000000000000000000000000000..6c22510437a0c2122a372d3fb20b144605cd480b GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?i-C%- zgD|6$#_S59AbW|YuPgfvMkz5~e%|9^+krwRC9V-A&iT2ysd*&~&PAz-C8;S2<(VZJ z3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(nPdTCHb7w|IfB|o__M(HYc)817vv&J#d0QVad6C-xR&Mc}CdZG*6Czw%V`n5v zr1%^zZ({x{^{2&9}o__w>o3!zUxa-6aE!CMmtFC6P?{#}D zq#kknZ}wc z6hbmm72G|21Gs!LlT-7GQ>_#NN|SOjlU?$26EpL;Eak-ar)@x{n|$g zCD=b)FKoWjd9eTCm8nM)9{kZT<9YR_=ahWH#v5nVT0J$nyEQhwn9{iJh=P5W4%=O& zi6za(cidxN?b?_A!Ds&Y&o%enKmYsZ$A|l2@v8ee)b4~<39NTAXxhGCBjbRD-$$vf zd-7@)b$EYqWjtQc(d=N*`%}YK;;5d~#6!mOvSwalD|)e>)u!dILFeKqjy^+ybGJ{p zFs5$^Eqi|`ZE4>B2=27z_2T^dr>)?v+>go-=*b?k>>T9;q`WhpTXPXr#y_ z*O%2hBX9D!{bxuIcx2c1d&0w4?~0qx|N3cj|NQyipR4MBEH~|+=l76F>qg$Tnc0l} zN$T@fFPrt*qW9a@kR9CYCpO&nyuUQV&M{wWPlt6(vWn=uBe{Eim1x#Epfo$o00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOb( z0U#r5VJ?pV001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00E#$L_t(2&xMn}tJ+W$fIssr8XSs4D1wVo2&iKR zadPS!-k^rI*)nzWKXB{*O8Qvwrw+=PT6j^?Du<$#UkZ$nO3WXuIrRar3fG+ zgn00M|6RM?zDtsX(P)G$%jeOD!+~C}hb+rXCKEJG`;Y|~kH=`5hOXAoH8i7vMYa40!XG?WdnFOSD0H**5P00000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4` z6b&Oho31(l001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00BWsL_t&-({0ePO2beX#qs}5zFxsr8Wp8!aB~Yv z1>@l8Aou`%14qHl#m&jt!NFJX0R#nCr3FQ#OI?HtQWLRAv~rW?ItWF9xNXpwHJ})xF~W3XOUQ|^N9&B zOOoTYF#Ot#qE#25)w&+t-rk(o>pLxLbuIu!F?5%f=KRCM9oO?b0GiFFySsZ-kK<1l zKme>Ax|NEm7-LA&6aZrkTHA7#{egwLyu6Up(-Q`R0RYu%6~|eS#l;OZh5$hjP$~__ z(D!{rg7JC*aGc4!+fCvmN%6e(XMkSs$sdhgv!S>bER7S1V7yzW{ zz4!h;LL_&z&P2j+x(#Q)4u6~nn3?%$T0hhqjoJ1$1K@-4RsJ0)00000NkvXXu0mjf D0F%_m literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/car.png b/Icons/map-icons/classic.small/transport/car.png new file mode 100644 index 0000000000000000000000000000000000000000..b5165ea84f13da4917741d9f028c692f1e5f55c9 GIT binary patch literal 438 zcmV;n0ZIOeP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT2MrVl0?3ohXaE2JG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io2uVaiR2b8Jj3KUrKomvaK*IzvDU1NogeBCHAjVcf!VYkdfMo++L1h&NQwta* zvPmsXx`!r+Dny(61*ZA!|3|%>ch4mN0P4EtoZGf-+qP+%Qc5XhQ55)q01U&xId9t* z!0Ywe@Au2Es;a*4e+#$UO-h+0$&%j%0C}EI)ATN^q9~fC$@9G9@km4fE|<%46On0} zzVGjLJEfFT%5`1RG>wSX>oxt05P~tb-EJ9UEX%Uz^EuCRUDsdRWm!HRkNf@JG!1di zqbMSxFbu!8H=9im1Vj|av0)gi>-CzZDG}+qK91w3z&T&G9LE{QkpP@dCm}@Fb@+qB g;b2+T`FsZO19OJLq{-?7y8r+H07*qoM6N<$f_6%<4gdfE literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/ferry.png b/Icons/map-icons/classic.small/transport/ferry.png new file mode 100644 index 0000000000000000000000000000000000000000..0d3f2f012b91228d591f4e7991d006eff0239592 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~g!3HGv?z=Y!NHG=%xjQkeJ16rJ$l)yTh%5#w zz7E2SP8zc-fP(BLp1!W^HyEYFOeJP^>vsc%OiElMN}Tg^b5rw57@Uhz6H8K46v{J8 zG895GQWe}ieFM0BGLuvDic_r=0!ou|GLv2Ma}zW3xa2pP-3IDE;_2cTqH+G{`GtOm z83foK0 z>aS^<+@@dHaeG~2-w)Zt3FbF)(%t92xyd&DdQbD}g!RHQtjiBZ3mjCkh!4s$fB0KB ztbBe_w^apC+Ci;rTgBc7tKDpPo?ONkU>;ukamD_O?pUv+q9D4f1Ynzim|1fyE L`njxgN@xNALn@Fh literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/ferry/ferry-car.png b/Icons/map-icons/classic.small/transport/ferry/ferry-car.png new file mode 100644 index 0000000000000000000000000000000000000000..84fdfefaa1779c1b58fb6bc65dfcd9faa85e790e GIT binary patch literal 472 zcmV;}0Vn>6P)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0U8!L4OruZYybcNG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoDoI2^R4C7t(lJY0aTEpcUtVIWDRC-PGB{-R1Gr>;1;GwZLKi*(vVlL}P z_~k#U+-NjD^m@JMbUM-R_ajZy)qj~Pxqh?NYCWw~?x-Y5G@H#=c#Llt;CrV1jiutU zcle46L=K1ef#q7Q7VUOB>h=2ZeFxSrq!gKD)ZO;g=&*KjxlrA(Ay2aDJ* zB%8-yoMI#6uJ8;W^TMBn=mks#^TC5Lx0ds6mDzp6+u&uekTX6EUIgbs1ed|~73pkd z-kah2)7@~4QE(I-1lKV+8{^LxK2Mi8S?AG8b~uqcq98_vuZ$+&v-h{5BYH1_2bjqK O0000Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0U8$p2}#qIxc~qFG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io9Z5t%R4C7t&@oG!Q544U-)#dyY$-ud3A6>bP!W`V2MM^kNVX1{3Z10T(%>Qm zC)bVzsrUghSP)zU5d_B!P64sBDOiHFk>qypO5eOhum>Kv_kYiGc+O?GUgA}bt>S?@ zD*x~U^C)K6B%ZlvZQ>i=r~3>1#4etUG88iBY3ySTUlW_f7qrmFHpX#<<@^fgDefVz z6KkgC33NjU)mp8#R4SFKqtZOaM?AzvVsBB#YdjAjT(sNmSgBOHx2BL8(7+#blIaW! zI8LAX2p=$p9;(>OCOAU;4>fWdtTcERc@vq+H7`aEBEKW8NWDk#X)?~Bv&NuLj5oTB zG$UJ)llYHk^=pUEg}`Z@@;U~&h=UQa2gCgPr@smuYeysKUE}}&002ovPDHLkV1lgf Bw7dWS literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/funicular.png b/Icons/map-icons/classic.small/transport/funicular.png new file mode 100644 index 0000000000000000000000000000000000000000..b190a7a6acfc72bc3203af055f9d7e360c082bcd GIT binary patch literal 937 zcmV;a16KTrP)3twus5LS)HiuOuQ|NE1zvG_jV8N;Zg~MQym* zXth(c9VH`W(CIOqPRGod>6vrB&&6tG6YPce>dl+y{pEd<_aU5fd{2o0aN$BDbi;r^ zDJZ3&0tF=$)z$0Agt~6v#K}6OnbL6R;J&dr1%MGv!_J?#;6p5qZQC}XX3IuoW?IKY z@A`vMd%L$Ps3lKlj73CA&PH?8gRUwT~WoEBr6}#&OQzbUGo5 zrWB)M@7p(l39_6X6#u+9*qr$;&(@ST~5dONMy(wi^t)x+aXC3 z{C+=%<9aiZETSG&?D>TSK9N$YXqqPK$;1qS(%rU6wwbAskqv#XUR%>;33huX!b4#M z0s$nGDlCq?IV=*AQ)<-N<9(V=IOo{DWAEy=Ht#h;h(rkCoO415U>G_=gYTj1I=~q( zTDT~gJ0<_O&Q6~>p$@MZh-oLu=qt}ED7_BO*9xKl!(dR=I1;J~Lr-Da^t{xMtJd87 zY2C`hUT@d4G|56K*QH&*RHYCcJ&W^6XC)%=FBSXV41|v$9b<%jLvb>^m>(&jw zmX;K?d^HOIuz2wTrM0!IUqeQio5+&fX*qWf?ydQ&bm_cHlRYl>wJ_1q=D_|vFFbBf zqY~&|9t-(rA*osbT>jSbe*ge*?D(Nm%t*C}LV7De*~!mTW;M8Xte+U z0491=Sad^gZEa<4bN~Q&+H)>SO)N=GQ7F$W$xsN%NL6t6^bG(2Qs)OFkjrIo00000 LNkvXXu0mjfiw&^j literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/handicapped.png b/Icons/map-icons/classic.small/transport/handicapped.png new file mode 100644 index 0000000000000000000000000000000000000000..9ffe4e71cac88b312b87f00c7e111fac341acdef GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+g!3HExhN-duDaPU;cPEB*=VV?2Ih+L^k;Op8 z*Fl)kNn>^eP>{XE)7O>#2BVa?i1unWLrLV0FM zhC)b2s)D zQRLV|?ZZu%Y&lwvu`OIGa42$mheJ!jtL!h1N*&({J}9^Bz9_=NyEj+&BDdnikkgz_ za{m{VPJ8~)?s<7}vBjT-X~MU({0!PZd-8t&*m^qiQpm@yuZ7J!Tg(nHS6x0Zf8lu_ zCjG}64@7Go*xoy;v!f$ehowgPe^NvKW3!q@n^P4>Y}XYwtH0@M+MQ^yN-A-l_ffqE zmdx*tFl`S$o4m#N0q>TAw#uA;dDAW)4`W*6x{7ICl05riXWu<8i`%UDnD2DXG}Zab oaJW6-kers_dhxXKf4lcFvaQknaKxKyHqf&Sp00i_>zopr0FN)3=>Px# literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/harbour.png b/Icons/map-icons/classic.small/transport/harbour.png new file mode 100644 index 0000000000000000000000000000000000000000..84636a18181af4834cfb1c419b4eb0cf5ef0d097 GIT binary patch literal 495 zcmVPx#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0U8${2YM=mVE_OCG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoK}keGR4C7-(XmTgQ5XgAU!q$Aid5+0WKjtSVwM*Kv5?I{O$P%y`5(AA3I%D0 zu7ZWG9STKApyDVv1cXk`Z4jY|qPC(S1o3sbm4|(g2p+h@{l0VV`Mz_>#wKEHWf6K( zYNJ@eYYgEI1GvO_l9+oW9LI7LMQgQM?V;FcG_+c+5BQA3Ea&xVwYplb*Fm${R4SE} z%VnKTXR6(9=dhEt#>Xg%;$pEFhkawjg+d{&R4Oq(WeMNnJ}F8$_t^L+$S1@XDH%LQ zF7WDaBx1u(qG^@XI3Gh!*l=u002ovPDHLkV1i!H#zX)B literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/park_ride.png b/Icons/map-icons/classic.small/transport/park_ride.png new file mode 100644 index 0000000000000000000000000000000000000000..b469d4c87828529f1fbc8a315879277fffe315f8 GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~e!3HF=pW8M9DaPU;cPEB*=VV?2Ih+L^k;Op8 z*Fl)kNn>^eP>{XE)7O>#2BVa?I-f{pgB?)Fq{KC%#5q4VH#M(>!MP|ku_QG`p**uB zLm?z1Rl(iUH-O70GdVS{IMqrapfo8bGub6SH!(AhOMa8tZJ_?2o-U3d8t3O;ve!70 zD0BSd_49v?3_O?Qctv)+R9cskRB$xKC^#(gg_>EHj#yV{l0ia{ndFHovu02AO+Pl* ztk;v>_4~@@&u@R)-2Z<0`R&OG0?`>^v*QfrKVY!@`cmnrWRS@t+1(cFizcDrm;;@XKp=_M9Ymdn+@eMuN5&hz;HT(Ci5Z@^NRm<=6k^Loq zPXBasIh}T)&Hc`Q=4@Ba>w;Tb`dEHTto*K=`l02b#5H%`*OIOIT}9TK%C=25z(8Q| MboFyt=akR{0PF~$OaK4? literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/pedestrian.png b/Icons/map-icons/classic.small/transport/pedestrian.png new file mode 100644 index 0000000000000000000000000000000000000000..71646147aef10fdfcd190cdde6183f628709cc46 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eK!3HFi66di4DaPU;cPEB*=VV?2Ih+L^k;Op8 z*Fl)kNn>^eP>{XE)7O>#2BVa?0e51<2X&y3Nr`JjiF1B#Zfaf$gL6@8Vo7R>LV0FM zhC)b2s)Dte}?Bmx1ivAtV>O}RkK8-qgUTNt$rXbQlomB*yityBHpPFnNLJ{bxgERRrN~C z>AQ39Si!53^S0mZ&f7k>+5X~q+r~b3o8RrZ3wrQQ$FbND#x$kM=GzuIZf~EqJmHB{tjy%xeDO=!lT8W@ zrXgOO2^@Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOb( z0V5Y-_=))d001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00JCIL_t(I%cYY)NSjd<#eeUMO28m-_^6WzVu;1X zfPYXrId$$GT=!6SxF2zz;yCra&|B z<>=_>bt;t#oS&ZuLZJ{H9UXX{M?RmYy}kV|9*@)6+4&uq1d2#Pl94oFt@Q>52IM%7 zj4|5Y-j=mio12?5#>g0>!NEaUYkf%*l1#;c0Y2^T@4xHo>kCXxO%aVo|Mq1J6_>la zyCf0`ve_(MU0n&_eXWDVy}dmf4u|y=LZOgyxtt^|Niq%(V2t4@)H(uadPumqxL{#n zf!^NUhRZuUJ6v5|)#aKVQ<7W@Ngr!b_)jw2ez%P zO~qnSYinx)s*%ZLbbWoTU@)k|!^7$pYTv=z`}_NkV`F2_T3cH=K0an^YpW{M-`|hx zx|B*K*4Nk19LMQnRGw>FKGBL?U(Sm54^8@_pY*`dsEWY@v|NX77C856sQY z(bCdVJ-EHSWqy91TrPL%x~?s|uA9L`p-@Z&KnleAp!bypdfpRr>`sfbrxApHS3oW|Ez#QC7v#hAsp8kGa07+XH@6pF|^|q z>5yXOuzL3U$FW17-&C;J^NMt4i7Pn^u&^?H`19L^k%6I;Nt%_@3M9b9z{miiL42mC zzrP;?s`&R0=nfDK;xm8w_vgy1-#?Y^{`e}f@6+ppATuW?85r5=S=9jTXYh3Ob6Mw< G&;$UWh)sWe>EQ&-fF9z01(>NM^2_XrQ76r9>7gn8H zINPmfVy%2I)~aT9VlngGv7Wz4ku0fudUE^$O)lBA3!GiFtz>riui!0DO$^ifRoAMx z(qsVer68>FT-v;O>bg%@VuWdpU;{YlF`RBNgn!p{8#>0;S8%CEALIb=VMUnNdhYn( zJSPlAJuGoRFknI>WHir@hgBPu$^@z|^{VAsBk^i>3LRZ5e!|-j;euf3w>kE*h>}KO z^NPtgTnrqECIi8k$BbW|@PfmDdc=*AA;|+!z z4#Q#jhvGon5I+7| zMZvMggKf;On+Pd@+M;skT2QQX*u%UE9Fk4IyAa{BVAx(p4>Lq{1>De(nJwH65X1$? zRl(3ofI&dN&2f9jM5Cj!K>m+;VNEXBX1DPWHMflJNEX$4JBrQ;?BAziv2qXRkLhSPlz24U zd_F7L((2Ha_!ddo_7WSe?5znh>kWd!84Qg<53!69;-irkp78%mO`5*|tnOQ0)Hf9G z0000cdQ@0+LvL+uWo~o;0C?JSE=o--Nlj5G&n(GM2+2rQaQE~L002_w2P2TnWpDrh N002ovPDHLkV1hj|JC6VW literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/steps.png b/Icons/map-icons/classic.small/transport/steps.png new file mode 100644 index 0000000000000000000000000000000000000000..417b2e58f28ebdcb96e71e96cf157f6753c97fb4 GIT binary patch literal 632 zcmV-;0*C#HP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L004LZ004La>hfy#00007bV*G`2iOP> z2NMoq4srkh001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00Fp3L_t(I%bk-wNSjd@g`fN7i}5F-H5e)?QN*7T zgIOBHVh|N6mgppcC^#2~4laU2mts2zf`XtO+CiyPr7bNABK~Gjp+?bQ6jU&xwG!%I zjg4OiDflHZi9O>z_nv#+_q?y@9vmB;S-*0ia6brmQYcNx^KO6b=#*Ew%_S#l(I;xz zKRS=7q0?qpN{SNtb$>@WGjHpnnotyw5kdqLuit&AwAe_TR>FUE9Z^IIeGW+pG6S7< zy4q|}T}Z(P@o^fOYx5BTo;R2&DKJEFfZ9T1O&)>3O__JujLpIP4|> zVqs6kKgxZ;>gF-dl>?rYWgrO%=|YNLhs~VM)3PiMk1qhQ z78n@ms;0Eqhg6^GqKx%D9l@iIf-JbaqoQQecn7y#h6KS0}? zIjSCK;ypU2XLu#H6mAAYVPWkD?JXs2@1O8>cK6N{Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8!0Iv+Ake*gdgG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IodPzh3pG);pVnx+|sK?o^j0DvF}ieFP~+YW+& zuKpA7JYNYwWAHpr1$hR95d6nyGQUz3MF60x>Q9YN*3SR{szizP{l zqDU0Q(pdo@Ns>mR@zqJ1rnHq?y5H~9>2x?8p3mpSV&QpSnx?ba?0UVf*K5nNs6H38 zTCLG&)a`Z^Me%)qv)M2V)9G}^<8i;=zuj(C0mX5g=kw{hZjvN~kk{+gY&J_*t_Zf< q?PM}>9OrO2>~=fLvgY%7ao`Q>i6K0iF=<@@00000@?kEP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0Tc@@17*}XE&u=kG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Iocu7P-R5;6xkxfe*Q5c1vJ9Bj~#&!}dXozN}i$XVXEzP#rg4M*P-wi_Eb_K8ftjeWQJP<>9;}tZJ=t#f z&Se7UGC|WrMdguzTt;FINa856Rh+95R}#R^rRDTw61VX;=rUk&+2#1uzZ0MVJhD?A zX;Y`X(`c=-L1P+nfHmzkGcoSayYs+V7sKKq@G6i`u^r;B3< z$IRZojl2gGcv$3>QeqsBW*Kl?HuQ;6Qw}&%WL8jgsa*YU>zvPinz983#yy7XqFz6) z%wF4Z?G{_YJugi)rEf>)eC9c`r&FWq{Hm^dzyB`(z#8z)>2=1Rjix{w7(8A5T-G@y GGywn|aY{J= literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/tram.png b/Icons/map-icons/classic.small/transport/tram.png new file mode 100644 index 0000000000000000000000000000000000000000..62d0329f3e1f27612c20331b08d3345029909ba4 GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3HEhl+{lMQjEnx?oJHr&dIz4aySb-B8!2F zuY)k7lg8`{pdfpRr>`sf4Mu4O7KQ7FHGm=vCMB*BCC>S|xv6<249-QVi6yBi3gww4 z844j8sS56%z5!f5naQbn#i>>b0i{VfnaM8sxrv#1T=JXDZUgln_jGX#(KtW#;##j} zMv-G5?_0-BVYN@Yk+Q>=rFns)0asRmYyM%a3QgwqhZUlH4`&F3nXYi1pg67y489?|J%jJ{$J;ktSi>u11M8y~we}u(Wzm0+ zdx_Kw(`!tz9_KdreBhDQStMVjTV*Bu^<$g3$%lryOy4UGarSMHIv^xh++S(4{Bt6M zZON$#Q8(O#PurLM@h>-=d}p`P!R871ANF4RIKO%Bv#sxM9Aeem&+x8D(dUx+3MEjO Nc)I$ztaD0e0swmIjAj4; literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/turntable.png b/Icons/map-icons/classic.small/transport/turntable.png new file mode 100644 index 0000000000000000000000000000000000000000..38fd69d91bd1f2fc2500430a209ec93df397b611 GIT binary patch literal 551 zcmV+?0@(eDP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0tpa1C0^mM2LJ#7G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ioc}YY;R4C7tl0VDBFc8Ks#Xki{K@nFgbQ0VJ2N!X1@&mZ|4czrBxQpN>4$jq8 zLdRduymF~$%vkx1n8`D(S=?RGnz zPN7gBp<6OdbFVJ$>ia15HjXCj_>M#kh9sWX_~640zhmwo1M>R0Vs;HSS+^Nt(Y^&i1>UyYqgpz%du9g6`YQUl+seE z6q=KBZripj%V7_MkX$au7z+W0VN@!W-!EOS*B_6^>2wnE^?K>L-e@%9@%Z1SKR@5~ pdfn}Ip68|0>2kR&+(!Ws@c~*_*}SJ#w5$LC002ovPDHLkV1oJq<-Y&` literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/transport/underground.png b/Icons/map-icons/classic.small/transport/underground.png new file mode 100644 index 0000000000000000000000000000000000000000..dc24061461698d6a7eb29c52f9f79f79b8deb87d GIT binary patch literal 722 zcmV;@0xkWCP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iFV& z6f+CdfE1|!0013yMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak?_?!z0006h zNkl1vj)7xnaQa~4|5J?o+m}ta>nsB-_@jsZj_ZP6BY}oJ%^cT2d zMZ&_E)|eROCZGYS7ix$|1>qFh9?oStE@}yvM&(&eCg1zc`^`5aI6+~@%d8f?k#}nj z>)Sq#t4Jk6q>=_#yQ19aHgg>bIogp3x$QptS}-N`V=Z zT<=Zr&}wI}#}ojehWKs4$v%1h%bHo)M=5Sz4>IRaTbVa~b(sbes15H@0mb+o>TvRU=TG8KpFCppgJVoZTQC zmP8CuH_%$6k906OTWTtroV5?v@u)%AfKV(XX)z6i;Lv1jVv`5A&Yc?N*hGx@d&wrOEJu-aaid3n!Ce!rsnHOrshlB8_whU`cHhpKzEGJq|6C`{Faw}`eMg= zwP64AEl4T2*_Y(;{Z6j5htnZ|Yv&{B_ZzMblxE>mnTn&Djx`pQ3=XvL$ZF?eTR5GJ z8M$Nkzf$zFGi#2uRB%}T=~8wSLI})=;PQniclr|C?lozP8|l`ltpCPcM|Gu4W20eW zJGIQ7tA?tcw){Y2NI^UzFvB7j56hP=F_~%9?p77Q0pEN4+prihK>z>%07*qoM6N<$ Ef+nIv9RL6T literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/unknown.png b/Icons/map-icons/classic.small/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..1b4db1b84e18859ec5921d448fe8feb52faf4901 GIT binary patch literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^AhrMp8<5nmf9C+C7>k44ofy`glX(f`uqAoByDx`7I;J!1GQfVVMZs7*%d%R_7YEDSN0o>GEDq>zIP0yfkGxFt`Q~9`MJ5N zc_j?aMX8A;sVNHOnI#ztAsML(?w-B@Tt1n}sd>ezRtf>7NjaIxF8R5MnR#6Do6K$l zU7_mf;uxZFzIDPzFJ?!9w*5EnDtW3lnQ56Vnp&_unsd@2cY!Se2fcFEfZ!L|oJBv_ znpz{W6&}7yQ0-uO<6`NUe_U4hKj)1J-mPfTl>wC6joU}R9J=)}0~x6iiQGIA*T zFsUCf3y}X(v_Lf3=FFxyp_fc@C6eDYrq*4L4HWTB?zy?f!SX}ss_->iquEwWJu|I1 z&nfhI!}3Y{pRL*Y+%-^#A^$+(?z?>s_AMV6&hQZ*{|bdw#K-FH5Y%4_BouS{29i-a-FZ#aWBW z_sjQw|GLWF$gpLDw$gc}PZCZMe}q}SF>w1ZNFVdQ&MBb@0A&2W@Bjb+ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle.png b/Icons/map-icons/classic.small/vehicle.png new file mode 100644 index 0000000000000000000000000000000000000000..30158ef44e2be3c6c617c7563a785166b1987694 GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^0w6XA8<1SE`<)7qVk{1FcVbv~PUa<$!O>_4AgQRgc+SQW>)|O*-JcqUDDxO@5raQS2=r{)!>S}6pSCgo%%yX5C4X6A9pZ!)_L zbcLj+i(`n!`QA(Wy<`GK*go7}m$qmnld|E{CVqt@?jK~A3FvH@DL!F~T~mU>p&Zq3 z%m>pFXID0L%w56}!6CR&fJOTH!Yie0Z<=UHQNH^Tcb8nb{>yVyUWdl9&I` zkbGzBd|kc`ZTC6eCo|V?Fkc&UNHnbUarUFSmewVAyfo*XdH6u?{)V22>sd>i*=Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0UH4t3^14x3jhEBG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpYe_^wR5;6}QcXxIVH7=++QMAa5CsugLP`|T)F4EQ*@{TgfC)ml5?n;Bf;NJy zNQ^{?mWsO;wTN1@aV3<@NA ze19OxLZLuaRe5@PN&tU79*>7zm;pc(MOduOM@JAv5f+ODf*_!$=e^L&%ggU|P%f8oetr&{%?3@= z;BYt~NfK05MRz`XdwWQy(^y|$N3+?)^71kk7Z+ignwpC5?Cikj^C6ST;Njr`TU%R5 zCX;x3d&BMREn=}4W@l$nC=@U{Its7Xi$o%UPNxG%lEh}S$!fLAU@*v3D#gvsP1@~t zj*X2m5{a;0uXB5QoBR9wR1}4}uG26K&dtryOcH&4eP}cqa5|kRl}e~oDlnN$P!t96 zcpUxx{ixMyP*oMOEaT?p29hL!BoGV+d2(_>l5DrzTwPt|;o%`SHa4hf+J|5+E-vWz z`)L>kNivtqacymlsMqTZg+i2Nne+4WJUBRDtJPwyR{Ns5Y&J``+f7-P8Hq%w>pFh{ XFl&Az76HzI00000NkvXXu0mjf%Ro?k literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/car_rental.png b/Icons/map-icons/classic.small/vehicle/car_rental.png new file mode 100644 index 0000000000000000000000000000000000000000..b257e615fc37cd1dcfb6cd57f132b81d5285bd6b GIT binary patch literal 597 zcmV-b0;>IqP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0UH4sCcqAh9smFUG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ior%6OXR5;6(QoYLJKomU_zKK6Yf)5}V8;f*N5Q%6d1Z>jS*ysaT>bnR*ODjtY zTfqlV@aGAFC`22Tppg3&yUAwMZmB34JvC(LRZnq1@*qc?x7&@H}#^bTbhZ)T0bF|xS)a!L*G8ufr<#NGdvA|?9 zfn{0Z2&$@5zuza@w%_(3EZeqeFc^@cDA5R!007!-HsmVv%Brhzg-iEec9Y znoL7YGMUU|GMSI0cV_Or@8d!ds!7iuaL(_XBkUmiwu86~{aM%R7w^gN!8E)ws)!L* zw&9aGOVfwv_XsY#DFvU+D#dN(iKI}y4~3R;_LfrZ!rd+9nVevDHSpm`Rw#KeUsFzA zQ)Wu=YfX7?LU=SSOy+qAfrXp{Cx+pJTcAK+3b4YBRmCWvJcPhNEr8ig;kiAAeF>o= z!qn@AWzWzbF+|NS8wd&>&6oFaHX4sSo{wuMu0g|hG5a%c_z(z?jVm%fJ`P}1bsQKG zkyTY44y?>{ByzAPYEC1vv~k}*88K8>?)>pUm@6V!YhMFS1391p^tndo5>Xi)J@DjK z5cp%^?cXmuj(hpPw65=W5s}*>a!y2CRaFrYfG`Y>t=zqH0@yH)v%XVZ_t>*<;6~!o zZm#uiRLiTI^;W)8sgy;cYp&b*(T3hl(29t;p{oBkSSYr8Y2AD4v5`zY=(gw61Nk@8 z1NjeE7MI$gm80!$@+-%ft-`|0&S$MJ&Q4joeROd{Fa5SqZ;2BNo%CM6P){uPWrrhf zH1bZPvGLNx@mKeMeD#;asq^1F_}Jjcp+Yj1iFsXF_B&oI;@DBI>lcH-?}(5x+8r_C zwE7LM-htS}U)XCaaA~ zY~tzTm%46GS3{rqoBtRzo6QT!MDMAj$k%7yKl4SYT8y|3>R7=Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0UH%M11^jslmGw#G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoxJg7oR4C7lQoYLJKoq?bHV7Ilgs7m1l|_U^@C5{Y0UO`J7ZAi0g1w-HAXo_2 zR#t+YVjzv67!kxq2tmTnR%W@)-uq;d0bwI>;JdTL7*$low*L6y1Bogr~9goLat+rS!zBM!& z4M~!0+xAil1Oo6M@caGVgz0pus%j_{DwoR~#{mGPl)Wy?u-EIIPN#ak?oBWZ0{~K~ z)VEkANdkb?YUTY_K@fPJ7X;y(8Br8{J|Elg8^4cgVx`N#8UO$Q07*qoM6N<$f&ex9 A)&Kwi literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/car_wash.png b/Icons/map-icons/classic.small/vehicle/car_wash.png new file mode 100644 index 0000000000000000000000000000000000000000..2ba1a565c5d70877035a93a1ae520a380d1b175a GIT binary patch literal 528 zcmV+r0`L8aP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L004Oa004ObIJJlp00007bV*G`2iOS^ z6F589L`nJp00EFmL_t(2&yA2jNODmahky5?NXykpbaHSIw?+jA*SNEbw1h^h;~hnW zh6bmWpg;m~(4ob_MF<25K?4y%(541kaw<^n(_m?SfBL=$4(C1Zdw$P>qxBlrYdAWB zejlb&xW9+DH#j~9fRhuryJL^(bhGQ~3N9~Ux!g3)&*AKBQ@if2_xQLAKRm$U;iusC z7H)2K!`D}Mdg6~fKf_=E@9%JZ{V8zW%}dQ@lRzMV-|zozIgSIs#RZ(6?n?#G>-9J| zIG|RmZ3o3-aa&g^6*`>`FE212|00;pW(0#lGMUWY;Jd(eU9#CM%de06hR3#TEfxz! zqfu3>RedoW4)@NXP)NySQnqa?olYy2O3AV;8Iq7B!!QKse=rO~rfDjXNXR2exm-@+ za9EScM2$w{$8e!gkY!ow_xozKS~5-3)M~X-xm=cISwDuoUa#i!xk{yyB9Vwp)0Ag2 znaFXR?WMtB@K=G)=TknPmn8Z9evQXt3839>6N|;@cDwwGdc96O9%nQf0q_Bpov`av SL5J}G0000aPy z5Ofm7$;HJt5Cjo?2i=@}7)J*MaTkT!t%^%&QA$e+!SpuKp(uXaIh^5h;&uW6z@gpU zzxSeenb=DQT>zm;ruJ*td%M}ouhqjWlm1yKA=gFopp`_j8kmIK$~4a;skta-rOU!D zjyO$pAD<;k0U!|m)$r7eIjYr(T_PnU3&})^*o|uSYAP-VM*(~Q0>Fhmd4IYyOAU6l zAa*1eO8JOl9G=+KNhk2|RT0GC@&00iY4{r~^~07*qoM6N<$f?3s_<^TWy literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/caution.png b/Icons/map-icons/classic.small/vehicle/caution.png new file mode 100644 index 0000000000000000000000000000000000000000..b02b374bd3e5decf0d64492e247b9c13a7a61f4d GIT binary patch literal 673 zcmV;S0$%-zP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0UH4o2(WF*-2eapG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io^GQTOR4C7#Q$J|pa1{RXORg>a5Q5N1hip1@s3Fq1gIF^ZdLp>#Sm@*=IM@y? zIJI^6&Z)_yg}jmOUd)9Eyyyu154Iy(!EpP#Y7aq43v@~PA5uy?6n z)N0%3l(L6Hfjtxo?3_||QLAmw;*!4sUDrjv(by-H!i~k?#$q6pf^RhTbzK+#seWB9 zAGHW!Pt_{ZG>s*bN%mB&vKArix?DbbGx^kUB3G(9yipW3_I;Mig+hYO%JDRpNvh5WqpT~SSJZZ1j>!IK8PvZG-7*aluk!`Q+XxbJ4 z5W_G;Qm^k3O0iTbO)b^)Jb0crg)NmzAe4gC>wAV_h=Ou|zdLlC#SfB%?;9Iaba4!^IQ{mrVHQ)M zNb5s=rAZA(MZ`9GJZDpp-mpz@ia&*=+!0>2Y`Q;+UF5Eju=D{(!-yrv~r;$HT8sk*(P zU#yGI9nzFJeA@qr|;hpQ{Hgt~)nwHy?+<83$K=P$M3j880CzT2;Yd-sL) nP0z2)U%E3uzvSNua|`C87aseVI`ia#PG|6R^>bP0l+XkKES`ei literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/crossing_small.png b/Icons/map-icons/classic.small/vehicle/crossing_small.png new file mode 100644 index 0000000000000000000000000000000000000000..c326a1cc0ce7d36ed1ddbe29da61f368910e91d3 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>;VkfoECwpR z4#JF18nY{ag6t)pzOL*y7)5wk#5@^7Rs)4hN?apKobz*YQ}ap~oQqNuOHxx5$}>wc z6hbmm72G|21Gs!LlT-7GQ>_#NN|SOjlU?$26EpL;Nba4!kxV-i3MqbB6 zh9e*EtLs1NJjC#cYbj?=Leq7jseU{OT-+Kti7MW6o_TugTe0KayMH?$Kj%{2690>{ z$KaUZmxX&6b1f21r*CxXw-$?d6jgC0@7hB#y@jh8V=daxKA63Mf4M=m<7LGhE#}V~ cK8xEjmg*}U+Ir|$4$yiAPgg&ebxsLQ0Ij-YI{*Lx literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/emergency_phone.png b/Icons/map-icons/classic.small/vehicle/emergency_phone.png new file mode 100644 index 0000000000000000000000000000000000000000..0ee60e24477776920031ebf90972f26e4a9302d2 GIT binary patch literal 563 zcmV-30?hr1P)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TcoN6~6oJ9{>OVG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Iog-Jv~R5;6>lRZmNsXD)U+B`VBS@?$@LrJAHNPsaVS)7|1NqBMfK-=k|wH8VU0l@U6No9W>A)wuE zW7{^JPKQ7s&?nY_ckPJlyGH=jAYE%sI2^_>3;H zqXb_8N+}YF1RjrPC_oMd+-^6H<4~*Bc=zX5fY!P%%jff9Sr*A;60L`Chm=zG0Sv<+ z8jVsal_(aA0Ccs`Fx&8Btkl!9vxtsCb?XWMx#M67{s=13WWl# zR_mK7{NR+=>!n()lF4LfHk*V(AzUsOgRXom(tY!Vz}7Ln-eAf&FwS1347v;gZXcdM zSMc_6Iz7%W8-F?`Ap~k^);!!^oeBNt8kc<&C$C$sgU6h(AZ!2t002ovPDHLkV1fXF BPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0UHeg9~25=D*ylhG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoK1oDDR4C7-lQF8oKoExi&7k6j6q3T6KnU1b+2j-vauz`l>@00Lcs$BEdN)%)qUnw4lK<4v-7b#v#UrFUzqbAESF1&2-fR0LPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7v z6D9)Dz)&av001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00E#$L_t(2&!v(vXc}=8hrj=w2}KL}b5}tFRcQ+` z2nCmdfea23NC&|wW0o!jhwLXULdImx7Bh4T>EP<-lHod8s1U6Uwc!j{&sdP-rq{)| zG@bHI-}^ltzvU?r5gvhYFP%;Ytu?l7W7{^-Xmsh7N`?RSh=_QeC#h6Q9LJG+>h=24 zTdkHf8Vz{}V?Li#E|<|-Q>)b;EGd;r^!t5=!{I+Wb2^=VY&M$|i$%ucF|O<4x-RW@ z8{hYra~OtHt5v$)F0H1Hc(V|Ul$>MBbjam(eUN5n8zxVtmy^*%G1 z^hhT2j7HYtUPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOb( z0Uru+4V>Qq001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00CD?L_t(2&yABUYeHcdhOg(avoo*?7ERMKEn?XZ z5CngMzd#%!EDaRQMx#xP3yMKjjAAp03YLM4HG@GM)8M_LqGKQDf;+t7dhhqsByqq4 z?tv#D!r#0i>6lwdFOoj0)#~2NeoP<`*h`vToz3C_kzTKN(`+^^7K>3XmoI9D!y%1E z1HjH3?<7qViNxN_l+9-Kold7CK$2$8Sz8$JHk%ESa2)5)O&*sT1|ETMG#a&dJdT<9 z5sx$~#9%NWlgaGxi33onR4A27ufY3mx07#iJRWb;>GT%ZuGee- zjlp2>IM#pS>3$`3`~7~mSS)sPx!iOznY>B*4241hE@Eb?*XxorGfB_DHDHIFKfzzW Z)fciVx^B8>g$V!v002ovPDHLkV1gU@*WUmD literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/fuel_station/agip.png b/Icons/map-icons/classic.small/vehicle/fuel_station/agip.png new file mode 100644 index 0000000000000000000000000000000000000000..04e0662e26ee3877d06b4cf97e63bb89bae78af0 GIT binary patch literal 701 zcmV;u0z&flg1>QF>*sZJ3o1rbVxf>KCJ zr3y`&OE0-3m%Fb+Q-@XyKGO>?eBOuWeFR7J=G7xQULu{2zMoGTrL5zVQKh6c7!!iA7uJ z!7e|3=`4Nh!)^v?xPmY1F&38w*|UNGNZCE^00aO^3Gx}2Oxk1alSVcbVxw%(YDXj);mceXgy*H34^j+x67kDDM4-ubh; zg9c<%sgyo7HAS^r4VFr!Yg^m9k^T0tnKnoGR<^{N)4=a4#?1nku3Saa4zhQ}R|3G@ zLZOhIot+INlS!7Bm%GhI!#0eNJUcpSrPC?PvMf74n74D;jExYsRjb*RO2yvV+_VL- zl1L;j7K=r_Uazydy1Litbe@~0sp6)o-sQ%VWfb#WXA0W=y7eBTFP1!x~O z6sQ3AfcwA#Fu)1=OOX(O2fPJpzzDF@gCEnsisS>|flVOsr=I@-2=sQc2U8~jI=u|q jy%}H(xZSf~ISKF^()aL7p#C>^00000NkvXXu0mjfb}=Yl literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/fuel_station/aral.png b/Icons/map-icons/classic.small/vehicle/fuel_station/aral.png new file mode 100644 index 0000000000000000000000000000000000000000..128006642231c52fb74d06b2ad14f8deff6da50e GIT binary patch literal 815 zcmV+~1JL}5P)I=nou_VTd8y@{NZrkMKfgGeAHRS+F1|99 zBR;#43$?iyN}_##mt4s6Y8h-uxw`glqphtihup0;g1=BFTJ9++=-kL7; zWhRQvzKX32_Y3NC+LF6Ft&I&HF?3O8rl+rMZ*MszzvHPB!I9yK#`3*+)y1M}r6f+rvb1fj9f>C*$>ia)X#=PW27|7io*oj3gv0H2ziO}Q zkx$->mfnhnPj+naO*ma8K^MgBekkqjq3em)cAQ8aK9f!t1~32(g+lc9_R`(mjmP6r zAZ*#IvE%z=H(uY_^kt+in0=}SbKCa1-{Y@DP8>gUZ0vewfR?8P0fzj3|BlYiPFJB& zAeBnZmCNPRKnbw@{%5}a_=|Iq^zH21wE^!p$wNo}x_a{$y0!)XyWSA60%$e!!27^Q zz_&nys>(n2%iennD%m-G#5ayLj3|H&oCD^7CJ~tgmez9ZdcUv=i~$+IUxo620A{sk tRAKrgK)Jeum1+$T0rmi!sykU1@Gna3C9fd|u4w=O002ovPDHLkV1foahs6K@ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/fuel_station/elf.png b/Icons/map-icons/classic.small/vehicle/fuel_station/elf.png new file mode 100644 index 0000000000000000000000000000000000000000..a8185f4486af97f3e342950a750767fc23894e3d GIT binary patch literal 628 zcmV-)0*n2LP)Me`;IY4>#-_^ViO_%{;E< z(w*}>PZyrL2vhr9J$%3L;>!mf0brR?1R^7)yeoB}00a>P0t5h9(I~#}(|an(*?}Pz z7w2g;8<+q}DbQTEEc5a3#bFYO1jS;Jk&zL0T05lEX*_R>@^Xdy6Ay7zltTOk`QpMp z5bx}y)oSq|mt#CTPNT6+rBY#FaFBYv&iSDso=i<~`qCKj$kz-3?p7y!N<2K)lAU(lB2bV+mo O0000I?>1-K z%=u?7bS9RUT$vV?7->6Xhv*VmLD%SzhlmalbS%2;6l4dhQyDd?MN&aVq!kH+bc+8n z+E$k0wzhQc-Rt|lT}HG@qwnc~AAAna^Ar4%uIm6!;Ko8)arM56>QCQ9`82!8lDtfT zNy6>2(%$Um!0u{nYfKpVOYvj|-_2nrC+66{tCFpUJ*>5wNu?FuP0Zte{*mFS7-x=c z$p<1|7jRctxq5G$==2;u`32Q-J?IwDtRONpH5KA5D&}nOJl%nbe4xueiq&G`<c%hjm^3)?$Gt>(gIjs2D=^7Y4qY^-iIQb3mVzE z&5Z=K04ISXKx-&8lDTlcbNg5{Wxq42k}9tfTI~k0Sh`M3o6E$5aanW)mqdMCndt1; zBn0qK2(ed^B%7vbS%s^MD0t1nfX^Rp7S-paKCP0n`AWbMPM-R)95N3J3#^9LoOyQtr)=!}QgF nY;H+%ZU$%oI)GXrwi@sQ^`z|*NbxcD00000NkvXXu0mjf#wRx= literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/fuel_station/jet.png b/Icons/map-icons/classic.small/vehicle/fuel_station/jet.png new file mode 100644 index 0000000000000000000000000000000000000000..d54cf84a67dddd1a5636b83384c198e4e3b56fe6 GIT binary patch literal 712 zcmV;(0yq7MP)OdB+t5@r4`mh+foPT>1wj-7_)U2-v$*2Y%@pBgNi^WWX_-{>B`Otx zS$_iRyEMbu`@9Bt0+#@IJy8+AetdFYIrrP`3kK1BXW1agP8k#}OLk?RlZ`W6Jhfms z0%J-Ia47o#40kQj(z--zd!F%lAKOX?Yr6{9FDPUSP~2N(xKpC;rYLFC)BwQ_0DY}F zb~BO>pPR{TNi2UFkJ&)PWwI{wT}85?KCY^VvX zBGQ`@Q>a9PA-W<4(S}W2<&-JQ>oWqF4uwJkqobp)TrS7d)Ko>&wD-U>V3vQxdI9L5 z2Lq^p6$*uj#bP9rN#gOirDkwtVxh+X0000{b!P6JnWshL&aCLH4(A7-#o-+I&k_JyYXGUWu7CRWqs(p=xOU|%)3Xbt=9a0e z3FG%kT(8X6be4c$5w(Nl@&y!t>y_~PRQrr%XVGx!->x3(d(nV$w+Oeq6`B74HSwV literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/fuel_station/shell.png b/Icons/map-icons/classic.small/vehicle/fuel_station/shell.png new file mode 100644 index 0000000000000000000000000000000000000000..1b8733d9349580ac2afce8114f88caef2b34c428 GIT binary patch literal 720 zcmV;>0x$iEP);hwMqZ({p}P-x1hZRSYSH- zNiST{m+0Jc(`{S#TK}netm81@C5w~!Yd7~h)z5ZDTSls5=`7La3DH&Gs!C&{OM{`@ zVnUH2nb|yb{T3BlH!+&twp)t*orxV8B`#K?Mnr@4#hNL^yIgOiCVl0%4G!o^^4$Z8 z>6cGB;%y)2>69@NM#TB`LPQ*_N)(j;Kx&+sK=9%fw)i2cTrZ`Q#!3hzVi5rhpezXJ zDuZ&pISLRU0=PhQ!P9#+}$EQAr0(?HDAz-nM0unSlR zWKO*ue4D@X_+9?KKi{eKQqd+~RLr7Wi*gP5hZQo})AG(~Y(4D&heTw();eyjEtX29 zMIv(C(lRizs^O|XFtW^)Jl?Bn2#%)~qeEjH19KhDs*VEqK&hYRs{r&yc z_x-uRn$4uve~X$0HozO; z1CT7E{12eZcdCrpzX1VID4(EQZvu7#4ZzpG0Y3nE5bd4vCu>mv0000SQl?0B7%63ur#j&XL?x!6J%f; z(h4eNzfHE^{5`*?gFood=J)i#!}EHc=kt6Yg(~#`h=KYBnmXapwf=seFijGxtA($y zFbJu;;8a{Z1_VL*2(4*ISRkCqN$HG_%OZ$0B$lBSP$~lJz&mKnLQ;Zod_L)HY)EHi zMLJ%ulpqcu@e;1Nk z3nL@2v;;z+1D!w*a2YUx`2*OA06rnm;&Ctxh(!J!adQ(}2y*VOV~V0Y({=r^rfE-s ziDtO<3BH^_foK$I7|2Wpnav_S9_Z@A1alca>p&zN4jbLw-5ebqd1A5H{Zgr9jluM7 zU4P{(7DttVfdFf3psG+PU>QdKo1(nlm2zDJo-{NxM23cjv`{F-*4CC?DwR%h@S~}t zW1)F}-})Vo*ZFO`$myw>-rM_`NvCIb0)d%EuQ#s%+reP)W_x?PVVWk%Wb(LNF24l| zfE|LldAJY-T><7m%)+lLAU?Q}Yy+120uuNGJO^F?^FSTvRHZ&p00F!Qj)8jMyNmx< zY8BW4Qb6YHTU6=!a{$eqQ(a7+2bA3mEO!jh20R3=x|vi3{sM8&+|negBZB|{002ov JPDHLkV1mAgCC~r> literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/fuel_station/total.png b/Icons/map-icons/classic.small/vehicle/fuel_station/total.png new file mode 100644 index 0000000000000000000000000000000000000000..720385dafa1b5062af4ee7e3bfe6e34251ee64f2 GIT binary patch literal 798 zcmV+(1L6FMP)AL_t(I%YBmFOH*+e$G^XG&R%sd zp6PURHfQ;oDN{@me2WNl5_C}@UIbA=SJIVT_78MZ5Yb&-bQMyq+nHX36sc&LWzLt) zsY}l`=jPeY+pn8J5Nuy~;Nkf`eBjIT5d0@fDFE03JOoeyN~xAi8^S+hp7%=!^+$|B z93N|6?WnUI0|18-qGFEAzy9Epf-_C_y+g+}h3dah3t3w0EkFBcVy=w0*`FT?W+2Qt|->c z9SaA50MG+q08m0mj#7#oHITQ=gd$lPu_qPgiIUdMenoZkPu9}sKG7WBtju_Lkps{N z;5q;&fHZ)Y0M+_lR18@>^}Nnrsz za5|l}fk1$Dxm;{47CR#dLao2C+1TlDXtJy*zjjjwMMZ9;yDmI2;9I%aA_q)Tc1g2+~$s1-QBkl z-Y&8L?#i-U6NyCFg@pw~qtUe0W}B{UZmjsRzgN+2cMv|CHI>=QR82@3mFOO?MfM$9 zEY8zp+ROn!GMPju6#Dl-l60^f{=J+K1bJX=Wco^nKY>PXo)J0k~bbQc*EQ<{E$v01*I=5_?4rw%{=Z7%c^m3K8;!9soK4+yu}7 cKqv+H3zB9sl_9|Gv;Y7A07*qoM6N<$g5sWH@&Et; literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/gate.png b/Icons/map-icons/classic.small/vehicle/gate.png new file mode 100644 index 0000000000000000000000000000000000000000..5a47b907b4cbd36d924ccbae7b52ed4277fd1bcc GIT binary patch literal 600 zcmV-e0;m0nP)j;hr5NSXv1 zq>7WHe}Uj24o+E}?IJD(2R9d?pbk+(OF=Y)po2j$g%Io^ja=?>B<9kjP3}j$Yn$GC z=e_3;-1|(Q2cG4FUVk+7!{75)(j1533~=&Z_2u)2{jLOOgVTrIepfQ}{i*vNWx?O+ zW-RbM_kS6Bo*Od8O~vOQAGj> zQFpTW>dAI-9U){6dovg2zI`bIf`k3mk!`k>AJJ(1_{h{c4Pp5@K>+6>=WpG<=Zr`4 zuN@W!3rj0^A3TmmU@QcXYX^fh_q8%nM|QjNTpKAWRgPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT2MrVm9JK`P!~g&QG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Iodr3q=R4C7dkU^^fQ2>SST+>}l5tCWaEqgRsn3R~QN!eMMqAb{v`~|WHE{?6g8ztNkqftzQuca@0nNcY|lA;rvs=29|Z1fftUV2ob{(=@$aud1qoAk^#i`Fsul0ECcKDm9zU9LK5E zYWaNrCq$OzMx$}R-!02Zr_+ze1D;MNj^m=yC_+fnwBzykN{2$BNF<_Z8q2bxC_)IY z*DLGu`3NE7@i-ojce~wYv)OL9JsuCw^RZZLG#Yg}9Z?h~lLN7 rUa$A|`t$kJbzM=EN~L1kHl_3fUH<|4YDpMv00000NkvXXu0mjfS*+$i literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/parking.png b/Icons/map-icons/classic.small/vehicle/parking.png new file mode 100644 index 0000000000000000000000000000000000000000..1b46d11da40c5f97095573b615b68c683bd22ed6 GIT binary patch literal 528 zcmV+r0`L8aP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0UHe(C3`S%0{{R3G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoVo5|nR5;6}lFKVZVHn1LXXYF_Gc2TJp|NnAVoE7?vXBL3>}cE;vaoYmNZE)# zz=9PPBZ-w_qZtcZiczA_OlF#9G=(r|Zf9&JIhS`Z5fFYh2fAvgEVq5vnViCP=$YfQ7x9tcq3qX2`|TMnHAfqKyEM$tr~7 zNy70Ycaaz7R!&JgebU)lr5k230MMz#CSjLFJ~a3gcA&E;wM&fj)E6RH81AmaE=zb1 zZuJI602O62-i40uI-OBiTt8>mA2cM;DVlhvcj^#;oC5c;H(uYCY9Rd6K^I|p`x3cWG;bhi0Cs#q(~kuK#KvlAYogE5uR6eJwR*MG%6nh8Yh$4q S=Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0UHf19JDf6KL7v#G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpK}keGR5;6xl3PfVVHn4M@BBVx%{g5%TAD?=u#*?FRD#5cf+V^L43vQobbwgL zI|D^1qB5ZaC`3qh@}iOgArMg_EvOVvBx;r{@wDj0?y_9-}14Ydp-t?k_X@B&)+zJhEhZ%Hu!UAL|B}xK>B_)p1 zXRfzmS#QAQQGRYg zHNv=Smd5uEuGw>Nc@#>kJ`xBnFsm#8@UWqutM)8h9)*h9PL3T)LR3F)D(e_jj;eDI hMEakPx#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0UHho9b7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpEJ;K`R5;6xl3hqsVHn4M@6L|8xd|p&O|}}YoZgfP3PKls5%Z?}h%f_1Nl2nQ zLoz5N1nD9of~1I)6uJ<_grv_^S4GGo6mw}>j>MheOr{<5>~xWugSq;{d-3wT?~niU z{2y_<^Z8}pgnF8d()lkHx>Ng&!{3&xvUl0s*;#4pg=H`2n5wvyi{C#h8ER%@OX^=*Hc){GAYRt7PGv5G)<>tz|ZJp znEKM(zbOn)%mHw(ZnU8_`F+RN4S&JOBUy M07*qoM6N<$g2qcg2><{9 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/parking/garage.png b/Icons/map-icons/classic.small/vehicle/parking/garage.png new file mode 100644 index 0000000000000000000000000000000000000000..2b6b1f8b0a650ab8b72d07d1aa94d5ea3661d7d4 GIT binary patch literal 612 zcmV-q0-ODbP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0UQ7mI9&S-c>n+aG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Iown;=mR5;6xlTAoeVHky<@6K(8QqmbwT8Nqh(%|4iMa+mn6on9!!~)HoA|bSJ z5(IxxB3e#VprDvx=*AQZ2`UpeCLtqUZ4n}kKlroAL=gzgcXZybA;hgW~ z6VC@ewkf_~HD{#~T>|nQF>mF?)uWo;ck9>mcC42zIMU*oRFe5IsuoWhqFwZxpB9hNr0@JS~V*M)$}!9`}36Ot(>X zGX;PX6_(fb_`b5sot96SFGyOzKW+Uy1i)RJMOD#N{0GNKk{~YDjAux}?U^BXbP`_S z??EE<=ChB4qE}c82e|d%Jxw)PIPJEGJxPe@C!g|epsJ8^B{pIvpJz%=ilN+jHE$o)&(ItE7jRw$qmqS= y|H;caLsTI^^t_(voc|HLtNE#ha^+@R8v6tLXMeDaGbeEX0000Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0UHhzILopb$^ZZWG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ip7fD1xR5;6xl3hsCVHAg-|3{m{lJ?4WMbs4k48 ztDuX*fqgtCWoLd(*b+x~EuHKj5InO!g z_r5}hj1)@>yEXT*JUB9aAm5O0-CS*&6K0Z0e1QlZ_Xqhr8c_r+lM5vg z5NuXG^)+US3-Tx~$fLYSOH1<_-ra7(R%TEHqyRa6Nz5d%Hr<;Ot4j2^ZZ^_(Vgn7Q zoQe=pK*%b1K810A470XGx2O*yWG5K48Y)(6@du-e0_1eLBnsSWtDQYdB3o=G@^V#l z^$s!SJV@i|C%hT_mId&40#Ov$vB^AZPAbK4FiLB?3)jFn$M=>q8j59~AU*$dB8joi z@n3>=g&OyVNkZW%MGq9C(xRifOwZPJt9W>&j>{)EF5N`K${ae+ZzD80g+COf>)8+< zZy0-p@gG3;S7c9Z5uM#$ydyt3bNw~`V3fdkj7u$c)G8_SAGEf+sM_}+1E9%~iTzG6 zlT7ja?HDinL-e_WIC{JsZYa%MAuti+{m_pLK=%tjM|PK@QO|eVSz|^eOB~u&%H50G z5k&!6P*}kih;Y?0K+m;$UU@qLxWjb?-!cY4qD`{K`rO27s#i8aJ&H00000NkvXXu0mjfPQWZg literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/parking/hiking.png b/Icons/map-icons/classic.small/vehicle/parking/hiking.png new file mode 100644 index 0000000000000000000000000000000000000000..151a5deae8192c6a7534441a230efb7be74ff4a0 GIT binary patch literal 576 zcmV-G0>AxPx#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TcoO4lRWhvH$=8G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Iol1W5CR4C7Vl0QfrVHn1L-{YY-c4p)nK^nn-gb`sH&Fqj<5;_VE6AdEP%_a(;dN z;Af>@2mk>nl)|B&F3+y(C}$6B?i4!K7G7Z*kC9TbwVUVt;ukJty#cqhXlU1_&HIq? zsSO6hYxvsSj1G1>y1QWsG0NpK@p!y>=1S!swOS3I&xe$fY&J_eou*#DIgCpa zLId!4JV>t>(=^d_onSDCVHjwd)+7dyN~N$Yi)b`TBoe{4ZT^-@PI&LIK=05P%H7SF zHN~&u0|Fxx9G_O5=YF^F`OeZZ&OJZ#yEo1+S_5|rQYvnJ0?&;{-!1{+ppRRH+`5JU O0000Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0UQ7TBEWXEkpKVyG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpN=ZaPR5;6xlUqpBaTLctzwN)xZ5Bc<@sbKgiVM`d1V(~I;6r6(7gErohbV*| zGJOe*F7(oaP(29sl3?_pK|~K(n$SfhX{?!w(^Y2Xb#s3;|C`%-(3z`E`o0~$oG;(= zJ?Dsf4_{ufj40)-M}YrAL5A_E)c4I>apq`lMxx2MMkrn%mcbe78$ZzRa77f*NXcpm z5Q!!uM!iI5?>GSZD2ao6lR2Z-CyiZfDDxQ*5h2QJz3kAsM~cxorRGPY1w+lIX8<<0$4oU%eqLl@n) z$igMzye|IxH=H_rw3YROhIJUZS2?2q?pX*Ia+DyKA zD+Zm!`1B%qnI`fwO#rwTyjTWj&`K(D(qn@e2vQF<10aOpR&@bKF1=u1egbt>StOVY zYwql$bKH4sqve%@rt8IYb`OP)ppgXbc@HjGp~p6f;_>r&#EECwPrt*-lyixmzA5BI zFB3Drh&E`D#JU7LUO&A9(>%JlpD3N0%KDCwKZuVtaJOy`isHjI;>0z#glKGTziJs) qPKKPPN)QM{{%Ijr_}uOKC%*yIgw^dYR&*r*0000Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iOb{ z023!;wR(jB001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00E{+L_t(2&!v++i|Swyg^whSgw(dC5p2>}3O15L z5L9e~*a*SGk4nVC6%qXdia)?k@C&rGuz9r*3_`?C#L7aO#6rV6w^;7NK5MAI~JyWJ3v$8ot_kW41Q7=x;+e*g}L z1J36&a=9EF$3dx7f+R^00YFt%pB2nzu$u~ z_6|6mPFO4!xL&VdjG$m0BO$rSCIeVq5uE@07*qoM6N<$g7Q@R A4gdfE literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/parking/restarea-toilets.png b/Icons/map-icons/classic.small/vehicle/parking/restarea-toilets.png new file mode 100644 index 0000000000000000000000000000000000000000..7e131c2979f55f1625932aa54967b00555496e8a GIT binary patch literal 717 zcmV;;0y6!HP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4{ z5iSD_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00Iq3L_t(I%Z-vxNRx3G$3MS!@Af*^UfH5TYqhq4 zD?JEB^H@X@MNnDTA38>KvP+#hcnlBG#lX6W2qiIyb;(eOZjs4iIh(pPatAkkac%DZ z+d=oX(1~C89e&Tl^X2<|pRX7g`tW#aK7Wf^=hfOjdn)fxL+ANHJ{tZBbVxp_l#ks&CPTmPJv!HEDpaXLC6JJWx z{bG&Uq`wDP|PM;-AyEtS)LAucc-9S*3r^=v~-@Op8nndirGX@mzTR& zj&ZVe?+_0cT~CZkDyENZlQ9Rw%hSQQzEU19LeH0@po z&qpI%>~z*&0pQixJkg&TL+@h$;;ZYVGsT)Diuxv|v>cPsB$bM8WIvlLF&)<^mMRDV zVsK=L7g2We?WQ@5q#$1X>EFzlDOA*P`TM=0U+;sR$PykTX#RjT+ z1H>Y74M-|*fDPd1JvNYss`|(nb8*LDO;sO@$a_`&y0nM?8w+m~1Oe9CViZNKUz163 zI2_KCBykFb0@LaAHlNQso4zl0kwLTBL_|oEBpHv#8=X$)>58={jYflRx4Rcb(NS=C zc#|2g-EPzC^|tEudbd`qeRfNw*PiFSsaC6fYwZhQHS^6p&m))19n9zRSExSwa&`3` zxb=NMa9wvNXtnm8%z{LS<9NMNshkeN@T^oU#)B~YQ7)H1jYgx{APhhL^A&yrV6A}c T`9SSkQmuWjlQVMlQ zg$TT+kcM5l1d8CnH#~R|f&%rlL-Ya$;ykoqNLq*!_Rl6bm6#$k*{EUv{x1y*T`i@FzJI$>oO2t@ zd$&(9j2A5TW$eUeX%KWjEl2eQ35NH$lxt+*c_pp=(~OKSCH2N)AQ3|7Iea<%ov9f= z0B<_0>1ruE1prX=$CIV{f@DZVwXW_u_8H*vW)6UFQKIU4Ymna8z-^gOcy(A44NgL5_c1U;>+hgn$mbbNq%pe!D9B#o>FdgVgHeWoL%&SUNd+imQsNp>;+&tGo0?a`;9QiNSdyBeP@Y+m zp%9Xhs^ISF8^Gn0nVgzeoNA>IP@0sJne39Eo0yr$CBMn+Hc)?$r;B5V#`&pd4fz-Y zMOq)`t8rb{?3k3r^(#}yHD5Ap(WDKmRjsBT8Y@N047iL>>fYl}uRJ;b^S?Q>f2K5w zdOg{Z&@7x2SiYyWjmw#5L$=uTiie!X^|{$+B=koA*kN`zPx#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TcoOGj;7*qW}N^G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IofJsC_R5;76lfP=hU=+nq5-mFA0})>!;-tHiPy~kx83O7nh(p2ROGJuv@g1Bb zgPRCWF2UfRMPehkNfbUOOJls9EL9Mt`hyF1IEQ6lHG$v{-gyRBKWOcrD0t=Du7Z@ngqF|uTt z%ywH7gM&fV-)_NF6@f?u*9b%+V5$m#yG3v?$cnUDDF6^orEn`pEv;6Hh&vI5SZode zyYcvD(@`tLVsp_;r@N9YgBu3+o6S}8ezO5L3`nvJFP-j+J=^XCbGe1jIhK_QKy=wn wgk_}ypK}Crxkb;mJ9h`^F;RXOV literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/access.png b/Icons/map-icons/classic.small/vehicle/restrictions/access.png new file mode 100644 index 0000000000000000000000000000000000000000..611f1e4359052a02654090bf99bdd4ad179fd8c6 GIT binary patch literal 594 zcmV-Y0Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L002(_002(`V~YLP00007bV*G`2iOP> z2O%@m7HVJs001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00ELoL_t(I%dL|!PupM+hM&)l)c}zju^17S4E_N{ zZq+VcS^QIAz!H;ZD+9tE$c#Gl7a&iWkXWkbQyCBo9x|XrL}G|Sgp&s6x-?abA_XaZ zq}%SjJKepfM1;Tje0;q7emdQ++~0dHPEe&1FHxlu_TC<|;gH9R3pVro)7OWGl*>3i(;(NbyRh@3Nv>U2G{|Kf zpBa^Y-vg)y0YGwUu>~`zGpM|}Kd9K;*)(uv~C~CFN{8X=Ho?Fyv z9b@D;8eov7%*NxT;@No2AWZ=nIgU2kmepMI{bG`3^rC2KfnF3b$uib_zi3-lb7dp_ gA1kl?Osl-}FPQ#wIQb%kegFUf07*qoM6N<$g0z49&Hw-a literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/bicycle-designated.png b/Icons/map-icons/classic.small/vehicle/restrictions/bicycle-designated.png new file mode 100644 index 0000000000000000000000000000000000000000..6040cd073adf1454e1c678ca56bb1d25d2d2faac GIT binary patch literal 924 zcmV;N17rM&P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L002(_002(`V~YLP00007bV*G`2iOP> z2O%Hk&IW@3001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00P`eL_t(I%Z*c8NRx3KJ^%0jxw*ME>od1mQIye& z%w}w@i$zaeKud}qvb$Z(3UP#CS%y|bp=44$tRA{Z)I(ck+09C#iwrelWaKPMx9M^< zr^|HTx38y(id5(E$L}1@kKZ{&6h#b0Sy`Drnwz!De)=V37l)-0XGuS^b|+P!7Drwl0H8{x zQeWlZt~7n=W+F=`_Zl%#9fSI&E&zZjDISG8Qs8L$34hN3diz3PW#bmP9Cxc&My1aX876BL2n0ijoch(rm{_+@m<9laSt*c5vsgS=gO`mSoXMS!{ik0e z*cXCIAwh@_DIz}D^i?s=X-~f0*L~Vly2e%}H z5CTyIT;3qUVc^htJ0@uqkVa9&$Flu&#hT6Q6V#lh#_j?`2;P12ArK59MHh#w_nWaT zZ3gtZILM?dWKs%edjMZOy;!2xLK7=En1oote)CBSc4f?jyXzNz_Y2sWp~J1GpYgHP zkL|^^$Siz@D3-y#)34xc3m|Vp5^g+lVlo$gOG-;i^$(g8?LwHL8Ox?192Q}F(Tdsz z&#?cSlH##pMIsnNQ2EdaEhps{X+Ic=D2h0D$#$}+(qG{38NmNQ!^v@cld>dhWBSp- zC?7dn{ied!VfdHG__5J2uhR@hd03gsE!Gm7o#a2S@1&!VS1p{tr_U2kWp5o(rjd2V y7+sF1n;P6cekx@M5;(R+s}k%&chkj@b^ZhB7CP>uLf0?=0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L002(_002(`V~YLP00007bV*G`2iOP> z2O%jbbdwqY001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00I+9L_t(I%dL~YOB-<*#y@x8L_EDez??%le~g9W zs_hNlB6bxDg8zUS1ebyt{R5H%>kttK5go)`aL6QPN!y$R#JC8$nCPHW(!+3fZ->@m zOFN|xJlp#`yzo4aCL+AVryy{r<9Nkvx2IIAWdkIZb=}G3>R&UN^2b8q>^Fgk@Y6(9 zf}nWe`*9uQZ@lpRxDo_KKt1a;5kb>5^`%hwoY~rXlXg02N?|w-!=48~w^k!+G>{}g zH%;Q@aa zXxZ$K8>NV-ssWG));87+`L04qew- zU0ubtZO+fnnV6U$j$<@Uqg$&1kc^IAXF9oD-GJ9oqrvRj8s&1CG)?h+AHy(MSXf|u ze4LY$6PnE?@5jc78VvwCBO~>`W9+*~|EJ1*kEx$Ie+LfY)ITtb?XCa-002ovPDHLk FV1jH;Jw^Zk literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/bollard-bw.png b/Icons/map-icons/classic.small/vehicle/restrictions/bollard-bw.png new file mode 100644 index 0000000000000000000000000000000000000000..10041d2e18199b4838d9ce18e23c23c3bee468dc GIT binary patch literal 683 zcmV;c0#yBpP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TcoRIG;##ZU6uPG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io{YgYYR5;6hlCi7WU=+oFUt$uWLwGc9!9^&g!*fhKMi9CQ1xv-%#i6V856C3t z=^x-wT4~@7oy!9)xV=ScOZx|igAREJiNi~XUxykSY3sqbmYMLe%i^b1=zu$`E_!|JO>t4wmf*_EFVYCj- z7>3abf*@ZaUDv$=Pyh;rf3!vNOn^>fRz zo|emHHk%ED!GPIp_6hh7kf!P7e!qWFsZ>akgz*5n&i2ggEYgFcE+-42h!XL_h&> z9EWDJNt&kUx=y#-#V`zVG1BdJ(RH0PO=&ipIF9p2rCzTO^BHfqTUjg?j~*0@#rAf) zJ-LH=y*@k}V-`REhXBM`fh0-Z0Y89e|KgX+zW@Qb`x_@r RniT*5002ovPDHLkV1g$$Amji5 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/bollard.png b/Icons/map-icons/classic.small/vehicle/restrictions/bollard.png new file mode 100644 index 0000000000000000000000000000000000000000..904c410d0bd28af3bb5175ca0292f2ba0bd4ffbe GIT binary patch literal 517 zcmV+g0{Z=lP)Px#32;bRa{vGvuK)lWuK`{fksJU300(qQO+^RT0TcoS9J)}U{r~^~G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoS4l)cR5;6p(@#qRK^VvJ?_(>bBzrQ}OIIO!1)+56Qm2judG9Xt9?Dm-LE)(v z&{6RcL5Bo|Zr+7u)mUWa>5#kmZ}qv%4xi!2Gc!A)s)&f(R;#b4mC89lcQAN+>U6GD zRe@y}q1*2#F7trvuXg*{x-I~jAmF4{yHVAbc|fW={FS?3E>kQP0SF5P0GIzt^*Dg( zbjoZt14zcjO7l$oA-+#GipWM0;`?g>X`XbDX*S6XhX6#a)>=TCJBy2)Qi*M~$(I7` zWU@72lP71O^*Tlsql(t+YYStyE1q;<8x73-nrs-t%0Z_2@)oS!zJ(2*S)3SSFvi5w zM-l0ZNO_wt{RbKZXb{Brd;lB*M~iM(eg0nVdY}W((}Cw{4;1(T9(H-$L2jJSW5W;| zhK%!hfN$V_m&dPB&PpZ!IEpS6_C6fv^L;eBP}NENoYVXllK=IijQuSc00000NkvXX Hu0mjf14YPx$vPnciR5;7klg(-qaTLXW|C#?}CS%ezHKxR9nyS=R5Y*~IP`h*I-i2@B3-~7b z2!bmGzg8+L?!+z(CN*s(RcacN%uHsEi)ir!Ty!Je#pS}~ew}kJ{P$+=+-kIs&gE(V zlJ*k%EznOz`tCNjleTSC{o3kE!P(FBr?2~UD`eJMBPu12cOQlrV<^v9cKRvjmqP$H zx(SC$7SEbr8VDKtW2f8qw%O<=)G8iJjez$bBMi{&M11Luxp=z3o3#O#&lb4*WQXfl zX8~{|I8hI{|E$MSBVa0YX>G=&DYUm@9>3b9kay`1QXakBsgQEXV%^C(7EqkXTsl)A?>nTKI9BsX#$p&{ zEH4D4naDC&tOo#84tjeqSP8TKDW=(ph!SCdFmPC$4|w>Z$8^yp$TCfC9V-A&iT2ysd*&~&PAz-C8;S2<(VZJ z3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(b#O~07?-sWyKVHNz_FyY&_WeP6$9%*I# zkkN8%d7fKm=U7$#qGx(F|MTAuPTjqn{rT+QbxA*@nT|TGT6%x?<6D2d&nq&m)|Omr zprK@B+#z(3%eKBC^25pMcZW{TE$O@M_n}ja)9i`u^uyQAIyGAEWccRH%IH{c?7col zeHlx7I&(wW^~3We*`jwFL>L{q>Mo?Qai3Uv#a)I2mURzar*qAJsKt6LtJkY@lW;=k zUI&(+@0(sQDlOpObn^J;%RZ_9%+((mx+(KFZ2n|6d8NFN%-f~&>KR!%trjfti#!Yr O1qM%7KbLh*2~7aeMx|E( literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/foot-designated.png b/Icons/map-icons/classic.small/vehicle/restrictions/foot-designated.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e0ba5153f2d224a35ae8a6a4f5c26b37665343 GIT binary patch literal 825 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 Hu0mjfS2J7b literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/incline.png b/Icons/map-icons/classic.small/vehicle/restrictions/incline.png new file mode 100644 index 0000000000000000000000000000000000000000..c680d6911595483f21ed95d169f3e1aab325579e GIT binary patch literal 688 zcmV;h0#E&kP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TcoRB#TKXApigXG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ip0!c(cR4C7#l0Rq~aTLdYdZ!ZaqT~<3DRn5E)I$Cs#l#l@v& z^O8a;m_?^3k{S)^lmtQoh0s=Rik|;)2@S-wD3_9eiKM4Fzgf~2AxWiQ_%4t4dGGP% z5%P$nQ0T1`3I)mkNZj6b6m7Onk>fhz)|TU;KI*<=AP}Hlz^?* zGi#zKqOa{zJpNi59>$5!hZCO<($Em3c>GOYa3-BLmpz{Eg^>|-WEmYRNWp(F_JAB8{f?b%9`lS*}J3cs$d&}cLeiA2!8 zzD9L=8l{N|<;(uQ?cNYwE|=!z#l?sA?k?9A1X4IVBh_k^IGs*Xu2jg+!9il&+@u(m zeOeh9NY`q$-tC9$>wLjt=^oF`K~+_xQYj>pNyK6?*zI=EG>wlOhl0h@Jxrze9(Z+i z)mY~Fqddz(IXwjcWV2bg-EI&<{@5`-jvT|F%=1TyM8fztxNvwOXE30?w1j%S4zJe> zole&S|MokML(X78F&thXgb>ZAot-CRi;ESt(O|#M&y(dygfuTN9}IfTY$j_rH-xoX zTXHb?TvPJ9$%#@As!^)oebdXJPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L002(_002(`V~YLP00007bV*G`2iOP> z2OuZc*N_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00JgSL_t(I%dL~YOIvXi#Xs*yKRankNBKOQ6l*k4OgTkQhw9FSkRR zqQy@3z}?P0_rN(<6A|v?qwhOOr53DeHDO#`4FZJmc%>eT6%S2w?L#JW^k6|m_$^}O zeBV29T~!2mY))KP<$T`*jP9N$B50as9Aq+I%#DpVoq8S3F!(+^%(rM1)#>o6R^w&4 zjD#V&WufNhgK^)V5RniOA?N$vk!48{b@ZfC3(b7q&yG{c~o&l^dl7IdpxO#t-THrG8pY;JC{zrPParBWdXf(Igfjzh0)17KZW zC-iPq&n73Co10^AZx6?D0PsAI_4RdXwHoDene+2=x?BL`@^aAp+h#hQW@cvQ*R{Sr z?(Xi`+1X)tcNe7;>2#XOdwesD$1A|=Mxns+@-n)v({8r`P)gC?-w!}4l|m`S&CLys zLIHqqV4$McW3eJYvsB_;BEiMQ1uH8nY;SKfH8sW1&=4adBaDuYGB!5G3tgvKDgjWB zMvLa5X|BC>-S^FW-nh+V_;hf97KuEXg0$Ow9Utd54C!^<@Uv;IJ-JB#r^-)$rl-8~ YPtE|Kobr3h4*&oF07*qoM6N<$f)GMQWB>pF literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/maxlength.png b/Icons/map-icons/classic.small/vehicle/restrictions/maxlength.png new file mode 100644 index 0000000000000000000000000000000000000000..27d9652f4ebcfec4299fed06a03a26a043f2dad2 GIT binary patch literal 773 zcmV+g1N!`lP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L002(_002(`V~YLP00007bV*G`2iOP> z2Ou30+g9!X001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00KoxL_t(I%dL|=NE-nh#eca=TVhTsHAIuR2!gR7 zTvM9{;pWU07iZf+=u#w-%`FhFP=tVV&^iQ1LF|;V4oOW;4ocKP@S~W^px}_ikPrV| zY|(y9_QBi!@A2UOo=ZfyjSr?7dC}>-)f{I+tyG2qy20R4Ef6Rb-R{i0L}K@jKt#AP zQFEr5E*nOt1oAhQ4WpAY%`~9?)VV|im&>K@BobfU%gfKNYc*V|ibvP+#$o`}3k9xh z8|ijYG>y*OoE0_Amm<8t=He=cI^UrLj zQmZ8pOI76}pO=k|4asJ+GB7Y8z#Wc`j!NCK#8Oo$fo!KztBU406967vr`&E6i9}dm zU*})wiA3<|IsjU=I^k9;mEkVnjm3Dsw#Mb+5R(R#sN{xUj&LZ39pn94x8h@%Z;}v-!Gxe5^b=I3S!%@@i^|-rin(J|E$5m|!r7 zVHo)P`+2gsNZWDn7)JNY*w~wU7wP|0`QBr?&zye%vznue3g-}B00000NkvXXu0mjf D?_60* literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/maxweight.png b/Icons/map-icons/classic.small/vehicle/restrictions/maxweight.png new file mode 100644 index 0000000000000000000000000000000000000000..91fc8b6f8de0b01e79204a52ae0ef4321781202c GIT binary patch literal 760 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 U8hT`SrvLx|07*qoM6N<$f|3X*wg3PC literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/motorcar.png b/Icons/map-icons/classic.small/vehicle/restrictions/motorcar.png new file mode 100644 index 0000000000000000000000000000000000000000..fc0ca18776d50a9f1a2c91107c865bfdd059c964 GIT binary patch literal 757 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L002(_002(`V~YLP00007bV*G`2iOP> z2Olo>)g8nD001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00K2hL_t(I%dL}5OB-Pnh0o+26`O%#H!-m$x+nxh zm?p8!CO=3}Az)k!u95+}DY!9Y(|?d=lWjIrJJBGRl_ss^%giuPm=HFJ_X)OKeN z+|A{Fz&+1ZNaCSB7)D}4$}O$mPl;Y{6#)E5r0s>n)>l>in9b!*A2pD~pCO`Z82O7# zMp^*>6&IO|tQtlhfVk^ZNJ3E*agxh@QIC$2KRpkM5SZ6>1k-5%z{oT)ZZtsOM?ljc zH#h6=4C6gXA0$yVjQpvl(E`}ib&l$FKGmpRXH(Z{0X)?-Rt+Oh65?ern0Q+*m!_AO zffu@t_{j-6lL=a_7CM~{y4@}Yg8}@71-#ka#gB3slk01|y1h+*a-7eB4Jo(AwVF_b zK&)6q_vQwrQVF(g!*yM_t_$0?aeRD?-f)Omu?R&7jB7QqA>|g%wztnMfX!r*B)PY@ zN6+)<`#z1<6$*tAjYiSy^&aI_KN4vJSRa`t zULPEQBvw{dkV>T>rTkr_s&E_!zVBmsc^L!K1OWI;OKsH)hpl;FecWhZuHA;FX;@oZ z!~XvMqfPmI9;RtxuHDAC(EtE=i;ETx3x&iTeNA2G_g0I;;qWgGT-W8dtE+n!E;1Q; nSSTc(4buNX`Pt9(oOk{O^*Gv^CZxU600000NkvXXu0mjfO58vH literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/parking.png b/Icons/map-icons/classic.small/vehicle/restrictions/parking.png new file mode 100644 index 0000000000000000000000000000000000000000..60eb4661317cc90816eacbabf17b8b1da4940eca GIT binary patch literal 751 zcmVPx#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TcoQ80%-kVE_OCG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpK}keGR5;76lRZcqVHn5%_vUhqIp}LkLKUJhaBn@YxR@#wGD*AmwcS()U4DnoCyF}4JF%*J=p&>1YCMlgvl#pJk$%WU!CTKsV^bgPW{GX2>&m-VB z#bPnXq@qmQ4h~-O^K%6N1h?C01p+&}hVgNEdHD+e(or%wlhyUpV@i1jxEIHi@~p0( z9wn1Ae>GxxF!++fLbQrp1ng~ z;}T6l1S(}B0WW+D3tME8v1u!n@->JZi|Pt;vKN|JMBLZ}wM(hLsg!S$v1!|q#}jJp?LALFe1`W=USYR)4C6n(Kr;&%ujMgy@d;YJh@3oxpc2OS z2X2g-rx>V~AbLC(1m&^<0AHO00D!6}BdCOsb9$lGi??Q{7eOV2swm@bF3M$vpi2?B zTm}F#Y8O+wO&Hp*nnmhZg*y31X&n4c?gXY}?^@Ln4vLRa4hP5@Rhpx6l+stPRe0fVIJ{4bG!|ClX_=rmlw~k;v8m hIpuDiN$B>SZvY38MvjnIXs!SN002ovPDHLkV1hS=MGF7` literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/play_street.png b/Icons/map-icons/classic.small/vehicle/restrictions/play_street.png new file mode 100644 index 0000000000000000000000000000000000000000..00c20d17e590ff7aa06978aa3fd0081d7a5c0fb6 GIT binary patch literal 676 zcmV;V0$crwP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TcoRE^C~@KL7v#G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io_DMuRR4C7Fl21sJaTv!xzrB0+ul1>gXQ2n?{)gYP56Yx85Ijl_1c)v;tU!U}Px4>-RYT z#-?(NP36#QCT^#S-(#caSPK%6Qj%FI;j~+kQc8 z+f;>gwn)J5z~{E{aqbtRZ!-+`#|Q?Te*~uIS9$YcnPN%bAzBz2I*DF0SXk1y^I($H zLIHrajVh0xf1y$}>Y=*-Bsq~<)H(qK(8yk+7CZf3ne2-AW`6@h__~*&UM4jF0000< KMNUMnLSTY~tuSQ( literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/psv.png b/Icons/map-icons/classic.small/vehicle/restrictions/psv.png new file mode 100644 index 0000000000000000000000000000000000000000..04e35056e2fdd0290d2223c1964aca77042f33cf GIT binary patch literal 743 zcmV?P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L002<{002<|ju)Zh00007bV*G`2iOS^ z6bBVn19*%8001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00JjTL_t(I%dL~WOB-<*$3N#Knu~IgE)~;7!;Kv( zv9u7*F@yOx#6^c5xHOP0W)QD~x=M$3aP$rJTqG_f9(53V;1yIf(LgXZEj@Gb`s>n$ zR)h}r1JCrl!1sBcuOx)vPu|ST3=Owh6FrxgNx4!P00{c~kH7Wx*?Zye{Hv*{kAF1? zA^0^!woJ2dsOz^ji2LGD*KaM;ECBNFK1m3HBuR29oBa@;n@a|b23?v)Zze-DnFQdw zZF9Z0M$>hXRh8D{r2Rafe<6ej5JF&?W?^4dg)K?q%rHdYdEzdC=ZQ1J5VjVK$g%G3p=T>AZ~ddAj>m?8!op%7|1&5uTduRA+D^1PStYPGe{aH}=p z6^nA0rqLW5!*QIyc5^q>@o~CVSMiEPc{rV(2=!E}$pGlhWO%>4%+1XWsZ@$msf6$Q zjEsz6Sr&;zf@n0#*47rU(`lNnOHZ|$?2yal0f6hlL44om>gtMGt;YHJIgv;N$8o6F z>nMtXZQCe{!Y5S)KrWXD+G0OnT#%cdW^{CvYPHJJ(o$Q0Bod*svy<)ZZ5+oTWf<*T zD2T_8fu~x%&gSMOCnqPIo}RL?vC%Gy#bV@gITjWc@O_`e`Z`~LARa$vH=kd$K^$n> zz302{oClgFY!JKo{9?ymI6SZDdeC%TD%mXmqLR(hbX^o(5B9?0`3FDJ|9RyHo9Q8T Z{s~YP&W&va$Rq#&002ovPDHLkV1kZ+NV@<4 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/right_of_way.png b/Icons/map-icons/classic.small/vehicle/restrictions/right_of_way.png new file mode 100644 index 0000000000000000000000000000000000000000..9c77123c50af42a2725c80ddacac7b79c1f2faee GIT binary patch literal 603 zcmV-h0;K(kP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TcoS3D=E96#xJLG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Iotw}^dR4C7#QcFt$VHCX|GYYksKwN23i-Bm>u1%95L0qeDpZmd(OG{o_h(6#T0UTI}85+ z^87tZ-rin6ibc26=L3hw^DCkG_y`~EHaNrKYxZS*eTOTR$_&Fe=B}=QI2_}~>Lg zxljuR^^-!u{cSWgn~l~v4(}t8kp>UZDAqX+)ogZqV7GWY&T65MQe|1}DawGjrzluu zS=2(IN+OY9hXz!VLZ9ujcm~)Z;Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TcoQEXvb1)BpegG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpF-b&0R4C7tl21sQaU6$#@0(1+icY0n0$s?$m!cT$77@ipBZTde%tHr@5QNd9 zLtUi2bjU+Nhrt3p*lbJ)V#L5=V=qW*@!HhaURU;7?I89?)LxeFXNR$|vDWIjeGkub z`0%C3KUi2;AP*(!bvc()yw_@_Bo_f zBCJ+}9~g)SgF)4e1DTbT=aHHkh~wipnwmnmvJz>x`^AmqU7pt@`ulU+4Gp+FJ43lp z0H@O-*4=$7#N*ok2GVnLFE?o#*~LWw!1?((a?8uuq-pHU%)Gi*7L&=goz~XNSVsrm zt**lF_oKJB7pEsDNOW}}YBZL`MB@IHve)aSQ)6QvLlqVHFh7r>p&`&T4W8!#0EMkB zgcJ&-Mn^ySd_MZ`;Q|5kc6~j*SS%=&O0Zh3U>F9XDB>sk!^7CBtHa^?`m;Y|j^nD6 zW^+1RRRt-N0n4&5nM@cQ97G@xKsK9&%jLqw@i8K`wMbel2OP&${|X$q-BTf@5=Txa zWLbvYZiggEn3$M=AP6uTji4wB4u=C@T`q)GDrA+CFWdOga;BJ%k> zHa0c@03MGAHk%C$!=R<51?}za;Gh-&6PXeItYr`T7^32>qi}VK5N2!9WP`;5+-RLOq~T RXLtYr002ovPDHLkV1g>kMuGqU literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/roundabout_left.png b/Icons/map-icons/classic.small/vehicle/restrictions/roundabout_left.png new file mode 100644 index 0000000000000000000000000000000000000000..da5c912ed991f696d03573751383d11ea02204c8 GIT binary patch literal 884 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 Ty}v9r00000NkvXXu0mjf72v|5 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/speed/30-end.png b/Icons/map-icons/classic.small/vehicle/restrictions/speed/30-end.png new file mode 100644 index 0000000000000000000000000000000000000000..1c560892eb67445dd7a554c844bedc9555995c1f GIT binary patch literal 903 zcmV;219<$2P)5r00006VoOIv00000 z008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_00SpUL_t(2&s~#CXk1kQhQD*py>})v znaMo!Zj+L+jfs}DX;ES^iVrFk6U~o3HyuYJ7LQRK4=W zy9W|_>^XJYz|7NjRx^eOROQ^~5 zk?6?iZIxV`J(*)}!DMVbnGyTbC_ISfN0fVM-;G`8f}-Kn%EBjWnz+VZk7ar@TG zi2ba@Kmf^HnyT%vvGOmKVhKS&ES?~pO%qSVF${%e%8X<0J}0#|W|Y@gI~(#bqLzi3 zwGctb_Rb#V%`FTmFinfrmL`&!6nl;hTB8if+=EqgP(v0vTKmx&07D3Nwn{87E)#k_ zQYumnNgCUlFf9|M1wv~=Kj3Ib8!g#1a&r3qkET)}1bY>maazLHR*X6&kR1bHZ%RVZy3s0n7L1-Tt)$ntxXh;6{xxUI29Mr)F+d; zj)Ty0r2Rh>d;6ce1CtXIq3~TgyEQL70(Y)*K0-AbW|YuPgfvPF`^)m0R=oz5ohImbgZgIOpf) zrskC}I2WZRmZYXAlxLP?D7bt2281{Ai36=t_H=O!u{gbS^1{Am2NBovIoGaT32itg z+MM0&7^d`#vBojj^H9R;AN{N97*$GnIlD|0S2Dyq2K~MEMrfDL?YrO9{Lh>|Q~Ukg z* zZCSomPOC!eSonu~_G_+Z`&>@hf4_KV%s=-DDx7_f3#{f^$o1=pb@v@9y?dO+Q6NEr z?fPp`hWp=dzAd|ZROj?Nxw>43@9e&pA5_X+ekpRiaK-Ci`6p}iCg0em`}}ic-uBrl wo=Oc2i?&X?e<4z%i|O>HdEO7F_Wolya%5)P(!&=f0>hNS)78&qol`;+0BbA1N&o-= literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/stop.png b/Icons/map-icons/classic.small/vehicle/restrictions/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..860b1ac4aa22913a1c42cdd543beca5d813e6f26 GIT binary patch literal 678 zcmV;X0$KfuP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TcoQHLkdx6aWAKG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io_(?=TR5;6>lfg?OVHn1rF~^0_nXp`09oS0;|A&xu5xS-4fo`F63yO|iiy}O9 zi5dukqI0{@tu?i}=pWz)#fHvIX%jm0b#O*~_tdJd$_iPRmvj@4)2~#D*!4B(8yi&OII@bxjtc=;Tj*ur?s_zzFkZvVH_T!U90sB+<^e3 z%}q4V&fpFN1^}1G1GnG*=f?W(E}oB%dwT$AKRtmQ2h!FS>U(=2+eYj5764!z9pUrA z0ctxtaC9A=Mq@CcEz8QP>2&NrzwyFlm}Wv!l!9NDM}j3qDHx`ic#X1PGnN}6$~j%r zgtvVVY{v3Klqug2bNwcos`@4c;hSA9N8hWnClV000001b5ch_0Itp) z=>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TcoQA}wnh(*OVfG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io8A(JzR2b7u%|A<3VI08m&-0usfelh1+&FP32N%JJB5LU^M2onz*Wep)X><`T z4ZZ_GB*8!6+|X1FLB0Vaa`EK3mU=y%^J`GZFMQ^&%)Ljvd(H71s>iHlN^=bNI6EO~ zVxRMQ)+|z0#Q53?@rpX1G1d8BhYKe4X}5?`5~oS*5G76T2+Ms=pOF(QANlbU{l0ed zz4$e{vb8PBQsc!-?Qt!}aitoGg+)y+GU>)VC2~etYPWYq{ae(3#NNIb3^WPt{aN|> zQj!Wj48!4pzueVYEh2rMi1cM542v+W>3NWNn#HZ_$&<{(PIfzu6gTb}lgPx#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0TcoR1h6Lv=>Px#G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ip7fD1xR4C7tl0QfraTLejCH9&$bT|%4n!Dx5pb%(Gp*XbHNkLkt42PQ)(yri$it)u(QKAMbXqa4lhj;FHI9Q zj>D!XnjdAE|F3}_k8jo~3eWO+yyh&Q$2vu!9*=MSQ~b43d8!2h_K_$e_WJ_^?Dz3V z6j2KVY_(Dmf7LjzgIFv!@_2W*NEF5YV`T-tSr)Y0Z4d+jfTG}DCqpGU-sZhXumc{1Olu_B<9{qW^WHQrm zI?+g{2WwlFg{@W#B}qb-WszYR^!a>fWHMNHI8aX}vj6~~$Z}W@2FXD89B_ZTgQxD2hUKt9Avu(20z$WYeZ9 z7cU_9!UgWH_t_r`;r@VL+HdkE?>XoB@jcHu=Q+<&M1(kz46Fyr^}&H~(ce&CO zO%-KsM!#mu{7SJ}JAiti1sIRVs1gT(T!O)4{%cpa`Y&HJ`kI^2@863lsO8u(m2Jel zu58>`yyi4;6zKh?1gyXb-^IpC@9RgkP|tt9j%XN+D_4TYyzC|5O^lo)p_2t^M`Xncfa~p&L?14T7cyb ze{pI#3rm5{nFuTnc6I)9XiM1~85xObOv}o~@Vyln3RhrQR)`D_6YTk%&=;Q*?7T_n z&i`WSsp%P{oWInoEm*h$=$jl6k%`Y5a`yHNJXs(QGA&Wxz>@{yyL3Tjgs#ij**{7D zGJ8xLgKLXLce~p}#6015DuFj2Zrd2Gn4KmgwTDC>9i7?vR37dj8LoL%9?Z8!*>mrD zQAFfmB!S%V3k|_otX)gKEB^L>#O-`4M(U2ojD)}a6R(J*iwG(J!Qe6P>qoW7byG}c z#65)j`Eq>c&&_V<0ZDuJV_Lf|s^5F!a3W9xpaRMMYge~Mo^x$c9w`^Dpw52+@%!-X z+R5ne-!~%M5IC0`4v2gYI&rMXg)11pvF<&h_ip2?PRRA@&s(;@MNh+`eAk7#qdDV>`!Aou;9o zfr^TX*bKC&Lx$ex%rq#PDu5Ce0gGkw-)6H#DVn!DPl_!Q_s$B$<7RhjBYmYMe9=4o z%`3y6=uTDDRb_5Qf0VG-JFTG!7>n1C+He^yD;q7~=Xhs3`<5=6fxvLIe_Q4~RkLMA zU3tFC7r&MOJkAx3tr!Z60C=kY1BUm$48dTOY-ACmBqX4wrrlK)tF=SRv4;%?KDvsG zjm1Sm&6r2Wo&%iE%?Duo{XgU0u`O)Iy7NB1mhed#mKOnZszAM|Y-8Aib{r4*jZFZpd-Undp-FF}m2-7h+HUQMCK#O@@SyTb(J${(!YJyl0 z5t;%*(rZURQ3!T-@o?j_1a5r7*n6j<Nq4*32G=-36A1*SPxyYHcz^pVaoOj^ zwDEAudeMF34I-jW_>C+|ZJ|52JBBuu+H}{0nBi3{Rt!t>F)YnT%gaYG8VPoOM&Mr^ zgu4HY_cEY*{oWIY z69a7@&&s!{bOTBI4-OiZRK0fCsnX=yBl)wZuU^P$<k YAD4?L5rkw3tN;K207*qoM6N<$f=vKO%>V!Z literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/ireland/no_right_turn.png b/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/ireland/no_right_turn.png new file mode 100644 index 0000000000000000000000000000000000000000..8350c9686bdd11e486e05084798ce9a01be0cfd4 GIT binary patch literal 1730 zcmV;z20i(SP)c=!j77 z_3|ROzLqIx)u{-e5-<}IJHCX(OXE49$j_9bRF2q_= zhVAJRpJipiQD7Hv=c@{E0M-764_+DCvr7wp{-1{l4Kd5I<;9gb)>;--a1ZE;2 z({wri>Ur&@^pTJMIV0l9W?NTI^sjzt#$= z0wiIxU4~WQEa|E4tKJQ(TEq7C5!dlOhi^W%eS{`QJ6YopU6AL3^ z^cAiYb70_th}gz>Ckpso|MO+x6CZz62KVd~b9nfn-6PW`o@l-^b>dDu<0$>=shxY8!ChyxL>o;QG zxMgN14)7lSJ)W%_5x)<`Y6}}5s@^dRs2V#1(f$vc0+UttmlcZX_suNqU{Jn%@@p|#RRDt)%Apk7-1;o`i zp?xC*d*#bv{(s5)4X3o`{V6jd~c=P5>Iy*b@`~5s>(MjK5 zjnVQM0PO{Z{5$ta<}X-4MMVW>e;<9zmmps6_iU6`CBSTv9vc~6DtywL=c-y~!zlewoyt*ZX!=0KaB2urLF6aEo(OFlonKJSN z2M$nEQ-j@ZXJcszKWo24lxqNVovt7KglI!y&v%OG=;)xWt&I&EHUOZ`NeJCCzYnv= z{g`gL-SJ^8x;~|VlP6CC@Ybg9v;OR9B;ZGhiX!IlA4zzskfo!3H*VY@DJcnu!vTO2 z6BCAIx|}JxqNxHXA?iGyDFt+QcT-hb%=ha4jEJBn&&6@<1p4Ca5WmdK%#d$2I$Qv% zYU;|I#2z3qM8M#ek=cVm4y?!{|D*H3{UqZ!b^0JPf>mBr$6=Ga% z1z>kp9&h~PV@xIF*gVkujb~v}-C-?W3s9>9&98-ju|_uG@IF zR^Y8U95!a(ycK=Xk~e|D(ICewBC9ztaG|eoWyB)Fz36fAzIRl_Fs95CrgvBd_g0HL zEh!>Ke|f2xeqX(asAIg7i_+xa|8BM1d!{Jabl;5_onp76XXm2l=Aq~0B7=h%*E7UsO-%acc=SXr%X5OAw;DZLUQ98rwNJUsGcn7zRuOZk=9-$A zR1Ab%d};*$Hf=%L(%4fC7j4fz|Mi$P4f_v%h~xcJAB;vGcI!UqX=VdnANlmcwxQ}B zvqmobYewAGqP5K4w!Lrkz`YHak^H9fI86YmjH|7i1I>-G{&QytUh6>op?|Gnx1;Ce zVJ%*ZZB4Or^grLng#G@i0>(@ORsrjPEVIY`nCWt+psJ>toYJkv#dmT4*;NZ%nl9-7 Y0Yb|zS{cX3%>V!Z07*qoM6N<$f;zHO#sB~S literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/ireland/no_straight_on.png b/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/ireland/no_straight_on.png new file mode 100644 index 0000000000000000000000000000000000000000..9cc66283a6614551d2281dbc5efa631614e844e5 GIT binary patch literal 1697 zcmV;S244AzP)z?9biZ%99th+p znkve)ygseK`=#P`p9GqLb|8{TP$dHaWh4@h#y&W{CU&IN8f|MqKYz~DP%AFQRG72pOQi?$xv6mHz5C42sLHK8f6-n;w&N z<##@?{n?Oay*CLL%se6Bo<|O^F~I0{j1CUg@uJEih|$oXF{kduIFAxD=JQDj(2=W z;?q+b08Ir}#E!ID(|xly-GgOT1yc_m#ZoaBLT09Pb)9IX4 z0D!Hk7F0E*Eqb^Gpib2X`sbvd?e^6_Lb2Ju8im7w`;9+x-MaPT>QOdtpro+ys^kFb zv|OwUzLV0H?EVa(T-E))>1GZFSS&dAK8<5*11Ji%u1*em>?|lP$w-84S#`>PiAK=- z0y9)S5Xeb4R-CR017+X;3tZ2>1Xde4{$755^Z*&<3r#aL>3*MARW#L*3{=;|0^s5j z$xClC=x`##L56;^hRC0qCiRifu(459byb;`*Jm&ehbIjNFi==RUDC$?a`Pb`BXs{J zMxT0o5&6exO8re!&Y4j z(5wRO_T@E(0y4bk5hkh$OrdE^X?zmL!#hDyNOX5Gxbg?YKmLfZ-@axrw=b*q0iUQq z#JXt7>(-kWq!=Xs(?jTiyE7MX3E4k;0N3-cqS)-{zVi&NszHW>DK@sMTC^L>UjP_C zA9p#n?=;Lpv}J!v0=g0|my5M)*Rpi!Qse0A*5KaPjB;HTq?de}hGXlF0pJNBr6AcI z+_c`9zi;r!@PqeBvM(@k+D${^%xM|Aqu#U@2tE9eh{!$Z1qmWz(}Tf|fm;`uItI$8 z%jk>Gip1j+GsmJ5e&$IDl;)ep7+k$V^k`(ih^XVd=|yQl^7I!chiD~Zm35dY^%lHH#nv8bt^R$PMTowjZ@FaO)X<*(bUET5Y^^F`b6 zo$I`b?k>|{*9z-*7vp;2wQe;pzZyt6_*4`7POYe9zUS@M6ZTd0-;7z)$hzxp+)ZyE zxHNLZsXN)#%nm#h|F~mo__0T_;~gJf6Su9Z7RS~d1D2Vy8-V8l-OMhN%V{pKJ@M(O z4YBq%PxNrh#kG#6?ph@)3(MSj*s5!>FRS)l+UHMj#d?2T0prks#XucUuJ;9I=zgCU rRn^r3?>Tj9&RH&AyPAPdG7b8F`2!02L-vTv00000NkvXXu0mjf$E7@5 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/ireland/no_u_turn.png b/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/ireland/no_u_turn.png new file mode 100644 index 0000000000000000000000000000000000000000..2dba9bb0fcd4bacac1558ac5b23618392b6f4a4d GIT binary patch literal 1495 zcmV;|1t|K7P))R3^G9SzF@Ta581 zY8%A?yQ&wOkjO5K222dAUbL)wQNtYwH(JAPj7w^$KUoTi!id4)=%Ro`u@bS?!c<Gb)0%Q+jc+wENAkt6+O_wIcgaymhY#HPeWa)yEK{CT`RaA4%u zTeobTot?7PkQwOd>G@_q$K71HaG_#(e0)Oz02>-CGMka_aLoVq>Qz%~YwN?08nD~# z-0`})-xr&jD$=o-jEE^Mg~n#XwuS~2R#icz)dB#LJdgPFG@@QFBK`eHgu}9Tm1;G% z-n=<~b#$~|vJylDB7((YDSA9MHauxI(;tAW%-U>}j6`TH(&@CMo{U6j)@IAfF=;l_ znp(^W}BO_WV6ALai^s6^HJ_}qI!B7Y;&`WGZ6|wEeO@BJf7FBolRj?m28HqP$(1t zfb`N5-d?(du-lDv{6pX)0Cxd=-qC@t?e=v!^LSpTS`De90KO%PPWhCb3 zCGE3CMQ|)H;|YMSk`hUuN~?u}VI zQ(CPoyNFLui)O-ZH|EcslMxoz)nVt*5XzlSD7S3caHgxAl8I@xAytfJpBCzL-({YJ zsMm|s;v!z3IfMAj4AL1dDGLg)^X^@IwtM%6qM3+#y^=bk(;>#PPn8pafWO3Qm2~pg zuHm`Gg80mgj3~ddGAHrX(*gh~K|rLxU(#PXa-;NY>UaxLmH=>jtCAni`5tO_9gr zq5JpmQ!16B6DLl{u3<6yB@$#ZnW($FTN0Mn4Mw?yV?hu;5N14QLogT=la!ppF>N9t z$rYPQNa$arWNWe6ld`4U|Z%E3RM|lsg=V x_wFdo%){%`;Q002ovPDHLkV1hQf%ya+% literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/no_left_turn.png b/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/no_left_turn.png new file mode 100644 index 0000000000000000000000000000000000000000..c351707b75f7a0accbc6284eda5b45c2d6feef8a GIT binary patch literal 1590 zcmV-62Fdw}P)>U8R<{otH#f~X%PcT67;FeJ4q}OujmgGC&_SUc z2tJV3b{`NzX@%Bkw*RM>d+xpGckes*-g8(Uj|YK>qNs3-Cj1O^*dKFKaFUwOTEb%jHEBMQs{jxB_!Mjpnv~^x7Hp z+D8EZLLL`F9tlZO4CI*<_~fXKrs>OOv$?dqyu9m~0Aw;5Sx``*O_8MLS2WtA51(rV zeSbKRMS)rvfx_Hm{+W9 zq2|WDIYAOdQ8@9zTJS^r8%!qCcAZY=vm5N04F-cDO{rAY)wP9WY*bbII4{~E#t)~m zas0sAIRVmw45d<8XD}GjW(Ck{wIZohdZFxMPu%`v*Wq@1@6LzsuY`Wj zY5;(0>k6DKTn83wb_loIgZ;;@qwHc&oKz~kpw((cegR}M8L3bx&YP|c#htu#+h?MW zcCLbMcdA$0?st-4D9V@<0su~4x((B{p*V#?ab6~qk(2Eq#l^({fXK+mlJW2*@8uq< z$IP%es9c4Q3nYFgmMn|GBEdXZ8fFc406@)+dwBbeWYNl`Saw1}LM`xQ2h?h{C`FQ* zuR7A?v+XMr`6$VsaNgZFGIbJ|F&A!iH~;`UdsrhQPS~LY9 zm&=PP8tu_D0}cSfLMQ%G*WV*pue^dj$Hdupy4-lJz=GC4>;M1`;SBVZ*LUSf4-ys>A16K~dBuilV{^ zjYg9_z;FdmyJULpqgb!Jg6_T%zjpi37&a7GAmo#N?fyjHAI1Q~6=*b?Y(gv+XPN8i zSv$`q$Ad?3Ja`l^005ZlX-LK5EP^D-_~y2rpa##TRZIC;EPM$7Fw8hn`;;5Axvd|Y z*T%*Z91cg&YxjFiKa*^ZQCuv|Lj22-0DzJ+Ehs+I;?u9!&Va+=2-pNc2qs^(=b;|k zL%f=Q1s&ZF004*bQc#?i;s;<91VIP_J3B830ssh?%ViVtxWaq3he11<$0hK3S}fkm z5J8q90zWDo9*+lZj|Xlyz@E0eLr(xEe}|CAh0Eo#5l*MmCgcTvgeDb1a$v8`MObKv zS38Tv0vjwK#COa=WeO^O>cY+T0SI{{oKB~WU>K%Dk`$9wdF^gc0BknP%XxR-2pmJ+ zM{xn4gdmy=0PuK#yib0{&GrERfFvmf48wE~R;#r}o~bA(@e`?m=+50Clzi5Lude>- z^^PPb@bIHiHsyR*X#+kt|2}1xXHvLPZ>nMI_4-OaIclR8Mg;Br_Fw;C+2%|5vbw{| z`HCgcs5zC5=*TbtfU2w!r@#Ge%1$ke0G}MS>Gk?bHciuGG)-SF%uNm&;L{7Y@OZ}S zxhyUUwT5i)qrw3Id&`?JGruUzO$JTVmuZ?FV*`NMY%a}7=Q$EZQ2{$28-I*1s_yu- zyB>Rxv;Qhy*;SUOImBkOaCBc94s4C>tg5QoHnTPex-eP5ClMAJ0=L_PyS@IClt~3r onEXFWv+4TJic_Cey`b{^Uxv)Ms&6t(egFUf07*qoM6N<$g0u?SG5`Po literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/no_right_turn.png b/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/no_right_turn.png new file mode 100644 index 0000000000000000000000000000000000000000..f2183bfa0bb7d383ecd0bee4b162f087e95aee64 GIT binary patch literal 1587 zcmV-32F&@1P)iTQ;)JG74-C0~pT@gz-d-}gQDdCs}-dCz$Xm&*lTK+|-9N~KB{i^XX?9&b69%N0@- zB?JJ6!(p-8?G~10J5452twy7%Vi;!Bm-iBL2~aAPBAHB9NYiwtl?@ac>KQb*^`p!f1(NP=D|5h z)7C6O?ezy9wir<;PQSYj0>AzSyME*Eh5S~u(nSiCPYKDDf@%#f0jGUT-aQmK?D zm&-5euMS0@DQ}%~)&v1)3zKo+jaU!6`alBS-~X~#{F(Ar=&ue%%jNQmQmK^ZwF1Gx z!N72VRY)x8<{jwJU0Jl2_z>Ycq08Gy??mv7C063N_!Ri=+$2h0c zh5Qpuh?gYfDwRr+TYyX^E39a=h53?j0Klc5e7Tkm8&dL&usfUpfQJJk*r2F{x%Y_( ze?PArN4t3t6^*tqnM_s)03=P*0W?i#9>37y6Zs@e9X6!CRR!yyXTj_08ODa3Z_xFO znsNL>3uv0oq-i>UQmItwRyI)RYmotfj(bB$%`;-)(b$ZBbMIqpP*j4$A!hV5J;SiF zfkKr^l}?Gp;xt1&<1;w`wEh0aoH3KRFdGc@47Q5JX%vsgTi)E(J!@dtcixC_(#1n^+D+btx^vYnFHZ~(xqb}Mo|{L$kqundf#rNid&o4UpP z{Wu`WnfLp%Ac+kJ%d(x6$z-aPZItI7JAVTJ@Uh`8I3xjWVKN8;pePbq#r0_Eu(=15 zB!S(Vm*J=)9xp5nnKwBA$TrfrUazkuH5yHofHz{HBZJ(|b6@|0{L)4MKv=LpYR{(Q zrDb7mztic$XEmKzxxE~%J`|38rGO zejh>>`QfKK79{R7%o<0M1in4}8pirfB~qzW1x&e;>2x}^z^}id^w8RQkC|pflMhCtk=5(3)M~Z4y1IJL zk)2UpCl4n+*Z!Ukk|c2Qa3YTEjOwbcuHG}fH&~FyWNE}AkR*Yz@d@-=|2|oLX-xi~ lt=UxkXU(bCtp1_){4X0(x=m~_2WbER002ovPDHLkV1mYh+hqU% literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/no_straight_on.png b/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/no_straight_on.png new file mode 100644 index 0000000000000000000000000000000000000000..bf38f3fb024238fa629465612740c602270eeda3 GIT binary patch literal 1728 zcmV;x20!_UP)>VUY<_t37(WX`!o!tZI zcQWXAjsgH;q~VB>N}x!JLUtyJNXe*!rs)Qg$y8odRn_~C98jrLk_{U+Xj2rah2OS2 zXH?Xm0)5#P$fiKXPQ&(sWMpMXhq^jX)*6jQo!M+=0(L;F)ymXr^?^Z8)Z${pG5p>; z91!tjB+4RCy)7M)Ap>m`Mdj;sy1Sxrmjg95H4BtV2@k6WC%9Kjw!OE{LCY0{&cxZ9};5Z(odpl71)x`v*Qh89T z)ynSafJ&v3sMYEN)X|ZIeP5q`XyVD(_w{K|M@JIWYV`q?N+r2HFC2l{Y}SWH$#<+M zZh9m;zZVEXgy!m%7#pybt5m9;z^w>qG#XioBDJvCa7-X42od(bzXWHgT%4tHpi|ftj1S2&&7Gr(R zTtr5Mp~L1tv7sGYfJv+Emwv2XLLxOO3W}sCL`(}s^YK0afOEu+S+c0`B??)1e0;o_ zAW1TeB*~nL`cr~|@=Y(IaLrr*z>hy)!7JO3fc0?!M_|n3Lssb_ocPTF04RBF9zJ*{ z^|7OJ(RscZR>&e(tr~m-`e0C5kHZ|diudjZ7$}=+~tzx-czRc800|3_N%zTy4@1|-{0ODf!>}Sf4$6#p#6?d5L5M&QB7}wn2{NCQ zreoOU!IzEaU}~kIl*^aFX0shxRno*SS^pjH^KpD2V0|3_;r=cjDYZOOYI#GwHDFyY z>*E)^(ZH`NY2s}*+YxbaaBy_Llfkd&hj8S?B`jYU_rUN55h7^Uy?`gCgdj8|NVqS7 zz|!7_&h9}Z&z^x>FRD1Y-#H2|%VAB~VI1D4L`HJVc*qXgu&1s|P@ehJR1~h6i?_4q zAT%Thn_rzLtTApDMyeb8O=ods@XovQ@z#ZSb9EvBptb8V^4@C!>*LVx9EDgcj`mB% zjGKjOOEXTLa{>UiteuYn)ocvAJQ#L)VCxyeCPO>&cm3d(tXSW;^QC(`aK=6?$d|k} zUm)-79>D6Yhv4@3{31fIEbEAoh6@wJE)SM(vf%uM5dgs6chgazn(e3bP0JrR**ze9 z|Im3EhmK$LlPS)dhuyb+y)*VV$mdv-nh#4gjDpyYTYHMmR_O3#1sS1YWP#A!Zn+ zN0Ah@tnugtKY`vWH;|g&05Wze0Kh%wAG(RVxiMi30NwU$NPo*T?%X98t`3c2G89Qs zU>K%HY_(cjvNP2i_I%cLm(Y0Gb(jk+{R1Vy#2db*7db>JL)>dyz2SJD)8#zIUP`xc3U7aUuZuv#@y$iUNqfKQB?lK z9>Fga>vXzai^a0GEHBRf(bffzXt4| z^0hTruf+W>=EMq#W$#_8CCVbuT)h%YlYDJ;b#+T8_XNQIwKbcF|ExK^Ygdn{J^vG` WR!`1x6G!d<0000c7q z5p1$flDiLXhKv*c3QPCEz|6hhckY?Xo$uaJ5fOHS($do0_V#v*$!I*S5rm2?p4T&i zpaXy;%kl}GE*NFmnQ6b@=W@9o1_FWDZg^EY321F?!xpU*c zJa}O1?CexzLm{BIxA*I_95=Xr^JdA%si_?U0N7Drp4p5XhhzEIw{Pp4o133*DZp;G zbB)#2zpd8Smn5T61(CY25L%lJ2WxAQTV9TAoelsH=Xu2D=dt4PAUrStF%(klWi%Qb z7#v)_Gci#k%LEaDh+wf;@}5slj?J3Q^gE!q7Hu|)hr^VPWHL#c5f6uH(PqoYF>5x{ z^U29Ei^YowY4>JI2=?{Q$re!hFF#*v)N4D-Q5(6 z#iVtD$3y<2A_d=jhl7TOhFmfMEiEnFJD+c5O08A|7egV5^vRPabm-6_0+8`KeE2Xe zEG$Ut#ZX8gVoI&1cRt@rOG^tU2^bq0>7O;3lqsvMr0Con5fQz4^M8I7kIjUZHPKHCr0)`D$lK*jt#ik(g* za&jb}fe33h8x|WHupS6VcB9bF?g>FMcl4bdH1BoKyJipa?5CGlf%Q*h>CG>VXn0@;Il?s$dAiaMiR##>F z;ykZtT1l4WnS@TKm@Z=T^E)fwzaPa;CytDcBEPy?;a|RS1EH=iDQG6ngiaS^qAWY3 z*30W~#pBsgKnnY-t8sLE97je+H?r|BlF=yMwY6dP_;EyrhZUS^y&h4PonfZ^eqVvr zDszSh29OX0>3O^APT`A_Cy`THs<6iv7Vyeq0e|{+O?vp3$hq(o6y@v5qb%jJ5wZ8J)5 z!#zDcWHOmZ6h*}`oWhkWS16H4(BsFC$?bMibZ(AjD=W8eM!Rjt$z+lOfxwo*iHHP2 zklpXP9n&5LlHFoY0||ZNNR|nE9mziXQ2N=&az!s_Zf<^hXJVoz*4sN?>~JU=NIFOq zw+*gRt5NK5AlBPEerIB$W^-`h|N3i|j?eaUx*7k~@A*HC&?*gNMQ~UE000068=$SS%Kb z<61(^L-Wo;=#qUdp655$)zu|LBLQIl{{8QkmX;poyT@{Ne0LU+h_W1+P6VMsukh9by=UjJ=OX!0B{a=Va#Btf@Yk5cbldMQCkYjXB9lkjEqVy!I4YI0Lv+ovKIB9J= zL|vRc7Y*AA@X4wiBoQinYc52)%ZvL#`H2ATi#}{9%+4h=8jXI$Kjk((0a5A1;Pr_a zeX%wd2luQ*5}}IQT)S}(8*4hz<-P>~Sdfv5sttKFMqtD*L8H;=3AI|SkDY2$Nel$B zs?v#pYk_GY=c-|L&&l$65()IG-%10znEni zv?Rjeut-Rfbk&%b`N9E=d6|$T=_=vzcsi6M&1{P;q2cj(ItZ)PdR#{aMLH|(g*m6Q z(x4-QqSb0WP6&b!5(J@bSNXCR2C%Dq83aLS69ged0D!~cs9#^C4J@JNJ$L6zsCigl zqzyP6j(XtHaop6@T#efc zo*O{p_5$dVeJ-2LRu_kgHJnbT#Pj@S&Xhj9wQT7#Ik2~0g1z+;4mz(S^ldF$3eJ>1 z%=7%_$u+|N>slVuOD#-dda0$^WWBWFG+|cHsXYG|2fB>P;F6XM00000NkvXXu0mjf D?(mS6 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/only_right_turn.png b/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/only_right_turn.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ed162587496d379fe57aa14b20df38f3586f8a GIT binary patch literal 1391 zcmV-#1(5oQP)NaEeWP}mpmkP0IGEJHqg%8_^TH=z0xR_~H?6TsL4VA1_=cr4U32aR5p@?{G z`7_AAb-eSg3Ax#xY~=aEcKPC^V=mQAx*ER`CKW(`f#1r$Z8 zNRm_mKr9yHqtPfY2*PE*-``=k+uJ#gi-?(5@;Cuzvzaj(jk{QuT^ADMDpw~5Ur!K2 zVF5$oaR7i?A%|K)LtB^)<4P7vdYtDt?u5(b+S}CB)c;fh3BD6l!{Xs9m2+U1Jji@vTFhr?lWyWN6l0amM(F_}z9LKE4g+xMTtAN`}E zi2senOct8!bx_KJ9;ef}#b&dmL?cDOp+kq3Ra8_Qb$ZA0cYb;S@wm7gc^C*ng2o+7 zVbW&?PM$pZVQp>gPY)GfwOX02TeqHRJT{Pj;CQ!alHymDphyA$5FCl%%D`VKK6M+H zVCSaXz~RG(S51!ukuVGf18p*yjySzzPecv?`8gTzeEuHJe_=%T@eO!eH$TPa!0~Q4 zy<_<%lj(@TV4xH4rMq|U1^{GaWbBzpTe!LU<4%a&nMw2nM$j7=#roAOWRw&e$`;_4 z-^2Lx`q&J=j-PK}{aZ!M>xH?*qD6~N0aFn$o6StIwq)D({pX(gpMQPoDn78BM(l1J z&&i}{YkU)x`n(xF@%SXR?>~oPZOJyX*~}y(K-2U-PcKSa-F;6?oF4y`Wy_WpF+~9451i8v$u~d>8jb@FjlM^-B`{fJqrEN8&gaiOE zISHKq?G{3#5fBmy2m+u;0%avHgP8K^4UD3^u018UT%8;$G@3OeP16Owo`J`bKQAZo ziCLEt@bDwSF%aF z`PijLl3%(q{7CY90>(j-q)J>S0VtTCnY6zX}IU{Ft(xIfs zdAr@-PH-F-;W+L@Lv_)d323M;0>^PDIF5@D0N`@D_O4y77+%a|%{uvFCJSqqD~4Sz z*Ir<%9%yQ6>c8mgYH6<5C6CeB06|F5T(84LUsp?_Tu=tD2?u{2$zVdBb_B3002ovPDHLkV1kbzmCyhH literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/only_straight_on.png b/Icons/map-icons/classic.small/vehicle/restrictions/turn_restrictions/only_straight_on.png new file mode 100644 index 0000000000000000000000000000000000000000..d62b11193a806b49adde4241283f1d76b718325e GIT binary patch literal 1328 zcmV-01<(44P)JK&B&|Wrm zq@`xnKrfIp^Y_8R6wYw>bDv`-# zYN=GJ1^`hM1CdB1APB;Q&*yX7Y_^L$&(CJ#SCUD9$z;+PjmG0NP1jEg3N`29;k_Qj zR7k*7Xa)dKs8pa(NkLy)0An=`6*Uv!d47=NxKnn!eR5d>3*U{A z5kHPCntYsTuY@WmIKr}Qv(;){l#N9KdV6~-YHDgeV=sq`kA3tLqS4ex^x@H$aQ~k< zbbdUZ(uNQTdfLjt>{#b_xm-;L4<5Xd{C!PlXJ=w!u~;;Xjg4RToWEUc{qz^4yB?>H zRN&~|ZK&22K?1-t{@0Rru^2FP@?B#Ir z*@0`RnE}|}{f|73llye&+^0*s=j^~Wu$RNd48xo=7z|W=J&}RDyuA14CuD8eky<6h(E7+`!I$=Wi)DcO5QA``cxYIFm>u0D$>u3}j)P zDHEaaEJ`#5ikI~o#imW0oP?%nIZe~`UHw;6l7Gp9blfU}_(}F^6Hk)gSR;%63dH9rS*XPL-FLen9?wgFNSVnujLZv(_GSs7{#9BZlnt+4)66KD2gf}GMP+0 z6i z*QOCL1F2N1mS%GH`yb&w?IPiMewOF?!H$-)%sW>I9W7M|#@I zS4}`qTRBuY!4ZeUVNHmN51dY?z_M&JvtynAP{Y<0CqLA%70ixxewJmMlY0b`Y-F`s zCtWUA)3H4p{HKpptjKW?BEjh+6*#tMgWu(HH9g)NEW0t0NeR}Fhb37=TwEh8t1*e= mskUaxcxuh*qNrA>J^vT__*zET0igl_0000LCvP2F_S!8o}2AGna1xVh;c;^LqSiHW)yOA{wk(}cxn_-I|1&}eVln@t>UlDr&6btf*>N;&0wFq& z^}3C&x46G=00Jo`3ky@s&rfl1kjHT(tE=&d(q-J-e8>6uB4=ldoSuGWYwJBifTm4! zHCbDGOFI3LKwuOh1X4neVE7A~Hcm1bq+D(TFgd9bkB{;6FHPa{XJdOP9Si5+hAqo3o|o*Ow)c=763>IiNtFZ zMKCfVP!uuj02Bpm+oMou5DxqB`INrI;pV1>Vc6W=nW(B5bO4Y{21%vDluAvOmZI$M z=di4H4``Y$ySv{pO@~^|e(4|>R7s`Y05CTfd=Y9U^NHo<7&|*jLLuKvf~%_v<+8=~ zb(KiOkLL{*$8kI|nIANp?%xSq7pheoUAH(oDk9~egFs-Ebov9u;_v5j4Q0?BDZzCm zL-$lF7JGX+48s}NtDU0`I+v>haC!MitL65QO18JZVVZ+GAwXXDtC1tMz g{~ASsXw+Z(1Eb{CwMDNTumAu607*qoM6N<$f^)9}ivR!s literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/stile.png b/Icons/map-icons/classic.small/vehicle/stile.png new file mode 100644 index 0000000000000000000000000000000000000000..af019eb9b8e250e10abb70305227909394778f6f GIT binary patch literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k#^NA%Cx&(BWL^R}oCO|{#S9GG z!XV7ZFl&wkP>{XE)7O>#2BQd*0AF2<*&?8jNr`JjiF1B#Zfaf$gL6@8Vo7R>LV0FM zhC)b2s)DG;x zb)(n)6u*5bkL&-m{$95I&+hm;IXtJT<&8J|`*FDbeB7_c`f+AyXM4W`^+`m$xAgd* zP`O%3;ne>Zr}NjD+s}x5(cNWeU|`@ezw+lBeQV>-+OmlU>veqI?B5X~XJlkhP#f^% zd2-XP$NbF7hxJqH|G0O3s9)pr|G%N}-~Z>29AIFOed#yFYkKlYpw}5ZUHx3vIVCg! E0Q4NIivR!s literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/tank.png b/Icons/map-icons/classic.small/vehicle/tank.png new file mode 100644 index 0000000000000000000000000000000000000000..9f407a2e238abec1749cf6ada7db7dce5d7f1d3b GIT binary patch literal 508 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~g!3HGv?z=Y!NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxdd2GZ+6m{EI!=uRMmy~NYkmHh^%fUqI!@#pU)fI=oEt`Q~9`MJ5N zc_j?aMX8A;sVNHOnI#ztAsML(?w-B@Tt1n}sd>ezRtf>7NjaIxF8R5MnR#6Do6K$l zU18(t;uxZFe(6NT)rSg1j@BRQ%GUD{INQX{e3&Q9zA@n=cf^q`DIb|5ST29y&ROB8 zGwtjClPOahrE^?;Zg2S$FTmDx=<#0W>D3nEd~=GugS<}KFSzsmdw=`!$BnOdsdzd~ zQaMr>^Pz0_*}U!5k~g;b&U>B``E8r^T)yt3j~4Gtlwj4b?Vhkq^YTj(MVEy$mvyE_ zGQ{YK_Z@$H`oYf{rIrKVYisVS^Bi8k@sUNHc>CdnA)%p6^|K}kII%f8tiGDGHOf$e z$6~G@gUM`PzINuvA7}imIhSITxchEWq}cV>qM@OIT2r}ZpJj`^9;r9|N#(h^{qBJx zyYA}Edwwy)q(G*dwpi literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/toll_station.png b/Icons/map-icons/classic.small/vehicle/toll_station.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb2bde2d4d8fb40162140fe7c121f114337daba GIT binary patch literal 545 zcmV++0^a?JP)QJFrMd;F@MFe*T2L~r7|AT;#SrDaQ>sDy91ln}cV1^n=g{r9)CxwsX$&gNMTwmS#wh=X;8*Fvb7?@VO^Rvc#moa=`(}k{nn;LI|O%Dyy6xfsoFu zyq=n|?Kl7iwzjeQXz*E2A{E$AU$&a`@YBc719-Ra{YPnU`qf({X15WMA}gj5joEEM zt*Lrz#5DhrsMQq93Wr)kq2`-55;1i>WJlu)9uR@fGMT1SieFryy}9Ad9hj33KxPU6 z_`aLXy1ATcS@h;5fch0L6swHEt$Fw1<68M^X`6wKc1!~xpBG)%iAIkrzri^`<-^O| zw~A$G_4*%Oqg%K)(SLMRI`PWB@P1t$bao_+m~%Qin;0Ih=JS2+otmbfSO0E)IFJ|{ zA5(`0y8(dy>*IcAVm&^w9?$;Vq(<5)oV=J^em9qXzm*S?+qaY26XWxUVHn0hSHpRd jJ?7&4h~qexWd+GKYU8u=yWI=n00000NkvXXu0mjf8^!H5 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/towing.png b/Icons/map-icons/classic.small/vehicle/towing.png new file mode 100644 index 0000000000000000000000000000000000000000..b8156607665755d380d9c98922bc40acdd4832b6 GIT binary patch literal 562 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p!3HE570x;VDYhhUcNZWH1V5d3*8?fe0*}aI z1_o|n5N2eUHAe!d_>!lKV~E6M#^a0@{}{olp~ShH_ZXO2Sos+K|K}BxlzP_M)cpVV z@83FHoa~V*it-DxQxa}>clR(qfBsBYSy|;CFE8&W#%aseGGs;uF%(qQi3;-Zrr)`J z+x^df20ncg^TP8NFJ9Bo($%&-L-3H70bm_ zCmAx&oDn~9Xy3}8-@j_9tEoLbdGe&@nNz2h|NQa&$G4B~U%L1OXTH2~#cBWkefhU< z-TM0S=_9@$KY!S+-LOfNdG5x8obzT(w)y=2wL0_ve?S-i7JK;Mfx!3ApLjmLd&AGg z$??+4#(sKPZtAWtUp}k7dG+ES(8ubmEUYH)-@oN$v~=-}xqtIYA1^1{^RHjON^)`Y z{FIkhxTvPCarW7>CrXA!Ci_3UeJy$R%qi{b*RC6~va$Yo_x`=i&mTVpI5^n%vatXC zDlZ`{AbkJ91JTfksQoh1(rpa?|33Qi>EkyGb92sbUqAn1VECW<@X?b%S!GoYPcI*a z x;MMCllDzx^?21ZC47aXdV_;?H_`}Q1^?cLGYjYUSS2Kem($m$?Wt~$(699H&?WO<# literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/tunnel.png b/Icons/map-icons/classic.small/vehicle/tunnel.png new file mode 100644 index 0000000000000000000000000000000000000000..3f3b73ab971c833bbc8257e0937339d196167f6f GIT binary patch literal 496 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~e!3HF=pW8M9DaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#X#-XL734=V|E2lkiEpy*OmPSqqK;WsGr=80HBabiEBiObAE1a zYF-J0b5UwyNotBhd1gt5LP$ocg1e`00GCf@a%x_2s+B@OX;MyRvP*t$VrCwf{3f&8 zKvx)ex;TbtoL@S@u@#B+GUzW2fhf{#5m6z^tT zI_1o!H|qpdcHVwFLxod)@=5cLhO?Fxn$0fUe?M5WRC`C<`k3|Cd72)$|CCc?dH&hb zeD>M33A^ups<7E~H_u#)!QuSp2ocuD7R%y9Sf`yn-o!aUw{#|GO$M>=`^={an^LB{Ts50sX;z literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/turning_circle.png b/Icons/map-icons/classic.small/vehicle/turning_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..66959b4a16b69e77cf80d5e57a58d587c34cfb29 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~p!3HE570x<=sNx`ZCx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*bK<(E-n9)gNb_Gz7y~NYkmHh@2C#R+KKF9EjKp~S7*N775{M_8s zyb=cIqSVBa)D(sC%#sX+kc?CXcTe8{E}zWg)V$(UD}{j4q@2uTm;Bts%sejnO=h=& z`cphz977~7FTJ>tvpGQG$jAG^(cKnJQ-gQ79^kzvrg=nl-yy-EG`{HBJwhJ(9xCtS z#!+O~NHdi-q|G&a8{FHpUXO@geCye#$en4 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/vehicle/viaduct.png b/Icons/map-icons/classic.small/vehicle/viaduct.png new file mode 100644 index 0000000000000000000000000000000000000000..523d7d750fc1ebcaf0b44e4cd723bd0e913505d0 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvCMIEBop+B~bbvx8C9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(OB_(UQgUTxW79*Oz`)=@<>fmgc4-80bxnR3 zE_S|ZQ;vwSvDv2sY3sx_p5M8~C(@vMaPyQ;QP~T(mN6ZZcrxeVUibI1$vwjSiV90v zK1`HQmcP7V>$K-{<>&kwEQCgHuc6mWM2T;hQ#5JPCIX^cy zHLrxhxhOTUBsE2$JhLQ2AtWPJ!QIn0fXgQ{IW@01)k-0tG$|)D*(EJA5B{Y!PHA{UzvkJoODXP&tFA LtDnm{r-UW|mm5Oz literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/waypoint.png b/Icons/map-icons/classic.small/waypoint.png new file mode 100644 index 0000000000000000000000000000000000000000..7a75f701a8f32056fa76d6f77c64ee90603ae667 GIT binary patch literal 429 zcmV;e0aE^nP)Yh<3Z(t5hoYS(Xt1DwRs% za5#MF_xoS_0}9(2O24m01luKO&6=;pdZ3rUgyfRtq!Rjbu?Ue30CAw-gywB!0M@?m>x;$W+On(mvYZkT;y6C9)oO2^=LO6RBEm^b)5K&lxl|OT3*ZsJQ?uE$nEB`*`~&;| XSlD+KIA_PF00000NkvXXu0mjfbv?CH literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/waypoint/wpt1.png b/Icons/map-icons/classic.small/waypoint/wpt1.png new file mode 100644 index 0000000000000000000000000000000000000000..b19249be03c641975633f17261c6593f17687dd9 GIT binary patch literal 458 zcmV;*0X6=KP)I0iZn|gmo}Y6PZlr3xF}5PLEVobzIl|OeT}B z%jNQLGMSvGQmF@B*WYd1{wZLa7icsZP!#24I2_iZ(I}TB$qj-avREwSbUNMd^?FZ4 z1jZQlVi*QGozAf+ie&(o0Imv!LW+of{eypiZ&~w;JNKVxzyJUM07*qoM6N<$f}GI1 A@c;k- literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/waypoint/wpt2.png b/Icons/map-icons/classic.small/waypoint/wpt2.png new file mode 100644 index 0000000000000000000000000000000000000000..b2db585b22987b88c6062987032c49347525a0e8 GIT binary patch literal 459 zcmV;+0W|)JP)0qt zQVBR@cuNf!T&o>K0@-RrT4=$slbeg+(z%NW79C4FIm9LS2b?-|?3m7KTS_~W5NUi} zB9*4}2b7-aT==;6aPI~Fo+L>^sZ>f5LR0`b069fbBmm%?$N1EC5dlK2Ry$^lnPC_b z03@5uKD68I%Vx9r_`N}5V}`>a03>YNKJtCvD3{Ck>2#X+dOfFDEWY;p{Z^$?Q6erb zN+|%SjInFSaSm^r(KPMZb=`w% zwR#JH3xW`=Rx2Um;te(;gz)Kfs*K0uhA4{fgpgmCp4=GAvS1j-2LOG!T*{iJd7>!# znM~$wu~_WPX0ttA*ImZgljnI~1Gg{G>2#o~>h5GRY00vjqLc>f^*S-1&y_-igP)p z_El9a>$*M}kH^nLp^#}=)={-u{r39+ZX+zq0syXDE*~tHOTAL5e4I=s$yh9Qu4&q3 zy(I5ZdUpxe`3qZcpXWoCV0p2d18Ka<6s{jB1 M07*qoM6N<$f*Q!;YybcN literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/waypoint/wpt4.png b/Icons/map-icons/classic.small/waypoint/wpt4.png new file mode 100644 index 0000000000000000000000000000000000000000..18b9e51d85bb268607b169731aa0a0611151ddc9 GIT binary patch literal 447 zcmV;w0YLtVP)I7uQLlcz6*#x`w?J82yqIG0tKKASc3>AG)+5`QZ9r-pH8I z)9G9m3I&gpvQjFQri;a*&t|hJz|80Klg(!H1-R~aK^r(Jm&@aBxBJ~Nj02a;_1I`M zWHcIG%w#faN~sj^_T3jgP1CFxhOwK?W=H&f|Fcr6nakzYYqi=9kODdkz#MR>>$)L? pxB@l+`yj<`hJhVm>bJ#z#usm!e6dZ%To(WU002ovPDHLkV1m*LxW)hg literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/waypoint/wpt5.png b/Icons/map-icons/classic.small/waypoint/wpt5.png new file mode 100644 index 0000000000000000000000000000000000000000..e3797a4f597666063bc422650a26ec2058552cec GIT binary patch literal 663 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 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/waypoint/wpt8.png b/Icons/map-icons/classic.small/waypoint/wpt8.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccbd15ea06053660e3a88d07d6ebe3afdc0d036 GIT binary patch literal 1134 zcmV-!1d;oRP)r?ppsUx_lR&sN z-1;GfRJZ6`^pU4}?{wVhxSf|!fPTRyv&lNmz*5>$TI`WyZO7V3K+_kMnVjW`;BS?SE>?Y)@;dM!@E~3RX|6Pv z1e&imUyp~IR3;S(95Np=C*S(UCcDHg@gII0mE0MWpiWcW9cg?cXzwHNg&OT zW*`Bzs1`|}sI91t1h%QRsbW{Ny8GXN=bGml6D6bi3IBwDCC%4%UfT%(ii3)S0B}Zo zMhgHHdn)z-K*n^&Gyqt~t>eijuxyG#MInIiv%E9jnaRdDN{2W^0@91pizG0h8PLS* z=p4_H1e9K-cl8taSvA};++w1nsPI+$tM;pPA1aJGqfP*b)JAFnpfs;EFJ31_JBoGy zfP0I3%W67b*t)P4_(rlpxj{Me8ve?lKB&*n%lyQh?aq#;SSH8>5@;`PFMki8WgmI_ynW;&!|49e{RQTPUvc$SJM6ffm+A}O2;YcB z`j7S>B>{`vB9HYCFFm{zm$-*LWV-OI{#m`K8dAQ|z0s}k6aL>@yC)1227|5OW9I?q z0Z}FGjHX6YNg!g37)gN5Y$kzdFd8KBY4}L^2$}jzXfQMwx$^Z_j<6#vsvdQ@GF%yg zJ`qpKJ0(f%ul1AFlht*W&L3VByeI$wAxp>tfRH2P03;Juv(*foQkMy3f^F}{hP8Ls z-nH*dR`);fmFgo(Ig=m&002IER9JLFZ*6U5Zgcg5-u>uV|i0K$$DauJzGj{pDw07*qoM6N<$f)lZS6>r zAh9x0Db~1Qsb$2W7Zw$vLy>|j9h3}N(G_cRF)|e*S}8>XO3|`ic#%=Zip780Nv&yY z+R&6re=?}iuc&CK>0(G-@|l>N-K<-jiSfBPAH3&0=kUDm_kbixAQpP${%QYok?l&| z!_J4D&3*NMdW*fqWX50jYwy>Rc{*!@wSm+rHpe!{rk?aHTMMiO&3*Cue!!RqKU^_8 z&CYS3bi{epc{SJz1WiE`33x_5qa@%<^`&l8h8QB@+uFCak4*aZk@u0;uNtzrg07&} z96!J!ee@Oht5<~$VZ&Vmh&oY60=5O)0tw_+=T?(I>OkrM38Yk{RFFVbVO1dsh)Pkp z(;~5I%eCbqFHB4hO%4ra#SEa?G$)&rhYdhT7Lt)b_*VE92`I`Hx6ahWAEcg;qA%W zlO!NXk))77;7H&|G=r6?l_?UCRmv*k-}>Rs8Oe;qUGr}M{dda;mk<8>`%XcJ&>@h3 ztVh)a^aSV&q(ibi~T>FK4&#)3<5MdMA#C*+a5 z=g#NO_<>vDD0URui3BZql_vv9hxSAm-8>@cN^*K)a(=qNc*MzdwDBjnwUn; ze&!f=jMus0{@$nYY4Wl@`E)sTdD~(M>VtX`NYo|jNWkPUIkpAN3FVMLZDwsI3DkAf zb;S=*`1z~WSFI6$!H18ZeiSr<=9kKZ-~2cHHzI`>+b*_|z)|l}F9~Rr8YKywJ$?2x z31qy>ct-+@Yl~~Kjgvomd-v^Ka#lN6GFOss*trS+!N#9wFoVG?sVi_Za5M5`plP6q z1p4HC@jEW`>I_w;s4Pzx};swYR&l{zo>Xo;a4RN zhoxaD2?TXP9SN|DT_h0pg?%J41Lp$gNNJmB5iP;quga_eYrwCX9T5%)2h^HaJ_(U) zWVf;(T4`KqZ0;NWWc@O;xKypgscX zqg3kXaxl2f)@mp5&YtIiq~f}jQ(eD$2Hpse04c=%%(lzzUayn(Jnwq}DJ2pKn3`67 z1YSSMQ7B4hrt6|4rCj1^Q4)sXVkOl8j1`0V+|Z^|t^;BG4SoYPN?g}Pv6y}zk2iKF zldS`CPX)xH`vlXx8x{(i*ZKVZi|_lZN+i*2o}u5r$k=wdEyT?X=o0ACG|wLzjp||C wE0OV07*qoM6N<$g5dI^c>n+a literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/waypoint/wptgreen.png b/Icons/map-icons/classic.small/waypoint/wptgreen.png new file mode 100644 index 0000000000000000000000000000000000000000..0d7d3ff37c2e9f138043ecc60f057f5e5e80b880 GIT binary patch literal 400 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE?^gHkX8tE< z;@g~iTPfLxeFJC0X#*Zsh7Jv5{TjUvjzE#M8@^1&)D`i&QR-nykOG$JwDgeZeQ+wDfe~)$G3ZX z*uO~EhQ#T|Pb>58Pn1ZT+QG4Qve>WmzfGZ=Z@uYKebID*_2u$kxtDX_=~q8x^10md s{x|EnO3?#~4ZCu0s|o(~`M11+HU2|ZhVr&&F`$6;boFyt=akR{0LC$(Q2+n{ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/waypoint/wptorange.png b/Icons/map-icons/classic.small/waypoint/wptorange.png new file mode 100644 index 0000000000000000000000000000000000000000..2ac6b7a2b7a054429591565f1e553c6324226161 GIT binary patch literal 433 zcmV;i0Z#sjP)Nb_u%vSpzAtkjHv*^0D42AkOu&W$ibJt7B-k&5G`}8 znJ9_^)0EWANTVVqt*BQ9KsG}HO6QWbeCkTNI31g&={&)1N*wUE4BOEwzsqF3x=iZ_ z4;;D(zk)Xt!!QttC*C@(yZ#wi_FW)@!wz(*q*H>e?p4 zeUad0IlnR9b+zQ-Bm+R@L9IRwF034gtqURoW30U-P18^;7K4hS%mSDLkkWNsBcgBr b;2*#TJ7aRGUZu_aqG$zmfhN|(*1)y$SCE-m8D{e z3(r}7<=zoJ@*%5VS$K_NY@R4H>H^imac7DEN4-m|9xKZgSZFp z4;t|7Sf_1#%!gq&!#ADNmlzs4rhQxbv#rBGuHXDq59>ai@7V_yu<`gA&3yekPQPA^ z<@MxN0R^R%uPUFLuln_iQQ+*46A?j$bJA8{KFOsRCS7oj(bu@vwX$x$@bVnbphF>B z&sfG^(99G(Zph$awBWTi)0dYa3s0sP|9i)_zj2P(yyuG1TD5t+?Z2%TU%bdT@l4ug zaR&ZnH}C6-<@0m5ZrA9VHn)RAyq9g=uDdZu3ul%0sOC1@Vu+pfY;yd1`SsOLnR0Hs sNwis>tCT#T*|6&ME;GTuI{%jcV9H_2%5b~h)Cvk%Pgg&ebxsLQ0BL2SYXATM literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/waypoint/wpttemp.png b/Icons/map-icons/classic.small/waypoint/wpttemp.png new file mode 100644 index 0000000000000000000000000000000000000000..6f948ee9c17a8c4c1e5e50a33b97d892f8e5c7ee GIT binary patch literal 850 zcmV-Y1FigtP)41hWczgE_bpPVEP$u_&PIW6*uyTPUt17DZ zWmJEP?^X=`2YB-^RJAE`+s6&GY^z1imQbD8N2?QkWa?WdPM^;^AD>LUU_f7oP7yf&2 zV9KAl>a|`dJp{OcbZOiurn0gC33T0||4%{Y{``iL$1G8!ADLZaeQsV~H*FnVg9#6> zkhwv$XGBbn-!_FW(qRg3V9qU3$Yqdp7n1Bio;SZ{U#ERmTh`XyL{W9`s*Mw z`ZZzOmJkY9#S)Hf01htCqw6aGJv}`bhT#i^LOasw^rAbXBZtmixcdv5`y|4i#IX%# zQh$)Te1uoF6N!WqkHXOE+Kv&XdBr zfXY}b)@Yh$BAHAc?(gp(?&#=vvak3w<{907*qoM6N<$f}kUh>Hq)$ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/waypoint/wpttemp/wpttemp-green.png b/Icons/map-icons/classic.small/waypoint/wpttemp/wpttemp-green.png new file mode 100644 index 0000000000000000000000000000000000000000..f94c6e27323603d05c51ebe556405174ed2347c4 GIT binary patch literal 848 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 UXTT?&H2?qr07*qoM6N<$f+e?;DgXcg literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/waypoint/wptyellow.png b/Icons/map-icons/classic.small/waypoint/wptyellow.png new file mode 100644 index 0000000000000000000000000000000000000000..7316a1307d7b08f1c5141d702ac0d4e8d51814b1 GIT binary patch literal 411 zcmV;M0c8G(P)K0kCNph6(`8yug>{gKxr`>+T&otcLe~2 z;YKr`zps=^$AgufecuN&3$E*&R;$YMXar`Ctkt4PvAA;+1a~Rl_m>OEvJ61gJx_WH z!&&jvfCLesRx2AcLMF~6-xv>Alo9$lO|j^iMeI{1jiUbd3S z*ImsKk7ugN5&*Q@dS^I1 zIj`5RAD9_Lw0b1VvQVql(y}ZU02~5vZQHh{*ZjvKz5v~gbi0YdLv#QD002ovPDHLk FV1i&CuJ`}| literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/wlan.png b/Icons/map-icons/classic.small/wlan.png new file mode 100644 index 0000000000000000000000000000000000000000..780be870875c12b8328d5746840c2e9347d506d1 GIT binary patch literal 655 zcmV;A0&x9_P)v!Vlay?zG{dFe85Ufww*qkxQlzwz31Eu@ZSTeNiLTIyWM_&GMPBNUhj^k=}WCvD*=F3k|es_ zZr@!lmsf#6;Bqh+d=G^}003}JB`}#xpwsEXrBdk)&+`|Gq8MqKo(O{QD4);2C>D!x zp65xc)!J&cT30N~0ssJ^68L;RaJgKcBuUE7=ksWxP>AdGdJW664>^uwNRoVw5X!sV z?(K9sJ=KCSR>L$NkDn$IiEpV?>PI*n-X)XCR~TbcJRS#(F~S%h`-oF2*gBog4`#FZ zNv&238w`f8Znyg*LTIzuYycsIe=pV?-9$$}WdJycqIe((0%Tc62q6>37|F7HGVMt4 zYb_+p@||+I{J7umKL`ecpDBvE-tBfT1VM0+B&kuQsyJSOAP8727U$`7`gx^Nd3JVo zwvWYPFAs;qmtL2x~YdcCd~jmA+no832?%|AWhc^(LYu#HBedkn*H(P;Fo$K!ct zu~=>^iZX9B8a_#q&WFR{``K)^J$a-|CIb{j-B_(wxBPzp-e$9{IgZ;i3wc z6hbmm72G|21Gs!LlT-7GQ>_#NN|SOjlU?$26EpL;Eak-ar*3JTff5& z0kf8@nU(*;*iY=4&s=%p0mG9!0u`|$ zM@yzppI*#o0c35F-J)lZy5vS}pci+eTqp zxI}Yqj`i0&=fB>0E|WK7qfx^J=><$SjOmqL^38`X@Z4bIYm~ZhHrVQ=_!MVz=iLk6 zUI>a`FL#U6mN!-^Q`1D7;d$Unfhg`;-q_h0+b(op_g|(g2ga6#&e%o_tYMbe& zDf=4AA7p7c1kQKJ7ds$hU@yAB;<43*S=SEAU0|KHuzPY`g5?+862&c|Rnk$i|2M>( zb1HX=cMAX2uzMl@!n28y7EDqH+$Oe{&AaryVKrL;&y~jN2ZsJHf5{gF%z16;|1$kd mMQDQPkF&wMW}BYPx#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0Tc`w1v1ikX#fBKG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Iob4f%&R5;6}leF6Y1&Fq#Fp2PS|f z;G55&02F~Y3BXHW1Xz0_QkCi6IY8Mfn+3*0j1~Xy2Ci#yVakcqY|?v^ewfr$lh?lg zWs?p~>Ph?`OxiW6ui7oNJI4on4qL#-5aWFYd<0l^&Kv{#A;w=hAJzVGd00VDHL_t(I%QceAYg}ae)9i5qFo`T$;2@b3N)u$6SAC zlHgbItMffUDg$>tJVzKb++%P5Uqb*2v){67;4#Xl$DXklCq9)RO!%~(zoiD>31fb5 zra1kos{-Ot=NFwjd_jAj$ol$-PNe@3fa1k>F;1+*zIpirYhn7Se6h*-#Y8htt{9U_ zA}B4jc(IUsvPvHq=&mM{5u~z~(1}bz7G@2JKc7aFGtBL|&u`|7!)K;^#`6X*DP$8+ z^LJ1q3Xb+FMt2LIE1+!b*6&{6+PSY8IC5xkcCnm2eKnw|g@fHf!huo)GBHR+1xvwr zUXyhdcetS36gIlV!8c!1^OrA;{9O#aV$HDEv-sw(koiqRJuoPNj4K@Iwm90WxU!}C)a~p=S{WdFGno1Kol7bRwiwVV=A!-X>%xE5}FN|B!m!ECb zrE7bGdL`o6f&jU+FwiC(?6PQaKncvQ8_r%2Db`?lOS5TQbY{TV>e9KK)GPPz^DMS~ zMcjs&wSZGoAu$D2->|l1nE6NJYZ%N}YzNTOZdQ_U>xv!ObnkPvgFUT|X1Q$G->Des zviNd3BnWq0Lk-G;TuKmuaufE&f;D$zcFMMO`~+IOWCWfVikaz(i=ikZT^5rCO=!T9 z9j(!vBEO-DI1Yy&7^r!j9Zj39@^uNd7j5x|a~2z6 z9~jM99O-i^t!;bWXY}}t)IWMYYO1Av(*1`TQoU7~{pqubWq;Rl761ErE7+4#(Hlj- z+7gelJ63CXZb;GB;}vMj?xRs#vF(#*8o*TPQJJz|dHtpKWF-AaPSdpFHyW9qkL|eU zx(ibiC+{_*X(#elG-wb;vg>|)D6nJ$+l~kTl@Fi9()L9^mHEo5Zy$4=%&8ZL?)(H3 xt|pJa$L6gwRa3hyrm&2*Q@@99&n7{he*yCJd)E6K+#3J@002ovPDHLkV1n}5%o+dy literal 0 HcmV?d00001 diff --git a/Icons/map-icons/classic.small/wlan/wep.png b/Icons/map-icons/classic.small/wlan/wep.png new file mode 100644 index 0000000000000000000000000000000000000000..1e10fa0f045d54d15f0791cd09991af47d0ce89b GIT binary patch literal 473 zcmV;~0Ve*5P)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RT0Tc`sF~8Ho&;S4cG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoD@jB_R5;7clRHZTK@^3*m_5o}R19uR6|uFl2x_4aE5Y8%%73Eh4-g+e!`jvd zDa15(HfnDY>s5v&7LGbB*+j5$nqkg&?z!_|;E$t}7fdPvTfhpCdASU<`*88*T)!~Q zq?$=bCN<+I`q85ZlbW8@ii)R9Ix{IA(jYeJ)THS_aL=Ubs56_Cn6&@39`oWP&`+J~ zdVSZ=O<*(BQs;U==4(C!fMuW+G@1n#fK^}#r~>l=Z~0694yXd1z;Fd@_*W|Vom>aJ z1I&d1uRszQ?)}zZfM;L_xD9v$^umBPuof6H;1Re4Zh$A?J>cuWUH*0tOsf3i6=qC2 z90V#RotQK+qQL70(Y)*K0-AbW|YuPgfvMhR9<4(DZ)HvxrAN?apKobz*Y zQ}ap~oQqNuOHxx5$}>wc6hbmm72G|21Gs!LlT-7GQ>_#NN|SOjlU?$26EpL;&t!IEV{7~WC`(E{DNS$R0SBfRr6#2bAkZ?a zq@j`L!t0Dz2aY%>O0=-;ssA+N@10wskL>O0lhlqeh)F!Y*Qxx62ME}g`vz2g|DpK) zvbOmApVzkESGv`(o&SBYq4DNF!r|9{{do8@IM1)H@qV^f@s@voe>OkzDrLVOZgsD2 z{mjUS|BEF){C{uXX06WOxo>BA`}E%K-{#87kN>x)`*kh6{p0ax^=s_uejLBd%kR4w zKDdA1zGr^?z6TGcPx*E1#EByxe%+IeOJrT@|NsBL)RdH@q=bZ&Kj%*zIdb68v47J$ zTc6suiU0fm`*?Yw=u3VFVdQ&MBb@09wBHk^lez literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/camping.png b/Icons/map-icons/square.small/accommodation/camping.png new file mode 100644 index 0000000000000000000000000000000000000000..bd00ee270937ba76ed0529c12d6e8306b2e956fa GIT binary patch literal 552 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMhO;umJS}XE})P}iEBiObAE1a zYF-J0b5UwyNotBhd1gt5LP$ocg1e`00GCf@a%x_2s+B@OX;MyRvP*t$VrCwf{3f&8 zKv!gVx;TbdoKDubSAVOavGJk3<&KK~napl%Y;FG^Wl6~=rRnWE;K1~v)TA^41d@RG zz|x2&*^mjS`0p0_w|Nj0x{o~Is(S^;%YFRp--KP7h zzf54*B_-zMH`UanGFM9Ov&+3JkA#JVKi5y<`SJNP`{YTjXQN$&Mf7_`ieh8FW-Fp^5oLbPdtqt zy#8ITbGy6Uf&e67&dQ2rf!^xDIt zovJrt8xs$F@0X8Q_wI&HvY6!m2@?gCa)EkZ+}wKFsb7EIV^xV>^=W4&13hGYdfvaX zv$n!k4<7yh|1Z^MU%|FHIrqP;w&1NO`N#AAJHPymD{tn`f6TG@zxlVfLYE4Ps@a7T mTAt}t+)^_&HVl|GmoeLI?WbF(PS*qDjKR~@&t;ucLK6Vy*Y%zN literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/camping/caravan.png b/Icons/map-icons/square.small/accommodation/camping/caravan.png new file mode 100644 index 0000000000000000000000000000000000000000..5374c1dbe6b13be13a8c114633d8dbe9fa4ba11a GIT binary patch literal 610 zcmV-o0-gPdP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4- z6g3970YQfV001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00E*&L_t(I%cYaiOH)xC$3N%XyBa0gn%)sftsD|P z4Z;_7>BN^nk|J0^^pGMwMh5jqxJQK$1@R?XP!Cx>HA}(=dx&1c<{g99pu6%R=e*~h zUYhQPw3;6{a30R@!{PV){+P(F#sS^TnaHlj1)w8cXTRTgxbT7hAf4niTgW(qz*&=fLa zg_xRthEg7ub(CwVK^|w8uFsx>Muz%!r*NdzJ$La^3E*^3qWpe-CaOKn`I}>QOIv%j wVUX%M6bf%&xbxuCza&xCFGe%V#D3TL7w`YImh{t#^8f$<07*qoM6N<$g2{>ny8r+H literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/camping/dump-station.png b/Icons/map-icons/square.small/accommodation/camping/dump-station.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9a2fde9c5bf219e3b9ebcb8fea08f17b6cc44c GIT binary patch literal 724 zcmV;_0xSKAP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4^ z1_C=B#FaJx001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00IG28q=$Ozr5;8i5r$B`BvfjTfe+QfdK-oo(g-DV{#lt?)3xi} z?may?79w*|2hPLcobTuNJHOxWOJ_Jz1IT~bo#9B00!YvPsvnJadOpVA4(-7(1cjEv zVLlIqf>KIs0Ij``N2dlJRNlOB)N8lf3hLA846Js{5BBtWbFUREBit@0UEKo!l)0Up zZ#_+af0&8Mxeb6D*IQ7mi~!gaZf0fy0LzpBBvw*+%$S|*m#~j-nLhXC@iVtHG zNGXYbU8e2asSTnv!?Y;gq2~bm>W(D#)*ep0_#Bp)aTb#yWR3PR3+)^uK3dhMa5HjAPL~9J{TS8dz3_4%AuBv)57kM?;hUwCF1j% z&@{91MEz3UA_AzwChOWdrU4eGG;MsyT^^76OXkK0N{e>hOD{}n+mE%+#Q@YoLt`3> z8hN@q7#nSOn`yszKNt*rdg=1!f)xU|0(wdnmIZzw1c1}Kmi%jgut{0sF;eTNvjFU> z(0}D>mvt7M;mDhO5Pd}mGovUuFBO~C-7~ev$qN6=&c6YyQ02c4Pq0P+0000Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TdJj7F#u@V*mgEG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoS4l)cR5;7clg~;5Q543%bI0-@IBlF7v_GI_5#(JYE^1Nl(OdW&JwTgU1nz@~ zc1A5lDBVa)%b6I8bRfH$&TSFdG=mJ)rVsAsJNNuJ=fHcqLrQdV`FbL~*mKwScMCfJzyQG83;@h%C9~;NBs-suDCS+#TQ60r z7h`~1QaU6D1BD>z%LK`{fg+s|dH;vJ#<1N|d-d8vquCtR9@-z%%%x%*&yQ=-+`2in zwEXmKQZGP+V=q_dXK@W9jdKppIW&y4%hQvDh^w}5Rj<(~A7!=*n_*qoK|~-T=(>*W zVsW}rKFkCH)P7G3g?yVqQ52~CS1k~rF!FihgDH#!0;H6a`r$YZ0s%kOKLs$xz+CrY zjDd(I13rTR0G4IJwrvO@U>F8W(}WNL-EJ3_W%QL70(Y)*K0-AbW|YuPgfvMhR9eE7KcWgMmUOC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(Eak-ar*A$jb4WXMB4TX$6CDzYMPJ|Cb(9#P%BBMJGfllq2$aH=^Yl+9=*w6 z=eAPsigq!YV&}MMN|=BMOMCTPrE4leZ=SJ>>$U%`Z$JF>!Ouk53-y-s^9SeG{IV~=1eSG98OOy-anrpw-T>Zt=!M1c_QPcLf&vL8o*VNw=nDE={>%te& zo0U(vsPmrazs159{3)L0Ws=B(&t35|Gq3*?jz3pm#bQ1s1sJppp00i_>zopr09sG8 AnE(I) literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/camping/trash.png b/Icons/map-icons/square.small/accommodation/camping/trash.png new file mode 100644 index 0000000000000000000000000000000000000000..0f5d3d6a7906cbfddffac291a34adccab9273ebb GIT binary patch literal 610 zcmV-o0-gPdP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4- z6dDGl9eL^i001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00E*&L_t(I%VQ|sf7*b7f#E+nxOo3*14af0hX3Mf z8Xsb2F22A(0_b%#bzop%U|@urbO4{?)x}xb|Nj1E44*Lb3c4Xo#MmYzr||9j#}913 zzI|mzmm|smE%NKc83n5mX8w2k@P0uC1_lNmQL$eP3=9lxTwH(HxVZn~^}>$MCgmG@cS!&H_mA=M`7;^@858jaq{#3`SA1!2Ll5G!@s|O7`5Gf z-r)5Dzl79JWIiXq;P0<*->{0SYrev6BNG#Yl7-Ei-`~FzP6vWA zau^0Mv9SDS=jQp#%Ek5f|NnpZ4d4|M`zXpfo!J041@wmV2(mNB{r;07*qoM6N<$f(6ABMgRZ+ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/camping/wastewater.png b/Icons/map-icons/square.small/accommodation/camping/wastewater.png new file mode 100644 index 0000000000000000000000000000000000000000..be9002c208f525f3ef1b96dccc9e968eb9c76168 GIT binary patch literal 582 zcmV-M0=fN(P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TC847%Jv%jsO4vG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Iom`OxIR5;6}lS?Q>Q5eU6=Z+DxaK~f3X1s+Wv9Mu*g_YQdmBL;m7P3JsY^3)rIp_P%|9t0s|38BpdsToQ%^2L+ zs}g{oQBvmXoLxNPADC{eX#fx=()sT}YA$sO+#p>+$tgVN zAP$C%h=6#T_TKA0+WA2sXQ|55nN0>D$s_1*2X84@BxpHCe{jHcw-HW%3q(|q>K*$0<*=*7~c$?tW28Fu-IEn&F#1qns6@zta0P>chZ3^y};HD00 z7r^U+mC>KM;T71Os%lNpLg)@SZ-e}O$U1?v3&=fz+jq3Fz3Js$Ym-bO6vb=Q;daGIzi3#;ims+!)cAiCFFY3F#T5 UJ$r*prT_o{07*qoM6N<$f+1_~#Q*>R literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/camping/water.png b/Icons/map-icons/square.small/accommodation/camping/water.png new file mode 100644 index 0000000000000000000000000000000000000000..5fc8b1605e3ce3be9e68d9b3cfa2fccc5b899de0 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMqvRt(HH0ErUQjcN?apKobz*Y zQ}ap~oQqNuOHxx5$}>wc6hbmm72G|21Gs!LlT-7GQ>_#NN|SOjlU?$26EpL;&t!IEV{7~WC`(E{DNS$R0SBfRr6#2bAkZ?a zgduX$*SFe@{pI;wHFaMc8p8b^GEblRmN}+vg95jWZFSIt+mG3qWZt~t0fG7V_oe9@EM^2pRxXKW5>;U_}Kfk~KzhB=X|Da0a b>^X*>zLsSRK8nu=hCG9(tDnm{r-UW|43^Jd literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/chalet.png b/Icons/map-icons/square.small/accommodation/chalet.png new file mode 100644 index 0000000000000000000000000000000000000000..5def7f8c779bc0bbcebccc7c5bf919859c301cf1 GIT binary patch literal 752 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4- z0u4HsT3$H-001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00J;cL_t(I%cYZFNKQr zR+0`Q2P395Lg*p#!HB6L2~k9lJ^4`3Lp?-64_PZ}l@Z}fNstAJftlbW6&VfsciFf! zC!6A^?zp@6*NY1o4n}_9y!?LWd=9^J_+elo(gcA1PYg^%ng{@DaqU_ShKA>{0XZ*` zkKs^VHkIO9yZaI=LZagP^aoSwOH6-aD7>7WC#C z37f#81d=GKChy z&gPcX$wwp804M=KJ)Ot-xfdgLswe~isvY%fj7B3DKP}DwFywP0LsTkSx6hMK%*|G_ z0O0FC8@IR`vSZgSHv&M%;FZrcPS>Ae!NZ=;mX$=jviVpS-x}-_hK>e&EC8r0IE6D9 z@`c2ggBKcAEK7?8+2tiI05B{|wZ`rFl3U0wFX>PwDr^z5K3R0%dpa`}4%y2oa<>Ii iV^=RV0syx9o&N&3d-&QL70(Y)*K0-AbW|YuPgfvMkyg3Q-|0hE1-~EiEBiObAE1a zYF-J0PiAszUU90GLO^L!PG+)8er{rB9#{L?s;5Ae{+=$5Ar_~THSX2lYG`bHXm7cr z;(sQy8yj2O|3_I;@=0lW`wloTy(l#)O#p$GStSjPJQrSPygG2iK~cgq;Yx#J3WHAa ggvm1{G|rx5P-8VR&uSD<1scuZ>FVdQ&MBb@05`x*(f|Me literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/guest_house.png b/Icons/map-icons/square.small/accommodation/guest_house.png new file mode 100644 index 0000000000000000000000000000000000000000..0bfa669c83dc32e869366f5e7f347bdce6e13dfa GIT binary patch literal 670 zcmV;P0%84$P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TdP<4*T#BfB*mhG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io@JU2LR5;6}lTB+AQ5c2K{g}*5GLxBTV_UkjwiZd!;74(x*y1K2=*o@w53=k} za21N+N^tGZaFME6v_v5wib9AcE^168F_~m0nR{nk*cM|N>c@o_E{DVOa(Fq|ES9qX z!he~~VmV6ygtN;lo%>IoR`3_^;l`D903ZjX?c+>T_&n+lqmFKLr$Okn4MYf*8MM<` zzq@L>J!_ipSOAfNrTeY4O<{3LS;luVhU>)t3?KzfIs2(ojM#^gLJ3>-dzqNmH%|n_ zs&CJ|dAXf%U3W}ZDB;U)XN3$si`b((voWmzZ`3J^jZnR~uW&R@Ujq;B1AF|LGTfKUdg?!HL2Yt^`E znjnOrR4V>%$lzkb?A@Uo?Ae-aDhKky@>Wg|myE>kHqGaDy{O zTp0{SM3t2Da3Vq&1mxn~dyPvsHU?|bxg3Te-UYngRE^e})4Up?ls6>V-)-!*-WQ)G zCjc{xOMN|V3q{jIP5#WS6D^3wY++&ml{3Vl$k}M3&lDw?04!Zw?*PD1N?IO;uK~d0 z5f1<=s#T!?88JRG49z!A&m3KX95f5l`fyU2@V|Bb0blIlE$J(U)&Kwi07*qoM6N<$ Eg3Ul1`2YX_ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/hostel.png b/Icons/map-icons/square.small/accommodation/hostel.png new file mode 100644 index 0000000000000000000000000000000000000000..ec8849439834a6539200227a45c9ffc3f5a7c048 GIT binary patch literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMnNV%QSoI4i-AHWC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(V8e&;?7=4I@=ZW;i=7t5K+5{F#Y#3wE|fAUUa z2J;2eWMOy11^2IB>buh5V))?xe0!fAIjR{9n~v%FhGwZqH_Q>Md37sKQTtNCw~D9@ zzi&7$ifwqu>*jXs{~4V%|2vBu557xg_w<~pb3$hIkuSG>&YUTjofBM~X9TpaLqoIP v`Pu)!f4TDvl}*wOC(M$6aBqo;H8aD_iUKb4N%}W{K4tK9^>bP0l+XkKIhURE literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/hotel.png b/Icons/map-icons/square.small/accommodation/hotel.png new file mode 100644 index 0000000000000000000000000000000000000000..96fb85a5ead6259fb655c4c5db9bfcdd7861a3ca GIT binary patch literal 547 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMhR9<4(DZ)HvxrAN?apKobz*Y zQ}ap~oQqNuOHxx5$}>wc6hbmm72G|21Gs!LlT-7GQ>_#NN|SOjlU?$26EpL;&t!IEV{7~WC`(E{DNS$R0SBfRr6#2bAkZ?a zq@j`L!t0Dz2aY%>O0=-;ssA+N@10wskL>O0lhlqeh)F!Y*Qxx62ME}g`vz2g|DpK) zvbOmApVzkESGv`(o&SBYq4DNF!r|9{{do8@IM1)H@qV^f@s@voe>OkzDrLVOZgsD2 z{mjUS|BEF){C{uXX06WOxo>BA`}E%K-{#87kN>x)`*kh6{p0ax^=s_uejLBd%kR4w zKDdA1zGr^?z6TGcPx*E1#EByxe%+IeOJrT@|NsBL)RdH@q=bZ&Kj%*zIdb68v47J$ zTc6suiU0fm`*?Yw=u3VFVdQ&MBb@09wBHk^lez literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/hotel/five_star.png b/Icons/map-icons/square.small/accommodation/hotel/five_star.png new file mode 100644 index 0000000000000000000000000000000000000000..44545cae695490c29a68c5381e5091e98c1972e7 GIT binary patch literal 664 zcmV;J0%!e+P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4^ z1qv-Aj}$fl001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00G!ZL_t(I%cYY|NE<;IhTqwBQ?{FE%o-zFMGXnj zqD=+yAV_lXA}Bo+(a@vU2$GvOy?OA^Q}NtGuSE!&iet-r_9Lgyq^G|F0b$G-PFfL{KJ?Gwg&)!WJup` z4hErM>HQTj0Wg`=yZvOaJ&=upBMLJp4mVqf!VHKbO*U5MddtV%)s__@B!&ac{EXuj zKV1(Kg*9jiC7JU7m`*LLpd^_muxX+-YVEzm@5S#`2OL&`)E5+CT*_o zcSlBdiUvrDO@ZTiv!>ObN*(N39d-4}r|?jVuBvRVWBxb&zgv3xjtc;$p%Xb7x30#f zYXN|oCJxt@9fV=%Er3$8@inIJ&ixeo#wOx<001~#U9wmCUZwzG>(>wGi`LgCreToW zJG!c}RIus=3IL$(ZRo($6+ESsK3KDy*bvsfL|p{{XQM~q?RM?CyR5d literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/hotel/four_star.png b/Icons/map-icons/square.small/accommodation/hotel/four_star.png new file mode 100644 index 0000000000000000000000000000000000000000..01f53ae022e217b841eda8829a1fecb0faf97855 GIT binary patch literal 632 zcmV-;0*C#HP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4^ z1qviuQ>>Bz001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00Fp3L_t(I%cYY!NCQC_h2QMDk#!S|Sz^Qs4-$fs z5CyRiJPI2Nu@FJAwACh^ou!3^l~`NYiXb8i9-tsvcpve?17X)Ainv+bV=UB=xGGTx zhM)NvKHmRk9>R00AprC*J3O}`{O+I|^mZn?1lOhYH~;ema7YN8MTsA=MAXVXO(hQP?Bh6^u Sap}hZ0000QL70(Y)*K0-AbW|YuPgfvMhR9f={Kg0>w!WhC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(>Eak-aXMM!Uj40x#>R*CmOCo`XEM97v9cQf7+Yf zAJe`1onY>P)6wQTA}uZdd%l+3Q~&>mV*i9Whqgc6sky7Z?vKNcmWhoA6%^iduA6>e znuqz{-@k`{y!z%lPy4p{Nh1RTgFpYj_dmRO)!V7Z$EPFX@BjH9f6aSa|8BmG)|=}$ zDus_SumL@p9iyx~B;9^*m#A56YJp^v4RnGbvOFi%Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4^ z1qu-i;ApV`001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00E^*L_t(I%VQ|sf7*b7f#E+nxOo3*14af0hX3Mf z8Xsb2F22A(0_b%#bzop%U|@urbO6Hn%lMyx`9C_1&k!aUhn4XgQ>1X778~O?rU>Ce zO5__{TrKKSUY8 zz`(%p^0(S|1_lO(SHD%iGcYhPeEci@lTcVNp$mL|^^)z<)(xV+zI|mTCNSYHczEU{ z9|I#J!@=njm0#bz#sBigwMVYSRriQC;N`6w+^n3O|D^Q{-oJnRkVi;P;oI`u6x}~R zejr@J$iQF_5cWjZ%kK?_0ssE~VSIJ_CeM}an`9Xn7#RNl`^WI?>LnpYCMHBQ{{PQ- zeb4qk_fH-b_G|3Ci4lm;u3Qw5(9nL*z`($8=hz`p89l?d|Nj1EL{{_X#}DTJ+&q7< z#)45u)MHgU$9Mn#<4ijYuWnuEzPfX(IEDeDN~+&D1q6O`2?*kicQI9sZww3!FEI>I zwzm5~Otf(e3IA3!xBiHd4qzFBoXo^PX?6wxOy$G~xPHk%00000NkvXXu0mjf!zU8l literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/hotel/two_star.png b/Icons/map-icons/square.small/accommodation/hotel/two_star.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e79b8231ab95ac7e219c83de56f77942b570eb GIT binary patch literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMhR9f=KqnBKY>CfC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(Eak-aXMM!Uj40x#>R*CmOCo`XEM97v9-+c4FM419SNli11arg$Oa1!Qwdp|PD!xX4wceO`uto2~&#T_syra!K{{8wk zb*75AjZN{S{>F(DA3pffd20RpdyncXAKy~G{%BRTi}Z(2*Ld^7{La;1s$zS8-@fjI zvdZ!gxs`cc@8-+f3+N@LBp7gTR4;n{^gG+(hWh&d2K#o^PJVvso9`wbAo&0PZ*oQ1 z*GU4(!oo^c|Np1&*_Zx%{%`euuHU9*_l|HJNe|cK^2o^84|3p+;x`jk^vrvB8)%G? z((0d|AG3e1&zol-k$g}?<<-Vjb06>i|G#kg!tm|uisSF@43#;|5U6@Je-0DV{+%oz zj_;qb>XDbX++QL70(Y)*K0-AbW|YuPgfvMnNWi=3kjxHUouBN?apKobz*Y zQ}ap~oQqNuOHxx5$}>wc6hbmm72G|21Gs!LlT-7GQ>_#NN|SOjlU?$26EpL;n{8=@-uWYO1Sf{y8m)N{=#eN1!2yZ;}2h7b~5H^S(Y3vZ_!(2a`5TNiR)L` zm=_hCzP;1n;GfgX4B9(muPr}TAAA2{>CyA~GaWZ=e}De(cOIU$97c_$A`Gog2l-Qs zW(Fkfo*}TvbHe%Ooy|FB(s_z}R(5Juw$Jk|CQdB2obpl!7#R$nu6{1-oD!MPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tc=YB+47_UH||9G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ipb4f%&R5;6HDBgeCfPsPGKRLK~|7in81_p-z;%XWnVrDMBz(4}%bu@KgU|?Wi zVqjokh?%+g!n?;0Irj8-DE|HPn{jtvyW)puPuUq57#P03d&~Ow&u_*({T+($9zW!G z|Ku_I?%p<~;{B%&FfcGMu)s{bv}L`xT}Ix+mp89-83u(vzqV_uh`74umpAwCa{v7N ziN!D|{JD^<{Ezof9vTXI3teJiB_C{EyF{ z*cccX7}$Auek)nnzPfW{zmREU{Ig^8XUa-wXx~RM;MRfNB7(B=-{!>xn|^-%k`p<^ ze}4JGdVSA!X>K9mAHTkRV=)Ylc!uGEhi6X-UD&Wjj)|H1zmS~5XB{uUXMEz4KmY&x z$ME^p3-&A9H%ond{*>$T_DwQRuUr&Jn7{HIiUF4KsrMx`w7+hwDbePal=^NO9{c>& zo~?>Zj10^g5pj2(U%SG`#KQ6~pr!Zfi<{SYFkGPS;PM{X+0QPV;V%yhlw)UOV`$vE z_bp7EUsCE9zogVV3 fQZo|+rP&z(*?1af{Bry=00000NkvXXu0mjf`Imog literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/accommodation/shelter.png b/Icons/map-icons/square.small/accommodation/shelter.png new file mode 100644 index 0000000000000000000000000000000000000000..273dc7a023ed3c4b33d4cec8bfc019a109038b69 GIT binary patch literal 789 zcmV+w1M2*VP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tc=YEwjg0`Tzg`G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpXGugsR5;6}lg(=rQ540`OlLAlnvk|>NoSHwJ_=eyY+ZC^778tb1>K0asET0y z2f7g4=|bGN6^fu}MR8#%ma2$QKTr!n4X7wKH6NP9q-`3TnM^V>dCx@~p^bvo3m5K# zbAKEj_h4)`+7E#KOOMS)`xyY#v#qx@GCmQ*7V6TzfxQ600>H@lM66OF)`fXJLno$`cGW?^0rX%%ACG$O=5>*2B4=o0|o8pM3A?g@tZl%f#3ByqVyq2B3m zP^F@hR?`G0dbym<&Q>*z2%#Q6+1O(nLmcnTfBZQV^qovja_kMJ}^D1|0LmCopraHEgCxI zyFA=t6QI4FEv*#m?V?C>xu-Y9i0f8h|M02>03N=)Z#+(p6qdFh>F@{b*>uYAJDrxq z2Eby$=;X6A6;JBg!0ExfO|SrE6<`1iM^^bk{jzuJ+1=`kFQ+(p&v3TMf&2A|jy^dp z+iflM#-m_4&K}IxZDNfQ0SwqUVazKfNC+CX3(PWc@aAa@=01#h$XJgM@XAV!v zf`#DRgUGUHUFYhSbXT`jYyxbq9o*GG-!x&M1G~iQfqc1J`2`-g=^Li!Un`F)dn6qs;Y@&7-=xw%s{56_sW%J~03 zBQ9k)4fuTdoWzMeyLc}gKFIt2>~Tqw3}F2Ii+SIyDT;sp{$=?0?;pdyIn(4BfBs-4 z+JHM-*2&$yc9k8*zkl;4`|XXZ6o@k5&&Ln!hnFvwHMg+%k1W1_`C>_icdvK}8gOyJ zbd7(1eluCbrrcp-LP&r5@PX;r>}g6&3=E7o4fuZZs>tyj+XQ&{`Tz1rN`B|!;$mQ6 zU|=vXH~-1Q&;R$_{yhR8ubdabY5?Qkzf1>aPf`B);|HUfp8ogm{37qQb#?z)ySab$ zYUw{0*wl5Ios;wbfmu_Ong0A{!7$*-{+-g-&zv0q<4 zvmT!_Mdk0kn_^!-e`5as|3AZ_#q(qtKEC5-U|?WiVPIfj`2Xb-hh=#56S#L685uY= zbU!-8Cw~>t*860rsK&}9CHKWOHH+!j&!3D83=9l^zI&Pi|(ij7xsN cNNIKk03!F{GDNgY`v3p{07*qoM6N<$f|sK<-~a#s literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/education.png b/Icons/map-icons/square.small/education.png new file mode 100644 index 0000000000000000000000000000000000000000..0c88faaee33ed11144bf442cc3a3aa2d7dff021b GIT binary patch literal 662 zcmV;H0%`q;P)0p4&t5W!@mjP zhQYj*Fhg14*-;KeY&F@(>@Q7$%6sFWZdZt^WU@H0BrJL}$dBA4iIR?fEU~8BO(7Gc)&F}imZXW}t zAUYF(B=XQy9Xw(9aB2gQd>hdd?%yilMip&8uc(F%j&~#Xxdin#$+c1NIjf*`v0>r7)^^jJU{ZfkT>jGlU z0T!-b#?AG0e6tl4%Bq~Ny5(u0b8HKb9zV-nn{I4fxV@O2QtCQ$8Fn+71WyP!LeQqv z3Xaj9;|u^GHbFag7ax`$T;kFTFJGm$%z7_p82HiYK#s>XMdGX@07A&zar=HI9&bl( w@oBQMk|9_5%$>Eh-J$K|a&`^?$p4=6Pmi_zpF7I_q5uE@07*qoM6N<$f+(&gL;wH) literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/education/empty.png b/Icons/map-icons/square.small/education/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..91b3f8f5bdacfaaa3872da10f8099982ed0dbce6 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMkyg(riZ_ul>mk0N?apKobz*Y zQ}ap~d@_?$^NLfg6aq?Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP= z6fO&QS$y^Y0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FWZp_5GC|cl6yUHk} zi$IbB^G<9M(N!NP6h#-_Bq~ybg=k;<0O#geId!(_^tkiUg*n7UMm;w#Jn#Gdp6CC( z|CeArRQy{I>euB#RaFN=9sFOf8-*zV2zBs(EYsi#SMoe>TM`v|Bd4nBAOKL?^(cxW z`6!6Ffk1$XCM3<)ea*Ha2|?RQlTUNBm45W%RslUay08aW$^gi+OwKL9YS8_qePrEiDz_x0SqMSyoO4g+yx7!o$xg04AG~&1Uo3-P48s{{H^2XKd`8*Xz~M6j7{J>ncSE8XFrIp13TN z!^6WLG62PSSt~}PQQDmI`Fy$yN7&$2gIO$=R2oox-RA&+);eRD=Xr7SL8sHXc(u+H i{*6N&06_ltJO2dE&=bjvb}mf-00000003`NklA$l_v{Q& z@8a?o3OYzNWQb!+gIv*4OG86L{RQoQU83z@QMdIDV3YBo@kb&~-VAM%fLAkwPGaU{h7u35Di>tzeLsPKWkr z#It41=$Sx(H7TiD7S(C|GM(l;l|l+J2LMF;ehRwIYqv|t=i@$~C#PvlCKGDiE;o$^ zL)Yabk(d=P0FL8v9$PKWl1cUrgPf)TAcWvB7Q-(kcg-f-!Qk=^01Q>7Hy(4H&0?tP z(y|UB5jIqHq5HxWMy|`}c+7jhkMb+&M|;z${+wW4QFtg6{{IhF2Nc1c8UwFpDuOLm awevSZ=3-Eqed@LV0000mW-YO)Cm%qPO`l_eZX)3Q1X)U)CBEpf&a zJ063D+;4V$b7h#>wsEq!z4?J>Ts+Kr_POZ{S;;tg62w^J9&|O>P6<6SMAasjw5V;J&+1gQqLDW&Q;_0rn#d mZW-s26in?8Og3G5Q<9-BE-BLRqh2Y{9}J$ZelF{r5}E+Wd1~tb literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/food/bacon_and_eggs.png b/Icons/map-icons/square.small/food/bacon_and_eggs.png new file mode 100644 index 0000000000000000000000000000000000000000..c689d2021079b9fa7603e3323f747166557f1f36 GIT binary patch literal 1299 zcmV+u1?>8XP)8m2!qem}qDeV@!y#_ta64+MRrE(}VF)5PVLdhWA)}10V=M!wAC?frwXkFL8 zv$*6}rHrU|EJj;dNT-bw5E8L4cTx(e_Hhi!71f~L@hcC`j*`-Nb%iLku=c7-6Y4%T zJNL>6Tu(9F@t1j5T5C;;=~dR_O^9k4Y;+OqWBpO_Xghj$OL{cM?;aZ1_E@sREm6H| zc8>bO&E0nQ*~!%IdwWM7*-o(|A;me_ubMS)B7nZ%GupA?rl{wDuG&7KOVHnQzlCly z$&3<1nPto6wyQ^*zn}<`Q!qOLqHmYVxS8s*hfM&)d7!{?0Kop&fvN9k$GBxo^)Jzb zXTul1^LJ(Ngm1WOU_fWI)l0-%$kVPNCGmc8>0BW6+a8!ecM4n=R2ZZM2|v)g!uJ!3 zKwKxT6W0NFQr$OjV$ApE!gGv)Q?w>WFs4dzX|o0hX|j%4>l(iqphm4F$BKj^p-2dzP$(1%1;C|uYXlc{uJW<> zz|&=n)yk=bnJ1j7-Z?YSw}ToN@UzF}#s@8XI?me#;W&=tH~?41m2qVN=1bIT&MN_k zvkvwj+_kYsb9JSbO;*e(H_DB20N#3yX5Y5}X`1+hCNTi#mWzh#MN;>#9;>oBG1brF zJx2iV0zZZoSz)d>*PH7B_(~ehiUD{a9eFj8Q>Km|PV7BeGnrlFmlv*DOO8FWxZ&PN zA0&mz!{lLd021HQtjmBSETtjuPP_3ChG7_n%^k7lGY|z)5Cs5@&NDjd0 z^2Z*eK<2fM>As=SN@gA}k~o1gCbQqq?2NyBa3-cqS29>40O(!D+W+|l$QDa2FU$b{ZThd{`Qs}c_zp=9NggU{veEElo+&xZ{|RH*jqExe z2&U}-Y{VvVr2H@23LoLPA}5rk08T`L7we*XhlH@fOeZUL@NadX%aN?EXD;Q z9^KO8qxX1@<-Swe)1_k#Nv#1$`R;7o%kdbsG++5(m*F4Q8qIc# z6wkoD9v!%T=Ef2G8@;^llpc2gBnQbsasVPFOC!Xdz)ndBNHlL8xcbspU^_`v;Crmf z(2Y|c|HbTb{JuQxpd^QQt9WyL!Ce{WNSUnmK{thg6aoN%!z~m=Q4|GOQobY}WdJOS z@lE7a%@lhS9~+(cDmBn?rS6# ziKWE?2-)aS{zW2A+US#IvkYH={+TZ)3W(un*F0NBq&Hp1{{aemBdAYzN5B98002ov JPDHLkV1ltL_t(I%cYY`PZMDjhR>N>rq3(`*_;TH9>kbQMB*@l} zY{LE?K#}6wfF5G6A7^8?jDrsf$q%yuZBvHPtFaQp@^}`&oo!IBHEcb1MWoow6MOkb1xPS=IAys(x`xP1jgxXrM7BaTBcXis{kwmOh#;0l= zO(%|dMgRK89RL9MtydfDZLy@ZTxzY?C|?i?2Tk5bJ%mX93V?{vuM)E)?Kqq&vBAAh zB>?=D^n8SqA|3@cIv`x^oUpDvLtjghu1paJ=iX0EnQ+M^tCy#cuKKQ$zI= z=ahqN%3qwE%V$m+)t;%&)cF05o}p3MCr3q}q>7#WH>AY)gD!F6(cp=0axS0Aru;?x b-*^57^eXjz%Qbk^00000NkvXXu0mjfHvK)u literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/food/biergarten.png b/Icons/map-icons/square.small/food/biergarten.png new file mode 100644 index 0000000000000000000000000000000000000000..37ea8c1d65eaecac40335abd7361dcd80a830bbc GIT binary patch literal 771 zcmV+e1N{7nP)gK^im*`MOF9jiViw;6vY+w`=1Xfg}W}#VNwIt1V zQ|H*6V{gv6m*?5@@3cj(4$}Yh|MBPl;l~%g)cUPD=ip4z{b6}Wz#dNf0d4Gbldg*$ zoJqRxjD+p4uI!)O3vjO2>jdDYy4r-5o9D|{6FD^(5!)+t)&?Cd)*E!C7M1V&NUUUQ zA!ZJ}3vdj`Zshulke$sB$+n)BCTEA<@At!GGC{3YBTdel8yl~g#~$_=YJ3kCXo@OA z3IM}$R5Tie!{I1A3W5NS#{<6Ulx3&R#&7u+w<{N)%u>{EfG%95MAlTw!!zN=*ibj- zrtX8LY1nMln0nJ23J>31jjoHLyS!X zZ6+qR^mQ}>Mz4XgSq#+1hP#L^8+9W06@gMg_r$fpeYgdIEb;xhTY{z}uBr|ByGXu^OS$Ftu8VeZ3N@f7E>=CZ!-;bScwoVZ|^o$+aHY zFaIQD7XSc!37zA~Mg$oE3=plQ@o9-WSf*3r@8@Bk_EGyf>T+|3Z6uigL-lo9zx}IB zsVvyd1kps2(4-`Wb5<)stqO9!Ojl2etJMG2`4`UYBH*eUyAl8Z002ovPDHLkV1nfx BW+eas literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/food/cafe.png b/Icons/map-icons/square.small/food/cafe.png new file mode 100644 index 0000000000000000000000000000000000000000..c889e3556a824d82571f7ec2bba4e16a8f89f447 GIT binary patch literal 384 zcmV-`0e}99P))O}(NA7+T zU?2h5D06*q)8bBK*>&yf{0aNsDs0Ph5EC<@Sh-n{LN z0@+?LRuTUG{@Y(RoL;~OPTu_@aC*iCku*zzyEqMCWW;TN2sh);1|QDr^1=}RV>Q4< zgZth3^Pj)I{fclV0|NsC7aP;x0%xH|$eK|M*nH`;(EtAscA1;-U2HCR`1UvZ!?(ZL z85tQEeD!$Wp%}34{Ack!H@=D!6BaHS+%GW(~7oq>VjI>{-~Mw#maG-EK3nwe~r exjrybnwQL70(Y)*K0-AbW|YuPgfvMkyg(4n{rxETE8FiEBiObAE1a zYF-J0PiAszUU90GLO^L!PG+)8er{rB9#{L?s;5Ae{+=$5Ar_~TEAFhzI&k2?hxsyp zcEnz7nAq6(aQ`}!-|e}UMdA`344bBImz4m4g=(@13d|?M?v*7ZEfDCDGRQihV8k%Z h@We?Uo+)YR3>P{Lqbr;aT>~1;;OXk;vd$@?2>>V^PJ#dc literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/food/fastfood.png b/Icons/map-icons/square.small/food/fastfood.png new file mode 100644 index 0000000000000000000000000000000000000000..c8852d1b925496e173c35b261167b18bfab3b741 GIT binary patch literal 763 zcmVi;xY_6;hL??rjiGvOnJCs@jY2qNX$e-%f zT%^VRJvd6dJ6dV)oZ18ji1AG?`SN~w-^=@m-MK4+k(9U)XC)*4p>AA0R~dKd9#WB% zxbQT#-y5EBtbfk@HpG5ib*E$M^ zb@ge0@Qh|z3FM#Y_=2Pv$eWxnO7U=S4kv+yb<>k&Rd3kX)%8l9D7LpU03Mg~cxq~j1b}cjjIpsX)a!Nl z{eC183Fve>a2yA-*$mC~NkieoJ2e2PngD^z)|&nD@-m{)C}^4n!!YRU>w_qY7#J9U zEXzoxz7lVaZu(Aau*)Q?rBbQgYPBMrPJ`!p2!a5U$piqX)oLIJ0-`8_=XuyFtNAiO zv;f^E_0h)01~`s`+wDfNSVXm2g~eh)BoYD3vKSs7h9pTS6bcx(mG{zsxn%)-T6q2P zc{Q`MqZINv#q0IL=ktN%IN0rW1OfrbvJ8*MgD!(2db(-xgoU6}*$ZN857>g@1m1r6 z=16vo_IkWNReyg!NRmXkT*k`BrN+dC@9E|o@!~;OvKgkopJZQbP_eAm+}Z2WNTPt+ tL9Q0OR4r*KLYbV;4n7Wa>=6GO=RZ;(FsU-P836zQ002ovPDHLkV1hK8VUPd- literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/food/fastfood/burger-king.png b/Icons/map-icons/square.small/food/fastfood/burger-king.png new file mode 100644 index 0000000000000000000000000000000000000000..8704ee52879f0c37899844af2b4ff5eb9e730120 GIT binary patch literal 990 zcmV<410np0P)1uGM$<6Zy&18Ye{ zK~y-)O_5z}Q)K{#pYNQnr>B2wyScU7+Wk9WSzP8oSpXqHn3)XF;Dl%pFBaX67c4e0 z#v7M-VZ7CtDKU{mh=5{3781SC3tTc-4EteAv#r~Jj{UV8we8xTp5p~Ve6HS`_etKo zg8$glcV4Rv`VOA!ZR7rf#Y;7ww7<-e$K&zi@K&PR823MB>zJ`3E`kOa=f#8 zFl>&oTl*2QG7g0;&;wYZ9)xs%gXq0$S=JdL#Mo28^Jj;&XRG~@{+`xP_IXFJ&3+BZ zJD^BVbgZI+l`}96JLbLB7UQqQp9}XMjM~E0Zvx1G-!=I9fgO?kwU1Dzu7Qx4fj6*Z zGp4qa?Y|S4^9H$FV+buuVRWp<_vPnUmenDI7?Z(LcjWM{deq_!X4y&dGYN823CvU$ zBYGLNGKg_MjvA^$DfMA^+@LBozz>#Xy(RZHmEj&8AvHZsAv%YdNMgj7Q7g&;5H1(O z=|Ct7LQ&B=+A*SYm32p>_CR95H<~26GHL0Q33%n z7cV0l>nY66VQy}sI2|XY-(^Q=c7&AJ_jMw4onkzWv9N?OIgPff9V51YRWJ|^9mVIx zm|wu!&H?nvoZW#Mszf$7qIkVzhi_mmuYgm>+(@#0<9CV=SJ8W3#h8v_K45Oxg! zC0ev2>*~l{xJ2fst2j^eAe_#}C);dzJ{~|e*5N$Xjq7w5s%sO^xqd9ez)YpSmDfjR z>697Ff6@?Jq8NV&QbqB2ur=4>I{E^7s2f%J6;YAK^zUXkQATKfjrwf&jS{XXx%2rSHs~FG|5*E^eEUf2wb60U zduJ9m$_H-6+1t>|GbMgxY6?-zP;`Vydpa0@)Xb+t6HLU`Inq&gy*XU^8Gr!z>X+L` z&kx_}PNs7GP1Sz(v{Vr+bE9jL^{osuiyQoQJBHI?qphK0*zeX)4Sm#|dMW_u8n~#f zB-00-x-GJ{l{vJ!nWbo%XsSYGsfWfYUs5RI)XQz*iGkjimY?+g1$jtGuyZIzzyJUM M07*qoM6N<$f<-;mWB>pF literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/food/fastfood/kfc.png b/Icons/map-icons/square.small/food/fastfood/kfc.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9fbcd3bd1fc08e7d1660dabae050214c580c23 GIT binary patch literal 861 zcmV-j1ETziP)STjIksa}sxn*~k`6d;*tk*+rZ; z)EKb z6UQ#Zb_tzr?z_h>#43Fan}m-)_ZPIj_a)zc(Ta761y`YsYyAqB&R?Oz<3S1x5}%4^ zKU{hJ=Jv0L8}@H-Ncu8+-of^5B_sW@VrO7#-jYnE`R&{QC%(UmoX&FmcqgUqLP8S{ zSYERn%MzWw+9pTeu1}A5-I*;BA6sg!m1jQsrLQQJOtbHUx2Uc25)Fsw{{1LcgN$mf zAevCP-``6{8Zw$5-RT|!Jo(dcy{avwl4-VXSw|#1#ptNS$Y_u=zxET4PE+hOVOeS+ zPo2x~G(c44-0pRTDMiV#*Z&pYojQ-Fs*>p$nZn{S4u5(IO^J|*#5BWPP<{pg@J8|d zNpD^0LgTAdOiaW$a`Z=r2JaCHj`2=wGn&o_azxfEiR^O$`C2S}usJt&_Tn&`H?1O; zNV023Bdzal!}qcmK@QPSUoPtMOH9uN0Hl*i^`EgBE?pTx&8axcYDp_ue(3s%Or8sS z^;(l_=ZQ5I-ynKVyY>LoOf>g5^RT^hu zUJ$LX9jKzcLlOa^DV=yD;HiH7&)JgQpEM%hmMHYDpr*)0wB-Oj^}W nB5Q2FI9S=)rt1^_@0|Yy<=Q`|IC92P00000NkvXXu0mjfY+9Iq literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/food/fastfood/mc-donalds.png b/Icons/map-icons/square.small/food/fastfood/mc-donalds.png new file mode 100644 index 0000000000000000000000000000000000000000..250f8be6f35398028b1d4c8dbaf3f75f2ba2b83f GIT binary patch literal 932 zcmV;V16%xwP)1SFaR&yD~912IWN zK~y-)eUeLPTxA@^f8Te%`U@48p6dyGrO)aLun08t-AvVox@|sC!=H5H^x`+)$!L#~v_@5sf zI2!-bSV}$7GaP$p=t#JI^kOLsa4uy&{oFg|zBc=Trt$1bj{nn%uGrMXXW`(=*Uj$c zRsBtXbMMv`XGT)N$mzPZW5+mh@4t5U_#!SMgHhw7!>5gdp-4#vdPP>I^`YKt+VQ~; z8)HA6-4Gp*SfK;m)pBIMeQf;CyaOQbfpymP%eSy<)#%4MpTBHS*PXH2-m{WOS6C|r zCeC3C%Q;uE?aP z$zJskn(sOR)!!Fvg8FrgEssXuWo^me=d%x!ibtdKmFUr3fJ1OfnDIn7xtG~5qu7EA zWmnFOpT8fkberj1fG&b7k*Zs4Fmt$77xxu=r@}8O(TfP4%x{{o5u;TVPIz$8gihQI zykd^Y$pC|ZS|JEYff=sy!tq4_)TOF*DBZoky{|U|H3hwD<^fnP(b? z5znih9$yei`{2$I%w%3W^VoeasiM$6n4G!JmY-$ccATm4Su1}tASof8F<{LY)Bg`2rBZnT~|zDc}) zkfrZ$usV@|mAw>I?VK{TfE!ww2cIgidaX?Q(SF?T#+aL$rn$Y1J&g@mElm^`7Kqd* zDESeZyAHE@;XM1-mVQ*q3|O#ZH1(wU?Tt_H1XuzhQsCtOVk4`8lxVun^2}va$Y6E! zD@yrwyv@Q@@o5XAx4qDi;e~O$G6FC)v9nGMg#ORsl#bF&r0F9K6R%LAv|M;rDaom3 z%0ugVfT`~U0{{V)Xn?V`<5it1E@dbIqJS{vw;Odem;MHW=sBEiN@r>S0000^n>oX$=OQ( z%ZELm&I61;-5Q=4^Vae4P4CCVSo`{UnvY^~w%o6sEHp*lQrSLnSl((OA|#e)YBEf? znbvrDspdknbs9Ma8dlD7?oMB+uDm<2(>Zg$w0zhzc->{FAw+=;=U)|JVe02;fE^_P zSh{UkxbyXOCDT11Y}01J-ge7v%j>$EGyK&z{#j!%0D#@$M;B8!o?MC>wN`fIelL$B znIE{8CMBt|Ip0)DVPb%B7N7wD;KthuBthbTn+eU$57qsFTlv=ZM_;BpMUu+$sI*Y) z4R&frO`$}zIMFfS>@E0KWxf(gWOWC#;g_ic$6+j~FCK=(!E{U^R`1h0 zyp4G07!VpM002uPmAxHY_BVLIGm+8Jp&P+IM*V|s33<7Q!|=R8*^Z&A+w) z0MKBjjz(G6yUeUGV>~E1HSW|!=|E7lV>Sv`%Uv5U@}Ip1R$Y_?04_TTv=Fo&FUD}! zsJ97SYG!OWCPzypGL?(0y}7nxXA^w`f&RGz0DvTsv^tYpQMNr86L*k+O9qEsa!4SJLF9Y@MXRiA+xF&atf8Y5xSqCs! TC6NQf00000NkvXXu0mjfD@Q{I literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/food/icecream.png b/Icons/map-icons/square.small/food/icecream.png new file mode 100644 index 0000000000000000000000000000000000000000..d82a1f1820733b4b7b9cb0e9587629537dab5c6c GIT binary patch literal 546 zcmV+-0^R+IP)mVw@s?k zHgV4B4sC}H?7?gZYZ;U=3uA2TWbac}OfQE~S&wyYHn=03#$G5%o;2u}0p%ncL0e8leww z@BJJ_kjiRGIw_UO`igXvPReB`@TvbSS~qz=&PvAX`$jcr)mu&`lRFK0oWmj)y=zT` z#}8F~Y*|?x?5X{+ElYmjKR<3KB(35#HS;phIR*3f!AZW-3lKtZP$==UcW&FypT>KM z7pvZ{MN@L}S1temzbLTPmn+?YW#RKyo>F>&QR-p;CEy5wAou_P3?KmT<=YOOk%J8Q zb-mzELnj-XAAN?|A!mAv9G0uXOs#n-WxZY>volk+VVsi$zg=*> z)@>LI3C;ZOKIJ$Lq9Cw`b6gWc;wlh3)%LOy?K1#7d#dM&Tt6O3007hakGdR~U~+Jh zP2qQIWI<4_9<_?dNkcYw>DJ3#UrAg%4&*RxfVH6$Gf$* kTbIgeN<1R!rWm=Lj-Td!rYymI8lV}EvVY+<+Qc13BWI%)f!pm15q6h$&#G^nKB-BD^9wnT$+hsb8_JhpXkBtB)~ zpou$f4Cwm@8smJvVjVc=Z`Vw*D6b|lcbCHf9!k)sW9^!qXzNrfLQSt0#8ZGvJ}!>{ z05B_RBU$5qbZ@iJ0CG4gV)g*ds)C~G9M4OcLIn)NJTn10K7Q4FFeWG1Udr3;r#qAa z$2B&yaYJY*t*#b}MM!>TJ~w(Y8F5s2Loy})+t#`e-%qy^&&=mWV-b=^|NG9r0qDO= U=vGA%YybcN07*qoM6N<$f-$UJX#fBK literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/food/pub.png b/Icons/map-icons/square.small/food/pub.png new file mode 100644 index 0000000000000000000000000000000000000000..11a31f62e775f27865f996aecc0a17e67eb563ed GIT binary patch literal 685 zcmV;e0#f~nP)=I%+UMB!)rJghV4Lh!g}V z77J~m<=U&g-re^(5QmF{g3tOs@9+JWmwbP4sC#VI7@AnDYS@8#+m+IVE_Fa0n>B_W zj&HP$+-jNH383%sN;iNZGSH)ayLUOVj9uvNi+mgXS2N?Bm=^oPFa9mDQYS*?=s=um zZEB?RbTE^AU6hiEr6yt1Z~<&c)R6*`$Lj+DhgGX_$u8DwM{cx4d-`Jlz!*bAM{ii& z-%6`5?|gOvDu)N-YFA&>A8Moo4qHhrIH8G~@0tCRDT;z%FaQAH9C-J96z$Zs-6P~q zMKe#6blx+fZB#&JOl&vp%J~L@I%EKbJ+c7^k4z5qt1p(Xzh#h#lOfH_IsidNbfpxw0?1wA> zguSMjOpnxk(Xyy|lAxulkR&33?R8&4=8NT~Gi=f5yV4meFQr4(>Ed<`z(Z4nP(Y## zexD9G7!^_4j=Anitt~64NRC(F4&jXdUYb|PQ#gQC1F99krx=pODRp&FcLb^{@nFG# z&)GCY%OcVqnOjSwH4-~^U&>`(v4C%lY}AiCo|cGQUrmTEK-y>s=nhp<9~0|8va5lR zruhd?nCUoA=U0Xw*>ZD--&W#YmYX(&!dyX>VF3V1^f!On?K9mzA6_Q^`_8`r;57y? Tz2hCF00000NkvXXu0mjfh_fqB literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/food/restaurant.png b/Icons/map-icons/square.small/food/restaurant.png new file mode 100644 index 0000000000000000000000000000000000000000..b61e1d0779d029ea8bdf1f0647f34811f7c0616c GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPm7c+;h{O9&3^+2ILo-U3d7N?Ud?ySo?aNxj)`7(cY z#9nQf*x2}R|2mW3?YWjk;u0PVo2G7;l>mW-YO)Cm%qPO`l_eZX)3Q1X)U)CBEpf&a zJ063D+;4V$b7h#>wsEq!z4?J>Ts+Kr_POZ{S;;tg62w^J9&|O>P6<6SMAasjw5V;J&+1gQqLDW&Q;_0rn#d mZW-s26in?8Og3G5Q<9-BE-BLRqh2Y{9}J$ZelF{r5}E*YD{Hs_ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/food/snacks.png b/Icons/map-icons/square.small/food/snacks.png new file mode 100644 index 0000000000000000000000000000000000000000..a6774b86ac8de46260393e9cc75739f6177365f3 GIT binary patch literal 735 zcmV<50wDc~P)M}`nukG9hx*nqlS3K|2h9({@-`LkDRGy8+z=zr{nIV76&*sj*a#^A|2%A z_428HN2Kc24de7d0IdV-jXidqm)yRn^YqyD-d`Vhf(gy`F3&b`8vmal{f=-IlP`#( z1YZo=nC^6?x$~yhYN{p9;m36Vkeqw72}wj54Qx>&N(Qwu2>>~OJCM-CkDRYCU%RDm zs}nf4@u;a+KWQmTfvFU z13b|Is-5gT1psYE#Ms?#EQ}59H#`lgcGWH7KCnGPw4$cu4aRc9*R$S*V71IUElRLS=jrPbrjt|GT>QxR`F z3mjtr3uauDPh=8_BsFTt_Ov%{$Or73L`FuXCa%~gNqXPLT1sW%vbsU7OcuzgAV?A^ z)oK#^64*F4+B&e_m@g7SVAQj_Mm@U=0EH~W%NZ&b$YnzQGTAsbO8$49e*!Ly0Sehl R$SD8-002ovPDHLkV1oaZLV^GQ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/geocache.png b/Icons/map-icons/square.small/geocache.png new file mode 100644 index 0000000000000000000000000000000000000000..63548420bbc06e5346b38816a44310190a600f0d GIT binary patch literal 452 zcmV;#0XzPQP) z0AJuWTJHb=010qNS#tmY3ljhU3ljkVnw%H_000McNliru)&(C97YV-Tj1vF=0Z~ar zK~y-)t&_h?0&y6|KNqGJnKvX24jvQ@4JATDAb2!o(Lc}+Z0LV5`~!l6pr(cu_m z%%+XHT1v?P16{>E5IK)&0FF+icI_4qlOAa{q!<9@+@t7P7}p12C?^Lcj)@#r@vkTQRvA2&f0jR2r0MzbF zRMpEL27M>^e}nhHgfVq=5cFr$l2zNymZX?k49*3dwm~v?K~396dGx6uCfqdQL70(Y)*K0-AbW|YuPgfvMkyg(z8Ai$;(dBv$#3IU}_Ihn~W`MHUid0g#ltDXW?PWE(h46!(!oYK(npXUjqn;RQj z+y7&1I`Zdag!VKjp1rqf!?&4Cho8LmmS5m4`z7kd0T4I>#0{awj0yX7|1sQQ@H${% z(7-BoDFd1`iE=) z9(6}pSX6Z0OC$0DlT#AUQ`BrWuq^m8=90-ueolJ;X!(GWXiSX`mZJ#>1_YXb4jubvwwX1$BsI()a0 zO;r|TrwN4Cff<6#4_>@$BRIMiXJUvar`L1yX^ep%*U&`K5>QZV40T;-qPC_AM@i5v zFblyS1W!_19pmJUhqND#60zds7C)e5=A|ZzY+%;tyn2G>y<5QyBcuc;3;q!J{9vaU z8GC~xhY1D!9J~FI=WkLEVCQil3!qK(wkR+A3)3pY$+@sNi@%^0TS|00N#Cf$`|$*G zsX2}|6agIBc5d+gat0fkyOB}{B;Z2`fs`)bF5OuR0xqvRwo@Ao{TH&)b9ooJY?9wt zobMPx;c@3|9j2+F=hC$ICb)EPBb5;Ygdg55gAojIs_S!hDq)`io~;D5 zeLKpP@@#|%;N@%#0SG^yQfM;A$ixEm)ob|leXix}RJ!Ni4E_M-_yM*s7g@sq0000< KMNUMnLSTXnNHRbG literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/geocache/geocache_earth.png b/Icons/map-icons/square.small/geocache/geocache_earth.png new file mode 100644 index 0000000000000000000000000000000000000000..38f35d418a01732ee52482397f75457708fdb6e5 GIT binary patch literal 815 zcmV+~1JL}5P)QrHSFqz@b@5v4hGNEy~i ztxfaew5HCQcAV~0hh3Dzw%)t<{r{gI56}O3MO!X;o@ppxFqt=KgdNk+2FI;RLFY1T zxJKtN0-ej~DAQ2D&~n{FOfP6I+|&ZMk+(4*b!-HjYktWRum%a)C%J667iZlT0>R9f z`;UU@(@rHl_BD|fc|9tz%cqK4lhVE<2-`lUY`??NJI#p0$!D8?C?8wXiC@`HHib=X zVKSxdJx@pz^PQw~(aLat2(a!UvAX6x>}%dhuWif&02(VPz%K$E94ZPZRKpzs5Onnq zP+xloOEw;e%J?Iu)dPxifXfbTg#y!4W1$Wt0FLsuV5fB@nJ%fmtzsA@qM~9jH9CTo zFTLQGr7)Y#c=OJV5AR3dbVq}?ubZr+OP#`)gQfBPGn=q zRRJphA{^pH6a<{nS5Ib>Z%(g@+Af$F?8j z_y~w^X%qV6bw6tq_Nkrk)XvMC$LCKiuCUzbdY+;h%4|}a3(gHRU9U$&59(8 zq0SM|dL^`73&Ab_O3^X?lZ@ew{e4EyaF_8?5#eid@lSDC>jWP)mdrSnj;dVE8V3MNc0DE5qP1&pcfIZx=HG4h6&w_T||f&9Gw(a*0D)4 zQCxHAW}EwMx;1y&PFD?`_S}A-@8@|Qp6B7TcvYwDPCMi!l^`!~*8lO%isa}j&Z{9wTK03p6bGsr3@bd@E+jlG{y^&Mh zoC2&a7SqXlb)b9z1)&wBQpW&*T2ztCKTGJ154G0$`FZ>o&~Mcb!IE|)zc^>^Q3n?8WwTMDE(h;@}#)yT8QQxmM4 zc9Dcsa0(#EZdI`(;o9C4`l7-LJ=oH)AJ0Pll|V^iRZA^cfVNQ*rz= zv+uz^VIk6l1#de5xB$Pa!ECl4X>mD}ERf-Ef<+6U`gb|mQD$ArtiyHZMD;~A4Gy+} zZP*5KZC#3m$?p3(!nJm=7rhpm`m#*4gDtG@L{Zz&id#|*Ysr4~6|fEV$hk>{`~xZ9 z^^?Y$O5&#`Ru?}cO?~|kcs;TJ^a77?I7~JI9Bspfa%Kwv5RFEmYrV?048@Gs@el+7 zrDY|ks4Rz$*CP}3u)@PFcJ3P6#)qx3sYz-wnE(J9vdCsMAj3gZv*0*j?@tBcBWpRp zsS(zO$7KL`89oF6{LpkPvg9U(h9dAf4)ItFVrGw-N|QMNhmo;waL!PSjGcKVIAmCQzJ>(2v-J@8v04&X-lrLGDMb_Oc4*dnv2PXJU S9%+jJ0000L#CIO>TCR6|b0p3YO zK~y-)V`PAU%?#uLUq+bb|DQxJV@UJ9VqjokU~t%;fFX6zYoRU!0|NsSPR%#~YX->r|zTg+#x7HUh4EXVbgVlRJe}vG2U*-Fc@JYjL zUbAM6+7ZW1Vc)dBa`N2a`(n7)ed#Yrrnks8ZT|oNf7|rw(>F2vWBAYTkKupMsh)NJ z|Nn1WzI^#Ap0hlE82&N*7rQI=`P8XXGynhp-v+}B3=ErDV5U5L_)r|iKL6mn{Ok*} z|K=O!2YxsF&Mb0Q1zx#C^GoavM@aR9&D;WE`(HG`FW)RI=-fUTFp~(3bS4hJR;MUfC z%k%&dDJ<9czOH}1ewn4E>S&%ubH{Nq5qm7QrjL=&ODV*Te4)9@od`_ZDZ>+gt6{3t_?2~b z(YToeyzlt0>F$uK77_jZp7+$)yOyJiU0HW^sN@wttaj<6KbsK!K0TLh%HLEclB`Df7o>e zo$haIWD z9X9%3fH0qiB5wfL1B04_0wWBNfeI_U4jXNAT172@!9ZjllVdCfB4u<;j`4%V7;Xm} zLRzVP_%$~eY)CP9^wfi7oJTTF$^gkY^%cLt=d^NK$>+3+ZBA?G4>L>eNw4eSH~;_u M07*qoM6N<$f?n}JTL1t6 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/geocache/geocache_multi.png b/Icons/map-icons/square.small/geocache/geocache_multi.png new file mode 100644 index 0000000000000000000000000000000000000000..85cb8b9dbc4e2c20e6b0541140062934d5c703ee GIT binary patch literal 788 zcmV+v1MB>WP)jx69Kg7uPb)})b+m;4$0J$v6od?PQ>k9y}JAFiUF5=y1tN-NH-tZJaN*VI6u4uo1 z=@=fji7g~#Qb>;%q=L~Q8l&g&mkm=}kAo1oaDJx0;V49AngT$`AwV*Y6Mq9xD*6S6 S}Cqd$HBq2WmbxIu{DZ=k5%GoV-9W{Nc;mXj*42jSaEWp z#S)29qG-1rPLkD@49m_qXh!WgXqmM;wmkJ7e(&4!^!B{ZkH8oF_#b+SBw3S7!f9h# z1OT)JhSNsJ-98ooatz5?!0il$0f01^YX*JdcOyst*w|9as%$YnxAd~HQrEh`rix10l zOk=!rMJJq#dYu?8I28n;CLWK^TgO{Bjl3X}ZpYpO6wr-IYfJ$^lvW26RdrJUFxxl* zH*tuguH|2b_rlmI6{17uy#Az~tFuQ*+>OJ;32wO5WRMvq6%id3Ci@pARD4MB^Y4S%Q^OKu^;C sO5slq2HmWIkiJr2^6asC)qj8IPk)S)CkdJ`>i_@%07*qoM6N<$f{7~S#sB~S literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/geocache/geocache_multi/multi_stage02.png b/Icons/map-icons/square.small/geocache/geocache_multi/multi_stage02.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e76b29e2d6e7d150cfaad97b553da0ceb40bcc GIT binary patch literal 609 zcmV-n0-pVeP){kHha z3=9kmEI8!<;}B;=7eFy!!;K>XESLuHzG8U$eHj}A0|SGM`rDrjyssF<k>t5>hs+1S{AzIgG1&E4JI@8QFT z;%nBdS>)s6^BO%=H#02Ra+%@ZKL&>Em<$GG^;--+!50`7&Tv*>X5jq!^C#QS&u>_# zCTeZq{kHha z3=9kmEI8!<;}B;=7eFy!!t$c|0>GiI-XH*CG7k6?|ra9e0S#QJI3>j|1k~V zeZ}zh`*t=41}_E~^|wD67#JAE=RVfVr{xPpzyLN+yhQ^cph1WxzTTZ1Ozx_eAJwk00 zdc1CCShD3ZS{h(vU|?YQAMMS+z`($OWaEG2w7?#_Q5LEyG literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/geocache/geocache_multi/multi_stage04.png b/Icons/map-icons/square.small/geocache/geocache_multi/multi_stage04.png new file mode 100644 index 0000000000000000000000000000000000000000..ecbe02b877bd594aaffc116b9ef58f165486b803 GIT binary patch literal 572 zcmV-C0>k}@P){kHha z3=9kmEI8!<;}B;=7hpo>Y}oQsTvqdKBCFu*ay7$uF;}i!;e~2qJe{#2@}T#^3cLoS z=6(*)*I{|MXEXn7PELkjiHV6W3=9naA1u45@#Do8No-Dn8*u9EZ~ixL{|n8S$aBQr zhV6Y(4%hK3SFR|%c=3Y$$-1j9V)ly1aT~zOz;gi{qqsmwNaz;>0|Ud8Cr{WJ7#J8{y?VvY#>Vz@ z$BrE)ckkYn_V@Qs`1kK0ql}D9GO`O;7#J8B7?*BkVEFg%BLgqrds*Kg8wQ`?3k(Zq zSeokUKIrZ3J@9*13B&%YZzWqd-1S?XCcFCA5)Uka$i&3JkdU>J;r?wUhPJ8{hJXK< z7cN}5%huNRy^Xry`-$5hIRF38!06R^CI-U=aA0opoWa~?HY~n1H8tTXu0000< KMNUMnLSTY4-Tl4* literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/geocache/geocache_multi/multi_stage05.png b/Icons/map-icons/square.small/geocache/geocache_multi/multi_stage05.png new file mode 100644 index 0000000000000000000000000000000000000000..09bf21ce9a306005310aad83e4d8f2aac05b4805 GIT binary patch literal 637 zcmV-@0)qXCP){kHha z3=9kmEI8!<;}B;=7eFy!!##iBvzdQ3Cnv+N#Kc4wm}`tC`%E^P>@(STitluoW)v5k zI{Tad&D;M%GbZvJk&$BlRg}YZJfq-B7y|>tQ3eJEhKr>;lK%es%fThh_ei7Eb{nsX z@F#=|cwaHR{l1Kifq{WRM*Zzi2HsZ;Vsa~g{`&QcO;uI(i=m<6t@ft2?R$6cnWHVC z_T$TxTfPT87ofU8NJ!`x0|NuYlP6EuWn^T2y?XVEosEs{r;3Wo_jBjYt%U_{VPWCv z`1trJ6fZC?-O9l5@83rTUcUFTzCkt&KEW3l7S6C#m6d(X#l=+^Xe4kl)k*gH*Pnlx zCa$|1_lNO24)5ZhA4)hs8{kHha z3=9kmEI8!<;}B;=7eFy!!l$-w)HK}>Gt&mTX2us?nJR7{wOpMA;v#cRyfjoy5k zam)LF=K_WUo(oXDAS5L8i-CcG;mMOH>@qSkzh1q1#m>&o{_D@5KP<7av8N*6C85sWk`^dn{_g>aF$cDiu_yWVi8J4DcdiQ?)`o+9_&IALSzq_8# z+wo9GjF;ujuO%LsVZgw|#K4e{wUOceZ6$`bsuYHQ|CkppT)1oAym`A=m>B>0cArhY z@bHsjU#!M9oYBZ&Zu6YM+-5c`zBM&985kHC7_Ro%E=5WojJOTJOh}9b5*AhikTw0s vmkJSK5aXkZ!ysgg0@!1B>LQy;c6J5;Ns+T>yaIgN00000NkvXXu0mjfP$?OV literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/geocache/geocache_multi/multi_stage07.png b/Icons/map-icons/square.small/geocache/geocache_multi/multi_stage07.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d601bcfec85ef69e9bf33642a2d31e91fec6eb GIT binary patch literal 563 zcmV-30?hr1P)K6~F!Qm}IqJ*>hjDf&Prdc_dwQPt_x|4JCGd__{12^!B91@hAE{_c z001=ldQ_C(&M^R>(-i-KhK=qc07%u~;~I71XW^THcTFsGjl}HN*K&SEdCJw2H@M6& zj4R3M6G;vFT+eOh+O&{oHp4qK8f$hsoy}IO_3*)#zMD#sQrH(V-UTk|5;Zzyv$y}6 za~Fxz)00_&1`8P-9?aYg27?B_-@l$)Q+!WV=Ea`RZp(A3i%!*7paeu-d?a8;i7_Gq zAPUNSq9i#;0N8Gs1JCpNipzz{#mV^{wuSu|2=~v06`G+BuR=2?{>S5 zG)+fYmc3PVKrE~Svit}tJ6hV>Zh@oY0Niwa9m8AzfaI}Z#S^G%G*Bm!$A+XcfKCVW z3@qb3WWe}XFJw7|2AT9}sHWxRz&qGPvCdNR2n8Uos|G$~x8-{%) zaX1B7%S=BV*{-%t0{~olb*HPfJ-*@r0IsLGk4DwoSpeXB^r=Ukbruc;tSP^o^Y0*);_PNQmGR=(Pv}LhCU!17r&pGJ)d@XPnTOB&Kxj1zc)ED%onzj_9d$o zdN3FaL?V&N!OQOVBe5%wq@iP9a|=7y&7O9^?#HIRQYCqDL3%yvJ5swlC%(<)axTUg zNp86^Fzl=ggHnxIIHU6#Ng|4>s=5S#i0EN!&vBd)3WYKNh~v2504N@hKP93l5k&zc z+b57^SqFe(u_yq5rfC8IBoYa4I2_(o6lK}(_wUAHv9Yd4WKU9nVf=vYXzf&B%7=;I zC#)=9bh})od_I5DT2OWI-G`=FE$H=1MbcNVwgW5xrZF|Gfib}0EMa@|0y3%>l5Ouz zT3zRPzP9{)%lA0*&0B3W#rrqTrq8+UbpUwq@{4ny#8oBR!2kmQx_J!%V46r~7KE7% zPd|`YAF%#OqS-|Mqwp^Ww{kHha z3=9kmEI8!<;}B;=7eFy!!0? z2;b6eaNfqs&+!|khY8t$)ZEVj`Z_ER_iW~$&B@8|D<~+)Z}Q~H?lOT|yLIZF=Kp;2 zP59Q-6IRH2;0ByJ`zMYMM!HYpg{q0W%1_nkkx$Qrhn0)?+hld|o*|9R7k&*GAgoMP~ zUyQ8G2Rs)*17sn>1wukXzZe)87@jgqnYe*HT4t+_E=?Hlh} zK6&_AY+9J$_Fqdpu*3or69Yp+)<%X!GrSqvs!SLpWgfM*w(hgAut@s$^)rX61lQx$ z1%`|5HHF@x$LnT>C0j0|r2$3;1_p-z(cTOU3=9lNHvUIW3+%BwbqOUTMgj>7Yf41c x^dDa;M5KclA6*;|(7zH9&h0lrB@ zK~y-)ol{RJ1W_FR-lo~jns!Yqe-iex2_rdC3I}41aB*RAnOtyic9oNoI8Dlm+K5)m zPHvRHo09e*C;!%EEH?kv?5c6t-ON}+`RX0s`})4V_j}(XNWh2xp`E0}%2Q4-jix04 zK!Z4tM(sG=EC3jE#ebmQ-yZ~k3>{w4IVax_GzO=^58AW(Uc7(wQM4mk{Q%(gdUFr? z6=&=rnq$h#x-B1TTsN0wzoaw49x5Z}2ej@oXWPY%SbP4FEI!^8j}6bcyuK$0XAMNx8E0Bpo{=hFX+hR202p0cthNWj@=S921OOsEZ2*7{c}`IEgXs3)ha!YY*S?z$N%qp-qZDi zb*1&NuGwL2$P87s9fC}aTErT|Zi=AcLPD}Db}ed@kC5H58#KflBR9P;nqh)dh&EGW zp?+i+jw2mxYzpWgv_-nM^keOL-}7=ofNXoNp5%G*d!GFN`4d^u2GW^UGX1ON!>USW zEYmFe;p-0?t7pExV9D1X9A@cED>-_i9!`JnGgmK-qBe2!zaYZ9|um)tAdR9YP4`x(+Rriyqn@#<|pa*HW>Fcsvdv1RR>Dacc3aD**5Wz$MA$ zn~sTZFSb!ikw|DLE;ZUzM-kDUr=dNkp;#1lL@ zLSXFSZI;eh<|t|thS9k`{oAKet)6X@5TKA)780sx;PlVq0O7d4U|=j1U~uZ1^|kW$LF!F*Msf7PGtY(cp>V;*(1;3&9OP`91fssgBz@% zVucF?6z}eh0Mw0Uy@H)a2>m?-pZ}1@!Cg-wGh0O<@;p+h6yDnPGQ5Igm5nw|e!Tz? z21QEQXYKG zjYvrA7>UPGC=?)sfF5u))I5<7KRl73;UF<4E@UplEwDe;y3R!6PsEhU9hS+1yDR9WHd zTWv?LUESEMf0IA1q|>ZaEOG8Cmn&TVo_(M`ws%4C2=uYy| zjAPGo+H}fL@y7m~%CiddHC2{V-!=I6eUi`TUoIAlV2r_8>7a|+>PY~H>0^r5)}`uP zLv6dWSkkbtvf<6=r?I)U37+y`jDax*gTVj;;~9Vw>FVktW%e_ND!2YyD4d(Vw-8I* z7`rerad(vGc} zMkmn8gk`%nGarSpZM z%Oe7>DV|j7kJD49o^20({PQ9OfZpET?P74-B`d#Fj&tGu-4lJ?FI5wH{^-=5NzKWW fThYf#R1bpmEEGQ~MZ75Jsi2@I z@eq`#2$f*p=^El>RvzC zCWIm&B$NxFXxL5}%Qk7$KuVp08)js5is#89qvv}WygrF6mK<(A`3SB9fgGqBSb2~^ zT+f4Q8BGP`8a@}k^5RW_*vT#I-5LfVP(82y(>ESYb2k2-TTiof{FSjZoh>S{(_I|g z)y&=T4D$sW+1l8^@X_vHCnP4mkeSO9U8^&6xDz}RLqP1=EXNN-Xb>)lAmdXx3Po#B zdepD*;Nmv)+6D~WsIyBz3*l8=TzsxQO7n6$e*#EI%kg-X{sxs2=uj$IgmFNvQJM3= zD-qC}Fw0B4o-s+Lzvo8AvRNPl%j*8`A*J+JbAXSE4=ezuR$KYfUzuJ99A<(0{8#t^ XM}x`W`Za`u00000NkvXXu0mjfod_Is literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/geocache/geocache_virtual.png b/Icons/map-icons/square.small/geocache/geocache_virtual.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c0869a0ec0646fdb29117646dc0f576801f79b GIT binary patch literal 758 zcmVKJ8h>chizu>)gPYs_xr=kLntd1bwW535JqGc1tWyzXf$a8TWjSD zGuCMp*;;EGC4@5pfB!E|c)~^tm;6WvXW~|Ht$dL@+WVB}zz0ZSL}oXF*Uyi~6I^;Q zzC$xAaYis|0N}45jEb=YOKk>{B+(%)C0tsr3}S8>^I{y*ZK-@u_u;V>q%#0OZYH?< zTHR2-zY=;q1HDcMolXPBp)IA~OI-ewf5D4OIhAG`L(;ScDh&lST>`CI4V6X(aeAKq zuV9Ob%%&H9t5hTjX--Ba@*R*B5CnlaI+s+qz4t2B;u z#nEbD006^s1{Ca09?dOmkF(mVD1gV?2m%C>D=D1rJOzgxh)gQjZ3gZQBmM> zyD=<;pa7_^cfhfI+W%p8*~b`5P-Ugzuo}gpuB<&8_U=PAn}wn%@VMPLcA^L3Pc_bT zmH66EZbkTA3Kp%tNRV&hts6IyN~Pd(yYcM#OK52wz8bv2fqNskcwEmM$M)U_8ba6=6IU o^(f!qv77k9$YVE&jdoMpAN!{5vF&sTod5s;07*qoM6N<$f-l8H8UO$Q literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/geocache/geocache_webcam.png b/Icons/map-icons/square.small/geocache/geocache_webcam.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e4233136a0baf6cfeec8d39a4e0dd6f2108d8a GIT binary patch literal 953 zcmV;q14jIbP)6&6p9$;7B@n2G6IyxP`AuF1$(-93at_h>tLgpMyeIDPsx91aKP z-gt9&fuh8iom)U&@={z<%Gq;gxqf{d_tb9;2zyEC3wXQSLQPFIU3~*wY;H!U*Q0&7 zxbT&-va%1>R+h70JaL?4DoyX;2w&V-Wv8YI)lo%NNjWAV#rTa$T3cIr@1sviB$Fgn z6>WWeeRq3%JK;!_k3a9^S9y!5yog$$U~@EKtu$kl^yCS8riXv$*@lA{(n)+iKY~Vs zP>_=wvs$fu)-%YcxtUlh#-kw*r_xuk41YrY<{Ag`4b&D&lvf|*+T=~_wKjh2?MK<# zM*QZxZ)fy+eXC9~vYKB-(WaMhh6W8Rk?3MA(|AApo37Z=MYWJGaidwFX zxDXX(dvQr#t9-8M=|eMP!x)SOjLgPR9;)J*6Q_`au&qGEw@j`YrsZ%QRn|%@7BgdG zZnOb^P!)CAT|+~zlTCHCrb|D&G4F4{WXMAHg$V^@UViC$luZkV>z!m}No3L~!l4aP z@%Y~y_*Uhi$+3~SGiNS7G3XixHBBTMq0}t#;XALBpO=H0PLqho*$Cd{^5yT5Wtl)A zuuI~F&dx@s)9$&qxrNskMU#$m?1g3k?kst6kGfdD>u18_A-c6gb&ZW%(^I?5n=34h z@1H-P35J51jc_ot9$3#TEG}ev`g$^T2b_UCljPTng5RhW{YI_mmvmacPAB;PL3wp$ zCHO;k_f5Oqekc};u@MNS+~bp9yRHt9jP1O&ol@ffiT}H;Q7hVP`}W-_DJtsE$u=B) bkgNX%g)m?uERex<00000NkvXXu0mjf^q{;O literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/health.png b/Icons/map-icons/square.small/health.png new file mode 100644 index 0000000000000000000000000000000000000000..449f8644848c9f69a642cf6d249180e525f4719e GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMhOviBet{aP6CBYN?apKobz*Y zQ}ap~oQqNuOHxx5$}>wc6hbmm72G|21Gs!LlT-7GQ>_#NN|SOjlU?$26EpL;Eak-ar)?FL%t>l0oVHyOExWhC~}8Y_}u}`9UOBQH|1oXWZc1SCN@pXd1Hf0 z(xP=2=jWsu{rqkGx!k=Vz^?g3P2@tSt5f4TlqNB=FszEQT+4av$brI@J2M&^t4~jL z*mqd?9@9as{>)j@8Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4^ z6b%VYDX(V$001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00F>BL_t(I%cYaCYg17a#((G0QYn#ySC>8urcejr z(F{)n?ch?Xl@19REEocU4H=41T=FMma&t)`kU%nYD8WgzN@?j(bqZ1hQS=!SB(e0- zP)cLH9gH4s$KevQ$!K~8h}zN)75uGW8?!|N~KcczuH3pYCyGf9;2&4G#ahhkevtyzYc&D zi$yB|*E{qu(Dd%?)Dj2bdr8y!-ht*gj{oK#ss{MH_cd?f5yY}vTVn<|g+gI*4k{<; zW=F}n3XCfF=KK49-#<9mV`kY}>xL3TCe`XlGVUv#|vJKp=48F4O^|X9G7FF4iKE3h=gEEc! aE6zuFKa_>#0<(Mo0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4^ z6%Y&G001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00E^*L_t(I%cWCGOF~f){^nk*MUv5r5+NdrM977U zo{&TfS3v|}>%d)qA==fd=tX#!E!tVDuuWYhL?|kXAXh?Y8e~vWNhfVuT$QwL&w=3_ z=A1M0eRIAcXvX-P5#=8KWm!xkv z8oz6TA-~z_ur`gb#gl7@f|>a40-cF*QxMLev8|E26OF+kCNF ztyhC>Z8zzMG?&u3iY2mkyFK1-v7~}(@HJ1NfS}GjwsGIkFjRecc^lpj2gLAjO02Ix zR=M5HX`k=9a%7}dw6r)M;_)ZRAgKl5IRr|H((XWH0&@aH1ZD=2xm1w^c=U8&$_eNK zfcZx{_{5rW&R->wv=7h*<5yz{c=A2?*Eqic0v^(`jX=X%00000NkvXXu0mjfy_5G# literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/health/empty.png b/Icons/map-icons/square.small/health/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..01d8cf6346278d91e483f11a836f1a805426374d GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMkyg((Ik!J%|Ic!64!_l=ltB< z)VvY~pUmXcyy8?Vg@DqeoXljG{M^LMJg)Y&RZoE`_jNcP>X5Z(ZmgL&LF`9P>PEje>IPBiGbKIG%1?8%h?@~ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/health/hospital.png b/Icons/map-icons/square.small/health/hospital.png new file mode 100644 index 0000000000000000000000000000000000000000..6734ae493ad2200e49dab0b5f044489e8e2a9a7d GIT binary patch literal 641 zcmV-{0)G98P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4^ z6e1yNfIsj6001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00F^CL_t(I%caxJOVm*m#_`W@H0=#UgqlT?xDZ{M zLZt?7b)^ek2?~LrEB^sqxRMq@f}-L=5jV!*dUo0(NTP|6!WI!SA{mN>gP{<&#k|;y zf#d_11Lxl7d+xoQ6Uiy~KSfc&9GDYAF15B+slB~MclTARs|*aBT3FZ?!oDaX1W^oa zAEi>K*po_SakFU2WNsjv&u0w{eZt+sb_m_w>A-v-Txg}!%YigP%q5irR8*Yeiq+K_ zB=YfD@zmJZbIe#-d5VO1{G`x7IY4jkHfnWs#c+_1KZ=0H#skFk^u%#saj_aZXMm25 zeN@S0%JY_QxP8uzvnZ8J{sGA8wf_ExC_@GI{<0q)mZHVP#GCUP>AUIa4LmSDUWZDX zo6A_%)>e*My}hkSX=*wum`Zaa6%7XF)Yl*5g}S;p?im})6&M~4*pW=GD=Ep1A%ppN bxpDpp{H>?*2zo&Y00000NkvXXu0mjfE9Ml` literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/health/pharmacy.png b/Icons/map-icons/square.small/health/pharmacy.png new file mode 100644 index 0000000000000000000000000000000000000000..919778478126bd658380c1d1058933921682bf6a GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMhOukQO0jKMSwykC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(Eak-aeC|Jy?#!PA}kN`Tc5F2acOh8Chg&56-ijR{*ZITFNt3Q*N#Le@ftcc zcB=BWuDuxXAnL{4ip6Tj=HGmjqP}}`x>0pgxQo3r$I+)JIwj&)=3fywB*2u^^Kr>~ zdl`wE*Ecs7?%|ny`M`##3GIBnJ$H68=jP7jv8gI~%w}RDV{w2bZ}qjrKkk^ZY`?^^_}mdKI;Vst E0Ka9tQUCw| literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/health/veterinary.png b/Icons/map-icons/square.small/health/veterinary.png new file mode 100644 index 0000000000000000000000000000000000000000..f797b71c7a5f6f29e2f48b38974cc3dfce8e3969 GIT binary patch literal 855 zcmV-d1E~CoP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4^ z6cYuI-rSP_001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00NguL_t(I%cYZFNKOlgF3PL1=fzgW(kwFxQKA05I9?BJI2xTPoQg6NVM;JayB$)_7ZgX>P z-fef@ySux4deAGvULw!Sfy4QJ&iCPb32YX^{}my+7y*KSxH02lxO5HYyP z0ze>CeDkhWs&qS-p9Ebd&pye~e>-jFtZ`mZq69$G4-x>sVW%H8zFL;5ay4bArmZ8g z$S=K`w4Z8ikrqFHa(A@19c+0vE^>G7i9UcC0LX1S&@ZQkMw?W|SpH&Zp~As1%E045 zarIL7N=IWOnAVdPkD?MSC74iARI;Vp28dimZ6Ol15CEuQS#`cxG%}PTLjdbEkjbwl zkiUfhzJ39*y}hO!APfLNb%12zT%Z*48ll;XPEUd-w3y7xhT%-g8Id-ONQjL2yo7|v zQfStt>$U+42Yim-buJqsnxUwwH!W6?O0o)?h96_$a)QWa3krshHQRpXL`Mn0Xty)R z0}t!|oIAr4#$cF`MfTS4kg-A4iamRM>qv;4={)N>GX2_P;w`iU;GGGr%uT(`G>#1K ziL+(wVzEF62M5XJ>YAL1Qe58e35jX3xILuw9TyUeRBBK^H z+STc-^foX;U@T@;)ePTtKC<(F5D~`^V5|^{PQC`Q>z(dszaVIkOMn-o^T-oiqA2lOux1iM^gWf3F@0a+Y07D6n9gp(r@1ByhF zB5Y9EUFK5V;i@4>UNy{jz8_}Z_YEgWQh*RbD5XI-qcFyELI~k{z1|x_2&R-?oe9Vh zLMWn?2G2DE08mP=D5XK$p}-h}e!m~tY&L#f*8?2KA=5N}+HAIO>2&&&$Kx^f&szZF z@%ZUtv3M!V@?*E#&Fx8k##nqX7`)i+cJDHo%=Mjs?iSPO)B^yo6-9aCa=AEFRUs4# zK_n7^PNxG1A&?~Lk>BrsH5!ecodR4WlgWnw00<#yx7*NcHlb81L95lezltb|4*GN~N-PI-R$ForB?U z_!k`!B;`A&l`HW1KtJh%wG#jOX0{e&;{GNyxi~ SSt6VO0000QL70(Y)*K0-AbW|YuPgfvMkyg(>DCE;TYy4xC9V-A&iT2y zsd*&~KAFj>dBv$#3IU}_Ihn~W`MHUid0g#ltDXW?e)e>646!)9bh2&MVF!WM`#oHu zD}}@lPLL0MRm*fXuw=?k&l=&gj81$Dyb??mdlj{E0&FsKBA#%1oNIph?f1902ZBOF z*RNWY7M9@XvLrZk>9WjwA)#k-b_WEkUbS(iDB~Z_gy}x~3H%AQmI-Om#@ZEGW#45R zlo|Y=J$ZNk-M@KW3=PW-1S>;kcFgIhJ68C|Lv_x9zwrgLbWR^jl=!ux@qFaHohSc! z89e{y{mI6@#d?RTIp>U-%8dE~HZB+bHeK_d_+VY`?IgB6j2}d=>7D+>k|1i+&hR8y zf+51iN^s?6wdY;>CvBK3d=dp$x-MD#zwUXwmQ>27zZwd9K<_hny85}Sb4q9e0F?5b Ar~m)} literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc.png b/Icons/map-icons/square.small/misc.png new file mode 100644 index 0000000000000000000000000000000000000000..a6892482504975164ecfa91d91163c579438a183 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4bz+Zf^>m`1$^if|Tq zL>4nJa0`PlBg3pY5H=O_G_&2d{TPreB4ceLROwGjv*GOlT#WR{_{LxbaR{W z?EnA&@(RA{iPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z0Uj9SC&>8#001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00H_*L_t(I%cYagixOcN$G@X9?hHA&PUA>0kWS*R z;K9P1mx8uVMg*N(=oEJ9FYphUg#|T&4jpSZ^x$a`1PM`wNw;RYG=oVE{>mBO4wbCA zAiKTr9Ny>Q`MmG*<@tgT5(7Xk6NHc$1%M1@Baz74O#mMN zEEWr@TCF~q&*v}V@wjB$_Gma9zDlRlpEqg&fHWG7<8U~9@8IPjoSXWk9yggxAP53H&qE*(SbNQ~tl4xreVxf< zKCXzkyR)m7N~MP9d2n6#+-3lfBxx%c3_i3hYimV=TrM{#6bkP(P5Zzw%(B7rJUEU6 z+qRdvP$(4Cb^YcF006ePx99nM{!P2xJ|%{K_Z{!-US=0|1Cdqu(f+n$tAxH%)WOvg{R66qoh!c#M9( ze|0bz++G8e%jN4w$47VepX~b#!#JtcYBy4;ln=mHj^kVa-+R5@OqS(qrfH6sdw}1D gC|<@)_+LB!0wXo+iZB_x&;S4c07*qoM6N<$g5(V>ga7~l literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/butterfly.png b/Icons/map-icons/square.small/misc/butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..708991ee75a6e3ad250c10b49528eeb48cee2257 GIT binary patch literal 775 zcmV+i1Ni)jP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z0VO&O^=2gi001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00KuzL_t(I%cYY|YZ_q`h0hGqrWtj{FJh3CENmAQ zEFl9!vxtj;LgU9O>nvv>NTppS%3p@mz8km#&PFPDTl}fCtsg__H0(Oyu926fQyTZd+m06CZErj)9LgxhGDL9xm;P(w3%M7 z#{fV$9R4u{NF)-P-|z1-4D<8!^wibs^@fU~EYLJIh+y}kYR=;-Kar_-_XJl_`tK@|j{&hvb~(P%h|#bRh{YwI1$vcIMP08l6t9-2LN5yXH3(i0U#2Ie096s#=*hC;^fW^Kr|Zt((QI#*=#mu7=|sA$$Z?{*!XN1 zhD{X3=bEN@*4EYS>4u@kTielZeGIgCS+%^wZnDD=G{tfFwAuSuUC=dVu002ovPDHLk FV1gLQSWEx_ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/construction.png b/Icons/map-icons/square.small/misc/construction.png new file mode 100644 index 0000000000000000000000000000000000000000..c12658a2d1c607075f4b215cc75e64855ebec12f GIT binary patch literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMhQ_BtL?ScYk@*0C9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(Eak-ar*6KeGlhEk)!8-s&)7-({?U+B;9p!n^M;TM^_ht$<=NfbvS0-F^-ne zIi0|!n|v_!pvo?VQ%!a*hYfzPhq(mYE7z%hopL)&1=c*Q%uYf8KcgPao$a!zhMXzB3;zI^Yoc;u}j@X4kY9H#W(X zYrpQPq%yAfdMK6G>wG7F>cfQ7H(pm8Zq+lMZ}{!?Y^}H5SCvd{7(}#_PIq27mSQxs z@5c9gxzi=OqU&mcb|ybsm6pk~(Z+YTm2$GiocmwQ%Zlq7mwcb!yv!k@r|eXV-|Iij Yvbz=@k_?%u4GeJxPgg&ebxsLQ0Ca4?&j0`b literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/danger.png b/Icons/map-icons/square.small/misc/danger.png new file mode 100644 index 0000000000000000000000000000000000000000..2bdf105d258971a3bff5a364e877efc5578494ea GIT binary patch literal 653 zcmV;80&@L{P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4^ z6(|cz7Id2c001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00GTOL_t(I%VYTe|GxqQ1H*rE@c;k+6&M*982+oM zs64oR`}P6`5&$D3V*>*N0|O(}qy}t?K7IPc^7ZRiW=ToOpSTQR!e>iYSC@ZHbw&K2 zKYti;sljQ$!Gi~7zdqlnqbjgdYVF#!dL$X}@83Vhl`EII$2eYLjBiU|?WikQ8BHU}1*HMZ14zxPE@4@tHGcL~t6gVZ#PTH=Tp*oa_+3 zgE0d`S|EhY#>&88tFnjr@ZrNQSPeLS{J6xEo2w0ioqi*t@*D%h`I`vEK@NWyUfkWH ze&E0X1q=h$tXbt2X?vE52`S0^{=>lV`74rbObiUJTKgG~9XsXbF$H~ATrNF>2VIyk5J$rjk>cWK!eDJ)$z`($8`0(LLA3l6wB_<;Y n2nhVPwYAM-V1VQ#in22Rl8MB_GcT8I00000NkvXXu0mjfoO&3m literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/deprecated.png b/Icons/map-icons/square.small/misc/deprecated.png new file mode 100644 index 0000000000000000000000000000000000000000..c318c7e6a939792bd8cbdf5e7f80bae53208769d GIT binary patch literal 556 zcmV+{0@MA8P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7- z3mp{kgJ+!p001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00C@CL_t(I%cYaeD}+%L#((!3ruX$RUKCQ(G)>Av zMzJ0LfGDvbO<5_H7D|aCS;&%-g{}A-tj5~d_-Lj~@|lH&Y4C<)afh0Cnc>u_bDnd0 zy62qxAR-|^{^BAMQh-DvkxVL;+M)zgO3i=7A|i7lNHKnR_z}w-Aes_wajijwHo3N-c@`R{00n`-4+PhXaJve@4R8hwcE1bf6Cf@$ z%|JZvLGW@1H%n070zL;+g~97aK-+LO3=QLOdRj>Exx{P&$^sDHftzJW_rY_@)N1=d zS3`CmdU`wv#0BLCyAxXXpgs=iUbviw*9Xvk(-Vt%5ZK+|UO?`^EXx^$wj}5pIF5pQ z1(jW2ukcCW4@3Q^nf2);U$pYe^qCh`gnl_=a2+yZaMTV~hru3`;0!@QL70(Y)*K0-AbW|YuPgfvMoCdw-KJ?FTY*9*C9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(Czlqg6F$^-0B?J0r$-K30#Ik^?XqhZ_*SE6{F&jKLZwkk+P;KEr^**+&R+Y> zYkB^Kx4W8)-_2qmdKI;Vst0P??lLjV8( literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/empty.png b/Icons/map-icons/square.small/misc/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..c89347e79bbf661d78da792686ffed497eb4da50 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMhS6F3CGP}P5^~WN?apKobz*Y zQ}ap~oQqNuOHxx5$}>wc6hbmm72G|21Gs!LlT-7GQ>_#NN|SOjlU?$26EpL;9q(L@w!CHBvG}dx0l|+U zSI@Gms5XRYW-4gvn^`sr{|I~_yVzKGx3zy`lu7y9UCGCQW-@rX`njxgN@xNA0{vAK literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/information.png b/Icons/map-icons/square.small/misc/information.png new file mode 100644 index 0000000000000000000000000000000000000000..41f7d3e84965d9ea00462d94ad2103d2f2573638 GIT binary patch literal 561 zcmV-10?z%3P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z0WBk;M?~!a001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00D7HL_t(I%cYaQOF~f;$3NF+L9{CG*(BoZ(vN>Y z5L#Va#6bKP#8HP@6rw+&t%&v{*Osu&@hv(;z8AI`l*G3|pT3ui)qw-|$2p&SzvrHd zq%@$vxTLfJl+9*`uIpa%3p2*F0L+5a3O3%}*lIM`?{>+J$0Pw`+xUe7gLa#zM1t8* zh$J;7H6I^!zPG0rkU+|0<{r!)N8^VFT?Fw9DRaPNqSJ7)Wl63pjYd*D9)WnCr?WLc zt){ymDDYxYDwU#ZAXO^54*;=1Pq#}hT%>9hDit_B2Fr>Tu-A*mN>Vc(*JtG?S-0i;+=Uu!p5yvRl-t;S1$ZR2kWux(z~0EGgBO#%7*Ds~BIw|R0LykLHC0K2=e zvjay*tK?*o*G`B28X%Eic6-aUo1>)|900000NkvXXu0mjflGW#7 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark.png b/Icons/map-icons/square.small/misc/landmark.png new file mode 100644 index 0000000000000000000000000000000000000000..d048b1427c5c4bc012fae00cdb49c00d29a21f08 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMhS6d!=LY3^ngMpC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(QbOY2>J=+&cGUj<#>6JXpsbwC31)q0X`W>zRztOPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4^ z7YYFm^$*Jc001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00DzZL_t(I%cYY~D1%`f$G^X4@641%Omff;lRr_K zwSQ<^`Sktv`#s>C8vyWP7U$eR0Jza;3)39z(JfdLgV;wz}(Xv%Yl4#5Q#+8`xA40U3>oCCb=vR9uN|ef2i|(z`5wt>2z|Q zgVlwl_R#5(=}<4c{ABz2*lVuz`L1ks`vU;v03;}6T@iOi$HuOI0yt)8Eehw9)(j<9 zUQV?Tu27QxDgYo>{|?l}0g3($(ARDb%87Ly05Fy9fT^rOIWaStx-J3z-hu#tB>|QE zxmPLwj&OVL@G#-7Iy)?_F+sDvoas7kv=jso$)w0zBN;!;vL+{{rqf!hG5HDto*tv+ z;c(4eTF0fRTC2$>d3}qk^Cl6W<0yLE?gqEZ)%IKNx%v5v_Kpq*QV&b|&L0!yr=-Jz R;W+>R002ovPDHLkV1hyM^n?Ha literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/bunker.png b/Icons/map-icons/square.small/misc/landmark/bunker.png new file mode 100644 index 0000000000000000000000000000000000000000..3ae3303a1299b5a001eeded6fad8e150641537fd GIT binary patch literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMhS6Yg`0D>^#X-VN?apKobz*Y zQ}ap~oQqNuOHxx5$}>wc6hbmm72G|21Gs!LlT-7GQ>_#NN|SOjlU?$26EpL;1VZf=lr%}5w(_{Su<{fWC7rFkHTNt~guck%e z-KE_^UV?&}yC$BD_};htsOw<|*T3x#Kb-&Ye@^i;o>i}ycAX3h4QJ35>wdfX_O#Pd zE5cbA7{8ngHgnvo^k##q(0~3#@AaGdj=%UiQ~oofgVA1pwdzBS)m};Fn{Ooiv0U)E zqM7&Xo|hFJoV)gHpRX}z?&Mq6v+kaqDo|pRld<7i(pps>=S3Q`3Z?rvZ{2&ubLCi* z+hWFs_rE(hmIiS)M6GRml~T#?(h{S`-e8#4*L~uZnpL0k)+p8)N2jj;@S(`J{Kk=5 z??Rull?&{%F3R62o}u@LcT(}pBYsY&rktD{pLJnzd%yhT?o7_Y^d+8qt~IDItZ|d} le{#-b>Q=+6Ilt%DGfq{XCp0rG+7B4`44$rjF6*2UngAxv%CZ0e literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/chimney.png b/Icons/map-icons/square.small/misc/landmark/chimney.png new file mode 100644 index 0000000000000000000000000000000000000000..eae1dce9195947d91ab5f1339fe2d6f922bb333d GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMhS6cx#PR%UIhx7l(CBD!6<425|XgCa2~Vr&=illqTh5CcEV4CT8Yw$!{{d z4Ri&gr;B5V#p&c9|Nrl2VrD*EU-aSs|No*Ak`faCR)zkr zAKug7Kc7Q5IVB}00R)nO_`vd+jg5^D-`?K7>dl)s@)M8#`~Uy`0T5{Ne|&v?{LT4x zwOV3ALPoulCw~?H7M7OwA3l7T^W@>f zpN-zUVa)SvtJO+AK5`XSS6_bj&Ye5A?=J`J)IT+UH1%!v& zE9>gk2FJzy6IEp1uuDNf;XvNSMXotKE(~kf?(8gffB5ildsB+E1DAvf+W{lCq9FAp fg6rBZz2RZ-H7YdrN{E>X3`_=3S3j3^P6Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7% z3=_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00DJLL_t(I%cWC2Yr;?zJ=aM3lzxasAxlxnrcQz` zX6w?)pCRvGM4ZIIp+mr_|DgC6N++eDLzfz9KtVzTMN*+@>+52QR*PB>+~MBKJ-mD0 zIS@i50EqvD5F$YUgsQ4muh+Z70U#nB0BFgi;~yX*J%A$-Tulap0n21EoQMPfNRqTj zr_-;YP{@;I`BMl%LI`R!8V`!1yl)W1Vll5;t=^Z*G%6_&UtP)9A55CFrUvQ*L9^%r*mE?6wF$!_M|Av)OB5HTl}ce zmvX&cS8dx4@1s7(*q5&B&qSot(pfmv55Adjtew9BAh*H9ZgTAn00000NkvXXu0mjf DmZI%F literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/empty.png b/Icons/map-icons/square.small/misc/landmark/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..6836728be2bec6a6f7d795e3982a286addfab013 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMkyhE9e(LfOQ4WkiEBiObAE1a zYF-J0PiAszUU90GLO^L!PG+)8er{rB9#{L?s;5Ae=AJH&Ar`0KPF7@MP!KpYNyMZFD0qehGc?Gutvj^5m{W^8L^ksiYy5|{1+{9s%IB&4Q{ddJT%G_lg2B_( K&t;ucLK6UnB|^mj literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/farm.png b/Icons/map-icons/square.small/misc/landmark/farm.png new file mode 100644 index 0000000000000000000000000000000000000000..163193e002e93b5d62d4e45eceec86ca622ee42f GIT binary patch literal 700 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 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/mountain_pass.png b/Icons/map-icons/square.small/misc/landmark/mountain_pass.png new file mode 100644 index 0000000000000000000000000000000000000000..e8078487e1c06ff752bb9e61e950007e6354608f GIT binary patch literal 633 zcmV-<0*3vGP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z78f^%UHcpW001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00Fs4L_t(I%cWB>h}vKn{gSh}AQpl{4jt=h4BFCj3+$IisN)o~2h6?8rA*H2*Mi5lWk9hgJ z^je2ROYgzAypQ*W$9sS=J_G>#KZh|sBme;OJpa`&j8EW#>2&&{R4N@+DwX>ujv$C4 z000R9uuTjA;P?C2{eJ)TCWkTpYp@HpZ39Axa{BEwSgls1BuQt%U~uB}_iPg*gh)w} z&RLe7DT;DiC=`xbtyYL-*;zauH@6xfgveMdcER)fq*kkS^ZC5cXf)n7o6XOrX?iWo z+IKZrE|+_vD1Hcs!#`wM)^fSryH2MQ>h*e;48yEBjzg{)%;$4YG#dRV2*Nj6mbGj) z`(9PmH@dE0F$}YI%%EPc2PlfNIgb08N~KOkQ8cR6>Rl$2IUWoKtfpy-&*yt|4bieJ zy4&q?hmsG&)dKweIzLAKkJdepj-%Nv6~3s9_kd+U@oYP1Clk zm>`OdAr6PbfUfJ;6h+y)dg53lnx@wXp?_*AxjBp{L?V&zi^XDZoA8h3xpV#nVSUn^ Txf+O~00000NkvXXu0mjf%RvoL literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/peak.png b/Icons/map-icons/square.small/misc/landmark/peak.png new file mode 100644 index 0000000000000000000000000000000000000000..e7a4b6902d2e4c0b186f03edcb44052234760750 GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMoC69qojlDTY*9*C9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(Z*UZ+^vKu&!QL70(Y)*K0-AbW|YuPgfvMoC61!|>XT#y}yH64!_l=ltB< z)VvY~=c3falGGH1^30M9g^-L?1$R&104|@*KNn2)Y+3|4E!FT@Ga{@lwbru+QzE}7m(zK}mfpCmK z_kz;NxjL(VFrU76_Z9o(XO9mYkO?tmF*&~?OQS(5`P{jkrgDOU+zOm0Cn+l>d5fHp zpTJt+|9%NGUr45~pzsgoBqk-bIT;3NFZgE|J#gY}u$2|tvWa<`$<2$k^;XY%EP{Tn z`**Kw>6tFM(!2(x^}R-m&$qojZmpj7@b%$fwXRox7z(p}G8c$T-2^(G!PC{xWt~$( F695bRh1&oC literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/pier.png b/Icons/map-icons/square.small/misc/landmark/pier.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d5ec912c017de5603521d6f7dc4b92fb571498 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMo9)H8J7RnT|gm|64!_l=ltB< z)VvY~=c3falGGH1^30M9g^-L?1$R&104|@*k+%IO-?{O2>bY$ZYD!Rb5fK&9-DBI(J6D0jP2RDF^vl zfqUoF4%_NaF*V%$rLZ-Co|VA!f?Jv({nF*F~p_zuxHn#H7Jm&0d=)!)v?2%GUizPm=({9^2H& z8`~$G<9B#?^_Z9JLyv=>4$R~>*rLSn@uH{6U4{og3_|ZVDXZpxk7U@jsQ<@Q?hKCh zj`MznS*4q{nLd+>a?TWU534x0?4rrv-RJK&G%UP$>89hmJ+n`rS&(fo+bF{PaRfVq zpQd$R(4lIspfJC0miN#7`q=ir{DRoo!2VSXe?LY`N!!0-RuST4iq{q76pxr?|FJM+ fivE}S`#*)lczPA{w3qe)5P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z00tQl`3eC5001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00J3FL_t(I%VYTe|GxqQ1H*rE@c;k+6&M*982+oM zs64oR`}P6`5&$D3V*>*N0|O(}qy`2u03#z~0}}&<0KfWX}6H&)LIvc*TAA^;Y;lBLl;!)7vbkl|=pACv;iv zJo8OO<+du75f2qXy&vlpZ+vz5=SI3u6IKuqvKVxChoc+fuUQS#u zyKpWiAK%wWjdAuE2E2dsoc->Lt15+;T~F_r@M?;gL%<6zUV-0CEG)mz?%5#C#?JB2 z#y9rKl%A98l%;iFVi<6E{X&Iwm8>1@Ejza}F){sTU|?Xld~}!CzrTN3t{&T?i0snf zyvC~-f#?-qben~Z?H`Q);ll@(!&_Ht{QviliBD1g#m$>Hxs{cbzp=2e{Kpy#$eIry zJ}kIk!2Ei zH_P8I++R6=eBu&gc__rq&Hd}?)2A;41O&d|H6T7d{^9@s{~3=TKmPUo`}fbexVV0) zsHnX4_V#|Hsj2xDB{@TL76Y#Q@a@|-W)>Ef|7=KJM9xeMlxAlDW8noAxwp{100000 LNkvXXu0mjfK?_s3 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/power.png b/Icons/map-icons/square.small/misc/landmark/power.png new file mode 100644 index 0000000000000000000000000000000000000000..e95a389d580cdd32d836fd5b0346e8b8298648ee GIT binary patch literal 503 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMoC6Cj_PiQBS0aO64!_l=ltB< z)VvY~=c3falGGH1^30M9g^-L?1$R&104|@*QbOY2>J=+&cGUj<#>6I*@cG%ipo*(9_%Y>iv8BHh*3}@thkQ9Gm9O{rmmoWOdelS!=Zh zZ&_s%E2#;r|Ns6zzGB%jF(6&e7Z!HSzWm*tnWqmO`XujctengoCT?PCn#sw{UH|Xr zXZ7st?ALrbvp%*t#>CvQwYA;5y|%Vi?Bd0X{vTQy!cANCUHrn3$#2MiwE-kyI(O-*fmMMcFwp=1VSlXSxc l?y8Qx7tS1U$Sh-HnEQE>&_mDGY+w{Hc)I$ztaD0e0suPt%sc=9 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/power/fossil.png b/Icons/map-icons/square.small/misc/landmark/power/fossil.png new file mode 100644 index 0000000000000000000000000000000000000000..13dde3a94f5666afbaef3a08a00e8952aa74e303 GIT binary patch literal 618 zcmV-w0+s!VP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z04+AnSjsT~001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00F8=L_t(I%cYY)NCHtD$G>+f8l+p?30F2qI0PNi z*5FbukqB)L;%#n@*O<^C9O!V|s=^Jex(WvlULXYFXf8^K5G5QP{*7KkX?hiCec>(d zeZQZ_?+0HHLUsX=zZ^oyE(L)2{r+~V)hc2^qtS?Vxm<7fMHEF{0ssvF)-V9%a=E>q zg1WAItJNw;2>Ak7rK&2&^ZYXajK^b}D2mZer?Xio6b@8XJz-haoO$im@MJQfHBH+o z7K=9kAj|R*0Qh`9QxJrPAP9{`|2KdrihL{=vDIoEYP=x{jRRstlG$xt8=cnpO?XT4s}i4`;ll*?sC)3ifbmQRDhVAt#Q zj@JTIDwXYQHhax+Tu+juJFKYr5*02$hcx7*3=-ZV{jKA-28ex+%WNF*9d zfNrjJ3H zX2CFwE04$Xy7<`d_np(}l%^<(Sc441TmT=P{8ydd0Z53#uW^-L7XSbN07*qoM6N<$ Ef*+6iE&u=k literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/power/hydro.png b/Icons/map-icons/square.small/misc/landmark/power/hydro.png new file mode 100644 index 0000000000000000000000000000000000000000..296b99c7125911160aef8576fc22aaed9b231b8e GIT binary patch literal 546 zcmV+-0^R+IP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z05B>hHTq%z001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00Cl2L_t(I%cYY$Yr(_4r8sm5 z(mk6XrIVY3v;V-QLxm1PKnHOzICOT6Wb0U{Yw8k^5a?wP!K6WRy3|YU1!Euh;0)h+ z4(GrNB2oa*K97hL27q$8oIM(iZn1&y`&=v*3-Jq#v1Kk_8n;-}R&NR*AQmOQ^m!Mv+tCdRS2|MydVB2=wvaG{mvG}@|pjNAC`F#Fa z)3i(1b;U@6e!rhGP4m3d>0A^F1t*|4A`2YH5k1d4s8*|EL_k;;&1UmV*Y*4LO^~uIB!6nkW-%?7;jRR;*^HMYDNt2) zy8IN6W0A>V8U)}(5#f9eMg+$5AjYs-k$ol$lgZ>Jkx0xpCk=;?L=mCygBJvZ90x2G kV2T1SnPgYXQ2Z;-AChIE{}S5U0ssI207*qoM6N<$g7@m%GXMYp literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/power/nuclear.png b/Icons/map-icons/square.small/misc/landmark/power/nuclear.png new file mode 100644 index 0000000000000000000000000000000000000000..8f6fd9a18a512feb753dd44d1d24deb969e59d3b GIT binary patch literal 735 zcmV<50wDc~P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z05cHF6mSy&001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00JLLL_t(I%cYY&Xj5?%#n1ic|2{%#9jb#;N`;^q z6rQMyOB}RNFoTO=3dKna1vlwXv>hA*g?8(rLrZZFPA*-vQbBYOBBTKcXw^oGHfdho zdwK62mo)vbO3?#%xp03R?!5;j2LSM2isXO*U@DcWl*{FL?2_ks%C_woe~^ew0e}L4 z{lfq-J3D&{e-X(Yzwd3o--1XD0AQMPNG5YCidL_MVR&@cLOEF| z6y~(nEvlR1~NiYb8xwZ9%WRfHphL_lA)LsIhv;k9NV`CT6>GY48nVHMQ zVsTliCpSgD07w8JL_UE$(Kekx6lF_YU1v{s9FUyMX0tCA78V`{LGY+nt8u$L?*Zeu zm-TwN(`z&uZvn8ggSE9atJ!QCBO@apwbq{j`~(1{imk>l@7(=2xYuInbcySoF&aq8PZ(=P*2Ot3ITI*M~ZLf4P(M}dNH#Z;l^z?)WeOnyICICZ3ToK{!FyVjW{0q_XErn=K R#Hs)Q002ovPDHLkV1m0~Gsyq| literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/power/tower.png b/Icons/map-icons/square.small/misc/landmark/power/tower.png new file mode 100644 index 0000000000000000000000000000000000000000..27788e8c703365d64141305520b7ce38d41f3769 GIT binary patch literal 689 zcmV;i0#5yjP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z05vx_L}LB`001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00HqyL_t(I%cYaCtJ+W$#!q65QJ#srHOFU24%hrO+O@ z!}%`f$9L{M2M8f|06_lb5JK)K03eA(;_GI!`3QdrS(dqYJpK~^fTAb~0DuMna2I2Y zsa~)5>X`3#JD;K`T)*FsD~iG?io!XL^WhJ`9j#XDb){1IcFZlyq7Xtf#+XJ3(Fh^> za5%t4fGo@0e!u6U(WrIQ1VO->ruhH>R;$$wP1A&77yap*$WB5k>L&cy|UEjYg4RFo+_Nh~)y9cT4*+##agZQMUteH8?fDO z{pE6b&$8^{B0!R))N;8LtJUf|Q4}BD0L!xI^?DsJ48wb>GXMa(u6u{WVJe@`KbWTJ ztJmv_8^AEkA(>46&~=@C;ecgXGM!F8X__W2&U|jj^h#{@HBCBZTP1VsUfk zU^1E9mP(~9&-3^iAQp=~=W@A60D$p$e0v5c7K`r*A=0&Cj4>4shwanJJT4Rb?>hei XPa62;arbB300000NkvXXu0mjfsy8q3 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/power/wind.png b/Icons/map-icons/square.small/misc/landmark/power/wind.png new file mode 100644 index 0000000000000000000000000000000000000000..565ab3e51d9b5fcd755f5c78e020a5d8e7b099b1 GIT binary patch literal 679 zcmV;Y0$BZtP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z0RbU)cusEs001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00HMoL_t(I%cYaMiyBcB#=jYLbw&-_EMb`IvWgQd zwiqNN5CWRUCgdNmu=YQ&3apSq7|=rO0~RTRRT52wvh_k*%@x>h-SSQ71 z!S%6$HKz0CKt9lSAgwXhiDu`bPk_fNd3vMIy`cXy4spu{a(MhtEV&{IM5cnkK8N>S;6@ zHCnCKOHI?xDW#79V7*?molfVK-|zp#FpLEN_H95am6GG}c%9?81tH{8*Y$v=X)peS zHuL#>s?+H-?)vXd&~CT6TCH{xi^X&Ra5x;MAP7GtN%|~F(wAzr>M>1|-}KxAB$LTV zC=?n*B9S-UZr8azU9;KL`~Cj&y?|1w^jKBZr}=#TbvPW>1VLDB1Fk36JjZdp@pvrm z0LtaEFPqJNAcS-kMftw(1qO8BC4^kfX0y{BK%r2$s#GfebUIzO+wImqfKGLf&1Sn1 zMe*AXK+`m*VHl1?BJu0c0!@|^&t14XfJ`QHt|-b^JfQi_oTrr9c0#0-+Pq$`Da-Qw zA%Mx6N4;L}X!Fbt0B*PY?Q}YQhrcLr9MD#)6$=0i!(0Hj>-AsX`8O%?=k3=%ez^bu N002ovPDHLkV1jmpE5iT) literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/range.png b/Icons/map-icons/square.small/misc/landmark/range.png new file mode 100644 index 0000000000000000000000000000000000000000..45b8dff0c0fff3d68090242fed0296a1cc739530 GIT binary patch literal 678 zcmV;X0$KfuP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z017%DD>Q!q001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00HJnL_t(I%cYY+i`q~S$LGatHeOl?r3xwp_0l$O zFAEFqXEBJkc<`(kLGmP?#H+`WlXt&Dds{_NNYKk#SIi*?Db?tUNqXo;(hWUqJMb?5 zVSY37W(IuU=K;X~m*@LFj{v~W=kt%t!Vp4j008t%Y6p(pZbx@I9bv!UGlpTj zcN`~HC=|Bwc-)a?dCqa16Nb=X>UcbU)9dvu7;mnTXAVNsY^E?0mIG@k42tW{ot*WZC zaJi$=C~-QSs8Xr)1OQKgE=dv_`9zjw-PLNvh5^&*l$%T@@4}jCnhZ_TUIfr;wPvy` z-+G>R8C`gcfz|8v+h(&livT!|b0kTci=ueH*=(*~2AZbHh@yC3E|-mDGD$Am_;Qsk z%eulC7YHG=uImZcbtyp*whY6#jYebkM=(Nd^n6(mhP>vO;D68g7gB8jSZRPq)Bpeg M07*qoM6N<$g8j-Rs{jB1 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/reservoir_covered.png b/Icons/map-icons/square.small/misc/landmark/reservoir_covered.png new file mode 100644 index 0000000000000000000000000000000000000000..1a2e4e8dda389b5671b33f5ab9bdb41c0394edff GIT binary patch literal 587 zcmV-R0<`^!P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z02M2_!5R|)001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00E0hL_t(I%dJyQO9D|8Jx{02Kr+opm>~>ei|CVn zK`RGbIpI%mC5Rh07Q(Eezu>M=2+CCu)Upg06+~2K7^BHhl43eeQ;_glm}SsL?Z91J z-n)nM&V2`zQV{?hq$s5#0YE(-PpMESY@!bkLKFZXUrY)H03k%NU`Py2!1OkTVOV8Z zmN)^fLw zCt%{SQ%((VR&x1CyTHGNLZQoeJihSD#73jRXqv`(z22HXAZv5myG5e6e%94$VRn0` z=nu%6BuQ0ORe94itpH#JpfsCJBNz&j+X)=Vao?rb(YO#skxxxC?Wx!(I(U%g%*5d>k)0s#FE0|3wSAOG@^EWN=PBup4K Z&Yu)|z|8vw23G(8002ovPDHLkV1mIu?!Ev3 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/spring.png b/Icons/map-icons/square.small/misc/landmark/spring.png new file mode 100644 index 0000000000000000000000000000000000000000..9821c07084cd034c656cdc6e9b1cce1e2197ad4e GIT binary patch literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMo9(Eak-ae8gAulHdGf!fVCO){OUR)lVtCZ&3h^=P;G#qI}Z<)_Sl#Q#B!fKYq6R>$D8d ziN6*f*~hmyZc&7F`5JbH9W{UM*u6Gma$c;nerAtB$CQ=ar*t%f7;a>~dLMY|SKex~ zGxy(Y?Rj|jbj8*iB~AtZ#kTX`+WI`{(j*b{(uq&L>qgi0h@M`lEVE9sc~3Q8wD?Aa z0>iR9E8Bxbr*tzO5LjZOG;eF`%gN?ay&cuzkZ3*xA30pJ4K!xTal!ull@$N Y)s5=MuUB$30Rx=D)78&qol`;+0RKL|kpKVy literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/survey_point.png b/Icons/map-icons/square.small/misc/landmark/survey_point.png new file mode 100644 index 0000000000000000000000000000000000000000..6a602214330048468d3de801dbd12492977cee5d GIT binary patch literal 529 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvCIJ>5p{oy@)PX`KC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3LzP(3hti10bD+r$*Fn8sa6UBrAaxN$u9Z1iJ5s^@|(j5>Eak-aXR_O|Nr}$n3)gP7k&8u|G%h&q=dx3)hkxm?5O?yjfqX=!^5ko^LDFi zudVxEb5uM3Mo~b}&9}UpY?PIgnL$7pMC?jqV`FRUU%&oiZAEe9yVvd2LF?zs2)j=Q znrMHBA;%%k`p?XcB?oKc9Dh!)`o9nOFPkOXpi4he@US;j^=|ovNy;-p`mZ zPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z02?+$L|a4v001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00Fg0L_t(I%cYY~YZ^fq#-G{jzql(AQfz2x>S3Ws zLI{*12>B$r_u_X5(u*HLgkJU9wc8KjB~60|EyxOS7uIB5s&sbTd3#zY#wH|vU@i~8 z`7ylA3nHojpywPSsxScLIL>4=8hr+U>uYWs29t+}+HYNF5&+Va6yFyn=cF7R8NUF4 zG1deC1pxBP05G4gbs>oPzA%#{QbUnf?#b_ zDt3H){POnZW^J6Fnn{|H@~EIz+l{ZTc(GnD#EZqkh@!}-*9-CGB`?-$yYVJ}Zw9ul zWM^lEI{*m7(6%f~06^Y7`hvf+TCMcSWKw#Fc~GEfn&g~o&k{_hQ`536E~SK&l08|_ zZnvE<42!ebtkmoEUOibb7z|!}p7+gl-7np4_uaoZbzAAWZh5&}>WxO@0{{d;P#O-0 zR<&APZWS=bn)%-b0MGN@_WS*>wrytsFdmP8bUGcU)oOjunS7b>zw7)59XI9Z{Xla| P00000NkvXXu0mjfD6R$< literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/trees.png b/Icons/map-icons/square.small/misc/landmark/trees.png new file mode 100644 index 0000000000000000000000000000000000000000..55c941bfbe27d4da2767af0593b0a245339917a0 GIT binary patch literal 841 zcmV-P1GfB$P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z03R6q{*#XY001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00N0gL_t(I%cYZDNK;`L$N%p+`*53{wVllrHHS@! z1cT{?fe(df>fz-uM6G|2*&WfKuuJK>y`XN*x3Mbvm6>qA1?SUj!k<4FKdP z$-VwTOjViYu4C2D<>BI}R@LPqD{$J@=xsQ3@gu`9Gzr-dph!`+sdeA}jzW(suKktQ zD4?h2c8%UW_v}#;!2B-k?!8_VQ&r|^e}|)U%UUr2#PlFt{9svqd)2}3OCc=)Xp)za z<*=rC$$eP!!q9VVx@C`CxN+?gN15)7VORdcrVs$69QY>y~kp;%8Oq`J~A;-%C5-z^voQ8MdRgxh7%{Jbvj)lIf*O)w;%{* zEXyjN=Yr-LB~6iIl!~Hg|K^{yj{8+jFkzHQ8W&MziIkRC&T||WPc9Swcb$I#WwMi;e00000NkvXXu0mjf7~F8o literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/wastewater_plant.png b/Icons/map-icons/square.small/misc/landmark/wastewater_plant.png new file mode 100644 index 0000000000000000000000000000000000000000..13640584823226ebebe2a4a2b9fed4fb5031abbe GIT binary patch literal 710 zcmV;%0y+JOP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z04XgaQO4N-001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00IU{L_t(I%cYagYZE~f$G@}L)LplPv^E4uz=~-W zX$>{d_T=JG#cRMz|AyX6f23e?DDAD%Q^Bj^K|KUiBp?=q(pn;^*mP^LOG%q1q)BYX z>~5x)WJqE_)GrLo(n zkB=Xx6h*0MT6Sw@ra#>cKpH*Z4KYnqNG6jJO6gTqRbQ&AdeF>$Np0OI7LF$XlDl*F z-aA4_RO}=ghT*BzYBvQzfMFQnR=}-LSO=hYwa}E`@6S1%&TqDDmwZ0oXZ%6j!r|eW zw75t|+S9uLc*7Bii2Is$rO-MH+``^oSy@@}KWqnl0^sFQUtjixrlHVU!2x4q1I0wb zc+w6S0$}hc6mpe1EpWibM&3O+sXPL{1F!)E04Qz6v$JQ3sVSG<6(GwF+v}}2zUKt+ s+xWxn7HeIb*jR`t{z812{&$@(0KJ&QL70(Y)*K0-AbW|YuPgfvMo9)mtBmNAVn89264!_l=ltB< z)VvY~=c3falGGH1^30M9g^-L?1$R&104|@*x;TbdoKF7n|Nnj_X6D27MIZkE|1T;bDIxK1^@lcW_U~JrO&r2T?eqUX5C79wcY48+C0}HhGafqhgEt}h_qWOY{qOnZnCof|rZbp- zpP&CCNh9&W%gl=ZudjD0^YHZWwDY~a_VdHXy$nESH1FASDmhkmvAdAafBWPkEbB5t zu3qTaU;MmJ2`KB_u>b$Vui4k%9Tn^K;Sp(in8cuyJYn)oiGs9rw`2c#e0&7XoaivN aW@ZT1E2zCA@UsdS5)7WMelF{r5}E)t{;Sde literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/landmark/windmill.png b/Icons/map-icons/square.small/misc/landmark/windmill.png new file mode 100644 index 0000000000000000000000000000000000000000..f0b3e02f805b8e20b8c85e4e4f5fb3e19fea73b9 GIT binary patch literal 633 zcmV-<0*3vGP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z03;C3m-K}I001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00Fs4L_t(I%bk-=YZ^fq$Nw{K>bkMM^z|FK@MvztsNuZ}Afc`+zwh}hkJ{$MW{44QUYKB`FPXGd#+8RyH_3$D4H z&!1LC>1-X8%VpnHtKPQFQ4|Mb9cY^7RaNzUcx{>eG`sLjbIf|U zKN^jO4a0DZ1(Zsqz`O9J%=P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z0466y95V<2001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00DnVL_t(I%cWCGO9EjOJ>NX4ad0fPhmXpIK~w}$ z4g?V)M3Ja9spPiDX(doQmIrt0FX!|UL%pndnX`* zQ=FcjEcy6~`uy^Sjh*A$TrQ_~!o&sO7%(?IjK?PvM8rCk!hNCCqy-{ER{+!kv2D9M z1}+UJb|nEoqtO5WSeC`r>va(TOw$ycT-S9^TM1~+fYoX>QB~DUp-}J}h9NC1%E zE^C^mB$LU#wh|bCYPBk-)|L+jWplDrD)nc!Rz8x=5#%hladz4=&Hob~jf>{Cz$A_d9TGa6m$Kdx{qX4&z}3GZO)k=Q)gp z6{xczk0^3KACfZzk0iQvztZdGqaknmEjW+yVcD=ges`P5?ZJQF`4iyTv?UI;gR%es N002ovPDHLkV1jZm-_!sA literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/lock_closed.png b/Icons/map-icons/square.small/misc/lock_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb89f179f26dd9de80018812d4a4bbc15086f788 GIT binary patch literal 582 zcmV-M0=fN(P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z6gVq_#7j^B001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00D+cL_t(I%cYY|O9DX{$Nw`s>#nY@7Se`WiUYzLNe^9OV0Up@!@{Q&R<&VYs)+_H-Bnb zmOGfE!ycE*W#cM;aTpFXZua)}v!>p)?cDi6u~>|a1#lc^WSfAxNw0i_DesRUGFKxiHUhK`^S1qkh1 zFbd$hu2!kjJLgG+D%@l3mY`Y?{!}y6OD0*nKlKtpET3 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/misc/lock_open.png b/Icons/map-icons/square.small/misc/lock_open.png new file mode 100644 index 0000000000000000000000000000000000000000..41e880ada21887bc7f4720cde46eb26b7d08d251 GIT binary patch literal 596 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 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/money.png b/Icons/map-icons/square.small/money.png new file mode 100644 index 0000000000000000000000000000000000000000..5819e8d770bc51475b6df1d73347e475b81ecc4d GIT binary patch literal 691 zcmV;k0!;mhP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4_ z7AzBo?C|vf001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00Hw!L_t(I%cWCGOB+!XKIh&^rk$9YNv5qzeJrxD zf+>O<1?i>*7p}4xOc(xvNCh_q3og16#6Ka(EL};JT5#tBN-AOHY9Scb?* z*w{!uTwHuJAjIE&A0sUQ0QApbHBK*;)H@3cJwt^;tjqI|8ix17G%E*FQ{RrlEXbeI zpX_;8I5U%ey1RR?&vi+Jb4o5Q)WpillMG{kVJ1q$JOBXL-oBqYK29eUMF`WZ>{qLi zyO~VA+Sc}kDGJEoU65}ua2$*J0#Ym%wG<&QU~;ljnwa>09@eO-2985$E;sP}>`c`G z04S9rop#Il{OSJas9kHRK`h4k^77~R*=)9;>t3C6B*miEF+2PC+1_4U4>KTP4FC`l z3GU6!z5X;kefnW|*gn#A&tZ(wwY5}FOARhB9lEsisDE?w-2)*I4a0ObO%AS8)jMQauRu|{g%EF12o(vDa(uj2YRO=1?4U9@SU-tIRmK=0LLkQD%+2Rt?u?As zwU%25qFjzdS67Yh!$U1OKmYY(dpl>%{1BMw`fmrNpB;x%+dfe`JG*{1_5tv>neeuD Z{sq`Q;><|QZL$CW002ovPDHLkV1g8zB<=tJ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/money/atm.png b/Icons/map-icons/square.small/money/atm.png new file mode 100644 index 0000000000000000000000000000000000000000..5374e01753426c0e9e7f0620f074a8dfc4f9f7f0 GIT binary patch literal 600 zcmV-e0;m0nP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4` z6$cK2X>jrY0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FlfO?>Q545N=i0u4y&4DtZK`#E$+xs2K%6A;;p(8voBS6XUHlK!Q6~sn zL(;^7g@lE4;#WdS7+^5QM*CWeQ43O0AJ^elpp+8fo7~~v^XqeR?h&jEmy<{{c+nVw zASnCAVv$Cp(J^9dY?M^$R!#&TAOc_vfz1=}YPLvZ=#j-TA-{IEi1oVwlsD#ho5?h7 zCMP1kIza1`CfR=?#fGkmln_i!*pFwoaom2M~)L%f`9t9K1D<)=)QTE zuH*=(3t4|bwHvHr{Vw|-muZw&!5q?B=-6Mi8?1UVPe?tS1`|@5f6C!O{S1PZ76d3C z-M+59Av~yqTmjWQ7a@oZW(fCp07yJ|fr`fekD&f(liH6N`xL*!A8t@BZ9{3BFYlLt z@$;uJ`}!Hibo!W+D5YAa&_fa z*Q!+<$HDWwGiW*xhzKIW=hz2+cE6)E?@*~!j=Ux&?vYHMA`rnh#^fNtbzMY+zSLvl mJ#o^#=}v3tx6kAf>--nk!jdCrzW@#Z0000*8tZ5 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/money/bank.png b/Icons/map-icons/square.small/money/bank.png new file mode 100644 index 0000000000000000000000000000000000000000..b711117bb20876d5d75285e19611a14bc6630b8b GIT binary patch literal 665 zcmV;K0%rY*P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4` z6e0=rJYRtT0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$F#7<$0^cnqe4hZf;_l7<+q9ciU|qyGa}x zsv=Ye13qkT^97J_I4q~9r&6!iC6mbrAnWUVySn0R>Yt`K0a86a=Cjx99j&aah;7?q znx?edZLus%bX^xkLDK1TYdoI#T>+Ep_wyqXiHL|uxm=cPHY=K@2_TBXFU#WNLjrZa z2MXY)*=*8iG)N|s#N%-SfdGXcK(+fKI1FsZ>H$RYs%HgDsdRP#(QL70(Y)*K0-AbW|YuPgfvMkyg(^X(o=;Xom|64!_l=ltB< z)VvY~pUmXcyy8?Vg@DqeoXljG{M^LMJg)Y&RZoE`{XJbALo7}wr!+MD=Xt{D=CAl3|NCX~7_Rti%1~kcH`%p+SHcz6E5(c|$rI9y fb&L&zX3b@kon;$tp;kHvXf%VTtDnm{r-UW|r(H}n literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/money/exchange.png b/Icons/map-icons/square.small/money/exchange.png new file mode 100644 index 0000000000000000000000000000000000000000..082ee5ae2a0ae2256e368120d44669a771c47f09 GIT binary patch literal 729 zcmV;~0w(>5P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4` z6c;gn4<)Gp0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$F_~U1Fa3|p$IJmn@gd1Q3!?zdk|_<=p_l_FJfb`h@>%+tefO{NH$4B4^;;q!yB0I zo0)HhplTHVW`xv|UsHVLhB9yu(){b%E-v$PP^THd1(oDE#B}F05k(QP6%Q)-!CSUNpKv8jt&$W zLTNq(0I0X1C<&b`b*Bo?`%Ddz%O|Gq`HA`SSh!IBr#=4lpo4k1ZBC z?)Uq1qoW^UMk6g}vtYg6KKJ0@6Wj8#%biMrYgI$nwB1-;#Q`86Xn$1&lg)l-tyU|J zj=m8^0dr~v)x&7jnL-et&doh~6AVsgrlub3_VhINq4}8p>zw}pa+uZ0`{o->00000 LNkvXXu0mjf#ZWTR literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/nautical.png b/Icons/map-icons/square.small/nautical.png new file mode 100644 index 0000000000000000000000000000000000000000..072c8adf86a0f089717750137ccc688c821ebcec GIT binary patch literal 1166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPmhm<(KRs5`*3JeS^(w;7kAr^v+0xa);GXj+;q@|_R zySTUj<%kD+_Uw5uYu2nr7LexB(o%=i)YJvUYiD4XJ$rTnNIm1KRjc+-n>OtLh(jvK z%F1$J!ly|@L`411pFbS<)ZjJ1#>R%{)~#EL_zYmdCdtamD*p88Q@?NDzDa%m{+;2@ zojcc6R8%$s)&4|RkKqDFMn(>xh6JESX&D(A#vea^FbW6=XkEN`F#=sPh>zidzkmOl zeE$5I^Xu2I3_LtM4A$1x3_t@IL`6jv|NZ+X0kq%+vO#bIfPuxs%gbw^q@<)95)#57 zEG*1$?%X*Bb8~Zs$B!Q~@bU36{Qmtr`2PL-mpC{$4#NzA8^FTC@&)MZBR6l}{Jwef zW?!I9U>B5>lrYShGlv0a_*EVxM7}K{Q4f09|tS%a<>Y*xA_`fNX|WuU>%- z0*akN*NoKwkf5HP-h%h<-ya0J;_IQL70(Y)*K0-AbW|YuPgfvCJr$bjX>+0pMgShC9V-A&iT2y zsd*&~KAFj>dBv$#3IU}_Ihn~W`MHUid0g#ltDXYwm)a7g zdpozle%iCip~Bx)D_B20kN7Em@SU7VW14Z8UBd&W9dBhE87|~L|CwB-!06z$-u&$! z&j~7?XZ`Qw9*z{_l=`?sqpN?_Dm(M_dei^UjES8UsmXbJhD&~$$D*`v3}tUD>KXH1 WEp^PeG{FcMdJLYfelF{r5}E*77N~## literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/nautical/aqueduct.png b/Icons/map-icons/square.small/nautical/aqueduct.png new file mode 100644 index 0000000000000000000000000000000000000000..8d32124b61ae687134ec4d76a3259e3373f41f8b GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4Mt%>Yq@DU|LlQ6CMB*BCC>S|xv6<249-QVi6yBi3gww4 z844j8sS56%z5!f5naQbn#i>>b0i{VfnaM8sxrv#1T=JXDZUgoI^mK6yu{eEnvZ3E$ z2Ladn3R0_bH|QMATk%rR)ymJ|plA`Fd{dWp0gH=pVBi81G4_twh{tKSbK9C?bLP0r z2-tA;dfnSUe`nb%Go+=-6uP*mh<1B?ot(z7H~s_cBzxw|{TH@Pu@l8ONNRx$9RwpBz{DT;^W2`NQ8=y7d`D_p<9X z?)KQraQQL70(Y)*K0-AbW|YuPgfvMkygZ29+CEW&?%fN?apKobz*Y zQ}ap~d@_?$^NLfg6aq?|46!)PhSg8|D!d*@S-88!Y+oW+eo*hndIe8jF0KRX b-`6l0tY6B}+;im=&`1VPS3j3^P6k}@P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tc}}5pb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ioj!8s8R5;6}lfgfD5apUP+Bs$jazpv z#DxK$AP>+-h%UtE$ij`_N+@lT8Z+@8H_l|*N@?`KkhizZsYbJc+z0n;cS>*Npk7&F0QAY^f^cayjgDI(zMQd#~5)ZRYPk zOR!uh1jEbAjcuri2)^&TqtU1mhGFIC==vR;?~0u50=Rhs5n(tS7J?x7&R}r*sZ>f- zm0GQq4e$Q`?K-?)hX;L@Ac`UY4a3kHV@!HJi}3^ozu@QHUo-H1zc3z;6M!U19z4%; z{`?{b2R|-g=|nX=$+zH($Q#e|ToIW9OCnNrUDt6O$5yLVn+kNh-HcdOGXh($*FQ`q zlP^FFYy;F|nrm9L-!HC3(d}pW_Ai295lTf^ z0akUkR)A7bb#cL3i?vo;t(N8qL{)WOALRXD(#^bHNX;a#weur%-^>jFP|KG90000< KMNUMnLSTYw0`7AF literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/nautical/turning.png b/Icons/map-icons/square.small/nautical/turning.png new file mode 100644 index 0000000000000000000000000000000000000000..ec27f1e09343fcc49e8196dd244f1321be940277 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4Mq`OGx1AXqpE>ICMB*BCC>S|xv6<249-QVi6yBi3gww4 z844j8sS56%z5!f5naQbn#i>>b0i{VfnaM8sxrv#1T=JXDZUgO<@N{tuu{gbUvY|J# zqe#nsOQtHtuQxjsqM{`sf4Mq_@VSNFno@k(uNr`JjiF1B#Zfaf$gL6@8Vo7R>LV0FM zhC)b2s)DWy`d&1|(|HzUKY zY{+`vJk$LDf#1*PAOFvNVB1et6;DSU&EK6j%Gd;03pEyLGfO(`vHEVlGdCBo#8w2dNP0YPsp8et3LxWwKT?bohzsnqP5UbUn#pr%uV`5dP2>pKmJhXX?Q z&eM+2nRG;7aogJ+&bt{ht>!c5Y>Z)Aa#AbqwWIl;W|l19q-$H!&CfL*t(SUU-gAEX VB8l&OzQCYh@O1TaS?83{1OVy_sfhpp literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/people.png b/Icons/map-icons/square.small/people.png new file mode 100644 index 0000000000000000000000000000000000000000..d00ea7ceac386ae717b82e7e9b1c04d0e81875e2 GIT binary patch literal 504 zcmV}XZwZ1yY8r+?zMH&h8YauyS8gMS#SC53F8jK!yTF>JK@hIgi538$SiHGE zK9y&l400UTFmSH6&&%>kEE=7$b>Vp)0MO|yPS+3~-(hd0img$A(CLk?gD!$@!lIjA>7ocjkE`tEW>aSj ztZif_IQF}AW9_V z&_BTB%x=aPy5HK@Zj^os#E?%-qmH=M-nXxG&F$}lRx1h{k+r8N0uM*8H1~Jvq?&pf z#}8Q1-L)5uyNpO@Z1pdmn|3A=s3zn;6-pVyU3U zwwgn_G4E*c@X;SJhJjcH2n#jRg=`M~yoh5BawwL01d~PVY3T*3(l8i})h78l%g1-O znVuuBzbTb}k+l{qy71EcY=j82aTvE#h-DUGwe5qssS8TF7BknbgApX?=)9>BQu^Am z8R*r^r4GZ>xzx`vo(#tkj|!L!{({Hjfk|6L&-noiPE8@1l|!dBNXh`Y9OT03kw}yB zP3F#EfV}*WfYG3b)9J+BdykQ~w!z_WfTk57>myhPCr>ZW@jlYuy$ShQG51)fjO1p_yCt*9^? z=E&HW%klnG^NX7T03ekDS}j&I8mzRmB%-0v#bh?MLj_b(sZu<5a-fu>>GdAAd`#3< a&-o9*bNI8$#u~=}0000xn}Z2b@Z1`~gPVQYek ziO~%!HPM6x2~}RLU=$IggdnsXnRcermbo+64JDYmP`t@qo-esK=YVr00PwS1&XFJh z`0z0F#YLp?4~Gz30|0U?&CaI+idFH7gK@pcImp6_tXM44RLnAhPn^OeTwZ ze4tvcBVt`N%YIMSz;u7+>khZPE~>EtS$k>1)NQn@GD_70%d@KD{kcqyjzWs%YD6MYcY@g!XC!%jbQxNZN&SAar5pdLg5>&Gc%p-^&CC*Ch$@j zw$}rPG0>mwu$p)9_EQG4+s{yP_hA?|YV3gR?hdpy088oSP_#=W0%LHA10pa;M1`T< z0b?OZ)CW-ntl~#Q6eZFC*jx=basY0*2EsTls1bA^g0YcJ#FQx9iXWC~;xKp47l~{f z)^jJH*yLF+)oKnrK_3p@eZYEJL#5(H>eUijf&^8Mgd@`iVKrxbeDy~IaAm|YUN5h^ zG7S1;Y6^-RMCa8BgqzP}J9`MiYKRW0Nc6bG=bLjIfI-7C4MS5Cp8IvPY*2bpkBUNo{YA!?NE+^7;f~9V!SRpag(GAqW)IUeW&ue9lNM z5@iVb9mtnDO0BVP`o`u1%N2VSJKGx)1>=a?X}v%Ce*d>h*Q>1MsQ2;1U{CiT(tc+rl?g8%>k07*qoM6N<$g42I9n*aa+ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/people/empty.png b/Icons/map-icons/square.small/people/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..efdc0f5157fcee10a2f2d96b0fc37d2152531923 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMkygZwzInn*8zp(N?apKobz*Y zQ}ap~d@_?$^NLfg6aq?mdKI;Vst0MO1!F8}}l literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/people/friends.png b/Icons/map-icons/square.small/people/friends.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5ecaa0eea28a75c842feabbfc2afddda898475 GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPmGdrh@*_RtnHZU+S#(KIqhFF|VPHAZP&+~-Q&27fB z|NkZVCak#J2m+llXHQhkkkDY!IWgz-bk@q>ze`Qx_CI@a)-3MptSohZ8>?Fz8z0)AvCPcecFcd?hYyETjvn1#`}a#{@893$ zVmn;dt@D=?7mM4+&CM<%Zc~5m?BNq9IG*pXI(n9uKTD(H8;=qjvqqwV_V2gG%F4=z z=iApC7yuc}K-}DPX!>~zUJsu=b<=16exIMyc=XJfGYZO|zj{a9n7iD9*TA&)uc7hh zPrQnX)9gzNypa@72=!^;q1GSpo=TWajPj_1abA95CUrzK@T?gX8^| zE?o{66}7KFF5TNPq3+MK=l;{8yTzqf6&L*Z7aUXbW!0`<$Jeu5W;FWnap(U}-}BSd zEO+|fFDbcKdu-;CiI*8AEl)ObS|(4JJX1pR>^X)n_d9o_ZL~fI40{GoS3j3^P6-pZ#?{@42@zp@|`lp$05QuvMwW4*UV)*k4fx`7!GVA`!t9C5@Pyd+t5w?5_^aO;BhTY}RHE9@bj>-R~ALq5!eB#;q(vWEoN^M3y0x zLI5a*@SX_JwnXQMZA)mHe(xOd?OT2YqKJ`XbCa88iOMoWo}-EaX$&$=5mNS0fDnjn zOSG0Sof2jsnUE`)x!g$=D>E&gT(Fk2t=+Ov07+~@oou(*b&`N<2h#1e?^G$A(mx=OmRfEf%hRYf`nCP{)e2BkG}-Y(wbog=g@wrQ}l8TRxPJDK!(JjUvk z74p%DWHchJD$+bB%Q8%okZ6rk3VBwc_XOu~U5D*D>~u;u7|_)Z+m~49MoN zys9=9lBE68xf2Bl?;+0-O7%Jv0tx!7Ja>O8MWS^~v_@%-G6toqiag86mY0{VEG#Tu zS1K!ou=>uOkrcfG#qRDu_U6q6q*NwGVqMppRaISzkq{%HX_~)ZzI^qw5K(AjNWfgU zaN+ZBrIbn2%;d9YwbeSH|xG^`&S#D(>B zoR$*t^r^kHvC-+GNO<`0Reb*3qBT5v^aa;qXZ474q)RdIyxzn5*!$%R%M1Cf8Yq4!hH=AMg z@iCJ$?Vs7%lCrljKnT%8W9(&f2KAokJ>FWpwYav$H4Rq3d&gvM1aht=DJ4?t|E%tO zj^0BE1ZxR%pr6ff`tXoCNqW1|8fi>lm6V@);l~jIF@(PLw(VP=dt(qWvUvYKUmJr= zk{)7A?=VVz3iAF_sP{d%>w43D@`T?-jFf=5eVcER?NMQuI$%Ygt&x679X288z^Mq>Eak-aXLB0fgzdg)PYDgAaK)? zWHX;Kv8&C{00ayJBzvSRvL38xT+DXqxWg=w4Iyip7#`hZ3IBXXyANmvgQu&X%Q~lo FCIF`vEn@%x literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/people/friendsd/bike.png b/Icons/map-icons/square.small/people/friendsd/bike.png new file mode 100644 index 0000000000000000000000000000000000000000..60078c91f6dea889fdaf07d043ef6f354fb1b87f GIT binary patch literal 1232 zcmV;>1TXuEP)G+V|j#`p1+!gCJS_gG`F zZHujIT-SlhGGtNUkH-W>L6qm{(TFrn$>SL9DS}xjR?e`S7c7-RUP?6v+cem+q%X_i ztVSbLmf`0);b=sBAvMvO?9Qj&;lZ*y7`>sse&m427@X(fIfv~!`li8@C8jLtw%Y-! z@*GtZ129R5v_?k}Nfe>KdEY-O0&5R54!`=`SL1!|P4~=c-_tb>Cd+8cl4iBSWEn~ zbL-om@N{=~=8tx^hx>to{ou#T#Hg;rT8lM?ew@11_sjd`A09af zTTz-{%J;s>!~gm}ebK9DU;F;{2cO?cAI<-K<>a4l&;In-#~-#WZQIf{4SmxLo)oXX z%1aMFjNaQLolMBi%HZm3bM=YcVp$(wfAGIBK*5mZzQ?pJOB|zc-C~wY%zREepJNt_AuYl=lAAXF(U&L^wwX$m3(4isQlUzyJC#?O-j= uT3pi%pF&w;tBQWR#cnp(Z@=XPu>S}7OGQTGX93ax0000?NMQuI$%Ygt&xE->>gG3KX*Nba4!^IGvp0z>v&#>OdqL5V&bc zvYAhr*wtoe00M>ql08xuSr1k;E@r!Q++mi;hLE*P43BQIgnvGx-3K&-!PC{xWt~$( F69CJwEz-pZ#?{@42@zp@|`lp$05QuvMwW4*UV)*k4fx`7!GVA`!t9C5@Pyd+t5w?5_^aO;BhTY}RHE9@bj>-R~ALq5!eB#;q(vWEoN^M3y0x zLI5a*@SX_JwnXQMZA)mHe(xOd?OT2YqKJ`XbCa88iOMoWo}-EaX$&$=5mNS0fDnjn zOSG0Sof2jsnUE`)x!g$=D>E&gT(Fk2t=+Ov07+~@oou(*b&`N<2h#1e?^G$A(mx=OmRfEf%hRYf`nCP{)e2BkG}-Y(wbog=g@wrQ}l8TRxPJDK!(JjUvk z74p%DWHchJD$+bB%Q8%okZ6rk3VBwc_XOu~U5D*D>~u;u7|_)Z+m~49MoN zys9=9lBE68xf2Bl?;+0-O7%Jv0tx!7Ja>O8MWS^~v_@%-G6toqiag86mY0{VEG#Tu zS1K!ou=>uOkrcfG#qRDu_U6q6q*NwGVqMppRaISzkq{%HX_~)ZzI^qw5K(AjNWfgU zaN+ZBrIbn2%;d9YwbeSH|xG^`&S#D(>B zoR$*t^r^kHvC-+GNO<`0Reb*3qBT5v^aa;qXZ474q)RdIyxzn5*!$%R%M1Cf8Yq4!hH=AMg z@iCJ$?Vs7%lCrljKnT%8W9(&f2KAokJ>FWpwYav$H4Rq3d&gvM1aht=DJ4?t|E%tO zj^0BE1ZxR%pr6ff`tXoCNqW1|8fi>lm6V@);l~jIF@(PLw(VP=dt(qWvUvYKUmJr= zk{)7A?=VVz3iAF_sP{d%>w43D@`T?-jFf=5eVcER?NMQuI$%Ygt&y%vIWme1BEO+T^vI!PA8{0FeI~`IuOYQ1a4ZA zZ01uYcC{HAfPi6uWRH|Z)`Jy|i`gz6cbFxzA!IER!=sxl;h)cF_W{jd@O1TaS?83{ F1OP`fEI9xG literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/people/home.png b/Icons/map-icons/square.small/people/home.png new file mode 100644 index 0000000000000000000000000000000000000000..44f1f2dbe34be4a178ae48e25ef768de77692234 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4&HkfC?Kha6CZv%n*= zn1O*?7=#%aX3dcR3bL1Y`ns}T%<~no zCR5KTF*6uD2Rkt=S(oQo_xxAcB#q?2`+P;`%I5_ADse7VY`KuS{FRgD)4t@MWLBM< uvC3Z#ZGX3W>szbmiBIpRFWUcp4|AZqUdQ%D6*qvcV(@hJb6Mw<&;$TYL|h60 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/people/work.png b/Icons/map-icons/square.small/people/work.png new file mode 100644 index 0000000000000000000000000000000000000000..f36ad6bee2b95e76773488e3472b918d38168195 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(|FkIN`$@f1n6wfk$L9 z0|U1(2s1Lwnj--eWH0gbb!ETGBOoBb(E52D^n;x`0 zs3AR2tzcC}Q-zqc&ecNUwF^ZW8IE`KM!fo@`_ccCe13&;FncnWW%?u6Wy~+KPDJ~; zEB{)2(8hjl2g8HC>MhZGR1}nSPD?SiF^V5*6nD`3?{oR^%2zK>UW+>RQLcNUy!Z+& z&85MOf1A>T|2r(WZ~e!cYeQZC#zmg%Zi_8m=Cf?;IsH>5CespjO`ZjGB7>)^pUXO@ GgeCwT!e3DU literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/places.png b/Icons/map-icons/square.small/places.png new file mode 100644 index 0000000000000000000000000000000000000000..e8175453287595fce65572d254e740ba69ce8bc9 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkELDpAI}z{3AOW~LpHRtdOoWb`QPw99G^#arAV{4S>!O_buyQL70(Y)*K0-AbW|YuPgfvMkygZQBPKb0-%swiEBiObAE1a zYF-J0PiAszUU90GLO^L!PG+)8er{rB9#{L?s;5Aeww^AIAr_~T6C~mu{I6$IQ@Zj& zAjrX^uTx_BgcJiuXOC+=YbH)eQ;RyrQToS!lcI>Lvf;Kr|IZ(=I`fI2;ee*{w>NuN Rg#!&@@O1TaS?83{1ORIJNM!&3 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/places/settlement.png b/Icons/map-icons/square.small/places/settlement.png new file mode 100644 index 0000000000000000000000000000000000000000..29f605e085aaa70f22b664f8cededae0e8165e2f GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP`BNw-_W@3#$KLZ0Jo2QFoh{fr*K^wi89R=pzeIxTm zE+(P7yG3<@>!nC9uA})LFWp(J>kph;FYt%kdSie`a_+*g_5v2BBC*-CtIG~~799+$ zF*tkX!?Uw{6n`BL(^$If*o@R!%M6a`Obxp1Tf28Y=i1W#j&t8Hf2opl`hUgJ>f1dv z!+CqxT%RBHnw24E?wK>2nX|iH=PgcT>$qU>xXz;G`#yz5p36(J-`>8Q(Q-_p;f1wS z@&^OC!q=_CJ_^Fv%Uw VO7m>!2m}TagQu&X%Q~loCIAGDoJ#-z literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/places/settlement/capital.png b/Icons/map-icons/square.small/places/settlement/capital.png new file mode 100644 index 0000000000000000000000000000000000000000..2e0a7ecdf67d1c466356d99329b2b4b46a955dd3 GIT binary patch literal 586 zcmV-Q0=4~#P){xyEX4|7wnZ3-kjUKv{x2QhiMFSMUUQZ5IdD(y!iwXCxnrXaF!8(Yhbu z6>u$Cw3QQXCGI@WXh{fr%lO45P5=GkPe@=C| z(sD^x>ZDV!*<_Q*2`g9rWEJb$x^?c2kIXqb>4uw9b!UEJPYVhXxqHLsX74c<=e=Sv zvBuYPr+vN_{k)`VzTflL&GRnrE1t)`l*fc?LDNj554$qTwxmBh+IC&Ib0y~v?WR`? z&dXnSbiJTpljC4#RKpi1l($;p?_;eDwm-4YgJc_2H(yHhvG`z^A$87*Au_|JoUwvE z)zR@BtE*7k@mmXa%C}$T_i6hTf52f!=S0TNfcxSizMIoxrKC7{^_3aq4B6;ZX+Qq| zx1ZC?ZSZ)~j*5?u-pB8+tCX=UYFW5{|NdvEr|YY`CD&|VVzAFud))cxZUE3q22WQ% Jmvv4FO#q2oQy2gM literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/places/settlement/town.png b/Icons/map-icons/square.small/places/settlement/town.png new file mode 100644 index 0000000000000000000000000000000000000000..29f605e085aaa70f22b664f8cededae0e8165e2f GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP`BNw-_W@3#$KLZ0Jo2QFoh{fr*K^wi89R=pzeIxTm zE+(P7yG3<@>!nC9uA})LFWp(J>kph;FYt%kdSie`a_+*g_5v2BBC*-CtIG~~799+$ zF*tkX!?Uw{6n`BL(^$If*o@R!%M6a`Obxp1Tf28Y=i1W#j&t8Hf2opl`hUgJ>f1dv z!+CqxT%RBHnw24E?wK>2nX|iH=PgcT>$qU>xXz;G`#yz5p36(J-`>8Q(Q-_p;f1wS z@&^OC!q=_CJ_^Fv%Uw VO7m>!2m}TagQu&X%Q~loCIAGDoJ#-z literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/places/settlement/village.png b/Icons/map-icons/square.small/places/settlement/village.png new file mode 100644 index 0000000000000000000000000000000000000000..7df96fc5f65ca991292f334566b3cd2a4d099d2d GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP`BNw-_tiy@jyMRJ-JY5_^EKa|jw2`;jfyed#_OrPY z4D*a#W=3k{Pt{=zSz@cHtxz}Xf{Vy>CE4}c=Fih%7Oz*`U0qndvzl?jY;(`FNmtLf z1ijOnWV-Zl-j#v=1@q)}-bC5- z;z1bbLA>lBIz$ldNp@&;h}%kwEd8;TWKH7xro+=xR(-?!yy4CB{d}J%@I1UaJrxS- zK>(qAE<3}{2;VAY@p!|XWe2@|X(|hsKT9hw9{7X(zdWgY zQ}skN_3?G<86c(d*@c9pp>EzkH`H0e_ME` zD2Ltv(f5?bjCg!NqEvJ&%Vi4A(2nj-eB}4=Nhj4?{Qw8 UUyzr^Z&bK@esVgyeBsvoAMk#$i~s-t literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/public/administration/court_of_law.png b/Icons/map-icons/square.small/public/administration/court_of_law.png new file mode 100644 index 0000000000000000000000000000000000000000..dec1ecd6c9903d583ff2e2e26a5257d28574b63e GIT binary patch literal 982 zcmeAS@N?(olHy`uVBq!ia0vp^0w65F1| zJ~C4-ZE@_{-Rd{XD{Bsapa1>Y|N76hO}q`u&Yb5u@ZMURslo5K?ZQ~b6Df6q4Euh? zM1(OoDSkb;*!@*i?caSoB^(TA&%R>cU)9RoFjv-^@eG>s za~cqexfbreo3}kWFo=0&q;q=HpZffw2MOuw>wiC3=3MC+H)*=V z9I@p`GX;DXd73zC2zs>$2}t($xF1uT>Z2O$Il=#F@J|t?bsgG|m~wl!xkWSkx`SZA z&1fLxW@|o}V9*fud)+-<=0jZ@l-4*HNbs;Vf7tb~^zdsogKv_*dujthBY=?O>2VMY zn4^78^!bCDM?lEr5-8#-xQY8_>l>yWX|bEvMHWo6@}9f&K)k%c1nINA&)gJW^;j+T zyK(m(5VqCT@85r)U-d2sI<)c3{4etB!$an+XCG{>S{tXmrgR+;HeJy%^*;OIChy*+ z*=$!N51+gPgfdfdrvaf;m4@vUIVKs4du-2RZ)`~1y>7D9Qn!_YI&t0CAFy>j`x@H2QWXCo4*NeZFmpQCApM5rMv*e$;{rBIuI}|Rk z2;liP!#1t|uGqQ78C!u+)JjISkMH=`eG~MSaKBWDlU?5z-kf>j%at!*Cf{G@H2=T+ zd|T!V$L)CS@~iKK{djus@!nZ`r7Skji9Dy1;3GBpn2ODhtuI_Ja@%#3ysdj%r>nBh z&&JcHaaT#~E#}T literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/public/administration/prison.png b/Icons/map-icons/square.small/public/administration/prison.png new file mode 100644 index 0000000000000000000000000000000000000000..98e611e615833491cefe34fb3647f8bbd2bd0dc3 GIT binary patch literal 800 zcmV+*1K<3KP)wE`=f}X%B*4aiZBLQ~FFgstddbaWLm^2?t;I_Z8py$b zY`02_bPpR`nk>77@i5tJtAu*6_%7ePZnM@|+Q>j!cl>$RG zR6`9h;E&t6kDcP5?KBabxKJz<3q`O8>;ZcKmV1_amV3aQGN;Tb$Y!(IY&KkH#?81H zhvG>-Bman(NK=<~q2p z>$+};0q=R9=XpUiWl7?dhku;`RaI401uddQvaF+e$Ed{$*=$r$Yw1?r^Hsc-GqILx&9X_68%r;1~P?I0+}=B;auJ zaPn|6{1sl_%X@jShwLGHD2x#Bj^j9v1JUTw_>qXj_)6=d@3#f~Oab)1x$sK*<#M@P zE`vUyPv{fjo#w~#WBD;K(ni`y!%TIiI&&!P17_@h)ShWsZ>G?_~V602w8xHux&*FaWmLA zyn+%NU_F-3r8XU#j!nm=q5Giwp!*;^Nn$mznplNsf3!c^e}p#@M#AX)3S3tR`0=Ps z1WKgBt-GgFiW@g%{I6dnZZ5Sm5OgQmB(Aw!TW|t+6wxroyG&5(J&UptRokqpXOKx3euAE!Tx#ql}2psT& zN+rt_H9I1R%p<`$AaXdD_w5gLDaicG_5AbhegAmBpJ(6ivq!N3FxI_R0_?n6sQ^Sp z@r24M0o?9F1z>K1QXv7(p1u1JAAk2=Tl=H{>%nA#$VlIj@g5lYQ`^|J`7mOB+b=68gSIY^7yA`7HnyjZX@SbZ#$ma+P@UOa z_Es6QZp{jR!BiUYmn+)b0@3^L>*;y|s5$!3ekI!W=sGrx7!5KD{tLDKNJ?d5eK2dWvO9E=-vMeap_hwOV&7XW%?AoS%y zZ-;#WL!57HNxTl0Iayi5-UH)|m~*C2`%bq~sTAMPn?9hy3NriGr?QZ)YP#L zKo&ewxd5AD2UW$cI|2Q(-EO4{;;%L4`lmu%T+5!oQBbD~Aqzq__R2u}5&+8%x_v$& zz!Z7Y>0J&nIjz4@2>w$22^?@^_ux`0Aeg6nC_hq$o*DQJs8vtze(^Xwx2%1MQV5gE z4|N?r0(yN%QEMlNQT|e_aTo3l{eJ*@JvPv)lqn($m>%2El1w3tTySZ*!gtR|)Tm4S-{%#+2+1OVSE!$|-f*dLk#drNX{6c{K= z&-oUBbSi);zA^4a+z6@eS^$2#d3Wb5_-ExkReCL>Jq0my;qRwh(dHzG-Y=$WyFg8R zeE$0=RTcsjVei~o0bP4@(wjrU^7)2h-#NJARcyfjxsLw@j#=Km%zx%H00000NkvXX Hu0mjf>T5rW literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/public/empty.png b/Icons/map-icons/square.small/public/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..4103e40567b10304c48d302be5ba29bf6c413e1f GIT binary patch literal 1166 zcmbu8&ui0Q7{|ZKo4iT8)wZ^#T`Jlg#%@+oa0g*dJJupj87g>l-j#v=1@q)}-bC5- z;z1bbLA>lBIz$ldNp@&;h}%kwEd8;TWKH7xro+=xR(-?!yy4CB{d}J%@I1UaJrxS- zK>(qAE<3}{2;VAY@p!|XWe2@|X(|hsKT9hw9{7X(zdWgY zQ}skN_3?G<86c(d*@c9pp>EzkH`H0e_ME` zD2Ltv(f5?bjCg!NqEvJ&%Vi4A(2nj-eB}4=Nhj4?{Qw8 UUyzr^Z&bK@esVgyeBsvoAMk#$i~s-t literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/public/firebrigade.png b/Icons/map-icons/square.small/public/firebrigade.png new file mode 100644 index 0000000000000000000000000000000000000000..0cb2bfd2c779c28e53871a5f41097990307c36b1 GIT binary patch literal 1099 zcmV-R1ho5!P)OjTtZ$3N%ZdoErs z2#Ta!Ac2cYLq&4YcquL<(ZX5Li{hd{YE-kN7lS1tDdti%1`FBj59j&kv)}W5&hPvEo%3vuU;rR!bdLn^O=pb& z;OfdfdLku&(b10ufFxg`N&+w%8iT6RgP3?{8ZA$ZAMWPyOydBow$l7#4B@ic=$AiEo5}*p0o}+0gap6EDX( zDWc_mD|%$QU%kr!w(}6ROZ|l{6?$K)yaxMPhWp|>;B4>hO#SPy=vrsyl``;35lSor z@X_w_;{`czL?;~W%mU-D0iOg1+4~85W%?%H#V=U%*h8+`P?&5K)z)obJ9J~S690Zx zZQmH!1WQh19tb};ba;ONnZKMIE(!$i&ue}>(*}MXgT39c@S)oD#sUjGmnasBuK|K3 z*^;a|IBgO=&lgZegOAa3uYVXgoxYf^*4dTz1ygmpaR}Y&P}TAk2usDZRdwJU(zLu@ z4?q%0;MP;|W!ZL!FzI*bT0q+2JLnr|?=q1w?Nd8X0B>(7Ej_o^Sp)q##i1NM>0tIL`jD0&208*h;CXLudM@N}Hg>wR!-UIOd z8YF{c08lhI90d^bw3#40<*AIxg-tf+-72ES%dW;j3P3ZVzXh;! zaZT9V0LmriPV-?XuU|H-KLm|$z2letJ*c;-$HifI;ZjlVvF3q4U~tP{rda_rmjT)m zL_t(Y$HkR>Ow@H8$6vqSaUBN; zh%k;j(BlyC2{;TT2;+d16(l;`bUMh&W?Ey59>!>tE~A>W(KI&c0VYXpvV}wutm0`p z6(*((d`OOsj^j~|K!W4W>yO`|8*pp=;r#yd+V}JM?fZUzKA+#dU%>!CwB-W_K)JD5 z0PywY5v?Q#fW>k|0N58QG&%q}I;4PBEA6jdeN+aL1pvKXD!8{-oU7P{u+$*j(E&@X#3U4#O}OZqwgn*aiI;Po38|$ zx(B~~B1_X}?OUP$`NLD^2X4$45*OEZJ1Q~sv{U$!GjU`jCVqD;80_+}e4YPX2jp8O zqZ15UeU!>u+arEVe^qhKSAAh$^-H?hp=}8r+mlp*Q<))?5m($37bq=mKukFwpJhu; z_i&T{^n9An*KmJgws2GdYF&7Ee>2?mnw;@6!q^wX*LIeIy-YSPY=!YIyQWtL*#|Rj zu38FfUarb5>htOJIM?TObHkDr>HO(+E)6(t1Qn@n$xe=Z8CNnRI$lqaZz^uvC_Igy zl)vXUbz7kX_i*oyd({w>qx zeA(p)gw^JPfmM#E)x)j+w%FOTliGV1?!WUe|I5*qs$dIzce2J^RrE04pFUV(8-`7x zoyP({0->;}ws~g$>B>+3V+67kiEDC$PWY8;HYtj`_Lxcs$SnKyztr;>$wlr9hVQlJ!vV?k920T2Rx@8MS z@OK_S$TxHQ(Uox~^)PrAc!;7NmNa`Vx67gSOk+kuIaD^D+qP^OsKx_&)e6u&qiPb@ z!9bgL=2$5%*K|IBMzg?xT#f-`Ez=F^{i@eM5w*7Fb|nx=1agQt6qaND9_p@@9Vj-! z?_re}&$omA`r4Yy*&quLtA!j;bjAH&_4nFwl4+CH{N_VqqzZBNJ0y2wiZ0QcWM@IK^4qKSXX390{CL+y$ zu21)Vd&xS{cl55X#kNAb$Kq>EpDOcH$*wEU$`WN?HT}?YUEu z7en3V7ut=wp=p83nMD^9(kv%0Lwd04fz**lri_8;22Q0U`DxV`3tsSj@QNqRw~DddMLAL5*V63LY$EIDw2rh6qPa_&T1~C*3a`WK3PP;w(SU}iMikQ^ z4RRWp*{N_UfO>~z*|H4yjJ|4LHSl7qKwqE-#td?$TnW5RDY6yW09S!W?NI}_uFdFX zbU;q&YRhU1!2P0e8W&E7=Hw{e1bj5TL*`b_JP7u*1 zH_Q!(pP##|(P?zP`k>B}FbT-zP-7C4k}r|&nA3Qhz0H7<7PJdm01~R9nt#ma1iAy= z!XegWy$X4RTTK8Ue;M!G_HX+E^Zj&Hx(bMoN;Re$BR{%`mA|3e&;dJ-03aiS9WL$} z5DK9MqNYRxt_jx%RBPZWbCn%}@PTr>ISvpA@RVJ~-W3=y0j%9Ue98T_vqJ_@jyOdmiKZI^*gpOx0Bw$3N%X`$M>w z?iFMtgbB_hD}t+=Z32PR%|9$_W2+%s8E$MWUW}QshBMdJFju*po4st2(_Tzw&9$}R zxSCt3{UOa2$&JCp)OhP&UaxXFr$5g9MR8;GN6hojXU}t<-}8N*=XcJICB9=$Et_iqs_@- z`E0(c>cm}D*2y&kM?Ut{$zWEyDv?9%mD}Q!UIn1HS8ISk!0_yA(|yiqu8fawtnjXL zD6O~UWfWQ;XnnpW&Eu@r+QiMW-kDzK?9_Toe(qa~ZfGq8NU3$|YU>I4(ahCwx$BCU z__o&8v32K}fGl(DR_}7awU=kaA>n~jUE}A}dRTsG(ytE3f3ae@>=!@4X9t5jrZZ># zn~Gg6vR3wZj!)jL-JW~nl>WH@)gf9{E&HaXny0N@%O&wOjuJG?p7r*RL!s+hMk8~o)SkPpmd{dhRl`WDz(VYo757g^mo%y zX1KaOcKY{+j=4Kz0^H2F`G)!&Ue8K;S{?;;$T}w*;f__J4FTO}66!?`r00!ZnDIko zttwsiv6Dn=wcBoCz#jX6W5-dqO9y=fpTXP{9UHg5$C1di@|2JwEbYvc;->auGXy_gQ0$QvUYC2E>}$V!?;@zei0ygYVPU&zd7|Xz)X>?`{x8K zi&AiW!ve2JlewU_J^Kp+oQA>L1ur0?HQcC)DcH0>@W<64SRZ)E(Hh%ZQa}c7>QEgc0R{{0Na3k74pqKW&i*H07*qo IM6N<$f)38a(*OVf literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/public/recycling.png b/Icons/map-icons/square.small/public/recycling.png new file mode 100644 index 0000000000000000000000000000000000000000..3dcd9f24ce9e15a2546a3476a565f915198d52cf GIT binary patch literal 1250 zcmV<81ReW{P)uv$N&03drZ)kpxKz1`DLC_MX)j;AFcnF4_Lc+Z7RCQ1VUFdDrLAH3&* zz+txsX6~9Ll|5epLYU@CV>JSW`45UybpU0hc2HIT!*F95*isYu z<y!TL@6+Fk}$gtyUxHh|@19AY_vPxRlG ziOYe~bL(Z7n*o8s-Nbsrz&99{*|DDkD@Er-BUSPfp04z|FOy#eu5BpFSh-fAt`3** zuDBz+kU4x7KhJS5^}Ba`mCh%GQZ?`?l|N3JSYOOfB*cC!%qg2rh{Zxt0Ga2Xfks>a?yEuF zM?VFqm3yY%<^jPj@)@_}Up#;7d*)Rg!0Dtl%(+jb=?p~$oB{H-+|E*30B&X%`<@;c z86gDdUFT;3_bLE%W_orH^JeaD)eapHryFM$B}VUb1sZZCBhIJ?i!mSHk(=xzkxat@ z+gx{nTxjCl)r@TYqWX>|W0T~)=-k$8-OFi-q~GKo?5Bd1D=y{T=zCb|Ik&%GE(d^a z!=uc-_}>kqvoTTA2e_9IVb6AKq%T5c-fTYPEcS)@4WlFg|K~XV8`azj-fQu^dH?_b M07*qoM6N<$f;-7TaR2}S literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/public/recycling/trash-bin.png b/Icons/map-icons/square.small/public/recycling/trash-bin.png new file mode 100644 index 0000000000000000000000000000000000000000..afa239cf000d2938c535d7fccdaa60e90cd95770 GIT binary patch literal 1144 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 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/recreation.png b/Icons/map-icons/square.small/recreation.png new file mode 100644 index 0000000000000000000000000000000000000000..22ce666e1a8c3cd59d9d5f3bb7238983dca4d141 GIT binary patch literal 762 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4| z0U900{|P_<0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FK}1qe&>s*)M2l7-1a4~4qFpPO z{Q(gLT^8-yc7Z@FMKZB;q#V;mof&7o@$I7kcvYym2~?EBE& z9i5gFg>uebK3bT2_~dv?&uFx1c42{WH)CthPi2R!fevRaE!~ZeE)E}_okwC&257h2 z8urtbjP8z0IP>Ld28hOg4+_c@)cK8hYb6g--}k!86wgtRjiB2&K0H88x%M&qxHG3`-VPE)AkWV3#P^E8awNumK-IkOp}^4&zi3jlm1)sRAAE25gMmRUDXSc*|Gl6a{l zUDp+dkBz=%XI%6+Bz+A+1CKJ9{YpzQD2@pb%CCm-l znIg^?BAlT_D;|H4{L9TXmKdd;V;Ec{OA?PP+SYpg4e*#f^fG{t#06Hk!YVoeo5*Mg zq@4h#F}TAFXEBIT;XX|)6J{4Dct-usBQ)Z3l~oi3ZMfVbMGA}C%yEtqC6wO*q-wIL sedV^y>eE9AHmc|F4^C9W#Q(n+a07*qoM6N<$f?nG}*#H0l literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/recreation/bicycling.png b/Icons/map-icons/square.small/recreation/bicycling.png new file mode 100644 index 0000000000000000000000000000000000000000..5db09ae5771ce0115f96b8ceab18699665ee2d15 GIT binary patch literal 921 zcmV;K17`e*P)$N%R(4Xtan zEpNU7tC<)wV?;BR2);A}vuNUiQwhslmW*bYg=nIV`AKoph;L+b8ybVbs2Ft?Q6a%7 zMK`nyGSneKUP48M#IzkyRA`^)IeusgiKgn8#xMTA-Fr^%|95WAy@!CM0A}|C+ZZVC z2CflcG9hAG!a#pNP(;8t(+F@d(A*r{uvmiY+qWYJU?m_mHCV9ACB`a#y)o@-C>Ebj z*eg6cYBj$nF2ttiHXIQ{p}2^46bQd@zc^b_D*0p6!UKeSg1+Ld!LK9^@ura;rpK9_ zt8>u5$7)62q_4?(C`s&?vWjQluflG91820^(4@aX*Ux<-{*Enu)3KVck>Q84Xsx!4 z`rG$Vp00@YG-uHQ!;f?=MHbmZBZ?!xCs5O8AI&fEZGcm16&uKXibl z!$YOIrR++M;q}AyFWbC&1MWwalo^#F>Tf=iZW#_E%KQcH%WYKN;t^BzHSCG=s;A{s zG{gA=b&dZRD+1GyM{|YC9xrvpJcekk!%zBqP&)JJuW?oMw4KDpaTkRBOuh6xCLXa| zfT@%n7C^Y`N~HgcUNzPFi!y%jQ|h=|ES&nCO5ty-0)KW*q3VHnQl)s~+{TsWYEy}* zI^ox}#9d}>n!<&?8`ztv^40%8#GM=$AAgd}s}l}!ivJ*|=^D9*y_EIfE;*yh!U9m1 zF9TboUgVk9@qD=!>4tQ^sJg}ea*K3kq8Bv{M`@0+B#@+?9eifAIp3Xv?14la zkP31AgA2S_?Ns}$=aqW{2YF4>Ol}*Arj~(ru~>S>Ul|=dSveiH2b7aJBg#Hct}s;0 z)Fi|St}ynhok|jQXfnlTszGi1-mZMvx9Dkpy3P0V;7$NQJ>0x3d7tVVZl==8lM+SS zX!-d|;z>*{H4XkF=80-`vDK+882lDGvw%ikKUy%b9YA+?=v|JI{OX&5TT(Aw@y;i$ z<|eN*7IA`d8EZ@*!7LwsO>eg!CRjj7_J|kchNGK0#l4*W>sFrr&1u;>(?400000NkvXXu0mjfsZz4v literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/recreation/cinema.png b/Icons/map-icons/square.small/recreation/cinema.png new file mode 100644 index 0000000000000000000000000000000000000000..954b5b329da92a0fb4fdb19d83893d99aeab047c GIT binary patch literal 935 zcmV;Y16cftP)kmTwg~5RF{r7$6%lACz{5b^R2f#xIBr`zPXP}4x?CtT-GLHdtIv|w* zq9zbP0Rt!$Js0E0_nei=e<$Ei0779;!*zA!?~eNio<^CpZlAdIaem5`TZ1Nh&RNr) zJZG$ZVE+YrIXzsm&v%6Y3c+`avutr&&b=L^z8bXTi|ay%jUnru_j~cGUdcBwCx`os z=~A1SV`u|X0Hk2l-_C>8S3%0}Qb=Dr%J|#Tt*6og`ii`k&HcYYc zr2>8SS9d>1gh&uDt4NSYNvc84tA=4ke+BxSK&j8r;07-yrS4`I zlv5jR#6VYx_JO7nc-_%ltbd9Zn>0_{V**_tv%>*)I3XUefch)$sauU95D9ta1DPOB640_4Xdb7QsxWrk--tvS??woQ#m772$Dp7?o67-my3V1eG`JCAP9 z7pV&zGQVf$Oln`oWb)s6qyUyf2b^x@0*ptLbdL(Si-sBOku2e?w-t@Pw$7D zNcu!{LE^h8RT6BTO+_W^D~jc@mHG%0TtPX|cRvHH!0K-;}^davBds!r^%!HWBn9+CDY z%;BY7{GbUm)=odKifG+6VZJt^W(>2`ruk9l1tr5}>_kESF@WXrKK>OWP-#1|Gqi=; zGI`awk5gKR7lS6Cl#wRoj*f1fHk94E`fGHUW8(0`T|_5Syg)2-0#G!}Vy^=9EPYMe zQN*xv&y>+KCq8sJZ>exeHGu< z;BP7SxwO)}S-Djf@KEvLLrW~_*s|Lw?dw0*-@pMte+Q9zxw%%oE;Oz|S|90s|M`M< z*Q{@_H4!&?!G@=Ickma>tyNhXA!yBgV;*AvO!@E2i1^>@_!oARTrtC|oD={6002ov JPDHLkV1k>>t`qGjA_}6S*QSjU1`(N- zjbTQNkIWc#T4)%IGL9gf-M#0#=li~ME}Vc3SQ_V4lDcM|1wxVLcP3MN6}jP_L1{?B;PleoLR*3nUbHb+5`lAdqD1WI(AZc zl!3zp_fm0Po#Z}ES1mgO<~=B(bsG7r=?IfwggR7bZX~UM z;S%~+leG~KCrUnsfaEHIYy`sApt1|3B^f_HS$X>%>W#+`;YYgmWc{yK-)1gNZux%@EJJ_1X`y2{> z)7O9sw4~yLXE;UH7m|-D|4RF3%BJz7Mw%F91kn@xK1*~N?bZA`N$4Ce8krZSA6d6X z@Wmg9*AqEH=MBnV^8GcDE)s3Sp!iq<#<7fg8_7OMLj}b*NmLOk8p)S_;`>TweWd4h i`VplpqYeJ&I{pLypsxlQRwq#a0000QL70(Y)*K0-AbW|YuPgfvMkygZ4Z++RkTG&4t`Q~9`MJ5N zc_j=!naQbn#i>>b0i{VfnaM8sxrv#1T(IY literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/recreation/garden.png b/Icons/map-icons/square.small/recreation/garden.png new file mode 100644 index 0000000000000000000000000000000000000000..135825cf217f0dbbd2efbc11edcb5eaf64802c52 GIT binary patch literal 700 zcmV;t0z>_YP));T(>}r0BSWpiya=Y+u^JL z8F~Spd7!h?E9i9I+-US2K%xLKF=s)e)TezmCp+S-i249u0jlR17fo-heCKp&@&5ow$K6|o?|~y>VyoT$7Xd8kj{1%cC}?~alrRn@DwApNDzI9ePIIUa z0eX9-jV~2Yk=l1HD+{DJcj53c=nHeyw+BF#*%FbH3qwP$CNaYY0Db9>`p%Uwc=Kz4 z$uxJpr$VZ0I}bM7x8{Mve-OYNHWvRn0B(I4s3~+We!-=bp42@?a6g`$bZ!210RP!S z;BI-bCI}4inyxepkVF@N^r%~VCmUqvl*-lRu>6(2f0sW{H02~*NSECPAQ7NjI~v#8 z3d1=rSHB*%7iqczPPp1cJ`xmLTu2Ei4HZ_3usI{ad~ za8_0@sks$MyerlMBfrp36VeuU`>`qwI+czJFxwua{++Se0lNUk$IZ6NrPf$p3lC) z=ks+{4uDFfR0fpJklQFl0M}Z-AgRv#*i!&Mr;~R`nA7fldVfF^7yUiI8DDBsRG;tb ibWq{}qfz+Rv?~wff00003{CS9gf&zqp;R5X(;K<0p zU|<08@Ph|T2p`kNV&RaV_k=^(vJoOMdm#2Q5i)@J5W^YfLyQL*7chKdT)-GeNImN= zhGy1Xj7BOfyX;h0BpVs>CPgsh$y~>!o`sNs3Q{*L6{G|lnPN`^`D^%GpbbSOv00!QMHTS#? zliAL}`u`^fE7M_k5YM~$OL!h%we*(>p3+~Gf}h7E+UB(~Mu^Ix9kp3m<8*hAv`V~?*h zEg4__wqz74J=3hR{7kcs#kY0eFMM0aFrWSKpCjyt53znf#4zvsp?@-jBNbBc;dB5l zpqT#uwPHF)z2wwu`z5CeO#I3xKKCo%5C4nbM0Q^M_F*Amiz##f^#H^HMCSrp0VYK4 m1gj)y4Pf>_>}4G2>KFhjArEBzwG?{*0000(L_t(Y$JLcjV=%wCU9-X| zx>qEv<#cUXuBq$8Dy2fCSkd`*&i{Fy^ZTFY!x2CW%(KEi7nGXdo&ah!9*YDQSgo*M zfUF1s?zo_-$z2ddcdpla4j@s0=xDcLNs^B`b~i37tEsWuwOUWLub6i-{g6_UuFNeL z3cb~8ndh8NEdCz=`*vqs?)i?+VFT3-DmdM43eVmKX0zjll;r_{j?97TrYX>U z?$b`A@n^lI#9s9vA1s#7bzK{NA3*+Np*`$F>@yXd@9A2T=L8^Oyax`aw4|-n!|~>@ z8Ff!V5=%Rm`+%*|;Q$a02zLQQ)9h@W4q#V#bo4j?{wov(nn2LTYF=iT039y@?AKle zUDyI%2Yh^{7Q^KFh|VNAu=ndIr?E~J2IhL3%>gtwo3{YS{bf1;Q9E;wGYNPCTptHO zb3&OMF2Q=lLGT&yP+Y)g2DA&hQXMl3aS?U?_ED1VD)Y zKEX#5`hu%5p{H`*|9o&Ldxte@BM1twr6ae&E5@%OCwNq!R47a9^MjC*AdS2LmfW0N zJv(eImd(DoMW zMsY)D1UPrARNiZ$zaquA@3JUDkqh*C;a{)gFAgmJ*47}eJOBUy07*qoM6N<$g69TO AQUCw| literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/recreation/nightclub.png b/Icons/map-icons/square.small/recreation/nightclub.png new file mode 100644 index 0000000000000000000000000000000000000000..769171b2d60e1896093357d5f640a1e308de92a0 GIT binary patch literal 693 zcmV;m0!safP)92ls1^3}>k2w8-fX$5zGx z03GlH=;ttssx2}A^vPW<@kE|Angq1wYlJ}E+fS0HS9=>+_06ShGG?UJudD9|X=rh*MI6(~aDkg5`rQ#$z1VZ*)s>&Es9Cn+Y&M{b9Sy$_W zyvJr^m55VKTT?8*s{jBz+wTpRaqYCJzM~+|nhY7Rsv{ zDW6NR`xMG=C;u_Rfd6xhx7HGxNs>h+4@P5Qa@2q`lq1n(+Sqdk&l^6 z?E#~J7_1Ib@VWH6Js%eK+yMYwyBM4~ui9LZXcJKsg}-NFQe#ts zL`;a#5vvqh%(xH&5fjPIogl?U#VopVBVwVOK!0c{rVH)TRaFoP2nw#n2}oAO22=DbaVog_7F@9MpCdFP&cFT5il3IsJ6*Wrl@X#pM&9gBz#ng){s z;%5ZB(_v}J03^w{XS1CXa8-aT8x8040ww@eH34ga_tW6*g14(M7}~^bF(?%waTykK z);vbTN19ij{s{hgSbh%Pq5Aw<4>+!YBExAP6vA+P#)`EC0m@V8T>$ka_zLxT{S`Pq zK>9lL^@Cal_uL)?m>o}!LP!Qu;OuEZ@HaSn9;V!IDb$oBG(P>2Uk8Reh9oU@gFz3D^R|d86N%$>g~oQrSDMsYn;8l z9Rx%cx9(_r92@xk8ftfCdvP8D|L`xdlaHV}mLU>^ViP|h0=$P}1*SWhCb7F2{Te*i x4}WUP<9L3ncl^BXIt7)Ib;&w2igJ*4ybi0Wk=RjNVG#fT002ovPDHLkV1nRY-4*}< literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/recreation/picnic.png b/Icons/map-icons/square.small/recreation/picnic.png new file mode 100644 index 0000000000000000000000000000000000000000..6aad5f675a5e95b5ffa056097a752f9a6b7bb7a9 GIT binary patch literal 1105 zcmV-X1g`suP)Ow@H4z(2pcD>#Jn zcsnPwxI0LQa-h&yya>1&&ZH$Y=%o3wWTVj1fuguYOcrUr{ z^+T!3oW#D7$Zers?tF?j89XxBhxD2*HTc9m)=>S2h;Gy6MabNyd1FxKN2wZ8{fBQgEno zsD8Q{JPn=(4?l=Zk4lf&52k)o|G(eE3dstIA`db*?2F6z6+Cx%?C?CbFrbJ<#AUb3 zZdou)v|3xOtuUe<@g3=fi28{7@OntCOs!0<0F^?eP~CvZ=&9(*XjrjHu}RSe4r?6N zIE*dqe_jcOnueMNuR)Em##mbf;}v%*#xtQg?3bkGHkfF%eqqgpKQ3OsbiDf<+ij8Z7`vqx6>aS?DaeQPTM~{1ws}Vh917*=C+HgD6j&D*6l> zLK|Lc2m-gk_D|dZrBbO>dc!i`xb{i)9KgI1_@w!yDbwKFqbHA@^niqh&5dugfUI9O zAS;Kx=Dp@Up>QGWLfD1%a9(m=a&9@C%_`42s{_rb#-gbPkx66{nczUm!7T?;K`YXV zv>U;<&ackz$0hWDIe9SITnO!_J5K+;6;_sco$)#Yk^3X|M^?>$FWu?5)6pLSoC2Ku z6Tms#Iox>~uIO}Eu4Fwz6Hb&&ADLWxZ?{Eeky$o^ud~`&y$oVvV`5`sK^`xUm$yH} zQxs7`6s#_Kv1oM>B#tMJB_0Gvf9Wd6A7JR8;qswx>>o^Byw_=a(|+&%)WJtUclYeq z=xXmdv+Al-)zO6hisG*Ws{#TX3)OW}x5cJqA(;($yy{MWk*4R}bIO+!a@QGEvp?ZH zfLX(U@KKKtCztSu!xQhs3a*Qe>q2rj#rBp}Vt=M|z-vvx$lqmiH}?Ua>@pIb^g8|z X-TR*6O+v<*00000NkvXXu0mjfEwB}D literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/recreation/playground.png b/Icons/map-icons/square.small/recreation/playground.png new file mode 100644 index 0000000000000000000000000000000000000000..5d10cf959fa866743e398d9a7afb81a6029aaf56 GIT binary patch literal 702 zcmV;v0zv(WP)Fr$ZUM5~8H$!JxId9AWAWMOAzx-doT za^JA$+H2UUX<{8zE<324b;Qf4E?$;=tF*6T0ikDUS?JL|2CBM&@FCq3LDU$iW396A zMD#*z51(7;jH7->QdZE1{{VFM%Y(}E2qLGQr&^T*m3RcZUol)91M`$v|31gR0Iv4tPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tc=$1Xjn1wg3PCG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpVM#o1>>in8+B6H^EMo?&(MD$^W7)7OYh%SMLphHDT zpcJSXK|vjZh>jk*WF0CqLt|wcC22;Qrc+UzZu;tUb6fjpZwE7i4nbb}!Jp^y{Qf+b z2Nbpf%0Fe*MWICS=C@W)B)c}gSNrr`_6OHyRKb)^6dY?wnk{%|dw6A9h^k+yeflnI zW$juK%7*9XCo+ag`-uw~h2*wWRys^ZUn7pM; zPIB9lqA3fJaE5!A2;jB9^=9`T%Tb6E`8cjQ-bitqio*KC=<1Kelbebj8%m!%%MA|? zCYWEIHb-@f(Y*FEmR}dx9yPee4L9B8?UDQoHuRh92mp!#0D`bOzl;jp9%Z4=TJBpq z(c_BgmiGvNvaJr!xlD|~Ae0m$T<%788CjWD69zCx(3)g)H+GWsX$VD<;Ev2(?{%^h z0DKaWOB$TfZ-~tS3OdV};vhbL;sl%>r20K%)qQ6|ts@hcv3i2kveP4wyr9>1B;?+)vI=O0B^87RagQ~>}0 N002ovPDHLkV1mgIG0ACOQ6oq4x zmIVj~0gMPhiwpty%mPeL$3IA=@pl|QK7d*TK&_5%cxj2ZzvJT$=EUX1bNR_^!Zwx` zwxzW46wt#{fHAQijUZp65w{pqyS2JuTLqL)~r*qSL@VHVPZX`Uv3HM z1@~fxW{4S9j@%DkQZl=&fNzhERCJK9D>^bhA=IT}gxd0InxfO1rnK7vTKH5zGgptC z{5ODzF=a1eqbBVMOBU;d~<7tVLu))jAt))!A~N>-67O zb^4rb?pf`!wpY6()rSV)lv>B0PpwO7#k#WIV_oc2Vx7T>7=xd56AkPQqJcW)m@S-j z%=&#EJN?09rz$qJ;kTPwNI(1$3^P^yVMJbnJN+eiR=Zm%61$aK<(ls0NliC)H_^X4 zB*k`zNK;n8k&_k35R+pvD>+7f3s0q3!c%nBp#kXH%*%A`-s(a~VO|IYTyuQ|^K*TH zQW6vNkr*|>iZw4;ap*qhUo&C)HB)3<2}@6ukVz0))JkZ>XGntAKoYd+&;Slq=}m{q zXO<1j%Vh&7TB)8mSE+ z81W1HXAoh3+8wV&V(?nRKSj>7A4Sg7D9ixB4EPV+frHA^S^C-2>2H=Oe7zEdFudz0 zZteO{_(aYh&qPiXU9Z2;xLzN4m+XH8;4uI!E^>GCzXBax@!7-MpHAG6IBsz{@m%D8 akK^B(c2F$hN`Hs|0000rf{7oTQ%MvuC&3_zF9pUVTbv^V z7)b-o6vf5Om9Qah9W4Y$=3d%#8-08FJbvh^D3hfa;`wrO?>+bY|L5hNBS8gF9DoK5 z4tk+mf{YCAnXJ&aVj`-7y%whBtf7h?nRsNfO-9iM+(b*fz-bkBDI~spLu1uRyVqK^G5ge7nt}VtV zI94=!Wv$*!(0JskHLXMTmey`7e&~q7ZM?d)N_U7Ri^~@tZx9!sJDy9-9=eh;0qrCG zk7R4AuG;jOz7%)p2 zS%pk@ye;sd*f6?W{?y!|IQdzu{p8n2{c27GTEj4U7b#Fh^mDaUQ)emM8Ep-_*qr+V zP&fL>#M>a6ZVcKoLEEY|Tl+ve+uIiGR98vwa3;%2ueLZgF1++=4j2LCO{ox=tLn>p zK)eLgMId!UP7kO-dOO=dH>6Q<7~&f!Nq+%UC5CvH1Gsr#EC%h?oZC_?!pSc|tN@<{ z#4lh~L2HHq2gui8>3zUH$l49+Wl-%vJ%m+Y$3l@!%6#8&u5&Fa0IdNw#zBcd-WpI9 z=cRdutL)q$)v77y;iM2qar(OAQ!2F!3FTZ7|&q zl7Odx*ekI5d5DieXg5fQ!22zTe7JrA#59c95;?zA4f07ib{fRv@bG?!{28HnhLO__ z!=*6T1sQw)*|}1eq{m6%nr2wuml#GPL(=~}j{gA4*%~q|w6$2H{$7^)QmLzA-4bME~e&gFk3kb!eLJP`0S4;cwMJ89V(6rk%c zDZ!{sg0z6u)#`!OTHWVztpga6ps%l5u&M%nAfE>zAe|Qfu=ej(?aIo}wsN5s<3|WT z`TUP}+nQCErfFIr2+Dvm;B-PVnM^vJQ1+F5({CH+H4UJBs(mUH0@JW*7{F{cn*oeV z#--WNF#u?qrghChJRXk&#CBpk03~0^*EQET&)6&g`+|L8c^Sqx#y9SK27|$10O;xM z=?yQ4~c{nu+-b0A1I0U9VZU+wFF{A>~TB zQm&RT`1zdkx10y4w9NyD8R>PCiBb#;c&S;KLVd#93JlOHom{^6JE+b zIbAH)2Oi!2>bg1&-=f#9+wE}w=IZRJF__I3#)@korVo3I!z=>?z#o}eyES%rl+Xv19Cqb&UpsLL_TQIo2Ez2$GHc*}zOwX89RrjUSk2=6u zn@-gsQJ$C_nlY(rs{p>d9vNMEXtlz;0=b;@zsK=+0w9$=-rGIc00000NkvXXu0mjf D&?hU4 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/recreation/zoo.png b/Icons/map-icons/square.small/recreation/zoo.png new file mode 100644 index 0000000000000000000000000000000000000000..68ee9367456502eaaa7b664ab275fc06f9dec847 GIT binary patch literal 526 zcmV+p0`dKcP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TdSzB2RJ(n*aa+G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoU`a$lR5;76(?Ls=Q544U-<_G5q%f^ap=hGe7C{NR5QLhgAnw}v0r~>1qh;IZ zJ4CdOwhA^%5hNr8l|)EbQ93r`=#1}pTfBoZEt;A-aPK*s#s6NOa~`5m#I8;>8W4>s zduiFcK{VIuw*ccd5gpO&2pUn5m_G!(wVjAL4rXxIJ7daifTp0JehBy>Ygw;{ zPI{tGBAD_8oYnBy8!%}@z@S}w=@aP~ud90MwPAHPT~<)@$Xf#jtjQ}m4#sWy}EF4<93wxUNt%^3}|zMHV5DyyX56&0r?|8bRD#^}aO{?*Pu0Xn^Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0t^8n8Njq$?EnA(9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00LY|L_t(I%cYY+OJY$NhM#k@ z(oAg%4K3jcHH(VU7ERD*pjAPOR;_B=-?)FGRX?O?(L_W=Sd%$3bi1f1W~gatcBk@s z?=0d<6EmBc4-T9czVA8Td*DSui2~NY90esR04qrFex3DmfPMBu5hArP;YZ$-fgw3? zn6_3>J_ASq>#U#GsduJGdE>;x2@-)Tu6%a$7rqQPX$pV>g`NtPZUtqp4FE`y@@=y{ zqN8_dX#PVE!vGqZuTH(&g{x&^ierw4RMZdloWs7vh~37B-EOck9VL1*$J`A-p1h|; zOT4}&S&J;Doj6;rtgk)J*!q(%AS5G;; z-(+)olF5P#m*K=|%raa2BOpky?#283cB55Re|?OjIwp z7_hwyge4(a&%MuX6Z1EV4uBf9t~~kPVTKzWbXYIENC5)+7F%+RSVcAOip&^DIjyMX9F;-ENs*%g(kY$-%F307?r7^=yu?;XWMT(R+LBgLU+rP%z zHyypROxfK!&C(T0000`sf4JHn89_ED-PxOF7awV=2CC>S|xv6<23_h93sd>ezRtf>7 zNjaIxF8R5MnR#68Ypb3DRethxaSX9Iot%-7VUUoJ@WY=k55!6VGWAa?{8XH)_?L;9 zb3x<6gN+~{n01LU#Z$~uOfN4wkJC-hZQA|*`ud+`FK(~?fB)bAgJ~SxyA)P)Y4;a2 zZV*(~Ru*Okg5{j*%>CN^huT@?*Zte`=d<#zDzy?uy=Xno8EHF|Ll|Sz0@KQx z*bFur8zz4?7Pc1V-fp~I#gX{~W13?cUl-4TSDONvB@BcvZ9jZJ?$6&p-_2KxX!Cco zaPtfE3rl;l{n_*D^W*cYJ4BA_oH=uB)sa)Dwa%aV{QmR)`!8NeF0|}sw6zzQJySyC b>^TOO+=!a&tUe>4?-@K@{an^LB{Ts5H!zK@ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/religion/chapel.png b/Icons/map-icons/square.small/religion/chapel.png new file mode 100644 index 0000000000000000000000000000000000000000..1e4c31d0cbddd563882f6ea78bfeca588c03c6f5 GIT binary patch literal 547 zcmV+;0^I$HP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TU848N%0J%>V!ZG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IobxA})R5;6}lRZnrU=V+m{FcKx@BHts_2w zBaZSx8&#@fF0S$G6n>HtrAnD{1z?@^+9sRlu>dZv1o|`2riUlrS`ZPGQW0DH|4=CX z85Y>)XJ@O`!m_Ne?_@H`UHi`P7fJ-t!M=POV~*To?Xc!FXt)|324u;4073E+ON|Vf lPFSUXS>bNSJtqEp&hNt}rYDO!aMb_+002ovPDHLkV1i2%;3@zB literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/religion/church.png b/Icons/map-icons/square.small/religion/church.png new file mode 100644 index 0000000000000000000000000000000000000000..5c864b2257d0fb0c372f4906361a86692ed227c4 GIT binary patch literal 489 zcmVPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TU89H52>lb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoJ4r-AR5;6}lfP;LK@i4&vwK%~;But9TCq?F7N$vMVH?oWC$RMquC(!7;>A!cpRrENAkh2Ff-rB{MjKSYy$Q#77{iEumQoxfWeX+#KfXd zHth=u+W-n6OSYVHw`|KJMvqzYufQS^$U+b%Od3ZUsH@zD49>xM?`oh$~ii zho{4RsZ^q``!*tKuh(n3%kCn(Qs;VED(>}q7-P^{i`JUiYz9jZ#1?8nDTUTLdDE>F zo&k_cEG%HHy%~4%0>&78-$yBh<2ZPpm$UBEWhH+bV8f<7cjq-%x$)VzKknV39X?wu ff+WYpf6w^`3iEZW=dZ!g00000NkvXXu0mjfcALao literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/religion/church/bahai.png b/Icons/map-icons/square.small/religion/church/bahai.png new file mode 100644 index 0000000000000000000000000000000000000000..819b92da79fe3d63edbd647e46c6b5b14956bce8 GIT binary patch literal 681 zcmV;a0#^NrP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7& z76=qo&|x$H0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$Fvl zHnATdLTS3O&=Bh@@lm6WI=;Kfh@IF?d*H&o=kdGT^S_5U@l9a*FDp)b(*#WY_@9nB z{(`}pG_7XLQxS1!jKzt^0G0q26$9LGvyvgRGVhx*)d8Pp0NwKB9Z8b!yL2r8Wy){z z#gjH7CW5%XO9t9`PYL={Q%(nn&XyzhCM~RYHqb6j@$~){7^dt`+?V4-lfd^-r zwBpCFDk$m*s7i;(2yY|`tF>7LgK=+8FuTi4) zGtNFXX<8Radcw)4b=Iqg9DeiR>%CB6ndQC{XJ0}Z7y%N}z>T|W#X6q%&j1Y?)+EWO zjNCitJdz_P0!)~g3KSftoPH1x2A5n$YSip6RJh|#+Ge}p!`CTM8mg$)E3V!R8JZ(R zegz3OLxfsx+**#D(}PF*1F*$bRo~aB*>Aah>&D#^5eFGE{xIPu1*M~)bQV5g-b|PP zOndD8j1eo^u#KMwXhH6CK>ynS6)LY~Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0t^8I3?cTdJOKt$O7E00HVrL_t(I%cYaQY9dh>#eWl2 z)O2y+syJzk^(0~1z&?SKF2+SmQv`J%!90N@l18k9rQ;JUq#evo8*vK_;sp)c_y-Z( zB2m;V?6UbTx4GZFhjYJk4kb#b!0LZ?iPEV8tRh5y-Ei}Ry&5nG0z`>U_j@HuUjUSM zr0?6!7hVqAv_;3$2?HdSiQzftGDd8&58~NAc;qqKrF%3AjzXz)O1U%d0I+TQxbe`? z)Tug-6MwznVz7R*1JI>=bouR4)pZ@qvKS7B0QCEPs`pjJbzQY-HQ5F@*rq)SjzYSw zb)C zwCio5q5a%27%&Jvd!EClX`*QwhGF3I`N-vRnivA}U0gb>)a&B^j)7$GvPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TUAjAU+{~L;wH)G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoEJ;K`R5;7clQBzzQ51%sb5*d2LJ>j<8Vp(;8iW={e?wE7i_5nOF84PC{(}C6 zlOPI4X^WGC0XoO`GiT@;bL97 zrz1vb07W;v@hCu^{Gvv!)25wk(K_?+?p8HHHoTEPSjpjxk8c110*Uf`3y2X5*rII! z{W2Pj@FV`m+#-kuqA$-XSB<3G zX#`b845B`Q44iuFiWw49>31D>?>urlKm&PPMV>WPfxVgsbp1+>+2bvFnGLeIJ QFaQ7m07*qoM6N<$g1A(Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7& z79s^u3ytmo0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FAK z_AHE1k)#aLZf8xpY$fHXjIOTLwMiv7= zm#%cfjntugbCNYcpqK>WMomMtlHQUK7926fyOPj zT9V|<6;}p;hUR3+PA;?jElRZVVvOsoU$3!t-GAaf`yU%LR0HEaMl2s9)C4%}mt0zeY42%a2 zt&<~XI5^52b2SB}2aqGD7b%+4O#fJ5;d_Eac<_ZV;ra|S_XixjPm}gFX} z?Q51;D&KMUc9YG5j4To)!qV?%4R-srW#WJ9{0pKX^JE2Ecv=7e002ovPDHLkV1jW2 BDOCUf literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/religion/church/jainism.png b/Icons/map-icons/square.small/religion/church/jainism.png new file mode 100644 index 0000000000000000000000000000000000000000..2d7fee21c6a58e0b8266a6eb0d5824dbf60f7751 GIT binary patch literal 531 zcmV+u0_^>XP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7& z79}FOK(0an0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$F>i7wE@ z1cN`3)L(?qOC2}hqM{{wl3C2$-0$Ax%poM)0?c1dNVuf{Q>FUcq*o?%4tau-KJf9;wd)+aQp>Gt4r5gW9?O;jE!wNbbNl$H^3#Ag=?;Z z>D|Q@2Pc^u5EJV<^_TSf1s8=!9&?$1S&E3<3YEbfcV4|wLf6s#2>Lf*gd#+794s}Pc>+a zYt;Ig03TmGJlSBQ7u`m#AZ)VvZZK-%L~7%SHPgR6)eSe^Gy{3^Qm6hlD@^=1&Yz_L VpyQjOZ4v+g002ovPDHLkV1g~-+7ti) literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/religion/church/mormon.png b/Icons/map-icons/square.small/religion/church/mormon.png new file mode 100644 index 0000000000000000000000000000000000000000..7c1eafe54350156845a6aa352b3bc978871467ad GIT binary patch literal 716 zcmV;-0yF)IP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0t^8LFaG8z(f|Me9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00J~gL_t(I%cYY&NLyhPhM(_x z(VJ+KR@D5sNDyj-l!!V=GnA;K+3XSt3PRSdB?y6bmK(Z=b8&EWQCyUYk&r+NN}55% z#e`ZUCNxHcd%9>)DuV5Svp(?tkt7)eDwT?eh%7HJKL7**0TB_gEK6LSt{XsffL2>;OD2;c zm&;)o29uMM=(^tYpwVccX&R(+UQP^sAi4NWFW6Z>;xbET`RE9U3taXOuk0tOf;$B6A~Xab<_bli3OnBx}*_5)9~ yqx$mj=b-`6K}VyP-pU9gB_F=p{W0;sbN&Ov`7ppo;QU?y0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7# z7B?+GzHIIQ0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FFP!z_0r7cuZAyEfO)EF6XL5PEf!MHg31U`VT(f4q2aq z5`zPYQ4tqPC{aj@^uLQC6^ju)$sO*w`F{Cw&iznPOF;OSqoS4sAY5VP?SzwCrYIHl z03ZP{t@smgH3E!RoqBf2Q2Y((3m_m6&N(l*xT1pMN8g$>=Kx&XFB&O&(a_fV^k<3` zyV1UnFKB3+A)#=@(S45G;G2U11F1@NZJqVkaho-2i|@S4J$f@HrX1_wfrpHTCniby zl^{{7k7+i-^H7$9ED^5DNe}y@{1JpJ@(pBF@W%ytkK_| dHcb3C&L4f0nhrGDtV#d?002ovPDHLkV1g&?-hBW7 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/religion/church/orthodox.png b/Icons/map-icons/square.small/religion/church/orthodox.png new file mode 100644 index 0000000000000000000000000000000000000000..4a947bc74edec6e98052d0c06b7516c94802deb0 GIT binary patch literal 524 zcmV+n0`vWeP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0t^8OC7G+;0{{R39&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00DGKL_t(I%cYagN&-<7hrgzA z7zz_Kjj)IaQU=5Ug>q4}QhI@2q1Tuf=?z>Lq>FGNs2dTXTxHloZhvfWf>E$(5fe6! zg!O~FIQRa}cMtd6gMpy~&R>>+p)Uc>CYx{PoHy~PM{l)7E2g81IPv%CGXvuUKmzb4 zj~PoQrqZPwYS7r}(p@t#l`&&!3UC7;eOSGTxtg#JZ8u|`FVc;nl#s|RJYyO#tr~f zsO;9LZMpkL96h8+z0LqEtbjm-ytkN`D;}TXTfrfR{VZAGcA`x?a?N$}l+)WZ>1Wp$ zAn@S}kdYl3c>-|3g+5}m{MBp8QBfy;Zy+&8QKFWGr2<@Wl`K-+UkGrPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TUAnA?1?*-T(jqG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoG)Y83R5;6}ld(zzQ4mGXyxk-q(I|=%Y)l~*u}G0x?D7l#LBKMkun8>wg4QX_ zXQUB?5Ia+BZ44GRqS!5)_r^jt$hwKfTzJ*oIoz4Y5D?S={m%;sY657P@_Uo!11XIe zulMNHI&|*RwSeFhzyM@5j~H!-ggX}N4H@o*gj*@VEr8D)_30m4tN|D>IH*v0tx|nc z6hUUbOn{=aX%8n%ie0+(7OnfF_Pu#FLRyI_BJu!YV&ia<T%_)h}&Y53%w#baq$bslkl-Y1tf=&$ht^Ou7L43kX#Alm+%U^DEi}=SoNGg Y0mzbsVbogOz5oCK07*qoM6N<$f@ILYp#T5? literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/religion/church/shinto.png b/Icons/map-icons/square.small/religion/church/shinto.png new file mode 100644 index 0000000000000000000000000000000000000000..8050ad514afcb2648a35aab1b7b9dfb0f4020ef2 GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4JIB&9+nkbEkQzZC9V-A&iT2ysd*&~KAFj>dBv$#3IU}_ zIhn~W`MHUid0g#ltDXW?{`Yio46!(U_wvT9Lk=>>KdyiHK!H!yilwxmK;Y$~30p6y z?rS{%K)K`g+I@YCBU#J^->3;%?cnHg+g)O@sBoiWj!tjhzX#JE*URsCT&EEt+wm@v zEA%`=VB?{EzQ3DA0#}qb@CcN?=t(F@i{I>yvfx7E&`U-FQ#`BanZKYs_M!$M2ns{pCjw$1FHSsHd!EO4Iw?!Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7& z6bcCkWV-b7eXpP<3K#X=6lhZDDC{3Wu$F(`i1qdViq$i}3J zVWYv27&ca{;1GnCP%0qEIMYQ-LvU8@N#5$bb8_y@Js21(fb%cUz*vz0Cqm@MKKogQ zU}H;Z(vdB;$^zjGat6jH00H181~}pPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7# z7ApsRa`b7eXpP<3K#X=6lhZDDC{3Wu$F3om^Ju6&1m2VX*; zKoWxS!aEXeP{MD!TBSB<>9%Vt`*+qGw@{%Nbdr;tnaO-J`Q{tw(B}XI|MGO`a|A$; zM%rA!LK$Z;9r`^0pa3wexFRPLRar|60eIa9ILSCb7IURbFLT%O!6}ol@Y7`?`z9sM zh5q)~*3ip002ovPDHLkV1fz~A#?x$ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/religion/church/taoism.png b/Icons/map-icons/square.small/religion/church/taoism.png new file mode 100644 index 0000000000000000000000000000000000000000..6aabe9417472f3d9a190a1e9107ebd08ab638ecf GIT binary patch literal 675 zcmV;U0$lxxP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0t^8TDn?aSRR9109&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00Ik1L_t(I%cYaQOIuMC$3O4s zBShm5NJvd^3rK2xi4BTFmO`gghiFSk9J)IBKVdY=kTKc80k z%kud=tFKqhMHWv&ggO?9Yy}uk4fp!z^_kn?TCGOCUI$=hWrfguNGVX5DN}Y^F*1NI z=}K}t8T3B!O1HBnlS$(7xb3T|ia;^BnQ~(A6d~bX{bzZ$wb|#ZS2x0q;M&nPl z7|J1se(PQAf7m}457@!Mfskd{R=|t*qIXA>zLkvoK;3RvwA*cw&1S{;_;{a$PRVK9 z5Pa_^Xti1*kw^%K!|~4<7?Ou>2==!3E-bKN7$O`FKR86z7i56y$7;uFNU>O?TrL9; zi9}dfSl~Vj5a`%4whAq+@}pt`G@DI3XmfLujg5^vUsCD92Uc7?rrXP;>(1p zs;WH;sZ&Cz!+nCfWTRlsAgrhmWlse=idgiK7%^8EUy3n002ov JPDHLkV1oMgAtC?( literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/religion/empty.png b/Icons/map-icons/square.small/religion/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..5eeb596debc23aba239b1276edac175f3c00d782 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMkygZy&rrxLx4hZC9V-A&iT2y zsd*&~KAFj>dBv$#3IU}_Ihn~W`MHUid0g#ltDXW?`g*!JhFF|_d)ZL1!9c+EAgg$x zAm@(G-pOq&OCBhgOtABGo@ihEH1~VUi51G?O8F~1cXb!NjObu4dr@20xS7#7`T$cM hOHE?WkrcD%>`8jPAC8X literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/rendering.png b/Icons/map-icons/square.small/rendering.png new file mode 100644 index 0000000000000000000000000000000000000000..331c522ef5335be74f32fc8f701f8260719074bc GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^5hT|5}cn_Ql40p%1~Zju9umYU7Va)kgAtols@~NjTBH(t*47) zh(&L5&WzdwR%T{r3+CJdUSe!)Z3SUs%lH>D-SJ<)dkdRRE>6P%~H@wf+1zmn{ vU4Ea}VV#Jdzt8Xgke+YH9dMaRBZ8Abp-3go`JQJb&>;+-u6{1-oD!M7|#_1fPP6e9Rt_1fPYV zC=`4M3I*{YUj~tsm8Pc5$dTQ0>YTbwg%r23zB_Vk*n`z~Ip6ui`TfqhALn#mYOGf) z4N3rNhuzvlH4%kl>22JOwNS-gZ>YB-CVqXcXFW8cxMja`2T0e7BEjP)dK#3sJ1*Mf zbDTk!4Zd%j1DJe=_1xuZjf614u;dZI8=cPH{JJ`^#G%iU%N6=QG}OX~;L45;(_mHA z^r6u-v1ww0r>a*fR{mSCSV+W(SgGhFAMR8&$+6kU1z(`%jK^1lleLLoD{?vs+tzMM z&Obmpl;TmKKAM%s&%|(Q?5p zEPtDYcTItcvxO zCpT`Iy1F`$rO88dZxhnAG+b-GieX^|N__zxtjXV*bh8pxk}>1Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP= z6BjYMo<4g30016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$Fg=X^i+o_o$A2R-_qmV+Kq zRRx$9S>PXRLNyB@s;bi>3l)PiGo0+lVkhUlMIU7PW^w?9iC5mD3;K8{Ie>#1f9Wko zz)q-U-6k<=32eTVP~cnea6$PJR{$5UapqfW#TXO8vrXLrpx_do&w1v@FB^V6g0Tj9 z_GsS)cySBIC_4MF5KgohW^WK~^{E{KoSBMUjYWh^%E69Ddtz~%wpMAp?q0OFUc;u( zItRJ_{qmbbfPK;E%v=?Ka)g$^6?r;WMSz+i=A1&CajP1QA1z_1FC?Am#trY*eM!Vc zx;h*F+J-MEa=E*ap5F;%`9b9{VCSbW`8>p6sz&xad@sP%lMwys8p9W$QiGA4OK)49 z+gF5RpZMvkB>>j;4BbheY5;X3Z0s4%B?82%mc^0XqR;AW8BM-&e-2H{7MSs`a{XCu;;?p8ENQ-7tqQCRD=;dvxqg^!9 yE?V5SrNWjiW>TUZY0<)VP-^N$i?I$iCbCV97@{y@wq#)@@}-o-1QXLZgCx!vg&C*DT@pHH zvaD;DY`XQLl}#3v(r#1=Ee*X;dhhFpt$uJJ5@qrE@+2ou^7}pKoSZ{E+yej&VWU$E zEyg?*$FYsT#z(?Gym` z<_mYM6adJ9zrW|Kx4`u9olCc4?0v~k0HCa?5cfv_K=2*%0DwdxzHS-Fj|d(Ugg8yb zPh^wXnZ(Ro4*(QRy1D^?dbX+$0HQ}{F9Lw5^Ir=vX11QQpVbd_@om{H?jjsy1?gvf z9wvA!k-o^f^gH#f+$0G;q^xLr#F9Hs*KImf+Z3&-?5%mJewv87-UfgY+o~m)PYa{M zsQ5Zlzw6T%pRC+et@3rx=;sY_z1!+;OuU~v^2|Y9o)x$ z+>yLi8@s%x++FW(_KmY>mVIR>kY=a$q~?L;@8??LX+T+ylR(M{KLAwp-zSirpvI|j z{)t}(QtB0>Oes0~{MQG@q@j|-vaiZ^GNGJNtl8LF)RuWc@}+nHgZT?Pn2w<;h$Pvq z%-Pvd7PHtN$_C__@hShLGd9czx&c611E3DTxqBdbl?;@reOjM3^weZTO-IgVEz^PE zH-TDS*gdmk%DfI>BP@Sh284XkdqN?wGPL|w>>U8$+NcYaZwgy>*gG;M$!biUp2YQk zEa`m$q$aP)YjQ7h7tzOjkxNITOG^tR34-QrAqap>aDR{v0*DhtObbvW)Lsz-ES#D% z`98vDsWUfE+L|NPXkJ@St=fc?)GPNWf^z~JUnkrJ$UZFTC@lpfKZ?adJHQ(zuL^WP zgjh7kD)aW7+86NNjQ6Q%=iaMbo`$tH^{R6~v_0d^l%+;|Tb51BCV*1P*wG0T>0000?hfnY=#&aHsi z;wH^Ng3=0glR7SI-K;WhrIeNS^m6>M;13f5{2;#nzxRFe<@@pyDHQ;aIbUbdK!awx z;+zH=NF>-G{atB-3G?&ss!cFKo5WcTR;zWaj#VlBq5m6~$R!HC;>~vMaPD9@0i!3? zlNx$_rFpel4?UDh&RPSBlf)t75HyO&qT@x!WtGuPZgOt2sNSU?ribapN#)DOM8`x4 z?ITBYS-Px=jzG2t9)xbL=1Z;>fNzqe$Wpk9EjP-|<>t7Z!JGy0f;jM3#Nl{vyq7Dq z1!^j4D(viHwxiL}=wCH>-2lF8)3wvJfi_D=+4ZvPx6}9sm3NhQMTJy@xLw@Nw-82t z1HXaHS*zc=0hYy(?lyN@h;bzk(u1^{jC!BGNMDRn5oN4^6|mtA2jF)pv|g`ekr z+#AI?<=f@=BMnHjR^rzOXuk_ZE3p+qi9fu5{fS;NE|F@3tDb zsKC%Nz{WgL^<)3+pR>;B=X$$__PNBIpYN&exB9OFzcv0I%h15>qH$_oOYtsAZ*gbi zCH4DyTZxb)BYxAwfv++yC)`;xfUjF6P&P|6tg~oRB;9((nqg}RABHh*Og{490gzRd zp3cw!RX`PZy@2d=RQ=L-fcz!tuL}!+TD`qvY6|#i;+I_iGz?73GbP~{lE@{&whO6< z=0SxLlt8i~KxB4hweZb!S;$YEaUbM0i9QhspaJp;IzT-OBz&$o=j{f#TvoTV1Q7WF zdS(XLTE3-h@jc)vCZ~(+1*B5(0g?o~-+OM(w~|L6Grc8YXVcvL&*a7OVjjKX4Ftkp zMsiP%TpG~EOUMhE`z2QeR|p=AeEw#0s0JXuWqYU|fTEaJVE~}RV5A-xO&jWCEkH0x zPGUdc-|6Y(^aFlRkQTgwo=~aN7BMh>Rya0we)K%ky&?b`XRWeUxxz^T6}@}++^6=- zzWSN%Qbb0wYN8jQJ|uJ5J%GE)=b?Cjppd(V?F0CQfxfT~c$mXnBe?)G9r}PY0MTO{ zndIohbm41eW&ewl@BBB9=u~T!k`tWC^}g4#LW7=a zPjzTCQ0vZf=LL5aTOO5>#bO`~gu_An-*x;CEGe|tL}I^S00000NkvXXu0mjfGtU?r literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/diy_store.png b/Icons/map-icons/square.small/shopping/diy_store.png new file mode 100644 index 0000000000000000000000000000000000000000..282d99181f2f9593d41ed99c15c1bb1fb32d8278 GIT binary patch literal 701 zcmV;u0z&Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4- z0VWVQ*VNwt001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00I3;L_t(I%cYagPZL2D$G3uUdVe;72fcVPc>s%c(AHB*`FxDqf48!QI zu4<0o?ZEk5E?W@ApHe(Nah(uonfHL(ZCK&HSKyCe0HB1h@a)VvJv5Fj02gH$zFKW4 zuPEWRh2u~9G#q36R3$Cmjs+@BALR=NEpEHiBVJYY*ETo5c^GS+DChx#3`{zo?zlS7 zw4T^8X(Zt9X7`F)yOfIIBlwtr5Wb^vBLXre9SpPKx-HL2A9(uw`*~m`F`kUy^Y`=m=6m=^t&sVstLv+HcXuQIVeVeK zWE{VI`7P;(uCD6`M@L&OWV1H_V$IFr1Hs^aNz-Hi0Z4#nn(q9A2g{F3B@>`$W~SrX z=;*3+b!6oBwXv~PfOsMiPPetEqxo-SEfo64#q!!38^?~>HwuM0;|X$bWTZu{F2oaw zaJs!c70c)4Qw!64Ie!r(349Mchq1#0^h`}@QZARdzOu55$N*touTMSKmWt)`%4dr| za%yghc#TS;CIFJhN~J{K#gj~zZW5iG)Lu*`Goglt;4aXBKBOb#oEFlGTBt=1Z9#|H__fVoy zy!Cao>=8DvTtOT<1WUi~ya1qeb|N=L!1EB>TeyGR0^diDG$HFcqHKbyVi#5@Z*1V$ z4!bXG&-{csJj~ZuzsG+qL)^5ex!-{DLYlH`bJyC!t5^s-OvtIBW8d>QUwjUc$PVD0 zJ|mog0XFX4{B|<&%bbcYm?&ULnxalk1RgUe!zWWk^1xJUHbcXfW1=3Wb7;_BD;AeC5K#e)V)4-|iwh!` zOT9NSA>;a-{&fO`KzIsRD#P9VywsSaG&E?ht>2k*Ez6_|JV74LN-S8ty{Z1QXXSTa z>BILttV#vbG$}6M!WbH~*YB)W!vOrNO!ZGk!cirV^aH9S08a>f0lw?_e;LM7HN0D< c|6Aw30j~#Ia=D}!`~Uy|07*qoM6N<$f)n42T>t<8 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/diy_store/hornbach.png b/Icons/map-icons/square.small/shopping/diy_store/hornbach.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1faab140d304a8a675ccf06699b29f570ed85e GIT binary patch literal 752 zcmVe)OHUI~7>3WBGi_&} zEv1*~OerN&6oD{uDG8TyQL84_G$z=%@F%!(Z{lxo?amt|s8ncN7z`#ZT(|(OWMZ#V zdZQ@njP10vosNsCEaY9k?~^CrhZ!_FM(zR%003Y}Asr$_ic~aqI79$|R4|f^h$&e0 zP*2ceyr|&gX8OM1R~i@qz!iwOg1ZOXgAGaR3PiJ!5rnrK*SOp|tFx6YbNuB84G2J+ z?F_`6!JX2Fv&|ar3PkreMiJhkeOz{()li~&CdIEzH1cG7(BqHy1$RqZLv@kpy|I^# zjNsa)-N)rOSgo~8&GNbMc;QXI(gL^wlpcTFb!(@zeO_)Lm5pngwA!Xb>olKU@u+P8 z0K}<^b2(bt8fr+|6E=O7%ZC4FtAPlC;=6MvY}Gp-W(iuPys6BK3Au`(t_l7H){jV~ z2~T@lr}_O?<5I@dySzJi_Y)%98>q2XdaiRSo4LXjRPWhTCNxD*73a+_ndctUNMZQi zM|Fb+7{h#d7{_J1k1MF`nRGrfh9RYrH8GbGnyzYoW0YEo8{FbrRDksofg_prak((7 zp+w4?+FzUe{h4z5zcNel*rOTJAzBv_{Ie^%{A#SVKeX(qqC8)Ny&LX*P@1&kg zcJ>|77nA&|$JqaiT1=!uWAZUXZiivIG}gfg)LfbmdGebBavf(bCA8LZ?)4}&pCqkP z=H&(3Y#Q&99>1@_+IOAKCa7%n-ol=Rd+61>1p87V{nSG;f_)*yuX>DUMA9xJcRzk7 zC=^$x@)7sRcaDFM;y1fxF$ucG+$L-C#-aI7GQ_?;%3vJ?a#}D@FoRRUx}_FT!$f_H iJcina{Im0*Ui}Muwnx6a29>!000006P)3N+r?s{l*`rJ2=bzsxh@u4G%g5X zw=e*da=BVu5W>_g_&fhE@B+Yu<2)qh5BWGktWU?W`%vw`BuHlT^wVoH>Y;IZoOw0eui z`f_`zuJHPOhaZI25N&iL24{cJc0X+BYEbj+B{wvE-qbDLpu36Ww1Qoc<(mrRpS}U~ z@Op*z>-XFN0K5SJZf7^RQ%L;(8UHR&Bx#rz#f)1pFNzsOl7{53@B9Td%BR|2lX^V> O0000&>}7^uZ#Tf3HF;#U$Q~hm*aB4jRxRLhYaYC z1PWfhl5AVEq>`_k-;FSwzUSTPrsYL2Pp4?uafbRHS)QwidoYL`uC895ZmmD0rekpc zkpRzEi1-K~1Rwz*2mu})D1}@fcREuGO9>6&o4#h?m*Qo%PyH_HY`{& h&1~JWZ29dwe*;xyaWIM literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/empty.png b/Icons/map-icons/square.small/shopping/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c910d6185dd319c04be9446759a4196d48ea64 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMkygZ6V@CBJ)n?WiEBiObAE1a zYF-J0PiAszUU90GLO^L!PG+)8er{rB9#{L?s;5AePM$7~Ar`0KPF^U;pulq^NG*wF zS>kdd-r2TY);dQOq~`B<5FmPF;VczKp3Ns&W3w1kmFD|BoXC^%VDSMtWh3GB*81U% WO=p_I=Y|4JWAJqKb6Mw<&;$S+vqh}{ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/florist.png b/Icons/map-icons/square.small/shopping/florist.png new file mode 100644 index 0000000000000000000000000000000000000000..3d58ab6a619f4f803102bccb7983b6b0f17bda6f GIT binary patch literal 638 zcmV-^0)hRBP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP= z5-%jd9t>On0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$F&C;kRk z7G@(j8KNO^RyVX!Qxl^h5gdS`ZLPIjwS``Lwa4A-L_(xJqrCI;eDdVU`(ObWrT@GI zV3ZLN0l*?-FYym|hiDuC7!i?|d16L9D=P@5pEw)kJk|e%h@FhFA=VR&Fi8qQ!9%zMj0J{aZ zv_+NO9L#{q{3L@#`Vq1l*#B7|^RTupV0VYC)#pyu*99K~ky|0hG|+tUVE^N%S8nmI z007{FOpe4@=!+p*B}1r3brw$C=sNxWilQFY9qHiF-JucE{Jw#=)vA*EURcz)Uth0P zH6Dyw%7|D(apd2%Aihy5Y8>_r4V`FMZ8vg{I{R0D!TTvN5(&Hr6ghPpnSzlegx! z);o38wnRq&ODEO7)Xi98YN@d8_0mTYJe?UhwRs_;_ElQ->G{kWFa2tI0ggQ;9CyyY Y0XUg5hM-mRLjV8(07*qoM6N<$f?4Dk-v9sr literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/furniture.png b/Icons/map-icons/square.small/shopping/furniture.png new file mode 100644 index 0000000000000000000000000000000000000000..ab6998c47cca821b4620cf527dba03450e985e00 GIT binary patch literal 731 zcmV<10wn#3P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP= z6)Y|fsh|V^0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FhgL zfN_#iN&r|SS^@wzkZWJhp6}X8=Tf=Vd?CC3#zBPUrJMo)?ZC`CEaTJUOn>>r1+z9V zngS`qu_AcI)junzs2i7hb;gA N002ovPDHLkV1kn*KC1u# literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/groceries/bakery.png b/Icons/map-icons/square.small/shopping/groceries/bakery.png new file mode 100644 index 0000000000000000000000000000000000000000..ed09288808b287f78f26267dfb3a6ebcb9cd428d GIT binary patch literal 1078 zcmV-61j+k}P)4wd!P5S=OYU}0`TBufhmCmO8PZL z2_)d{%^GPq+lZ0L$(MCTjARD8I>9ixpYe0Uil*5;Sj=ZUtFAz5kiur)Al$agh3d@ zKe{@3&eLU?MLoNO0c_RQlhe5{bi{0K+5;BLz_Sghu&^-y%ESZ+A@UtN|1KLF8_w?R zgpR`I<_qC4IM`eK(_3Jxww{+sHD)Qp z26(SvV6I|jW_%plV_MWTHIS5)W;zuQ>U};R1#N(Oj~~2?e}~#PYF_*JNf?g!BcyFV z1O#Z$#ZwZ=Fv%T#|iNd)yN= zT>(eK%Rx62XM6eySbxJedeZ;^Gc>_H*ZnQpbg+b&zijn|mez*Si?73c)$Hs z#oMYuq44xvpAL7wt57HlVCKry)Mz;#2EndWz36%%m#SuR(k!UJPE-9961 zZVl^yWIs$qj9%^ThQZRlu(}TD+ubgGn+eQOCdxtNi(Kgp$df(Z_Ep2d=)?ANy`aig zw`}Zzb+xV;cRdG|l?=!dWr;2>Ag^<;R~CRAca(s#MAhV92=`V6TBEkWQoQ{=Dp}mXVU>j#>f~M zr#xLvSJPFX?3A6db30h6DK(`AAonxB5LmPptwjs4OLoaFopMSkr4(>o*LB_71yog4 zRTWUq@(Y2&wy-U1fglKiAUNd*@8BIgAVi2TidkF}$ka3SOdVigVBhk6exKjxfp8K| z!bx-jPZ2f~%@16w)GRei&4A*#I4+KF2gxN|=RA1#2qdh8m9PNa(k8XP){L?>IPQ|AQ6WmBUjm`%}TvZ?bLhXG^M1v=49 z7%)W&v{Atewoopmr7iup{dXT+_d(-iAI#2|^Wo$?zvq44bMg}64FC|U-`^&M6g9np z)lx{o<>C!3%?Ao7px4VK3MjBPjNt-HB*o5RXJ}|$TMCgv+`03n3@nv2IvbsFar@gq zfT-!Exhk%c{5zOF!LDR;>Dh{n%W|VDV$MDtn>#nmm)}HfojE07gFWr<|vE zx$fydo3T^SJk_qWCkBbKLvi^)x-^~DA#-sVlXdQJH}5p-9p@#HU0r(Flj1`a!E*h9 zn7HvuE6a3*zSwN0mji(Kfas#&CkwG=P3wDZP0G{W4eBe}JRSKP!n{H@&Jxa6`5pDy z%`5~Ei5P(PUnAsfQAhPp*OzW=@Acz2J5qykxu5gTm`I}J`T1k^$iaRC>+Q?AvHPZ6 zpCNbKhxfqz=z=l+)a5UmsTp^W$|p8O(tr{mFZ zPc3=ary@DYD+7rHL7X5;?aQg0?mP?CcO*KD>h)L5l<5`5)gxb!y9YamJZ&C-%Y{xl z0TuLIny01)t8P9F;%V4tgEzFX4f`drbhm1YkbUIVe&3u}9+_zd= z(70^43>apI2hYl!x-!W?TQE&ZoM^K352$U(>VB88!ta@oT+JFyV_$APGf_0edAy&z zIcWnnZERXeVbs0UYqNxTiQf5x;*-v?OIW0gaO~>200@QR4ZLeWg3SAFqKfDoNWQ^0 zh=34la1iet5bsYbE&T>iF0p@KRl$G41Qzr_9q=OOl`Wtv2RLpgX@^XvI-_|T(Dkj? zpAU0^?CgN*P~p4$yyUyk1ub(2kqS7Mgi= zuj0IHU>)qB5I5FgDe4fI?L z(dmpv;Qo)6?R~}2kFRHB^;eNR_bRY4qMHd3Z zC6qh2I5!ViPq!PkA?e9##)*bGhI)FCd1Y^s>FVo#*GrGkS!>lrS8{$4tQtBW5CHT) z8*peN0h7#O)9kZ8W~O#53W;|MzI~IHQCDD8@^0~{!})5VMni39w=>qehxcaQY8V}{ z0YJm+@BqU#om@lW3YoJu|AD%!zFv1qec#Gs?e?B+vXC-v41~?b!CTrEmfd3={i0{4 zK{aY|tguvSeGM%8HH0G*z{u->OWU4v+K!eIr9@vJ@qdrwzW@m{5%4R77@`0G002ov JPDHLkV1molb2tD1 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/kaufhof.png b/Icons/map-icons/square.small/shopping/kaufhof.png new file mode 100644 index 0000000000000000000000000000000000000000..ccb42558393136e46e8a00fd87a045c667f802dd GIT binary patch literal 654 zcmV;90&)F`P)@lmYUW$%4p-) zIMeuMM(4d2^Q<;4hR))0;NJ7&-21ynI^o<%IQ%G}>lzhA(lFBZ#>a=`c{u#BCmIco zMItkm00v{R?x|=rt^{;ltF#zkEE1Us=(?r?^b8LN4>xRVCzHR{e}@Wi-T{=X0t=g? ztnSRQU-XmBD;#g`;$l!oexv>%r|(DOD!{SmE$Y0&?Y`S}9_puuzn; zf!%x#MQo}>pz81q-Y>?*FfKE_J8b*3B o7VECGb}$y}P8vp9{&$>z0j;derx_W%F@ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/kiosk.png b/Icons/map-icons/square.small/shopping/kiosk.png new file mode 100644 index 0000000000000000000000000000000000000000..2973ac2ba04b4465656ae96c98992a13828b2e74 GIT binary patch literal 592 zcmV-W0Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4- z0U_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00EFmL_t(I%cYY|O9D|8hTnT<9300=v&PJzGL71# zQbD@{H$fCp(xUdQ`ZuktKj1ECkvpkHkOX~zi%f*f=wpIXn*11TZmWijOslhe-g};V z&f*{f1lS)d0t5(Si~+zFA^Z46tur3!7tId8f`$qXTJqf7Bi z4TONxU9`h;qpJ-C524Ut$Ly?I(=<>@A<`$ZGQDl&u}sZWIR0q@zhBN5i##C&R#AlV zm`6NKv76$tAbGt~I-N!)lQCG2Jc%|lFh8aP0OICOiv#!H3tpnp zoa*zv%7hr~?EJ{2Eo%MhD?li~U#ZUxSCA`}qMS??KeIBxJ-YPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0tgopB+yfCng9R*9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00Cb~L_t(I%cav#O9DX{$MNsX ztgcE*!YZEZ5Q+$b$G}U{z1~5`-jjhZMF@}5)zemo(nI2*by)Kc`gAffOSb&ohWR}o z28M?g)a9RPL0yT60Ng5d#~*Sdat@$GM7D;nuTP8hdO}2a3j(so$6JFh{r+6q?S~EG ze3wryF0yA=S4SekWHP~8i|e{LjzhQGrFwZe?YG;Xef=E>!;l~d2!a4>EvZxrV+>kr zn$0HT@p!Ah^8(NFC>DzVhzP6I3S$gPDFB{5kJo*`Ce!H@-}e~|2ITX3DwPW9bb6=v zBd}ht@qM38r^9luhBO+DXux8zz*>ulFq_TLS~D7rn9t|YfOtGkCX+#HO(K!N z7(<~@z;)edfYzE)sf1FB;c!SUm!n)R6N|;70RYKll3J}swOU1M{rL-#flZ7td+&FE tr~CVN$92_j1CPDl?Cbg9W#Z6v{s62@_E4~ZVK@K)002ovPDHLkV1h1u)#U&H literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/sports/outdoor.png b/Icons/map-icons/square.small/shopping/sports/outdoor.png new file mode 100644 index 0000000000000000000000000000000000000000..a14b8d11a55c1d43b0745b37b8d0553be64331a6 GIT binary patch literal 705 zcmV;y0zUnTP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4- z0W=rhM=`Ge001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00IF?L_t(I%cYaeP7`4ihM({2l(y4$S}2oJz?Nz( zA~8}D2^$TG>~w3m18+m`!4=*D;R1}rkmyGF3%YQDKNU-)DA>W)*6DPPs}j?8gPhfy zlXIS&UzTA;{?nFWMu~_3JXLC)bJ#ISqjyF1@5hGsBFcyt{wwGdPe0aMXms;G?dh>;lE2z@(VX_H2{7)-q z6|^FRu^Gun2zZiYZ4bh_4XII7?wax@XSFwaS#O*1p}s9BAL(e{Yg0%;($wg-C%Rr0 zjG&T4O6^R~*?j@67_p8Xhz{b^!76R2q;sJB;W3nRB2@O}qvsAbA6 zVnr#|w)NGcZEe)6qEC**O=pdbL~5u9P;v>MIh$2X_n4xs$fk!G{IaR;@2~2DZ75^% zrrx?SpYGYh${yN2f~gePCgdzoZjJFklS}y!{+}|_)w2Gyv&)LPkn926hVmPS%$mbM z5h|}NGI#R?GEom{d;D_Y^*4A|IrQ!&)<2vLzx$M1po8E)2}P#LZqsTh357K6WSd%6 naPB~53>uwNzVI_~(Rcm}CNVl0N{J`!00000NkvXXu0mjf9F;a# literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/supermarket.png b/Icons/map-icons/square.small/shopping/supermarket.png new file mode 100644 index 0000000000000000000000000000000000000000..d9acfb672b0300a946617feef1fad8b85f39d7ba GIT binary patch literal 638 zcmV-^0)hRBP)`+itg| z|1E}=63W_|jX^0(2;s$--G(b)z>CPigsX{HO)nly`~sdd#&~Js!E)jP#6+!0rPMZp z6|)9ww=K0BY(VJ3dcsgjNE+relX>Qsc_tZ~1Pnb0Mm<$aw-g95yr;Jv|d%O<%_CyW%R!_ zzoHQ4)?M+qz6B6ar${8eAm{uNV-A|L7Lqoix{ z2DxzkCK1Lb$f4PQPhjA2+2NtDLJ$aPgd{nhc#mrN2O@RDXaRiOp@``k6;scWV7U$0 z?JPLng=)D3yTgT$=!E|BGdd^>{h5r`0${8<*1o*O@K6X|!UK#OLU$O+cL#9tJQx&F z)Use{8mHbMxSG=3+Nxn%4)peT(dlGSSpR^&ZU+c=fGzzSB&XP^o0}6EmW5?muq+Gt zjo+wNYv?~=p}7JeR4Rs0sTf3>5Wi}F&@e3kKyP>-My&*Dv*T<40Fc|W;^RjTA$a{b z+}{R8QJ9&XK|<5v?gMg|5(7Ec$)5R22vDG3P)KlY!0YtJm% za4}O{`SkzVy#Mw27EXP2ZU2AY`M3FiMUM0*k4t~F6NH#SfP2$|tc~V@v+}>^wQi0q z@GSE9WbnrzEIpy%N?Jhew`mVQZffSSpI3iyLks70UHdIlB_w3FDz?Sd^jtQL;C(RR zNn(OQSW7`%P0E8ERs9c-f7U-D{lPi9v(d3fyu=~3)~gIwu$vDG}zQC2s)8W^LDczC|Y8{Vn=Fst$L z^ZY&kj%PKzx^K_J^X3c>&nqDTpDytU!4exASZ#AB&r#Mqdye7PB)`eu?uM`fgNVV? L)z4*}Q$iB}S9g&A literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/supermarket/aldi_nord.png b/Icons/map-icons/square.small/shopping/supermarket/aldi_nord.png new file mode 100644 index 0000000000000000000000000000000000000000..7a3bbee94c84841763704ba937c94d0550c4e72c GIT binary patch literal 612 zcmV-q0-ODbP)olr=-Wl8Nkf?D{(R0kJUqHLfq>Aju5uWOo*v}d z+#EKi6UAr zKm7#&QX{jf)_Cx6ftO`idiI$@UZYstZW#0*KnU>Ok0SMVaH3SD#UN4cHske1cR~*a z%*>?uw4qTvc7#&&8^?`0Hqh~9>o=j$+Q9%-t?|geM5X^E%Hnst_XfFr>jJt+nzF-! ze{z{$1+6ha2pAg+W4vfZ$(3=QZQ+{7hRbDPXrLYQMj4~q#+|#7eN%P;!QdJxO;C{a zWM8i{JlsiiK1XyuhsR?@jb$n8CDt`TFt|5G2FU-^2t4^nY3LNZO>*w~X{M7Ept9TU z#!UyIr*YKFolHDlX3*!@13Z6`pljXX~-E*0003vNkl3af(B@D9V*evDIR!#BHg5`32b^Z199QuAb4ZvS4-kQxxuNO7Y_P6vc z>$PzXFr{*|qDht!1j#L#D3YQ?%J|acoksxdUqAL6)In_a@Q*!100000NkvXXu0mjf D<}RxO literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/supermarket/lidl.png b/Icons/map-icons/square.small/shopping/supermarket/lidl.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a65fb571a536bed1fb9c70a10c0c1e793d40d7 GIT binary patch literal 942 zcmV;f15x~mP)rAK9cIZYIXa#Ib73u~dsRj)eJrE-bXgm?ur17ND6N)kM z+Ji?lCdNpOOCt#>#ZIPJD%LP_2NnnrQn*A|xGNde#M&~PH`i0Q3kYYR~e|}IP=~Gx}VNtX^lc7SSZtq9W;ZoK&Q}t3kRQa z7#Lmn>e^AG^L-C{CT{Q`A^bV@fD0*M8XM_9wV%dqpfkQ#vCV)-lA?ZhdtP~ zz}W1)EKa%%zch{88Isz&L1uS_bCd0iU#^m>$c!wvnYnE}?OdiXw{3gh~^N&HU|JE{yeKymjn_r8-WWm}BPp7IeX7 z=c${lyjzFe7vT?Sj&;rxt1{cSme}9BhVSI5P1UlaWsT2^+u)Jj<5HaQC0y|(UiGC^ z@a67kLW1iFiB>%cbGAfzSE}n;;uTk_IZMo@BiGJ0O4q}$ivB0s#-*=XQK||?H)07Akf?B9yC9z|5CTynbeo zsi!18851K}5Ihi=a`RAm73VG8@~9Fo()N3)4M8szox z2uC{2+rL3G3e#gg%+UnQ26q3tMEIMq!`9SPaSM1DlLE z(2p`d2c0&Kr8JV)LtiNTQ$c*bp|Q1!JQAQ?f5fS(yzFh$K8+xGJ-pwY(JU5GQYl15 zp`{;SA9Dd9oM*H5-0uEugQ2yr2`UFq)xYqQS%SU41F>cpW6d>M{9;*3jclQ YPe}k~(&I}ntN;K207*qoM6N<$f*WG7xc~qF literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/supermarket/real.png b/Icons/map-icons/square.small/shopping/supermarket/real.png new file mode 100644 index 0000000000000000000000000000000000000000..2850e75470c9cdad2f495d7d38140e98edc9cc81 GIT binary patch literal 515 zcmV+e0{s1nP)k)C%v{>qe+-b!p*mcNWhB=f^qX3|xGkN)5$L(;!01j#GP-&)*Rvsnm40WhHXy z^h^{%#J;Jf z3gTcB;p!S2z4vLEdWTR7fTCrU6oCJ!$mZ<_sN{JN5)L$=Ya28^yodWbhgX=Sq30&5 zvxD#3A?xc~Nb$!C{_Iy`r#q?d$q;;7LK=tBl`39-0z!@UeY}a!=yPXzHaySW!D*hp zng1;a<`z)bE`t!rY_w6Y9$4}~S-M|}j5Qm!4o)1C5$JP!`b)6*9*7SFYUkY}K!k&6xEd0}W z3zJmGp}ISFXS0d@zXMrzoLa`VlTpEpZ70i)QxpID&O6A+px_Ui7JdK#002ovPDHLk FV1jPK=_>#L literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/shopping/supermarket/rewe.png b/Icons/map-icons/square.small/shopping/supermarket/rewe.png new file mode 100644 index 0000000000000000000000000000000000000000..d3df861004af2065a10046f6c8befb1b4ebd27de GIT binary patch literal 389 zcmV;00eb$4P)4Qn zyY8*E?WV5jlbz^~ndga==7y2wf{x^ThT(O3<8y)EYH{CWbKYQY-d=6mMp)WKSJ**Q z);UYmEkMv2FVGk*&k`uk4I|A7Ak76F%K#Tn(s-@_0004WQchCE4c-t00000cS%G+ zR2b8(kLwaeFbssF!I&~m$Dye9Tu}}0|9n!<;M+;Ee|B~Pa07uTTod67#G^xR@O0008fNkl&!6ae6J?!E8# z%yhKw8P;2ll-E&c^JOo#|-_MoH^pAO=pozH$3jvDX{@^fOX2k9+Y}QrdR?!Df{k{5STz?Ts(2mnVC_w2h&csd-1Xwd;GrYZoRg)dF}!~P%qqG+WF?v zzzau=6be~J6VGAmR=oPBYfbmUj5{|Elh0DQ+&Oo~Ub|kNI21BIUse=NfGScye ztMTfhLpJ~FYrC|d(|D)7;+y?qc@?vC{o?!F>V!#VlAcRa2+aCH=%gZ6sOP^IoA*)+ z)avGWn^Ner!*jo5d!^@-0wk~k8U5BB9DBrPN*M_;P}(YRgfE5mC2Ka;({iAO#X|0Y zunb9a!EcO)m6}v;<_Z@)zcy^5q6tC^RLIFQPGSEch+_sTv@7)DFWg=YUpcLTWX5TA zPgs962us2EVFoX8I2+klI(ck+Zr&p+-z+(pr``75(i^Y&Bzdh*gj(wF+-r#X59O6wtMxm>LocKBjC+OL?|4a wBjt$L7bPSTXwYf^VWbF+))*0M3BZj119QL70(Y)*K0-AbW|YuPgfvCIKF4VVh6Rwm>1d64!_l=ltB< z)VvY~pUmXcyy8?Vg@DqeoXljG{M^LMJg)Y&RZoE`zj?YihFF~5I(e-hbE1Ij`Md9= zCtPcYU{7mS+FHwH!qzDZXUChtKSFgD?n?WY;y2m>IZpKUJ8E<~z zR=Lz)_mOW`xvZ4*X^%&$J0EVZHe@g^-fVYy{=J{l3l3+mdKI;Vst E0BS0tLI3~& literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sightseeing/archaeological.png b/Icons/map-icons/square.small/sightseeing/archaeological.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7a00138f0824ca34dc0f70bdd37411ee18f51a GIT binary patch literal 644 zcmV-~0(Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7- z4IvbU{bJAn0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FTR{ zD1uH>aI;br92`Y3Vv4v}Qrbc(rG+l7mTH=qnrHsJG&k2F@-Vzqp`Ph-INx{A`ObF) zwNPv>gaB0U%;wOq+QIc#dIYE4?X>CpFslU;)+DKFwywrOprLWf-9}K`POEDV$MseK zQt3QB{wNR37tB?b?E0oZ!G>^iciUBNG+*M1=bQ~58cwqF@FNCdAGqebh(I(Zxa{d7 z;@ZpWck^U_6zzO=t@i%DR%DmvC!__PBN#%b+c;7C@mUi84lf_a7Kt7U(SNg(o~|%Q z4z>W`6I+}egk2#Fq1Wkgy)Q~j(1#F$lSg-BxHTk_FLKpM;BVUM*n-ci^JHWkGjG|s z_oWGbs-km*btM7FnHH8+VKtLSDHytU0e}jUgf+=XA>Me6%Q6kXz{61{rdPN%80WzL z0FiKjMfsKf+%T3ZJG!(9KFbsPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0to>pA7g&~uK)l59&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00LP_L_t(I%cYY)NE>k!$G<<5 zYYgSIcM%&98X`24L(G&6LZDkL9hwY@LqP)F9Hd%^OEsXQV>XA<;R@nn0u`j7UTg?t zF_IQcB0s_{>}~KRr7;>ji*BA~EPJIlY1)xcN(- z2Y~*c{e3GdE7sA&(J@6)765<%pd*tbktzGsb4n>rPEKgGR#gW00j=F`2c;CzXq3vb ze9f{fV>X+SOePTs1eSQ7pVI=s)q|@`jYb2j)e4)U>F8IpAV;}ryzuMK~kyIb?$NQTNl9V_3rJ)cWVHk z*X!?uNRk9qRZ~@6^{NYCFc|8w^H?mK&Eh_YD2l4b8BMe#?iR_lUD zl7!9pW>KfpHSPs8waw1v|-|W2e)Z+}_@H$+FB_MeAgtP!R3}06>v17MAChL#7#%am~A? z&dRgp^*8G@co@vtzS>?JG=?V|8ylwI7H)&lDTZOxB3~>x9F7vmO`+5u}b923pqfHl$aXM&-MF;eDU?*Y|xMg?AJFXNodTu8K%iIZzN&_|1!j1>gd} zqWag?B4Po!CysD9yh{sx`(pc!HZ~?_pA!;^#16Np%ZJNrC_G?t{4oL0ZnuLxq1Ws6 zC>n$5j)6d6z&+7kucy-|IPp6LGMUV!gWjN-&1PfNh~#p)2Y8@M?$@puLR-EP;*J-Th%>bH|(VH$>UIwq9>;`90X zBq^24$g0V3ECPT#nP!^T*8>>{CVZ8}=_5c6?07*qoM6N<$g5a>-h5!Hn literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sightseeing/empty.png b/Icons/map-icons/square.small/sightseeing/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..1757ac09825ca0930cbebffcfe86fb6696bd44f1 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMkygZt4CLOHGx8MC9V-A&iT2y zsd*&~KAFj>dBv$#3IU}_Ihn~W`MHUid0g#ltDXW?x_i1fhFF|_J6Vy5L6PThklnd= z>Axcd6(+Dtuown=hq@epquBd=%iLcrtA7@AGA&>bc=Bq?ThD?6!Zrten*@(VwQ(`b beRhYTPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7- z4Fwc;6@zvF0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$F=6-#r}1{S;pa{h`$N;ev=1)S*JMfWZ r1Q!Jnz>0`%Grw!79N_0=`mXaQZ_{~CadJ!d00000NkvXXu0mjf4e`>F literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sightseeing/monument.png b/Icons/map-icons/square.small/sightseeing/monument.png new file mode 100644 index 0000000000000000000000000000000000000000..4d0cfbcdf0aeb2b1a7b481f00f7e38b07ffa47f4 GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvCIMa(tK4~=+(03@64!_l=ltB< z)VvY~pUmXcyy8?Vg@DqeoXljG{M^LMJg)Y&RZoE`KY6-1hFF|_JK5IzaDYhL{9;dC zr{ibVaUEUSarEH9gH8*J@5-_)JUIWt?0CU~@{m8AH<^OCcD)EH=$bv-oMoL{d&q?h zvE7~TiyqYMne(u=#p~32l}$E&p{7$KF0A|%ICZeEfO#`Mx7eV%!M~8@SuE2^jsj+XwVLgQu&X%Q~loCID?T BtC0Wz literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sightseeing/museum.png b/Icons/map-icons/square.small/sightseeing/museum.png new file mode 100644 index 0000000000000000000000000000000000000000..8e277641cbfde4a1bd0c2a21951b1950b6ed0dfe GIT binary patch literal 683 zcmV;c0#yBpP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7# z78@~bj$01^0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$F3q!GTimJ>$(a6Fn@n?Hpdr> z#YY<-H=YyGC?R5ay${uusH|@gU5%h!*)8I-qkb>i9}-WpndRZ zFc^F(kITE7reS}yzh_z2aqFzrP9~E-uD0NVD~h5?SYl=}nXdpK%d+nHoslSt<}f-u z1%UH==iP8PJR&R^vn)HmB3J+m6L>zbZ9Bj?3}2~K)&Zbat3{a^BN&FkF3*Wgb>Q}!OH8E_p&L!5=D{vkK=AswQU=zRH~fM=U@6R94JI0k*3;Jk64yH zQoCw{QL70(Y)*K0-AbW|YuPgfvCIMa{Q@j7-`+!1nC9V-A&iT2y zsd*&~KAFj>dBv$#3IU}_Ihn~W`MHUid0g#ltDXYwbMtg@46!)9bn;$(=R}cX^S|$n z-<#pR zCF^(X_gYeWnvc~$wSTVc`rNaDkB)EI$5`W5A+hFh>Ivu41&rI*b0!KaH0)Tt`2W=x zx*^=04DaV}=V>Tt>VD%>_Gw$8v7gwMzHKbiKSjn>pT4&=_ttLR19$K5*HAX@Uz(Gt kW5U2-aCOs%_2vHmdKI;Vst043kT1poj5 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sightseeing/viewpoint.png b/Icons/map-icons/square.small/sightseeing/viewpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..82454ece5582534596f5a402b3e9f43363e0be28 GIT binary patch literal 1689 zcmV;K24?w*P)PkFPr|s zlVqgqi#V3G=F-BAcxh=`iB&YL_9$##3m~mQe@WQDEBDK|nS{2T(dM&qW11#P?~KN? z*T{|TP8EthC1M!(J5AW+fBA<(2pqH60MNhU81X#+P$biY^=B~*v`iFp6Gr#fig{o^dl}a|5q|2f)9!sJ8@wUc&6dx6f}z6;vKkgx4e0?n;{5^Yflq zO?fII@tM*wR_nJqFN#~@_G6ky0|1mSFb#G<+>#!r-`Z`N(&>X!2_f1OYZTMm&*UT3 z9@#_@Ei!1t!xod_K%XkG3X%yXow1iBDR^ zG+^(~97noVS7c{@)m$GaE6q7zY|txW24X2sx+e<|_uv44K)J+$_R)GOFLL>1o9xNa z$qo?6?fay4SH3$fo?X9jeE%K7SHd=8z0QA!aW-#I7aAVq)63(}^<9h%0nhXtR;-1igSJ`$9)zYU$h5GRRtn`ZP!(+y7?#ST1 zM7{^-kB)m|%lv1TEd(tD!DA+N1SL=cfGl=XoNoVFFPp=Y%6pLJJS1QF&Z_U59RO?l5`Y~Im8SB~YiVdKC7-Hue`&qYe()t! zxU#KFT@^c#f<1ZGZ-A9DoW=G-n(e!9+j^pUqOd$p+o~>+;OP{{&{g|KYuCK+ij3YB zX1&e1??}J!*36AOtvP3*RM>Iuvp9DHwG4aHwH&45(mD}e)!o7 z({gX?<6(pMp^yvid1TK*DDm!d@|C*g&dHu!@%m1dySJe0pTfZvHV19&@BV)Y6gmBUwJk8cd>4cR05F!s zFtf2B*s%A;LvB7V8|PcM&}1B+ag}9Xm`q$Wa>-IQqqsXE|3FaFs@AnLG*M>(a1ld8 zceJW6tdoC`gw80?ijhnB!7y30&$w#fb()MR!THWHZoat9u-7QeY~0)k@bJ{nPq^4l zNr+OIgeaA&h?)&Yy*^#BCE4qZIqSE%BiP)Y{sMd|=DnCKz#RXYn=*IbKS@0ie>wLP z>uigY1oC?TBpER=vg}O9r}R?BX_#~6#`tbK_LY|b2T8z+<*u3i{J!VMZ+rC@+>1D6 j)j{@Z#bO!#zw7vaI!*Dh)X?$W00000NkvXXu0mjfODsUQ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sports.png b/Icons/map-icons/square.small/sports.png new file mode 100644 index 0000000000000000000000000000000000000000..4e0bbccf21a40a0cbb0661e175311662a1b5d0ec GIT binary patch literal 619 zcmV-x0+juUP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TUDn7X(Yt0RR91G;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ioy-7qtR5;6}ld)?WaTLctzq{H%jg37h*y%_-3e_f98W$1jQixL_Yl%x+x{2UF zaI1@he?c51;3mS2a!}&oa0nhk!?o06ONO*GHBHGW<~pR5B-Nqzjqknhm-im;Be)2k z#X^WbVjc6Jq&gV@X(90?&5fDGa|8}b;5ZPRcoR@KV}mc;u4@S`kj-WRh(@E->vd#Vz9qkwH+Bzq zZSL`Nwt<0ma&!`iL?Yz#c`VDqwr$4aF@-{b1Lr_yh{j8LGYwQpy_0^Prdq8cgg{kQ zeBY;1sSpl_NhXt69VtDZJ3R*>1nqX4L?VHrD1<^GbX~`FU2NNy_Sv6(MCZLT zHcgXsI!&|Lq|s>5?RH6}Qgk{UYPA|$&$cG>CwNmHj?9q;;CUXoTnF9iRttdsasM0l`8fX%1dyZeKlR_bhwj;Q zIwcm1p~h8@C%oeYJ>;w0T(GdnEC1#}x(vo5Fp2-g`4>ZbppFOht;7HT002ovPDHLk FV1i-~1;GFS literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sports/basketball.png b/Icons/map-icons/square.small/sports/basketball.png new file mode 100644 index 0000000000000000000000000000000000000000..c795149d66692f069625f418bc51249fca815a06 GIT binary patch literal 694 zcmV;n0!jUeP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0uT@Z3yP0>qyPW_9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00JIKL_t(I%cYZDOB8Vw#(%T3 zvu`uYGP7*9>kA4=X(@(M5`>bU!P_9ZSR?2Y6!;0cvC9bbLv$4+B!ToM+7>E_XlkQW zyXt@EWp`$}*mYgotLzU44(H)K=kPzz1Jeuv!MS3ZAqfb`QY6n3|MI382axJa^9{fy z)V~$Y-6q~P*_%?S!0Mq>e)|2V`Rz(&hX{T%Nw}FbTqHVUWC!#2b@f>Id@R`Xbwrp@ zRBf^|r9FOaUVPD8T&e2VCq1F&$up_!;MBOTN-88XA;xYdFddIC2M(FE%)LHceRh-` zz&-72B%@|Lmmkqpym~>Y#lWQ~h9R@CQO5QIbVpXNu14D%Tc0FjUZU+?!9t1w(K_M- zE@*_fbvXe7-uo7hj*YfFd)sFSMiO!LMlKGCI)PFLDsWu#`Lto-Wo0<}vLhyhn#2PlHN^D;mbPpH4?fP<39oLe+ouCUl`?LJu86YIM! z*R&|3={Uni47m&lSX{HXo{lm9ONh7K)=sMqBKXhye=ol|5<(87+CSKU1%+*gOhjgG zvm~Ch?=Ls2@r)8Z9p|C;%^wgQ?+pa1{>07*qoM6N<$g78)?N&o-= literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sports/bicycle.png b/Icons/map-icons/square.small/sports/bicycle.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f457b4dd2518ae651a82cffa2ce0f69be10aef GIT binary patch literal 537 zcmV+!0_OdRP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TUD<0NTa-YybcNG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoYe_^wR5;6}(@jqkVH5@6XQl&=8A3p8BQ-`+NnqiE1tGdKtkk8hUAQp(js6IK zi_wJ%i7t#A6~u&4f*+`Q#i@Hxw-GjIrrW}(G1d4y`q@_sd2j& zywwkiZb1lre{K^jb_vdasHd`OL`7^^!*xG9wdV?EeKn_ivb|TqMMvJqJFn@pA)gG1 zH4XS>%Fdtdy#x&z#|A9R`X=#RqAW40X5H}LEgXtGGhtt>Dt6xoujI|z5=t!@Q!{8$ z!Lmyd4YzGTdySKRxM@>UXh}{gP?r%%wS=Z^E4iR5_Q*S%5-(j*k_$Vsui3LAE7J1C zh>FCH#JrE@lpTxA+wel(gnbQ}u7wm;gYH?gCAKG)bs(qavO|#3GOBLMu5GbU+O@FY zwWkW5k={{qBy!b3XId5KJTa*y5J=s%?y(zf1>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TUDmD>6Tw#{d8TG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io#z{m$R5;6}lg~>QK^VtBv+KLt()*^bVri$hTNJ6_#SYbW?-D3=hBWl%dWsN&{(ustLxh471omFqfzOyqOw0+UG!&?sw%nb8<=KFkS z9zls-T;}m;qnRkN%MxWlnKhOuQD(gh;W0(~NZn*l}y zx~dTU39>uk*mY1B8wo2t%h<(+B@Gh==#KsE(Ps(mRbcVY*L&Rc4*M*Gl_Mnpvl2jZ1=hv?w(~E)lc)7;3FC|a O0000Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TUE5DfyTpk^lezG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io?MXyIR5;6}lU-}mP#DMmCpk@;q|qj8EE%Pt7j8N>9Edl9I93HgFD8h+_r|Z$ z&)^sEc6Z(=DyS5^s1*@!#320EnTZhllutMWT!?0AK)M;m>~nmA`;vBK4|hq<8PHk(iKq`F{gKh6wMkWK&k| zY<5^!5+aGtdp7qH6Ur#Nr8UkpGQMH9%?FRFE^&hsD@Z@NyULkHM!jU&)K603acNzt zUCW(V0SAsH1ZdHQ?Ut(h3KV|G_q<~Pj3Xtq+O{FHLSm#2eX{-W2lL^g&hSz6YopfC ztJm`?rEEVMjN4b=m~qkzj{tI&omH>+_Iq709l@75;rWe1n6Dp*0Y{B@cUHQ$o_*b? z)>s;7Li+X1LihI5`m6_xBPGH!{c%$;9RP5-fj`bRY{}75tfi$~<6FB+tuX)$<(3<= zK`2I2Vx}MxM}gaCkIXsMS(f8s&74da#{04?V`G|#0VP0BVnCvoCkfJIS_tZj?`lm-h|=5<~z%rlzO>03Y*g#@9ug>v#iV z`-c^Yu|ySL6FOYeo$W*!TV(32*={dtCj76Re*+Bu+Rjmns002ovPDHLkV1mVH B9{~UW literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sports/dart.png b/Icons/map-icons/square.small/sports/dart.png new file mode 100644 index 0000000000000000000000000000000000000000..220061611972e5a6e038c1fbe9e5033af3a9fa09 GIT binary patch literal 909 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 Y1rsNenPYVc{{R3007*qoM6N<$f`1wJApigX literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sports/mountain_bike.png b/Icons/map-icons/square.small/sports/mountain_bike.png new file mode 100644 index 0000000000000000000000000000000000000000..cc7250697711c003b2f4347c6b1e675961c0dd4c GIT binary patch literal 716 zcmV;-0yF)IP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TUG)7kz!ob7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ip9!W$&R5;6}lS^+BVHAenxeo)(a2Z;_1ZpqPhG5Y&2D>t`CUt4L)9&jJ@CWcG z`~{l0GrBV|+UlZ$X+j&+plQ_>1cVNk4w>OHFmA9(7;Qi7B0FtE62T%CWS)&R04vhFAAi%eS-YRT<`_H?>(-XhXU6ko2+Fq%_f@4e2;wOKj(?7tfh`JmpJ&o}-8*t6FrwB>Z6>Nr#ZK-#<&Cb^Cw zeZCs3-g%x^=~fRBz_WRK$`XJfMKsBJ_q0J!gl+a%9q1gR5^DdCZXPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TUDn1c3FC-v9srG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpS4l)cR5;6>lg~@j0T{+VU$<{_{>UYnBTJpS%5pZ9VIazi5LSo6j^!vQyUD=l z5}5yh7jH^3hJoZE@}NZutss{)q1=ki;ToE_veo=<>3+Hnb(!vx@9}*fK0NR|ufPBe zcp1ZwivO7!!kpxm94}+MrkWl;{1;#ZJzy1R}Q@+Ezfz#An=h=aZ@Zz#*sH5CYr523HO8p%On123fRB>h`fLXw6opfTx;lNG zXfl}qsI9GKVqyZBOs16Il{Z?0RwrtfZ8jZ}&&9S_^j8dsYtJU&oWSGOhLtN^-C^WwdA5kU>#HH_{YzJ+2&B2=M;dIF&+##jjz42h_M< z&Jx><@k71-b8im>z|1E)@%Yw#vGh)w2ECr7{sK#hVq7m~NkkHa%N22V{l?nf82>?{ zjnQDg)E~qN59W2Px^tJ6@|cgPlw#|6am;%q>e>?H$-gOdaFeH;qJ?0tR*UH(`Qlrr zkZvfCc(l@*tK*kXD%g(a+wz-Ix>QhL06ku;`+es>Dlq1`U@x_|00000NkvXXu0mjf D_w!Pl literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sports/pool.png b/Icons/map-icons/square.small/sports/pool.png new file mode 100644 index 0000000000000000000000000000000000000000..6d7bbd547f1f1a8f1e73092893d0de536e541b92 GIT binary patch literal 676 zcmV;V0$crwP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tcir3`~%<6951JG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io_DMuRR5;6}lg(-qVHAen@0*!8f0>~(oeUvu(~9uDU{FHl7VKzgpMqCxF`-XuSIXCWy6Le| z@OJI6*;F0(%o`*G>D7T|G!@5wvAMI&CX@;x%lxweNkLMA^uGX_rr)%IRp}b}$Mw?2 zog=f5cO~f+zRv*#M;4!N-@Lu2js~C1Zg)3l4I(B@0HAEE*$0jF_0mYu2?*qn<7%31 zeKC4H04ofDs&hZ6*TiHf`$FbMUthl5x@PhuOcXmW-PZ6_ZB=lq1(}n5k`=-#&Nu1_|UJxasZA!t~hXeGbj1;MvsotKDS>{xQ zaei++KEAjG*Z_dl&J+M30a$9x+a_G=L>m6@PdqlpdCY{1+W8Nh5$wMum>DJj0000< KMNUMnLSTYcKO%Dg literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sports/racquetball.png b/Icons/map-icons/square.small/sports/racquetball.png new file mode 100644 index 0000000000000000000000000000000000000000..286d021e4b1a2ddbddaddb9285b3b2aaa6ff2d16 GIT binary patch literal 749 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 FV1i-~1;GFS literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sports/swimming.png b/Icons/map-icons/square.small/sports/swimming.png new file mode 100644 index 0000000000000000000000000000000000000000..2c67d48a7f0499b3ed4cc04d57209d0827b0c32c GIT binary patch literal 548 zcmV+<0^9wGP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tclu2k5qBE&u=kG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ioc1c7*R5;6}leDsb2$rH)2x4hvqouEr*22~o z@HH$HUqBE9D-{&)t{1!|n6cPIT@#X^KMcc}`OkOGFdQgS0Q8?$k%9m;z1*|P9>2AZ z&mD>~l37lX=&!pXGXN4Gmi!=0&ZW({v^f@Oo-jEh^>ub7R28rdkf^JAyEe?gat2Gn z(FVLqPzR7(50C~N9)1u^?;;|5JwT5+OeyeEaH*hNf+GQQ0VF!$;>94u!sq?_2{pZt z!0PYBb)r}ZkP^fXTgHRutX&J^9o%NR$mXIXfQ1$Cdmy|9qiRh8mAnmSVSNXcNr$xf zj{Tl!_kyUK8bFV#nk5d<1qYYrN&kaNAP_?~p3xkTHbM4TykW!v zH>SeP8KjcU0m=q15QIv_0q=Q-Zbe&iJD@yb$G=feICPfa;juNqEP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP= z6#)VrTb2j_0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$Fq7Y9ac=f8_K`)-YtS7JS z#cJ^?da)pgB1$QgqJpSMwXI4DMTC%GlHEk)pRm7BA+l!+d0wG;=OnA;15`UcXygGzn>5$4r&fq-kH}m! z2;;kj>Stu8hbjb(EJ!R;^I%>Dm-GpK;ADN62 zxi`w^v-^Gvurrij4N$XNj{@*1CN?In-f!MM74A92q98S$#yT49oCmysnQ=-pIlc`R ziJe&q_Z8#EgU^Pp^o}csv`f4L?sreWu9>)P* znvj{&K|KhSg�i_ouLhM1ugmG?8!_rp~d2WfpHVXl{VB=_2MUnCCts<=&EbQSqms zqmaOABU|}Lb&KI^Z&-bvBJ{yPDs2+LLD{a)b_51NOqA~G6LM`vX4goUs)Vp9vI_-= zIzc~RF9tFWe^MV7gP2rNk#Vt*{ofeI=5I=4QbR?-!9o1e2Rl-V221QF*os)tX&TQw g>`3il;(y2aCy;it6*0aI4gdfE07*qoM6N<$f}J=EI{*Lx literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/sports/tennis.png b/Icons/map-icons/square.small/sports/tennis.png new file mode 100644 index 0000000000000000000000000000000000000000..509f1c2881b86bc28dea08e9ee502d1a7a34c0ea GIT binary patch literal 737 zcmV<70v`Q|P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0TclR3p>S{U;qFBG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpGf6~2R5;6}lg&>PQ540`n;B+?mZ4KRrF0~yAQ5UzDv1UYC1_l+GEw6~O?2hL zf1>^o?ldtbZd}OT7-BT)!eGJp!G}mdY)eZEgPobq%zJ$<5F}LmJjqRN?#n&-<>Xx; zgERpCPnAKM0N_Ys4c9S&zflIm03ZOsZp%`xBLpgvT@0T5FaUr$A@~YXvWbNqdWiPtsNm0kw1Wk?JzM3XMlSn%X>+YGS z3xQ_&n|oUXl+|GgtKM2FTTGPt+E}9GmQOvJ%Dsw&KAq4ekpl?w5!D)b@PV?H&lI%YKmf7M*He?Fa&LB-eTjvo zB{LkJ=}+oIpNbqD{&;tLv}%TJu^M1otO5WKSCu07FQ!ySSC~<$S{-XNVgFgmX<%q!4Kq0if15y;{0)>*f4njjHccX0*!-5VIV2qRWVv zdm;@6T=m$}`Fn3F&3R|@!4(`T72_?fZQ#YrcgHJdAHHRrv6jcD4-igBV+KD_uqS8L zY!FG12sI0iee(I7J!5F*>|n}v8xR)BSGbjl^R*ST^i_I(7t{crD-%w>^*)fr)YYsdlI+&Cuu?>T=1sCoZ{ TMIcBz00000NkvXXu0mjfQ87Ag literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport.png b/Icons/map-icons/square.small/transport.png new file mode 100644 index 0000000000000000000000000000000000000000..209010c233ca57c7a48c9bdfcf5c9b41acbaa160 GIT binary patch literal 653 zcmV;80&@L{P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7# z77!i0qV6XE0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$F5s@MOCPP#Q`1Qep-rWFET{E8|LtSNuz08w72z*y+vC*ni190G0 ziq%#`-Qrcs*(jIS zwpUiJ86uB1lsd*>&k6TNVEY{0eF2-k@$vADU@(ZisxUF}{PXVaL7NKG7h%f>mp5U<2j5(9vkdn~;MJ5p!@~%8f54r05Y^ilJp0sk>s$8i?@V=i nVSd%Ftvi5!_k(Sw|FZK>T|n*Aq*OwO00000NkvXXu0mjfTs9+I literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport/airport.png b/Icons/map-icons/square.small/transport/airport.png new file mode 100644 index 0000000000000000000000000000000000000000..9564f33ae2ac91f65a50090fa304cba147d3084a GIT binary patch literal 527 zcmV+q0`UEbP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4` z6%YVmQrTkw0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$Fr4uTHp^zb8@hLfHVft)DYC5Q}hFBZ1E>l z1eK0Dd>|GzG-PVJD<-vwr@_9A`aZKd%ej~L-gDpkp7SdDA^a_rGA@fqTB#f&5k|=n zO#{3a$fnI7*jfe03+!K*!eQr7+-A+- zUY44cnWE#Njfu#=bK6)Pl^?8PV5WcB`3=)1z65@; Rl3D-&002ovPDHLkV1h*k)b#)W literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport/airport/airfield.png b/Icons/map-icons/square.small/transport/airport/airfield.png new file mode 100644 index 0000000000000000000000000000000000000000..55273995c0589d8508bc1400f69e1b5fe6e7edac GIT binary patch literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMk!%o9yga=mOvr764!_l=ltB< z)VvY~pUmXcyy8?Vg@DqeoXljG{M^LMJg)Y&RZoHT1$w$ThFF|lI@#9SDNv$ees%DB zSrZ+Z79AZeuB=Rs78$40b&iwSz8P;iC@*kPDc4iLvH8L!pDEY&i6K*DoLUTym;5SIk(1Y}o7-L>^x$(t z&Zf_*uLEybZ%BK%gVrf0tbRlgQ_8#}NK^ zzsU`*X{SZSedc*vRb@&n;=Da^9oy1NQ`piQU6LM4NX=T3-@Nk5Il&nJ6eH2~m3v)P z_h}bc=zjit^;?Yww{f|_cMj*T@>+$F4sQ-UKdsyFJnmAX`gCo3{)dYMvP-#{f8675 uhcd literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport/airport/helipad.png b/Icons/map-icons/square.small/transport/airport/helipad.png new file mode 100644 index 0000000000000000000000000000000000000000..99252dc545b835455cb7bb26372acf56ac22d7c6 GIT binary patch literal 531 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMk!$txnFx?w*iIZN?apKobz*Y zQ}ap~d@_?$^NLfg6aq?||SyrbL0`^~=}G zOPYpkah1<*4&ZIPIH}orZ=No%&<+;UZI%)q!51W)CI`DXdIU6cee~Pf!WIGvW#;sZ_azI+~Fa%RP9HnlL6m{C<8VNcPbLftptyB9XZx)y}{YP}yEyKSr=fpEiDc!ET TSz5CX7(EQ0u6{1-oD!MP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7- z4j3*>Gl+oz0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FDAtWtx3?c}(j0j&M=qY4T_#(a7Q!mbX zk)VheflpHjqPIO5VWbohg^LZB278zbA#}ZNHH*w z?1Xu@ZHHCOWi101w;IO%M)|Tbqt-2mO1@rEBJl+fUx|Drzv<#TsuW9E8 zp?Pg)=0O5reB9jxBM*Z?eKU+52?PRfVB2b;;5X_xxRjD|-vXR_)!i*W!S?rkeNUR8 z!JeIsCE-hRCX;E0M?F4YZ%-WuV4CS9_*ND9@Z9KV$W%9-l+d16SuGzrI^R}>s5fIrFHpNJx~rj?{c}^b+|QAEY97n t=mBiphsizgx=p2CdFK2B2k>9t`4?+U%4H5QuGatn002ovPDHLkV1f|d8$AF3 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport/bridge.png b/Icons/map-icons/square.small/transport/bridge.png new file mode 100644 index 0000000000000000000000000000000000000000..ae22c6a124e00af4c008e4d6a52c255935b84bf2 GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMkx^%iI|{2;Xom|64!_l=ltB< z)VvY~pUmXcyy8?Vg@DqeoXljG{M^LMJg)Y&RZoHTF?zZjR%)D0s&*zfq877WFA~Pz>@s$|9c-X+ZQn(rcZ2qC@wtD zAw3}>;rHzX8%pE;$wzf#O&Q9yI z5)wf|U%q-DmXxsDa4?3!m-+5w35g%~oNfg78yoDgIdR~_FAnCzk9B!?^8JkrY$Dhf zGB3<>nQvfl=3QDs!Vmt^gY13#_O<2m@JM>A`F`4Y_P~cPmp(pLS}rNEZ_m#^ks0dD zhtIF)m*aSwoL~@n|Jt=}O^pZNe^?dzr)Kd>hNG-JJWF;nO`NH5>KwyNpH*+BWhR57 Og~8L+&t;ucLK6Vj7^^4% literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport/bridge/bridge-car.png b/Icons/map-icons/square.small/transport/bridge/bridge-car.png new file mode 100644 index 0000000000000000000000000000000000000000..d34773eba497d5122c2183b242b975e36c2c189a GIT binary patch literal 642 zcmV-|0)737P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8z%7;$+2YybcN9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00HVrL_t(I%cYY~NRx3G$3MS! zE8j6`{b43sxrGHDWm*c+fNrzkf12KR@wqrx#$Y+8F^JolT`yUBO_GVzG#>>sYN;4C6yUsmG_m zlTd1C4q6Q}zovj$al+EveE4HD`d)|h(Hd6G=kpoy_~#?j(80_ENF@>e2RvXNm>g_#~1pD`afrJ;{dMn!9eeM%9l!k|2pM(v| zwkb^AhgKjXW+)o@*3L=Q!fFgY4Ycm^_DUtfxn2Au?OuTyZ*`SwPAJw;z~|9NdCS4Uqi;c026VA(w$eO|Y>B zxlMS}RQ2WVP}u{2T4X#8ZC^!vN%*-Xa=rk$jM-~0BXV&KY$cI9Nw}Oe^|uG`@AptW crvEzUU-ZY~NK5j;)Bpeg07*qoM6N<$g3*p6ivR!s literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport/bridge/bridge-pedestrian.png b/Icons/map-icons/square.small/transport/bridge/bridge-pedestrian.png new file mode 100644 index 0000000000000000000000000000000000000000..aa510daa2e2447cced6eed8e56329106f3d8715e GIT binary patch literal 614 zcmV-s0-61ZP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8z=0JGNIa{vGU9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00GWPL_t(I%cYY~NYh~$$3L$w z%Ri}=Gf*bVQs!ZvEMy=>DyYLQ!$X+NONYF95JL}+4gekO{$1CAP9K1Azz3iC1zs;Se}kvX=6AM%*#V?q#TY=H`rpj+Z!Gl`q6L(f_L?iNYfe|T!O!q zVBHIaEIVeTc?cfFMCLz1{HD!zH3MZCk-$$gf`a^SFi{Jsl6d^#0?c&%@1IHlcKcix z3@(aH#i1k}41R7r1Hr4tXtXc|_Y!*iL>nEQcAiQQi`k1I=<<4JUGUNA@i@02V8ja! zx7)r80oU;G>sHt=%n}$s@x^nP9Dr*F5S)ejTd?y7(rKt|fQ@x1uYipj80dkT?+}=S zM`K1K74PcWw%6Y;i;#Hlc1swN%OfN529n{vK3M{7$><%iTCGVyRIU@By@czBaQ8AK ze?w_06kUPsO}J4F`zhGYz)H2A?|+;v;X>_v3u4^P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4` z6bcd|1USb40016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FA1WUbYDWroUtl+%aFk`odf9~&-VX#1z+ zI0CnOu@01GzkhBMQlxs~YN1}=H4Iy(7=kz9^UXVKRZ zyGCfMdU$x!!;&M0VA%?{nea+ak68z$jc#{t7_5%o-r^iEn7X?iHDG*(4B)UL5U}XJ zyaRyj6UYUowje(b&is&53Xj*3b!kS}4}qr%&VdU{w86i=^E-<%yGPJ5A{+n!002ov JPDHLkV1m-X?6d#? literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport/bus.png b/Icons/map-icons/square.small/transport/bus.png new file mode 100644 index 0000000000000000000000000000000000000000..04beda8633a5b79d81d28faf481c0eabd8cab72b GIT binary patch literal 574 zcmV-E0>S->P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4` z6C@PHFM?YD0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FVI0Pv_eGJDdhrYz^57hFuxpTl`UCC;Cx>X$=^Ao!xwS!>o20?1 zrrU&|$sq~EA%g^mvq2Y^hTupd&_R3~F1z!`k<@qjzVJTp^M2mvrH+m0RxxR0p==t-4I1({4{>9M(74z*ehg~F8t zWZRD3W8gTxi>j(ZmgSX+X_|&a;!^DQXL^8o34+0q7>~z&BbQ|vgMlr�vylTZCDb z1xo2kgXwe%#wfFGmtY|So2Jw0-~OI@38hlUDto;I9KNl2&scH z2E#BAi^Y}Y3P!we)cdyr*+w;lbpanc10lOVw+n%?0ivr!Wqw&cA zIBSMNp)qjs$oWG9IB(2)wR+J4g5yr-y6Me;xRdCehjq#wrhkp|7lkXE9d^fP0{{R3 M07*qoM6N<$g47Z8#{d8T literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport/car.png b/Icons/map-icons/square.small/transport/car.png new file mode 100644 index 0000000000000000000000000000000000000000..697a3c079c8e6d6b11e4b4f7ddb6060b0ca070d0 GIT binary patch literal 502 zcmVPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8zt5AHM1d;kCd9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00CY}L_t(I%gs|UNCIIPeZN;; ziHJd1+~9POAz=tAVFaNK4lPDQb6c}QTL(eV5;Qgm5eN;=oq5z!g#H9>1&M;;)}$d6 z=hxufd6Yxx(g#298~*R{c;EXN`b8M67&C{7NMTF^Q3Ag~AgKU=K~Pdg6OdFKW=oV9 z3CC72VOPM|k^ye?$2+-PPE=JDnM?+% zs-jpdvTSyCld(&&|4)M*Edp6S+>XbWW;`AbIOnL>>)@P&bB?Gh``nyWJf?YDOaA=i!NAJwSenMnf;a+nlMu zGO^QHc>u0ADwXyt5H5cwAaZqq$K`VQQv}v;O%E&rUB9{)g!y1Py;>_2_HKqJFz5}1 sCY{yl{++pnf0IPu?QL70(Y)*K0-AbW|YuPgfvMk!%IMy|t4K&Hu+xJHyX=jZ08 z=9Mt`WG1KP6{lJ$1e7M_WG1`h=O$+6aka0ldJ0tO<>}%WVsZNIWJ93?3Ia^iYkcL) z_`CC!T_4?eb#uuCHmMo80_%PJg7k0mtxOb8lgVPJVJ?5dkQHNlOZ92{1A#wX4A(S| e&D{3x55sBxuARZMu`NJT89ZJ6T-G@yGywn^;!IZn literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport/ferry.png b/Icons/map-icons/square.small/transport/ferry.png new file mode 100644 index 0000000000000000000000000000000000000000..b974c3e88f820934c3c727e80bd200577d5ee5df GIT binary patch literal 458 zcmV;*0X6=KP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8!II%mc`tN;K29&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00A;dL_t(I%cYaON&`_4g}{lkwD+4#1QJx#X&KVqS#~Nhiy3cDt5V(IA$N{TB7Z}*}`cl5tO1JQ`0f+Z+ zA~+DND_$^xBiIwX2_*OsG($LVrb`IHV?-wLEqD;z3O+T?MNuw)J;ie&cz=zE)Dudi zjq>E9QCPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8!N3iPpaO#lD@9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00Fp3L_t(I%cYaQOIuMC$3OQO z-;*@;wTNjW#aa;FVE=G=^C+y1S=_E0w3t_;`(SxlDim?pvkU z(fAtwi(!MIp%<=Y^*ND;6c)?wi>Be9zZsqhC@ zC&2jtJ)glm^NIDns|t7bA^SQSjY^?VkXY>Av93Wv4rXSaZNc}4*=%MV(#2dZSA=wN zVBr1ITO5;&DsOuOU!`UHs2!O@-uLQP1pUiutd)QpQj-0}Bdd*QMgXpMNP(ePx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8$qARtU#761SM9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00GHKL_t(I%cYY)OjA)5#(x*6 zCKgMB(m$q)No7z;q^G&*S=boMo)5b?m5Xl-*@i)jzXL8Z>Ci9vWOT;nTVw5Cc-TPphq{# z8M;`wq}1JnZf!acQ{!MOH#ceCX=?x?DPX9UO8pAK?>?Qw^t8tdTLaC!GxoW|n852X z)7-oUwxyJJ8P);|3+8nw1(gb9Vd$`vNsGb8MxY;JyU}Rm8;pI{2pJ?#?pyG~TP|O$fXCJdcRuCw)(IS(3x_w4VfRWr9v}Ame@0I+ z*xS2$7WVx|M@xBlAJYi0ZWN32E8wfGu6q3dnM{UIDA;-f=Noed%ua&m1blV)ejY9y zz?U#wuEKFI9G-!~O|U)CW5csIF!#t2QSL<~68Y+AqAO3Q(~E$#MyOOC?!a?k1_*Wt z?l!Oj)PZf_v7OB(i?}i_7nEu=Kty{@;GMu*fpu}~t|t;!2@vNEta=+g+_P}H)?W7w vIzsyJvfCZ_J7OpoL2J8v)61m(cb)$Lt%T>oF|s>W00000NkvXXu0mjf07e56 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport/handicapped.png b/Icons/map-icons/square.small/transport/handicapped.png new file mode 100644 index 0000000000000000000000000000000000000000..17417ea9ed58c1feb3a94ed65a0b5bb71c7b7656 GIT binary patch literal 539 zcmV+$0_6RPP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8$=GZf$E6951J9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00DzZL_t(I%cYacE5vaW#XsLM zKcPG_O=e{w3zj597L-{ri4w99@?1&$0mD)@HWVTuNhuU1WSpkyR$SScEhj9**} z#F$|w&gOjYt?%vJb32MR2!Df8AD>0Uq0}NGxdg*ta{#;#Sa5g`zBfWm6~x>?&&1CH zY!1W6QzZ8bKZa=9jTx?Ez5Bjw_*`c33!6N;9(D)qW8QsV{y_nlOrZkd&w&*9@nGEo z9wT%YLiht{Iz+jlYbpp2oN*Bm9Tfm(bErV&{L<3UEHtbJsi3ADlFp#j3H7CL7YT-E z5C!gN=<9*F$6pj&#BXl49lq5k<1pGUaybYi0|f=P1L#i=a0T^ZwXPZcxjj8y=!C6Q zr6#psu8??ax38r7?&^vzDw?rE(otq+ryc6bbUj=7@!&KPTB;#s4;nWh<_TsJU^ox* zS0Lvcdb6Np8`7@)c#v@Ga_#hiN3&R(tDv|kIe9q)YNtfT_94+NvO5Q9SKqDxzIh0Q d&oKQf&aWnE$~K#f48#Bc002ovPDHLkV1lDk*8~6n literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport/harbour.png b/Icons/map-icons/square.small/transport/harbour.png new file mode 100644 index 0000000000000000000000000000000000000000..3c49ccfe624d02afe91191104f815ac49de60352 GIT binary patch literal 570 zcmV-A0>%A_P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8$|E?`DBF#rGn9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00E*&L_t(I%cYaCP8&fGhQHlh zacw zNDG|3wq@%kh3|3~%t=u)&A-~6{rBI0W)zbU{w z{s5xk@XP(@wU$nnBGn9jU0PjjHp=Ctxs{dW*@cC7jlI1e%hP$_q@M|5{P?U~Zg14< z@3plS5y2SqWP5w(Evy|V#bq|%$tqAPpwWotkB3Y1DE4OjCb)yve2 zDGz=YVdE2^b6k&Le+L$Ajt5WszVBb;SMB+CkvBH$fxhd($w}ojpP+i0dKLUhkTCA< zz8d8dc%!>j$S62+;9F^P^Xx%B!O&6a^CEPeL_yrf?Jd`J``~u9)?+|C&+ElqDo}{m zYV3Jl7ak5oWDAhrWgHCF1Gt%qqQ^Z@Vr^K2M;0Ol-6G8PL6o)EGcebiQecd^g%=%T zObErWQmLGScQe_4*_ogl`o7-*H%t_$bQ1ICAurNl`mb^R1rX-86k*IBe*gdg07*qo IM6N<$g8iKHumAu6 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport/park_ride.png b/Icons/map-icons/square.small/transport/park_ride.png new file mode 100644 index 0000000000000000000000000000000000000000..a774722a6fb12bfcf89b90eaa2e4d271bb0e5374 GIT binary patch literal 591 zcmV-V0Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8%7EOe*8mjD0&9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00Fm2L_t(I%cYY~NYh~$$3L%Z zGNK=XvPdfgbMkYC5pL@bA;gps>^LTL7?=k!ub#Tp&r3HiCIuk`1wjhKLkk3dT{g5X z!f=jBOtj%Z#!zSzo#fl$x8LTCU`1<=z_8Y0UZosr3N5u}9^Qla9U&0a<}OAF57va>8$gvoFnHMpU3+e~nuWoy z6BFS$_~Hf*u6e!AEL{KL_ut=wj-tunoCZ%uz*;t*3hnUjEwogov#r3?7`T#U|>K29>=6iE&0#}PpXRc(ZtplO&fdBwXI(-DRo#ykd1iZN|L`SS{3Zc-gebDPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0U8%EGAEu%ZU6uP9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00F^CL_t(I%cYY~NRx3G$3MSU z$>N1gWz|U$)+lK6&|;9#VQJuDA`}%nq|i}F1{3TQJ9HM=#ghaTyywy`=}TaGEgDN| zY=Z_uF^c9~;J-Z`-o5M{+a&e5e1E?$zu&`$@57_8N;p|5Wq%ftgik%VR+MTQ;vcqJB#y@Bz3qu;D8 z2(m7ic?3J%;Qs{kua8AAHug3IJ-;lsov-pL-t)y2tZ$0-j9%M+Wf-e7;`es>0AZ{PaK|2l_5d zd;v|`Wbn(E=(dRdv1f7i;l+K6@Z9uUX4mEI>Q>pGU zgtsb{7eAolHH`N@(0(gLxDN_yYKXa!Ha*vpPidK>uxaxXx<0oGThjLfgS6< n7=YV(*z15x+sPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4` z6E7uq1zV~B0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FkQ51&1`(OZhOvWd{_NAf(i6nJmkQg=8!~{BO(!t&7&4wTk-s0l; zVmq}CCQY=1bO4)_7za~2HFQveNC(q2PKGosNeNyD3J(J9pl7+m|DSXJ^Ph7By^#D{ z2+>cLQs#xIAY~Hgy?bwA;YxRP^+1vGgdif^w>OF0b^{q)Y-}+x4rkecR({Yg1D`EfUeR>1kE-c-ohtnpj-?F*D4c zpy2h*`T5qPVzG!20_OusI-RCey7U&Fd^uA=E*C=A^^xSBTLN9zDHK8@e78fW0AN{7 z5{W$;jRtP_0H)LFP^;BgT51D{0pC5WK!^&tTnNj0LpU6sIJZLKA*R{qgEC3Md10E( z5&oGTWHK2Pr3brQF0$Dy!C-LAg9!?Loy1}>48y?d^#Y)(Du!VYjYcuegOg$Ym0_ALhi9M1XYk?<{0zXW fcf-f@U+4T6mz}+~81dSM00000NkvXXu0mjfc4`}> literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/transport/rapid_train.png b/Icons/map-icons/square.small/transport/rapid_train.png new file mode 100644 index 0000000000000000000000000000000000000000..4e6823b67c12522ad285a16ad1262050412a6918 GIT binary patch literal 870 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 DY|7!Q literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/unknown.png b/Icons/map-icons/square.small/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..56b32ca7be569d662fa4d32641e82920b82c46b3 GIT binary patch literal 613 zcmV-r0-F7aP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4| z0umg0XAOq{001;}MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HRA^-&M@dak3QTEZWo~n2 zIv`MWVr*$+L~m_jX>JN1vNqcQ00E^*L_t(I%cYaQYwA!O#m_Z{a3S@f(w{CBl!xH< zo;bM*>7eLR=uiitlK-NUEq9{KVMcJE9r$1aR6bg-GS^irn6z;tc9~P$D?QS<3jeTzz049^k zdaYJF?DcvZUi}|{rfG3kk3=FyHk&;U1Okr$;5ZJas_L(mfJ`QHD~jS%GMT(qRrR!5 ztzH(3#S3?Dn&!L9{EGldk{%>UIst&$Z02jX+mTME^V{8r!{Nu30Po~-xufxTyygBm zjj#W6&M=IfR;#6a=>kgWE2Z=q0D{5b(=s2K zHw%k>003Rr*9L>ZWPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4{ z6&(ljBvt4D0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FC#0+2s(BNx^~L57d!d~c$1DEIt7v7 zB_xD`{(w$FSdJVyg-`By~l#(dtG;iMfzIikA4G|qj@lPW*g zKNzr*AR_ylJFUq66EnPF*BFTO}kL2J$>G}1U{dlWV3VO z?d|KEUT}X_;%qh?E|nT*udh<}5hRnLV5!uo9~^wK|73|opuV*g3g&X=qf5X{luU*~ zo0}Jx)6=6P%-zR|Lc|{j=B~THZ`JepNMvWnv_85Cq*7NE%d$|dR(~CxVHjvOn@FXu zDgZzLaClgMjKyN``~46?3l-8WsR}h=?2qNT<_enkK2LI^i>#K02};rlD0k00000NkvXXu0mjf;1K>A literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/bicycle_rental.png b/Icons/map-icons/square.small/vehicle/bicycle_rental.png new file mode 100644 index 0000000000000000000000000000000000000000..2c4ac065e77aefb02044aeb72049f3d0032f5742 GIT binary patch literal 795 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 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/car_rental/sixt.png b/Icons/map-icons/square.small/vehicle/car_rental/sixt.png new file mode 100644 index 0000000000000000000000000000000000000000..2936b70729b15fce1590fe716644a5cd43fc2b75 GIT binary patch literal 728 zcmV;}0w?{6P)4YZTa4th~9DoE_0GQ<&KcG3j5 z^+RKu=1hI}w(Z^9!8Afhr04qmJ|Dh3UmgMK>fG*;F^|V;;S#gBxSw8Hdh$qcyWhR{ z`>P$2w7PZ~z`{cP9lt*s*Lgfv%Vn1VBx!ZcwM1}NF)-}*4EP6+6sWz>qQjBzY}zKcOw99x0_Tdg{EnQ zLLuho=V@HJSwRtvMUySrUorOv9V za{Br#6#xeZ`(i96 zJ0~q%^h}M7SId&gY$h62WPs}G5@UI};YxphO{L!-jSK(#&c6Tx_7rV7p8Hh*0000< KMNUMnLSTX}JVY%3 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/car_sharing.png b/Icons/map-icons/square.small/vehicle/car_sharing.png new file mode 100644 index 0000000000000000000000000000000000000000..26504803c5102aaae7dddd5bd292df5d17a0dc85 GIT binary patch literal 751 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4{ z6*DrfkeKHH0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FLdVQ?CpC1 zxVkF)*)0EsDr`FtCnx;QaRdQ?;|P(>@;lr1gIW!0-Fte{>0+^5<~;BX!@AV<-Bh9A zaLxlilPTGu(7T;Xret#-_=SSQb$vHQM5NTZg+dZrSuxKgi803!qPba-*VZmgNn%V0 zB2813?d@wzlGwEnMB%U^0{|l;sy#>7AF1o>ogLw@tO|juHjDw4RhGeuMc*46`}D=K zJfCQwzm8yG;dOhdGlx5imc0az-@JFVzlIm9f#$r`poesfh+yT+Ex} z<61Fgf{Lt8?M(%yy@zr)htGzv1wt zQYo69ouz#KCnqAhCpbRN3Pn+9Zf>q2!OYAIsj5o3Twc@>c%BfZX_D{z4GBEYBhxe~ z2!yDcgXQJZTwh;H%hA!Te{tcuL?8f=B*usc)fkb;qfk@RV|jJ;^fnf2e|c}?;NX+y zt*x#%o0~tr4-X%HeaMB4jn0mdk!O*ip^qODiD;Kp5ptm4w*5c|BF=?qWaG_^?|Gh} hL?YT%-TJ@p{2Q_lGjqwZVdnq<002ovPDHLkV1hzmMpXa+ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/caution.png b/Icons/map-icons/square.small/vehicle/caution.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ee5173ae5308dd5112494511a6142f0d235119 GIT binary patch literal 626 zcmV-&0*(ENP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tcl)D|XvQ!2kdNG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io#7RU!R5;6}ld(%1aTLctmt1l=G~5Nl9Y;7YTqGA=vN&itsMZ$E;Q!zaE&&}1 z8ANW&$za9NsScrF2WxN;>ZOD2LE$vCzUjT+d++nU@Z$>{ zmIwbCa99=|5)cIcGyf2S!K;@5v8R@|mb%5QrEW2*_h(0Z?81xkow9KD&Unb1-;TdX zKcePh(eyy5jqMjiIfW>vsEzFx1R)TjW+N4>%zZb^lMiX7*#y8`T}`jdy)oW@(t1M` zC`ur@w>$Y!$HDV`Jl|*3ad2;U@`@6OLjkp!^Ktp~C}B1lsH%#hD42}~^662cHgi7y zBw%vleq`}tJEv8vq)H`pT}RV2Ql%1FwaVhfc5ZUwe&kWWM!r*s_pb%R^8nCw9bMM} zFg%ZV|616{cM6e!<=LC;RChO%tJjIEDgd@^W7{?WaaAQ(uQS!%%`DH}Wd8yrlR<1v z+_NOhBI~*#z13>bZnwia>$*sm#hSQhC6hrc{Kob9uV&`sft;vR=>3)t@K%-q=xuI> zZwbR7(>ajWUsuc!P?Rpychk<#tE)cv$HR>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tc^48(0>0EdT%jG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IoSV=@dR5;76lTRpvaTv!x@7o%qWO@_L{#?`&H6>Sz99(u9%0*YNS`sf4Mq`eOMa&_ivoZ`CMB*BCC>S|xv6<249-QVi6yBi3gww4 z844j8sS56%z5!f5naQbn#i>>b0i{VfnaM8sxrv#1T=JXDZUgP)_H=O!u{eEpvZ1$A zphVmJVw;7fy)wHbt_rXS`RZMiGO=daxpRky_qvOhgnFGW_zOh6U*LF{SBka1;hbb? z^r00dSAIwx>c|$0ldf5QnEn0Xz0rM5nk}sQvHqrB)+hT9}5bYMH~kW!-`edTv}x_EyePJH52_)VlBKY>Q(ax5xzT hmvB6FWJl>gh8&JFF>_upz6Ay=gQu&X%Q~loCIGdst?&Q< literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/emergency_phone.png b/Icons/map-icons/square.small/vehicle/emergency_phone.png new file mode 100644 index 0000000000000000000000000000000000000000..f7913135370c2b239540b056238efd47fb6cda49 GIT binary patch literal 551 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 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/fuel_station/aral.png b/Icons/map-icons/square.small/vehicle/fuel_station/aral.png new file mode 100644 index 0000000000000000000000000000000000000000..ebcdc516d4aeb80e3428d7a7b8395817cfde4375 GIT binary patch literal 693 zcmV;m0!safP)L_t(I%cYZFNK0v`%m6g^cw1ra16^w5iILWEeTK}h6G zP%xF$2>%Y}rrUDY-TUhyq-I+YeV-1Tb3UBk@0>3IH8q0p42hW`) zK^Xq%^SK;e@5tz{1*#m7c+`;p=GA&A6QIApZokhrGslUd$(X76>Ybv!;sxH*dYUiI z1n_!CMn%zN6}OVU2h)pSB*|0941xO~%AA)G8I8eNd!GVKBfhT38cq?C@r>M@tl%xpUWIorX- z8&)@eP-iL6&qZ^Y3TC|;o&qfnIC;Dr+QQ?$75W;VE?#3t4jW%SB2 zJjHqpeOQ9Su1DAN3Di~TargRhOiz8GlG5EJ@wHey7*wKZfM*ZFQ*DFZ^Iz<9X2(vxyJTeQJoBAWIGi~-#b*C*?B1xq|HL6IV0$q3Y3 z455_}tY*hIOTInnc3ahqvCLag6u|!|KG|S%FY|^iFxo&>MJ_a&!dQFz8Gh*fJ?s6B z^LrFU$qWDhSqAfWralSPjVm^rp4C>?ghR_w2}A%9hzN?pvI77>PJ#KmxQXWamiZok z-e<-XN}u%S1Ubl}R0=H6ot$rMh?-vn0c1%; zK~y-)?b6RKV__J8@#p)FYW-OdB$Kcp8LdzuRKiR&nHd?nva=u=cfnHcKvHXIT>(Nx zG_$Gg%&Hw>Vw|2f(uJUDqYU49j|;G5>9>8h54?Ld^Z@v&~#AhKP_(?-Lo1@bvh|^70RyqC+CF!H53OoRl>e_7xrJ0~V$y z2n`INJG;7wMxz{OkFg6jD=Vvn!(no{JR_r{l!_$+em`DICx^caR5BTwYjv)F*_@XO zSPu{X<4P&M&CJl#-HlT$5)1{&X0uF9P7#lN5;A-ZB5r#^2V&`i(>8PaYNQ zAM}hd7*{aH#TXaY(})Ph16Kq@aG&bn-t*~Wh}@;aZLNmZ*87HU;Tc|Rl=wS%0I2`~ N002ovPDHLkV1mIv%s&7C literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/fuel_station/esso.png b/Icons/map-icons/square.small/vehicle/fuel_station/esso.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a7c0241f9592fb8d6dfb7e2e605868ceee6324 GIT binary patch literal 648 zcmV;30(bq1P)?i zNhv!hDX0reb7H>2{$mOe9U=;aN`!(AU5YWhDC}TRhsa9^(ThSa5JpN-9SSF8_A+&Z z)kcv9>d-YdO;#U9+3EAUOsajVz2!C;Nx!OQR5 zXsJPasugOhQ0wZTz8;2#ps)~KAVAxttF*ru2eioqk|a=65TOvnVhDo)78eo0AmNo2 zW}PkU)GIXAWl~lq>5~Y~9LcA(^COQRK0=o&L0%rBpn!No14?l*ubw=mz55=At^3K% ztonu@8cK_@u~+4zs%r8NBuQ}H zQN@SPv)t+PbEV76{9+8V2`-%6N1L;GHE!T;_h7QY`fOLFN0Q>Avhh#OPhVJ%O=JLw z|B)v>aWfq%k7c|WO#P**ider_6eXEpGfhrvqBYgwtlqx(Oir#}ldek>OMjPDk0&}0 iX{+ShEtA-8o&N!_TGvyT^mK>-0000caR_*sKGI%elOJL@lq>gt~N zjg8y$Baz;|wE)`NE6N)iN5_tD;q4yi$Iyp4n5(ii+aN=q zA>dL8_&un;Qbs=K#GkwnGyj~Z079r-zdcA*;ajerUgG1|J*Y+bjD0tVnhD+veZYzh z6W-ZPN}NL~75}3s00_yYqmx{z{X|S%q0&ALT$vKJv( z0g#d`&m14d-Q0VWO+|2)sp%;)9Y0CLe^8v4WJ~B6Q+fmXuJc++iNi>XfV6QqbWBrn zym*BCl3^{Qa4SRPN)AG_L&4Fo3dGnV1qI-8J(p`oW8qwbtNzOyX}Rv7>Q002ovPDHLkV1g)RGf@Bl literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/fuel_station/omv.png b/Icons/map-icons/square.small/vehicle/fuel_station/omv.png new file mode 100644 index 0000000000000000000000000000000000000000..b5ef2b5f2cbdb2f81aee51ed143838d68f6c6cc8 GIT binary patch literal 609 zcmV-n0-pVeP)P{(C7!cEr@P{9l?9=1EtHl5XyeYD-|4dvDPRmrX<^1 z-) zzdsT!M__8Ivt5=K;wDLQRF}I9;P*$OlH{m1mAkkV3qUYfFYawhh|g!=)6wYRcK;dr z?~ig=bfFeBJhe`~Ev1Pi7HO*A&wTPHBB$adfoSY26E7a)t=q@s>rbc!jkli@eEjkq z`z{+T-UHmYbb`J+Ar?~0TsYZ6P1X*82_UZ)FbsqFqyj)Luaa5MvG^-PEK!`DJ${5f zshthAz|gIWn=N!TiyS@O%h*JSj>bCf4xD2;GKa1k0Jt4ClphNBF86S=w-XEcW`R{b z&9y-nR|W$BtTNA|vGV}vnodpD&C980e3*+Mx*KpE63A!E_V~ORdS6l{c@d)`f0+r97Ea#>amv!JtF5{I90gX4S6g6`DLW;FO238$cisQZ`xG z4wFd}ya(0YYinr`1ONmmWm9TlJGzdk&e>4KvSH}L-*a8x65@8GQs!(=_e$-Pr<&ra vkC|FqjY>4N(dSVGs}# z2s9`$NJNVEw$!w}m)`GlsuqQTaHcc7?{m(ZlS6=}ra<7?^I*{Fz!oYRRgyzP*RPU5 zVC+LAQe71aO-ybDFgWNx7>Ue(5raXe<6pDCGG}fj(=J0QLDy_feH4v}sd!07RXHzc zLZOMtt}bttSZp*J33*UEP+Oc5-x~d2z;VkqY6k?eUh#Z2EgGdC5R1M8`3)#Cloc``}k311lRa~^xW>ME%t!~y^W0ArhM005&g zF+B<~4FJcE)|bBNC&@cCq^4NI7~33BT#Jh|bG%h?zk01Nd%Q7fk|m<%G(I+#Sp_5j gz_y=>Z1hNQOA7`3Ksf4yhsS zEd>=dLx)x&ITTBkiZ=JN9OYf?Cz zU)A+9s-_jz4gy$Qyb#d!FGX1hx6*jrhoPj22W%q3e(Mmwh=?@tKp)1wgql`Z6T+>? zjpkVlB|}=B#89m6ZU}{NxLi!``u{=z_5o%|t73Oaj>T#V(I@}{LzyM5wglXm8CA&T zAeRG8gOwGCMyY!@XGU8mU||80NeBj^P=MiKSYNO8$z*Nb5&)3NfUd*bT&dR4hp0-&7Da@2Q@u|$Hg z1TGtxn0U9<6aaAV)1~4II?byXN|#)fdc3~lPP4N;CP`fY5@1>XNl@2k{N^M4=E%jJ zlbi3QZ?`n3w{dP+R%<|A8yjugq08k{uU=QTPJ2GIIUOC+@0~w(KEM3~IsiEIGf9Vi Z=f9(%vs{{iV$NP32G@7MWrRtXkrp#bVA0=BlphS<6@!)@xWQ0ALo4E`2;{! zm1(7_h(H)Bxyb+#!E-G{1Q7uQ01*-Sd>9l(@Jl7S9*=VUpCLLQ4$``yo*kPPvN&A_ z0`dVe9iXa&!=w0DIw;+HfR1DkBlI~jj*fbCrJ6XlZyjrwrZDDnK)Fo*L>rSw&Z7Ck z)Gi<>DuPiZZ(Ob}`I_yQ_TyGXK%@dtRSL&1;Ge#XncIjsHkzFv>>nl^%L0lhs8p`E zx2(rIvKM2S3ZOhRLg`5l_VPK9>x1GOaBGpO6ya+KI`5M?*N!*%ickbmsQP6O?zbB% z06#YlcXy*NI+1b_i6)Ws8l-U*l3EFoS~ef(U}k4GKMr(LA53DJ=M!%~g&m?id~lnk z&)Sh_3e&m^YwkwG@z5zHa>aoAy%{ozdEAL7X&<;r^7$Z4L=@|v++04fa4h!Z_|5G=qCFbWi$dJelkQw&OI|1ETKoKVAxtqQ;X)i>pc zup(_pmd;}>a-k-MEh4lu#5mJE%z;0JUCZZ?xU&cR0`k=|Ub2v@_r@@Qin6WdBKqII zL^kXM*Qtn@Ee8DX`!j~deX1iC-?SuHSN)Xui#E3XQA^vaW)N5$8>MUYDI%%$II9mK zUi8x+Jbzo@ryKnYzY8#`crz@T>LUDhyN8Kvk#gX3^t*X9rR!*!pT;p3!n8*U$|1KN zjnMlpq@!n?LQn=(6fl5g46W%n->*#4SmPjK0I)ygz_ARot6h#?d&J+p8Pv9^n;B)z zlG$u(ZKOHn(NGgXP!RbTJ((V7)eyf_=Kp~#WBGvetQhHphh-VQR3akp0rbF3I=$zm Ql>h($07*qoM6N<$g1D_~2LJ#7 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/motorbike.png b/Icons/map-icons/square.small/vehicle/motorbike.png new file mode 100644 index 0000000000000000000000000000000000000000..87a604dcb50ab6ec1ecdf17ab6fb4286d44e129a GIT binary patch literal 619 zcmV-x0+juUP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0UHcBFFlpD3IG5A9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00GlUL_t(I%cYY~OJZRZ#?SkD z-}^^%7_i$l1Z&1I?UrOgs~|44is&=+5!wggN4N_YZlVHlDFjiQ3WAnVBvFg-x+t_; znOLKv_r3pSF%%AThZ*Or4xHb4I1ii$01ne`p9OH3M!y;WgpQ8kAIfzX6aWC+&vNe$ z{u8vnpO#NgXVa3z5--M6KoBsN<-kC_Zqi`T=gBc%gZcT-K}lkHh5-}~v!q<^7=L|1 zC`6cienO_yan{!>+Q!CsB9}{iU0E3(#2ApLz|at3!eN#ai>YLzVbV;dQr_FEH|OTg zO3TZG;`X*Ynad@=d}tvM@ZsIvsR>EqxRDXw4*;O5V@XvV15NwUjzoB&Rx>(}kCc9R zfvUzw8x6~>R*mk-N%OfEipBhatE<-c+uLq;W+wP)Yis=5ZvyeSz=g*r-NNgu?Sw*v5Q0!7!V$x8>_S1WG7Lg5 zFP62l^Ypy7HX4maIZ~-~sVK5+vuWDz0uK+=+}y0)9~?|iQtCLXt2bJy)avxw&~>V1 zvxykbV_%`5>vwks1pq*<>$?5C@>?EoZ!r1^6Z~(Se*%q$Ejv(3OmqMM002ovPDHLk FV1i=P4l4iv literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/parking.png b/Icons/map-icons/square.small/vehicle/parking.png new file mode 100644 index 0000000000000000000000000000000000000000..54a579149bbadb229a25c4edb9f553f74547e5bd GIT binary patch literal 431 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4Mu5R1+8;xn_mNkbtrP-E zlX5bXUGj4iGxNCG*H%3RnlA3?;uvCaIyoWXM)HUGJ_inLINl(5C?O#sX z`!_R#z~lcwpq$<2dEmf&`~Uy#YkvHV4!^#*eRG;^ZEGF}x7lU;+Fzf4pPIUUzNCbN zL`0HGUMw2F!ro)%1HFgG`zyvK(9`S0)h>ldF+{Ms}_LOMEi=^hak zo*5E<|GK)iwnW@q=2Q7cAXfKaL__1>-}m=_{I;*)?eFjP|2d8wy1V=SzHM7=D-Hm` zhxhV_|G&Pzzs|n$)8+7-tc_A1-rb#l|MN53dS9O(28IC~Z1)(tjD?w(-jrkr4*OK` TE{8W17?=#6u6{1-oD!MPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0UHf8Eq?6r9RL6T9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00KHmL_t(I%cYY|NE<;IhQHa} zWb@N(`eTv?65AAnf)Wz8rq@7DUX38$yl5^8(jG+wy?GIG3|>qxf(P;1S}2qXrKA*0 zT1iN1V>dr-Buw07U3X`v2b<7pa%tbwH@q(o-|)@=z(I)qqW}&<=xX>|giue~VUK(nc7J3IBt;$r@U zkp3A;W6|CQxt!dJL_U1FG5`Vrs~I6cT|XXo-IeE;5DNLca*;^zmg{eV8+12WCPWk+f+#v}Q3{k&0E>lXOeTahjnck=u`#=K zZSBzmn~i1cc9zX#&Rf;$mJ5rE}KMw3(S~elqTM^#F5o$EEf46A2*% zgaF;#EK3;cdaI@DwYsWqYo?)B!?wB_7?x#1RMjxj z>FSSMuB|j0nhpT)?D_Eh@o_;gaR^Pu-QM4f|NG9r0G<_zl6WB^AOHXW07*qoM6N<$ Ef*NW*Pyhe` literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/parking/car.png b/Icons/map-icons/square.small/vehicle/parking/car.png new file mode 100644 index 0000000000000000000000000000000000000000..5255cc0e8ab7a6c47614caf306fb050bc941fe2c GIT binary patch literal 673 zcmV;S0$%-zP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0UHht4M{-aHUIzs9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00Id~L_t(I%cYY~OB+!X#m~H% zI2qHDme{H^G^LAJ+SCTgrUbN_jY`*UyDNlRBwJVZBb3k&Ak|$!Dx)hE!5P6)(_*8N zf&LLugT|PolO`Eo-s>VwpsC}cJ*#`)<^8yv^B#buApb`JOF^Mt{3**~ES>&oPELOL zs;b#ME)eIDCjig{9353FnwHN2fTD=vz`!++EE6&`luYV+!L)-&jb?YZWR8ucj7A?0 zyRT?kC=`p`zNPD*)36b-8?3Jv%xaaf?rvGeC9(yKk9#|1nUI|w)4UAO^uRQ0^x&XU z0RUMh#OHIipPrsueSPmg?C)1CI}e&0FvdYC=ah0@EY@fuaeUa{znQeV{MQC6E4geW z@-fxb)#jL)dC)^7E=nQ+tuX)sUcNAl?d?+8Hide8ge)!w1Fzq0x~EkG&z|}*tr`#n z;MMc+y{TB~6Jy}ECMFUOdkXA_JF)x?E=7XeCc>piXm?6@yP9&x-}vta0xqS+h`QF+ z&a#|yZdtV&W6bvXQp#8+Q!UTWA7?n{TmpdJ-i-}P8P~MXRb9`YIUGb79`@X9HHB9%;Mf&x!elK<>>jyi06jWNyzMM<}e!d z`kE;;AcpZcq^jAIi3#KTMX@a`Ji4zaA{iXK-tqhB|Gx7t2ilQ)YB2j300000NkvXX Hu0mjfteh-1 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/parking/garage.png b/Icons/map-icons/square.small/vehicle/parking/garage.png new file mode 100644 index 0000000000000000000000000000000000000000..182a4fb75780306ff63b927b431f0800b6216bae GIT binary patch literal 535 zcmV+y0_gpTP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0UQ7q8twOpnE(I)9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00DnVL_t(I%VS_**kkaYOu)df z$AA&SU|?Wm++OP9=z+}(xv(bc0EP+Tl0ap8iw$@}+z{-~=T zKh@m);OXAI??0KEp1#oA`{>cES(+L>Ju31jF8Tle|9_Zs%+2|@U%mSE=l_3(|AK<7 zED*o`XSjFo`_E6G{{CfWXJV3&U}Jgs@W(G$IItj_cJkz>uM7+f3|qG7YkGT&h{MEx z{P_2;z5T)6rl$K(VVbde0U2!H{`M6c+rEPw9QzMdR^GW)SEs0=smaBGHw;jt>Hq)V zzyJUL`Sahu#fx9OVPAy&{{AJ}fFnmfy!H0Jc%4v+WMZHYFkufs;tilUGciz_ ZodJta8AmI&bvpn6002ovPDHLkV1gA*_?rL# literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/parking/handicapped.png b/Icons/map-icons/square.small/vehicle/parking/handicapped.png new file mode 100644 index 0000000000000000000000000000000000000000..cf1de2eaa63c2f6225259c44c9e413999198e1db GIT binary patch literal 656 zcmV;B0&o3^P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0UHh+FVFda!TJOKt$O7E00H<(L_t(I%cYY&NLx`9$Itsn z9xsy6ND_&`wkCEFDaPIM*$>8sryH}G!5fywpLwTy}XRa zZ!7Qz5fc3X0MG&y3Tpl6s9XjB;CY6QM%|vC9)_8kN~J`xf~+8HGst8VWqv;Wtr-h~ z^ZN8u5SEt*0-{*SfQ4wQL^6qLx=wIkA7_V0WC>VX8w}X(G%ZO8g~LvVRb9)%#Kf~+ zS$_8x0D$9Y+T~(xS67X?ENgl)DZCjQJ3Bi+uhuL92pPI0Reu5i7zQEfw4!WnF2)xkjUV*?*Y<0KoS4tCyh=&rMHze2GMOBo-Tb z{$#-7V!t;SPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4{ z5f>sw#=-dj0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FN7fmLL$aun-AP zO@-c1OnmuD>CLT|i2rHv=;-=-W8;DWz}D6etJV4}&&_>!OX=waJn-QKW@bWf0O0J* z{{37}pM~@DTide!bOeDAQ5*^$9Q zJ^@W*Y-OcphC+T}bad#|*x2h~LP+1>;o)W5Q@~|@e&pTisx)qzCJe)XEXz<;73p*u zfj|JR?H88_0G4GzRaF3huIpfoJ#WG9-`nqY9~@IkQ79BpEEW-u$I)mskk98)DwVvy z(Q({d_F#-5lgS{FNI(=tn5KzvIE;F|K3EP?sT4F#gCt3aL?TEglkoX`h(@D>3D~xc zX0r)JQJ^Raa=9F0u^6h=>fb?fkLmI7;^L=|OG_9J27_=M2jy}Z*=!b_P6vizK$0Z4 c_5aTK4qquvS>d|Rx&QzG07*qoM6N<$g5mognE(I) literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/parking/motorbike.png b/Icons/map-icons/square.small/vehicle/parking/motorbike.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca3055096272fc14ffdc92ebb2889983877d1d3 GIT binary patch literal 654 zcmV;90&)F`P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0UQ7WF5>O0c>n+a9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E00H(%L_t(I%cWCIOB+!Xz3fUqVaL(mk0ND4i{{+Ck2R#%32pxpsAHdk>PXGXj zF~$%&2%7`|K&8T1GFd9l%_R~W8|rmE5x$z(+PYNt_Ou+wA>{Klzgb!N(0_hjh(x1A zuO))3n^=sHVDQ)F(vp(#dQak%0vjK9O7)`PT7!-byVYVrh>$X^C-5kO-`~Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4{ z5g#cU&60Tl0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$F(dAB%Z?jIm#=6LxniHyazp$`=8r(`?FQ>Y}cLPEKkyRn^J3 zvsgG54m%t~gle_%e0%%!+~izCKjXy)8%HJLmfzGG>ruQw8L*Z|<_N>x@?^2M#KVrgQc%h}`r0QUBV z0~`mI&&$%lfQ8@Q4g^$H*Jfr;g^>}PJ)Mq(-0lv3aq%qMQebVZP!xo^QZB#kxVn0A zQ798v1(kL7Zb(sG4L<*8wi0bqaszM4$dB;zcKnwCgB+{NR5Uz3Ae zPLdWDJUw%BuCDK2$McLUl@ui&_j?-+qV8_9xk*5lb!~as*Z)%nrlxva0I;)DzWzug o5m7r)Hu}JQE=D_L!hh@h3S2}o4St%dApigX07*qoM6N<$g3}EM!2kdN literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/parking/restarea-toilets.png b/Icons/map-icons/square.small/vehicle/parking/restarea-toilets.png new file mode 100644 index 0000000000000000000000000000000000000000..56d82df52324e043fc0d24a38202b9c0c7d15060 GIT binary patch literal 688 zcmV;h0#E&kP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4{ z5il}>v}5=H0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$FYg5YZv|je}FDrx^)+S zgdiyBVi2+jNF_rtsU+Gogmg&J4Cy3uXOc1CkJonslH~^%$^F#nC zPI`yOSQcZ2f}wA37k?Zd*M6f9j`R5w0C)mLX_@Eebrk^oex6@m4!;Nlcz$U~meXlX zA0!dnAfGqr#>Vw`H(pp6|9NpSH@CI*_H{a~6)*s9(1k2FjZTL-lar&P7(!nGA;9kL zyEh{v9LZ#wjbQ?>2kkavx^8y?KomJ{Y>XF5CDTYGzGUk4uKmv*Xj-=;%S{ac7;~Il zj?%L;wSICEkFBi8xy{X2FQ=w_zP-J&l1e2$uCHHx0{~Bu&Fan7)vwnNUzndC57ugy zC5jyJ`8X~R;JJwjfxo#iD9;n}NYIb{{rAzu#nAJeorqbjwk-fSJ&k{uo(=?OW`fU# zP9YNUiQ%v?3IMTKFzDthm9_~0s@kzUL8H;_P}*ytOEl^i4TISLAP9tnLIMu}g#x9m z7PHIcmgxyXp;UTp?JECJAW8K`v1l5q+OZA~@9s6NH;H6Y`E`41&}34n4*dcE939=& zN+r`cI8g509Af~bwoM3#CvX?zZz`3xb$Qv)7=zlXW8>--1z Wjct>tRuyjm0000C%mbk#;L1TbqV~0R|>Wnlzjp zx-r2(x-_Y&gCq^Yx&3}q zdU4Ts6aR4X`R4iVZY@ap{ibv@>afqx7hlpeL0k@~D$s7r(jY*wIO_(GCK%@3+qE^0 zPo*XwEG*p6UJi&Nu(R{=!{%nCEC`C+55h1mI|TqFNs!~?*R?c_FR2t?AxVOsn9!Nm z*R5kTO%BK7Q}*0VGM1LqoI<0C-;L0Fc6At1%q58oTE>uG0yH zUYGv>aGdaYX^A@mfYnvosLQ1rO(YUvS+?iZY&NT1Ss63+@qmCNL6#)Q08{`727{

      7A={z_P72K>*2Q^5c4X!PWS_}}mR4I#_c?mW?Q2LJ#707*qoM6N<$ Ef^O<56951J literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/repair_shop.png b/Icons/map-icons/square.small/vehicle/repair_shop.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bfa9dc94c2b210108d8df733edb574f52f1869 GIT binary patch literal 420 zcmV;V0bBlwP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0UQ7f9onVVpa1{>9&|-mbVF}# zZDnqB08D9PWo~n2Iv`MWVr*$+L~m_jX>JOKt$O7E009h1L_t(I%cYaSYQjJehX2`2 zv%$o$CsR$mdiGGHcq;T=1P?xhK7)^AK@i!C58x>UDfF5^OYySXLuf0qE4BGg!_Gh7 z&JH^ORzv$w0jnX^0YLP;#uc*m=@9_PT5HdXN24^J&F*^Ru~I~U)>XM&zP@Q)y`Mvb zi$0y^xBY$;WmzaYolxevj3$#_=JK-ZFiDt|Vip1f07@|@2|K;c4(9XXu-#UrF@Q0^ zW>c1n#mm9vbr4> z0Pho8E%B3!c8Mq<7GnAb^ZdbjmR0Ei_O6R O0000Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tcl*C5U)ihX4QoG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Ip6iGxuR5;6}lRs!vQ5eO~eSLZP&gr9&NxwCJK8 z1jkHvvS!HO5)fR3>Qsc3R7Hz8G-3l4i%_*Ov>_!I(wDrvyyK82RHQ`oOc(C`eth5k z&H<2#^B)Cd;-Yl`gjiSvfB{i5ZX3`0&-Hw?k7}C{4Mc&q^Ts<~e&}8-tZ|?Q0OaUd z01zbEE*=lOJeUZkhox|I06-`NAq40+0DwC6<^%Wg*BST9MhCLnO7=$JZoXnlUqz#I zCMM|Ra-{2$jRu>mtE^2=Q&|?3l)P_@e*rRCk_1T(i6`%hrtPU{lx{k`@63()d8*!C zZksXxw3htP0Xzy``lh6$GdbDy<7$Znm6UuIK2z)f@&|^hN=i2K`K|!JRHCvh7ERkD zNeuw{MLCRc7~04Px=GkJw823{gxdoETIZ&<&A-#0w;BNaV4s6p4gShX_u8#3`0MMa zGU#;x3tqeg0PgH;SAd&L0=|z|&6B0wZpb6z>D!-XUqeaBdMdU58t3MyEQ@6`);y)9 z-gmYDWU|-wd!M$=n6ISd&e#~er6u~+D(N`%mY3;FO;N>SteBE_jGLd^M*7XlSM^1E zCiHmN5>*2Lptl?i&jSGL(C`xVYir5Ig<{*ve}u^v75!G=#oPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tcl-6O)7S!2kdNG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io#Ysd#R5;6}lR--xVGxF&FDz102uL<5J*+}2EYS!;bMeru)Id?lDLHv)V1Gkt zp%ncWdkR7hT|5MG(BL5{@hB!9+S@{wVo@+9v^7u)akpO&i($7IXzRcS9}hDx@60ej zdqw_dKzl_59}wdG5&sZUuCD>a!o|g6Pj9s_noZBhH#sZcF;b78V{d8jUzSY$)I);pf@G zL5J1VG>Jrly}fq=J|x3?mC)`4FFw{ZO)82afnV_YW56GMR}@8RnkE4WTYYGEq?9t$ zf-fL{IT&2|o;Pz1TP{5N8t|uIJa6WDFu3xea1JldC;PeUF>%*({tY^UC}-*u0QUd@ N002ovPDHLkV1kJs2nqlI literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/restrictions/bollard.png b/Icons/map-icons/square.small/vehicle/restrictions/bollard.png new file mode 100644 index 0000000000000000000000000000000000000000..18691c5bf4ec438758f6ba22f33f5f12c12be214 GIT binary patch literal 646 zcmV;10(t$3P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tcl-8=Y8r^8f$b7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io*hxe|R5;6}lTB+=Q4m1S&BqIfv5UqUlv<>ah-j^LA%&t*K_snhT^GT%-T4E$ za_vU+4@fCO7IhO1G%+cn#@!1N&7#-@DUBwQ5Rtxk-y0V(Z68fR?ZCk0z??fXFu=;F z{Aa+*sOmgGsdScq2$AbC03{;QExva7RrJo>P`Lfe=JAv2=R$F!0x)vs^~w2r$4(i3 zFHaZCo0-+CrLM%c+j?{Ac<9E|q!JO#;>EZ9FedrK*$_|{wwWmYM5Yg_`$ zvS_thXsyv&Z*#3RjYb2X&xd7Mu2Eb9l}HeXoIurTs8k9V>+ndffv*>mkdH8%s5RIbm&)_i(WO3Og*fWCTI5>`jZGSlg4?B-lio7Tz*lf!kGp9AovfR^^CM|4xcaUtxZI g`_qFS69+x#-w!WE1*P5QRsaA107*qoM6N<$f&wWM^8f$< literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/restrictions/dead_end.png b/Icons/map-icons/square.small/vehicle/restrictions/dead_end.png new file mode 100644 index 0000000000000000000000000000000000000000..a020ad6456f11a0f9fcfd4ffbc3b389efee471fc GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4Mq`0Lk`Jj7P>$olM>g666gHf+|;}h2Ir#G#FEq$h4Rdj z426)4R0VfW-vBP3%;eO(;#4bzfYPL#%w(7R+{Da0F8NJnw}JY9db&7GSZwBk#Pj zjIY>FQa#6T^*q1imUnWFg2|5_CMF~tNM=x;B>w5&Zi5YyyNz?+6elMnrKEh&y>s%z z>+kVwY;E!tF%2mPX7dZQ?yvg~l1!-h_DlPmK|<030fRsZ&X5wuoeXjvd;VM6?~>~H ztn6J^_rJGs;>5;-R~=+rCkt>tSKo16^Q;fgl(ck)dpSG0*3=nX1O@_wr>mdKI;Vst E09U7<9RL6T literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/restrictions/incline.png b/Icons/map-icons/square.small/vehicle/restrictions/incline.png new file mode 100644 index 0000000000000000000000000000000000000000..d56f4a43dc10747d9b3e5e19d7529438c9893964 GIT binary patch literal 649 zcmV;40(Sk0P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tcl-02e*59{>OVG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io+et)0R5;6}Q$0%~Q4~FI7>D45N&F~AO=6-3k|Jv5xNG5vg8l;C?54EP!a}PE zK`gdN8VhCDB3(o_RuWj)1t%yfh>c&M8Jh*WW&J=T#3UwMi_t=u7*;Plc<|0S_i*1m z0JLs;V*y$>GcEvQ=`H+65e=#Uz`aJER?l0f)$>-fw`UGtsY9o)WDQ*`xB(#T`*wYz z^I0<-SHU16&Xkug<{4kivxqb01;`X>>fm$#joh)fVspgfV2q(WK5qM>s`Bbq!{4e7 zB#HRRe7sHU=|TP280tnxAu0+c?&EEeM0{0&aNn_~_HbKpE-m5m>Iy%SNjMi5QG2*8 zg!_&?uL^YeOV(k1xw&y_3O`Rzp=lZdfdGE#I{qjMhBM!ryZj|<1pz|DvF@#TC@{zT zJY-o0$8m_oVh9F~=fBKobC( zXm6(jQKXQX%mCUZ5fO-pBxz%3w|A(Z4-8Nuksz1L^@8|(1VNxwOAGBPg9V#yV~2>0 zsm^{p@>qUr!atu6n47~_jsx6o(|@-BuPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7< z6FW06Yip4J0016zMObu0Z*6U5Zgc=lX=7z>b7eXpP<3K#X=6lhZDDC{3Wu$F()#LoE)-b&FGLJ z8M4Ji-7+LdL87P?bD(e_Hbjb4C=JE*3SNYOY5H}L3nJ8^_D$dLy$A1m?*po{@{fS( ztmAF~hht|C0De1STGtmb!?Hoz~n^Fz4m-{&aGDmU8>4(BEhpr1b`b| z$1E16QyuE$@J!M>6x;i4!dG0K1@0AvotP_xWI4rl#rih3Xi$&Sk*bots+h$Yh z;jo;5lopmO*xnNnaRS7&t}k%3Ipk7RrYaQ_zaId@FgQ3k06_8knW|K9sVae^&7qjq z^#M2mqRR0|&$1X!BvAZ*c6WDKUS1{?3Q;bXsnu$Ik>Nywo@EhLjz{_e_O)%#nM{WL z{e8~P&KMsbCmxTJPN!+N+x;Dz)B%950bAFD^0lbKa#I&tb!{ZS{Ri$xwDEWL| zOw;T)?&|7F^7*`cuGPd)RWUpsiD_G>A|j8*cpra@ap2C0Q&Nq1eJye^hh820G(G)j oky4F#-LCZisq#~viKo8v9}_CwU7LT+KmY&$07*qoM6N<$f)D*Q1ONa4 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/restrictions/parking.png b/Icons/map-icons/square.small/vehicle/restrictions/parking.png new file mode 100644 index 0000000000000000000000000000000000000000..18dec891d3ae9e08306b097d40762f901baa3161 GIT binary patch literal 690 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 KMNUMnLSTa2gH}%f literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/restrictions/roundabout_right.png b/Icons/map-icons/square.small/vehicle/restrictions/roundabout_right.png new file mode 100644 index 0000000000000000000000000000000000000000..30b09169928b6ef19dbb435ca08c1c83798de8ae GIT binary patch literal 779 zcmV+m1N8ifP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tcl-Behz=Z2$lOG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-IpT}ebiR5;6}lR-$+VHn1L-^|T9Hf>ueHav|DEpo#U3JGOFL2g7OAwiHN8g(&{ z4t0p^P=~TQNgaX;CK*)xCCC(nI^7;=d}2M}U-1ORfPsj1lPbZMCGb2}2h(;~2+lAiOrgLBK`(PXkE#Y=r zsn}6Wk+y&{J||tLYxwj%X7sh`+;+Rrt3HkT?3NB=RZst<)?_H;<*mb9ZgpeO7m|~b z+nxIRsiio^>;Tdwn1A)Y-7xOgwlV zWHY5RIkGvq;clDy&x=2jrH$3o zj@DP^O`f`4+`n>=Q%CH~evL6T7schU5E{>f^DQV!BI2#Bj0qu##?!PPuj1*AL$vyw z*mfFlR+jMaY6CiL0YV78wUseNNkrDoKqLLV@nC0jbvmBR;Jf&mJN^kQB}JG`I=b$T zG7?y1IhLlgxjOCdjR)08|5KDr1}&bt3igzj{1xRbFB4l`=ieDBi)o1k6omi)002ov JPDHLkV1n#vP-OrB literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/restrictions/stop.png b/Icons/map-icons/square.small/vehicle/restrictions/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..77ec17cbbe867d4eb572635efc8b70749f90b8de GIT binary patch literal 654 zcmV;90&)F`P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tcl;2}R6XcmMzZG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io;7LS5R5;6}Q$1@NK@fd=*<-belAy(fFzU{!vz2jUFsPJNsIpxc(#U-TPLuos z7gFgWsBvq91XAHbhWvyRxH1xHWXxf7vW=D1<~}xsk%!@jp~m>B>)Y5p^S zo+OU|Amscz{vnJhYyki<#+XI2<1p4~P$@<(UnKZ>smh;1cR18~QG_l&ava9Ghq2Tj zi+tq!i65yDy!)*sOP^Un#9AU(D?EHg27u7_p{o_%J&dK}Ft#MnX;7)F6;5m$gfZB; z9HxBwlw9C)8}@R(Upu8W(aBm8t-OioV`cphfMAuPsl-|N9%T}@IJlkxE}eqCK5 zyR-Ah(Y@Z-fLE{oU0`K@A8!i#qCzb7PlW()wpH`sf4Mq`0L$e$0s%=0alM>g666gHf+|;}h2Ir#G#FEq$h4Rdj z426)4R0VfW-vBP3%;eO(;#4bzfYPL#%w(7R+{Da0F8NJnw}JXUdAc};Se#yZS=Ylk zQRLXi`&V}=@$mSCwPi?6JE&uJFmE$Q(}qBOR=36bK@x^#XV zOj(~8b?lw%`*}rv75DyIvfpDrTjZfR>uJUn0oS$G{{uLpXA86n9C~tm@6O2Q+S2QNUg=#Z9qpvtST|L`Z_ zqmwKAl@`P;4_OqpIKYE3!^Cat-DS7uzB#GF*mvII?4{jl7CsvrwRgGmM4wp7_{Wh` zU8nX|Y|ZxXvr1=6zYxE#wo_=|r}e8u_2eIYGANzlBmF%8#@7As84Oe>1AWin>FVdQ I&MBb@05I^S9RL6T literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/restrictions/traffic_jam.png b/Icons/map-icons/square.small/vehicle/restrictions/traffic_jam.png new file mode 100644 index 0000000000000000000000000000000000000000..fc169d2c412a4aca0f93b1a7a8151ce0e7c7f195 GIT binary patch literal 674 zcmV;T0$u%yP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Tcl;06Y-m+yDRoG;~E+bVF}# zZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;8Fb7eXpP<3K#X=6lhZDDC{3LmmI z+W-Io^hrcPR5;6}Q@=|aaTNdD-Iqk~lAcN6)Z~JJM1(8`8fcLY(Intq1`%A+DO(4f z4MOt|xFlIru#1ZcSEyqtXwaAvAy-S?#GyzNTZ<6e3>Q+la|jiJSEc&k3y=5X^FHsx z_W{@r84omIJ4AIIfTDJG@gHUw(Fg$0cQr4|>e#ZZj+y2D_K<%~h=kjY_+fq+03uJ< zf9`(jYns*3W2uP*y?%)8$ViB6A!Q%5_XlV)04%daru;wt;fDoNt${RrjX5M(Q36&tyV!% z6h5jdPG)8x?7w9fq7AWU1&`aXCcm$Y@UjeEmH_~EyB&(6z~yqGQmLR+Dxnz+f=?un z{IN13db)xV0LYB*`I+}Mh7KmtNT+*5de!M*XmAj1n+@$+4Rn7$m@hTvwX_!iVqE~y z_KVXd;(r>a7r^Pot$*?LDHZqWw1u0FOQVHB_w41fdBvi07*qo IM6N<$f=Op0egFUf literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/services.png b/Icons/map-icons/square.small/vehicle/services.png new file mode 100644 index 0000000000000000000000000000000000000000..816316f651cc43c308ea5bb03de0600c0c941a2e GIT binary patch literal 540 zcmV+%0^|LOP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT0Spy3HW@_6od5s-u}eq z<|&;{NV#lD0P8t*ZEY6MD*@p9A-lVmOiw#>yAKqL7W4COk@9;+iFh7#I{nly79~;& zy4?o==H^^xW*n+jl>uZFtge1zXXlbaLC|Xb=I$;^bFM1^kW%CWl0 zD&XQ`h-n)6fW^i4G#c+{w|`-pf@bqN?HU9_mX}-j{viJilrmAuq+TyG8tL@BT2*Xp ze56);!^+BsdqYqh(=@ohj~EQ%jDmhYVsG!qKbKR0QdaDFlM>+ke8|Ma)5tt;GA+El{ga7Z*G>TI e)yu?d*ZD8Zr4MOb%p_C*0000qCtm3+>M6l;u6wiiAIgPAe+V*rkURC zLNwx?kxUx6P>EzWOJG-Q$;6@ySK3XJZ3$w6BBe-CKF(>Sp3a)}-37Ms*6%Tq&gDeD@aE2)E%iX3h(r>TM~{xj0fc~qpD+5p@y7xmu3M>UYXS%a*3?60 zCgyUz@z3JD*Stw7mm!fzO~6(l3IUya$Jg!IU{qJNok4LpQ4~QQi8~KfRz^MD9jWCTtH;vDv&&b@ zlSP20qI|vPR&dp~9h~gw!0mR^($Ye7Xo#BHTC`G))jl7JC}CCGF%C_g4*sZp@fbh> z*w!RHzMyVb9A#|Y+<>>-%jn%vbX~{FW|>Y*m7hGBN!IfzFY@N5#wMX9e9oV~{ zFAwZTQ#C*mjSf@y@mlzKfPvA9E8jjE|Yd(xJ6CLxvf#m-_t(DOvw0 z!R#;57Z)EiJ?tH>n3b>SBEsQ+{(3V^sw$Q3O?X1C1qZ-HrqUX@#am%Idv-D|-Z#$w Y1OLh;qlQL70(Y)*K0-AbW|YuPgfvMrjclwdGUf4giJZN?apKobz*Y zQ}ap~d@_?$^NLfg6aq?14y~Lj?jy>+2^v zFmb9VSZEyOS11klTKIsyw5YI9I4J6a@*l-)g_93NR2umvR>|I4qP8&N@xgh5uP3ESPD?eE;WPBz zZ0flG4c=d#FxY4e_+ z%-cR$f#Zo#u%HYd`^~)VNfK_{G0PrXY`Xtm)%SAOf+$5#p|I7Wu7Q6vBX-Wpy&bxK z*P#Rh1)jsJR~;|xdA%#Q$;9`6>9)^5edaySWjg=afakGRV`}79Q7zt2f1ICvR(D&> zJ|)P0d)QW~1gqL58g})66_hR=J+<^_m9O}{Up{w!pNrR%7iy|x+Hn{dz6_qOelF{r G5}E)cx3*IN literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/turning_circle.png b/Icons/map-icons/square.small/vehicle/turning_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..98c8bf7cffdbaed1550e1e842ed4a2eb8dc44aa7 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvCQeRk?uiFf&4EI4C9V-A&iT2y zsd*&~KAFj>dBv$#3IU}_Ihn~W`MHUid0g#ltDXW?Uh;Ht46!(!oRDxM`NMpl0|z!7 zZxB3`kdTmar@En$<-`B|o0&mC*mBmyuLgzz92#Z~trD(%eey^4?y=J-Ec%zax2*T| z)jvOzw(qY`|JR+=u={tlX3nh2ihrAS?5GJzNlHpc0h)K=`hPV+>EFNpuZa{g59HzC zs#@;0W^-xDzD^?pgF8#|By?i6ig;%;+3nk(bMM~!sflqwO$j@ST3?&CF}Cx4+V`zJCNeoVS({o%`p|3L6WMI|Cj=10qsmN|wePWtdnNlRy#IcZn=&OgdVK;JQV My85}Sb4q9e0Kuu3L;wH) literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/viaduct.png b/Icons/map-icons/square.small/vehicle/viaduct.png new file mode 100644 index 0000000000000000000000000000000000000000..726564bc2daaee5fe75364a9ca251711e2327b7b GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4Mq`0Be`Sp_x1yYOiElMN}Tg^b5rw57@Uhz6H8K46v{J8 zG895GQWe}ieFM0BGLuvDic_r=0!ou|GLv2Ma}zW3xa2pP-3IEPl^y zhxtAS4s1ByAb2PtAtB{XbweY|hyVLGGlPJz<*bQc4GaS~G|U=U5Biv>`M&;usgh1!*bD! RCqQ>Hc)I$ztaD0e0ssq2aRUGV literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/vehicle/zebra_crossing.png b/Icons/map-icons/square.small/vehicle/zebra_crossing.png new file mode 100644 index 0000000000000000000000000000000000000000..d117efc5156497eadc7cfd66b5fefdf20cddc6d5 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfvMrl!Q>ECkuLT2#|tEpdrBrl4+Y7%*!to>pXXvs6ghhSsrQtm zPs>dlElK+OlfV6?CqU;#>x4ZhLC4`&$G>rJ(CQhx4(N;R{wmS z-*g5C4#f}7f`S)oXLg)8{mJ>tQn{%Og^V7q4F}8xgq%9mzh-z%QVS4KUibyS^wcK?kZLJ8@={>GV3*H&k! zV%y*^_juXL$%$ts-Oba!l2?A^XU);Z=|}D{xSx)ip0)K? tIewOj;k5S@#vg0!89w~=dGdYkdWSQL70(Y)*K0-AbW|YuPgfvMkyhE$;cJHQa~ZO64!_l=ltB< z)VvY~pUmXcyy8?Vg@DqeoXljG{M^LMJg)Y&RZoE`%{^TlLo80eoxG5d!GPz`iGTlR zuDsSitMid?$OM(!VFnCbY!!{aO=|VOW$X}L^FZ10lC!(T*`G|(dlfhuo5H>TjbQL} L^>bP0l+XkKN}xtG literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/flag.png b/Icons/map-icons/square.small/waypoint/flag.png new file mode 100644 index 0000000000000000000000000000000000000000..dfac51b2a97e36657fd7f875d1f90d317ab277ad GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPmkDNHanqlRZA3&i!o-U3d7N_4%^yfZUAk!|dvoUP; zHNQDiCY|8^D7J@3UH^!7!ILMiUOZD+z14yv@t^FJFWtR6t zyPa%^Wl`q+=zo5rLW5)4qlninnR4B{K-Bo u!>HRi>%?r7A{pkaIQ8hh)qmzXMgP{lUfZ&E>^%qc2ZN`ppUXO@geCywI(YB^ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/flag/blue.png b/Icons/map-icons/square.small/waypoint/flag/blue.png new file mode 100644 index 0000000000000000000000000000000000000000..dfac51b2a97e36657fd7f875d1f90d317ab277ad GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPmkDNHanqlRZA3&i!o-U3d7N_4%^yfZUAk!|dvoUP; zHNQDiCY|8^D7J@3UH^!7!ILMiUOZD+z14yv@t^FJFWtR6t zyPa%^Wl`q+=zo5rLW5)4qlninnR4B{K-Bo u!>HRi>%?r7A{pkaIQ8hh)qmzXMgP{lUfZ&E>^%qc2ZN`ppUXO@geCywI(YB^ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/flag/green.png b/Icons/map-icons/square.small/waypoint/flag/green.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1cb02eed94423a427bca57f0a3c173212b945f GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPmkDNH4wRg(P1fbAPPZ!4!i_>o>?&mvLAmYZqN-?u( zN~^Dup}@UE4@7OIs~eOhO}b%l^^&K6lhdDW7v;11p;xjN%!;u3@vf@))7@%?j=&%T zJtsB3hxw-$mN)oxos3PM`S$WA-*eThg;Ohz$S8R>&dJzh!1C)jTUMX!yWgIE5>vRJ z*!urqD7YfHH>kJk*QJpZYLo>p5|gK6ggI(c4zXY z4@{djY?;Tt@e7ODCy{&3H#JVREp7EqS?-cIIXf)PMD45jnkh$SY})uCdfxjlrTab~ z)EDYHV8D2h!DIfkyX)Hm?H?v}ohtE5)VGj`^YK13N&iG$v-7!0)+;%SFYQS${udRYtHyu0I@;bJBZ&lI- zS8HMQY%h+lCthtyyxY8)ZQ5e7hP9VtE^VLtpSP}2dih5?CZixxP>3*iy85}Sb4q9e E0HmRQj{pDw literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/flag/red.png b/Icons/map-icons/square.small/waypoint/flag/red.png new file mode 100644 index 0000000000000000000000000000000000000000..e02a088251008bd8de2a9249cab8e6331bc5dbac GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPmkDR!m*^mC&&Oo8Ho-U3d7N_4{+?aKUL8SHJ`6VK) zN>d(jmlO%kUy^@erT#{uRXuw~0qr-ds5oHnS$TB{gdIC_w|d}mDE zyNAyuiVIKf@m}s)@Z!gsjGGH>m7cV=nI`^N6{{GwNhlkaqsz$=4QiqhwRWMCo85V9eGjQz= z;_;~`GPLa=BWcp8jMyj;+8J&;uL=)&Vz?Bom7r31l*zox2U>-v`Tj zoN=7e%y!c;zy#j!G>6c%E^PaC2Iln^kJvC_1F&`o4iXHy7#rK?7>53QZf;4iUXS|SiIbXKcDLFJN-UJ0Qk+vOZ=W$O z*=?)M(Gy&X4ZCd}^F>yqD2PQqG`+68%=YlcXC-aSzixG{Wv~}Y$h~2@`bz7W!+ST_ vz1+cer|&^+3geBMRXYFHezt!g{)r_&D{5YHw$W9fPZ&I1{an^LB{Ts5wS06T literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/routepoint.png b/Icons/map-icons/square.small/waypoint/routepoint.png new file mode 100644 index 0000000000000000000000000000000000000000..f7fb0a98f6b3fb1784e4dabed8ec1e50edf80d5a GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)^mS#w&dI^4Z@$ht3#3D~#5JPCIX^cyHLrxhxhOTUBsE2$ zJhLQ2AtWPJ!QIn0;C+f}9s>iTgQtsQh{frplQ;Su3J_`Af7?Z(B)@643R~x;))N}d zi{Bqu;%R=bAw1#rflC|t54zeq%~BgC$-WRgsnsOU1E!;+hSvvwCZSbgm`d;6Sk?&})m zsp0j{OQviH49}6>`{h(;>{2E18rxUFQdTDpb6;0kb?_R`0l&|TH+Z)_o8?kjvGCkU z4i}fbYS!s|r^RM4-eA0;Yw&zS&Zc6eMfc`239B(g6bN{p6tl2e7LaiC)r#gyAGZUC ztlrEiyLSDeVe7-L+q_3RTqihm2(ocBI{;Y$JvT(RuP&~;`NORg=m>Lj&0NpTM zMN*oZKl8+g%g6VB{>ZrF?taht{~|vs{(U{=^aO5~o=Z>u-g*2*yq@_;*p!*4r9?A; PfzIIR>gTe~DWM4f0~EmF literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/routepoint/destination.png b/Icons/map-icons/square.small/waypoint/routepoint/destination.png new file mode 100644 index 0000000000000000000000000000000000000000..86de2031e0e53d3fccf8c5306415cc0c7a19bdc7 GIT binary patch literal 907 zcmV;619bd}P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iFS) z5IYIlsk8V100Rq2L_t(Y$Gw(YNYhaq$G_*C|GX_LS+QzM*NuwJR3gmiB8s+dQih0> zUC}JidMK!ul3ZdJA$lmYEJ;mmrAeBo8Dd3XnX^O+d(el_oU=Jo{;lnQdg#K4%t^D~ z<2mQ|{hZ&0^E-rdeiZ-+A*t}7anADrKyVfRx%jU}2uUS`q;k&lsi(yOpr)p#;uq+< zw&%oukA#kQ$Y?aG=BiaGkJ{Q-jEJJYBylg>$Y)>CZuk0;Vi|xjb%gN%j4_OkjFP0i zDPgshcbE1J3=HNPGHG0V5|2;VX0I+Ub#`>V71Ix;4QbSBv!6`XHz7b)R@TashHP|L zN03!e>Z1&h&#_pnFn|0AhsBJBrl+W?eTbEtw;)KRwgD(}^&dAy!?q#cA-e-#B`2DS zt|L4|hiCP5xKn-`QTmP8pK%n&PZ@Blpa3`T8STIO{}s^M+B%JSdDAn7(+FNT4=pXv zad=NMq7xEv^?D&z#BM@cXFC{|(A{oAd1=|iYH%elPped^eU9Z`LQ&xjJgINM`Rr`e zzkCA+0|GTcIJIX7l8>FhlgEw2o$ubgnotCk5HLx?bZ-Hn!J!bTH?(2PF>E$NAEHH= zP6yNb9#{sg$SW*#EYfHsw*gM4lZc|oUU$5~!Hgp~oPH2Kim8Z=i9&4DI$XP7h1$jj z)U~`or|Bgw=3ba;wb`6*1Dczg71dQ$OD{gCfnKl20_80D`}!ea_W=xAE$BCY!k6A& z7>kQhUQvne?jB3XlEwXQ*ML&Wi6CI@Y-N*n-!30Hb1D$=8I3cLCsT15759CNeUzOQBG>_Vy?t1PmBu?7M69>WG2p)e&Pi%2*qc zBteoS>0ckbKLRo{GlLmpBq!(W+erb4qDU#F4nbh{Nda)qWgeRe|7GBKdf>Zi(x12Y hB*b;jlga+Jd;@>MKxjmjT%7;_002ovPDHLkV1krEm`4Br literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/routepoint/left.png b/Icons/map-icons/square.small/waypoint/routepoint/left.png new file mode 100644 index 0000000000000000000000000000000000000000..d3674f77370853323dca029a0c38b509608c5d6f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D9FPI*C7!;n?AN(j1q_X!c{LpX3jOnRaSZV|p8V(k z|NlO0K;Y(f%!Ey=3CKO4lmG;dW-@9Xnh7Z>KFL7*8z`=$mL+}ez<~oBN?%_qE$CKA z3qD^^GT%UOaX|H?ZTvf@83-o-*n0i?l8hwArEQP5Hb}J@8yFZQ^ri&yZlAh+ul3dR zSDvw)clBA6XUa^Mud9f#toGh!c~HSCVs?U0-Ub<<$jk+-+)d(ht_oePayz@HLC_`q z^SZo+%T#r4u&jR;d$&nW{QvAgVWwo=!dB&TDPFqsADqp&vY{m*&~c@zi)a~G^-5L~ zUZq(o!ATB#9REZv;Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iFS) z5Hc`SZh*M}00KWrL_t(Y$JLhKOIl$V$G`9K_yYsMSdE;z)&dzh%LPq|lwrj&A1F zj5Slts2eR8Ukm3LM*tuc1a)jTX5LJ1c5DmV=Ht?_)_ueM*{CzVmn|rjOWf3pse!l< zHws0ewKk+us4DZm`L}W!ekRZ;HRAf0_3q-YqE;I6-|~O3UbX&|BRJQCA>&ZGUMO*x zFsyuBX>UqEL>MuT}Xbm3zDJYW2w$fW&wnw%H z;g@0iN#%rZs0SS5(5de%nRKS_LQ!b7T(Nw0nO&LKZpS5~joNw+; zQ?DrisCl(Gc6%&4cx~`V8l1i}eW2IqSI3vf@5$Z)0JNxDPWudfKk9`;y`k(_qQG^3nuNmFWKzT=a!s%jAhDT6;+9tm^7`i0J*%TVzH$oNu^Jqfl#q~Ew|Ae~Qd`g4?N=ToDIF`2 zP&h86mc*-mT}Um6NBy{vSjxFc-QG)lmio@0?KRsj9cXPtMWUkHt4{L{`|dS%ZuZY4 z?{yrT-X)Q3Xng;F+M~~02SZwTYkvRj?bKSyA%0>0qW9(B@5cJgiY$13SJtq5rWhmp zdwG#1H=0rwKQX>>zX`o(kZl_iIuI4j6XZ~M!TKDJY!CBi) z&+C?ZuampEl7sD9Y_$5c4Q2-)e_nrH=Ef7-P}}wSop+07bWZHt6C$!i^h;L#rGH<8 z_5{gqI4NIQ;gWcNZ>^Jv>!yucK0Yswd~PP;Az|Y-{r8{O#?KG3v%6~gxjwRawEtZC z{QG&D*_HCK?>@F4w+ZoF#sdUdhqB&hOyl=p{a`h7%C8%)N1s|UGaruBNz%~lXas_f mzz{di419U`O!AV_&8!T~j>q2ZKl#uR6xW`velF{r5}E*CuI*C* literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/routepoint/left/hard.png b/Icons/map-icons/square.small/waypoint/routepoint/left/hard.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0aaab6bc64d5a1d2ef1bf8039a9e3a363ebca3 GIT binary patch literal 675 zcmV;U0$lxxP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iFS) z5HTOrlI|k_00JXPL_t(Y$F-I*NE=}k$KU(zGnd*X8X*u4EEu6}%+gU}9b((9lz@{% zu}f2^V-N(1P7Ya&WUHG)Eq3Uj1|=33C2hdap>PDUr_i*}6w)T%<$E3EN@6aWyQJUt zJ>L8MzxUpE_dX<|*8l*B7==DABH9E1;LUKu*y}>XC?ZCQXp{8{7bMzj>2&)2KcNe@ zJ@`^)X(DlwcmMz}?^g(;L7nz__80jdGbKw zBr)BMujLF@k5}(>3%8uX;^E>%>QidcN=(-Rv4dD}J-a?-HRF~N)%7|n{VF-k;K^(< zWT#&(0y39HWIGZrlnaA~ZR_)vvhi^vL_pZHfFJ?+QvUYr+u51okK&D;FFU@4y@f}D zL>qj}GxpuG07C|D+5JZ?t4icebx8j@CLr-Ugq{JH(8JX2_*plpq5p| zEWmfmSJ{8If8@RC)$EiAiKwIVxM%#^>5J1{zsFy*bxk?r9qGf);cDi2=FmUVJ>2w5 zMrM9l6qi!53O5z#R3f#kD#29niB*A?5@`($N8O`8U9zhtGr0i(BtS6ExM+w5>OyDB zN6Yut9i(Ybz(4#`29(2yYmhKzKf<5m5-@?T^G%3Kxz z0Nio0=TbXx{{DRa+VKeh)X#a`Jk0EamTaXk6Y z|NsAe*nq&z?U)IhRuhnWJ}ChR9L;3ZJTwzhQhbtu_%~2o$Bm7x?f;23<7-MaNlK}o zKAhQX{D}t$KC*pG7iZD8@a|!~y)9Sx=)J*h**}wHW@c_)wc*uw$vWe2#TyF#w4Hpre}8=C@wc){A=+>LnEs7-ec>9DlG2cJ zPrklxgXx=WgP-4COAG7l)6nysJ!jTBuTNfe4IlOQ@6q}C^Lo0NhJ%=P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iFS) z5HbtpWoexN00F;AL_t(Y$L*FqO9Md=hG+IJ9~M#4#7HE@N)QV{(g+$YVk3fSEYbu~ zf`z3hHiCuv6GTJE4-iZOxnOm0SW5gV6eUS7=vhfl?{Z@iBO%;HPtVS`oSl82onhHo zB%%WV07OiJjUu8$006$#yczth5HX2}Ng_IAcAEnL2!e3@32J!TXWm{3Z?sUAtM1Hs zW`H3BAOIb700Lx;kzA8qny#_e`YYR?+rM=2F1-`P5Rkjg_3cPI5dtzk86fROcg3&F zO#vR4M>Q=QkoIQw#EprK%6HntjDm048)vp*VPxU@yXK|KNVx~?}6CQ>xT5kHF0=5O=99|0VkgAkG2yjxu!TRsc+1fPr` zYbR^t6}i%78K9^N=j5E)*3{N%YCd%#ElI+lckr=2uPm2+#rtBfWq{w~SGK3OrOn7@ z82}*U4JqQHSPXOr4yz`KxH1^Z3`_mUksZuzUhDGlKvC N002ovPDHLkV1kSa@CyI{ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/routepoint/left/uturn.png b/Icons/map-icons/square.small/waypoint/routepoint/left/uturn.png new file mode 100644 index 0000000000000000000000000000000000000000..2b2204eb979d9f4a145b1acd3620e676ad3dc193 GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D9FPI*C7!;n?AN(j1q^hGBKMU5O_A|*aSZV|p8V(k z|NlO0K;Y(f%!Ey=3CKO4lmG;dW-@9Xnh7Z>KFL7*8z`=$mL+}ez<~oBN?%_qE$CKA z3qD^^GT*@Pg2aXglQQnzUvsN^&GkQz`}<>#NTg`zSC_9ke`WG6p4qK_~G#3Q#YeGoxON;W0b+~GdZb6O^-ohE|Ctt1_cv)_#W{-IuLN}vbs!yc)%+;NF?=&4bHfuL$m=zBX&;OONsY=&B n`xrE@yt&F@-E+yzyE%*u5sh`KO^>gFf|bG3)z4*}Q$iB}wTGt^ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/routepoint/right.png b/Icons/map-icons/square.small/waypoint/routepoint/right.png new file mode 100644 index 0000000000000000000000000000000000000000..7869bf93f54216d83ec0d26d64b549844b85c42b GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D9FPI*C7!;n?AN(j1x$7L^}Gy$rf_(=IEHu}KRV5j z|6qW?@&Dg1olM!5q-Hon)lFJC@zwDSGin)hmbm%sGBV6OGo)Rf2u(bF##xn@o#Fm>asP{Rb=m9Jy8NAW zXJ)zA<-;b)Rem@3BxYY*HB;r(HeR*PNiRyL9QirrO7!82U56y&>6rW@u{tXn@absg^`+uU%_?l8pl2YoY z4`((Tf8qgxk8B^)#aZ+%yn9%0Z_5?_`0X1X*oZ|(p8o&$|FFRCzu(OlPoI8Wdd5tj zClY_2To(S;l*?+heEytg&f9yY&iwj+eto?};v=0W5ekRZKYxDI-MvV--+znH1A!lD zirF7eM4kIpxhL_Da%A1j`93{91>Q4G^qx3*Z?gYJ!_9wxet67$z3;ZQN!IskR;Rw6 zIC{GDbZg6cp6x$A{$>|;6?@U~y5{TkFZ;Xn{{6U|yfC)BY-PcQqCbmIH1%FL@0wd# z<;FF8&d#2n%9|cPxHdaFrt`J%T0a}Rg+Jc^w|C3Q%6XbIAL#k{Cfxh}{ya8mm*Ule zlSftA?En2qIJ(@-Mg57UvGC{mNjed=sax&L3f0_}{r}kZF}>f`O0D?wSzpdbyPM@) zOYiH{+EN*?Ybgeg2 Q04S|_y85}Sb4q9e0LVo>fB*mh literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/routepoint/right/fork.png b/Icons/map-icons/square.small/waypoint/routepoint/right/fork.png new file mode 100644 index 0000000000000000000000000000000000000000..204e9c0aecb7e4b8202344570b0c57406adf611f GIT binary patch literal 548 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D9FPI*C7!;n?AN(j1x#WBR=c=DhB z|Nr~20fC#_F%veeCLs5GQUVY-n#rhnXeOkj_#^}IZ=kr2nir3M#O#C~-{9c`u>$zj9sFVI!8jAv4Md>Om(fVSM{WA{CZn`rbzHH z|IkTXbfv&)nnB>h@mZv($I~Y_HjN=|F2EDiRglUUiyx*mtk7bF+UY z$qWRMD?2ud83+H%KW5UrCgjW8@8*-fOjz>c-R|9Ueg%K|>v8e0)0#ug-}$-P)^L2R z`23bv|7xwl&m$?U{jPG1J9zxfyzHE}@fU4>^2*oJ@+i}68Dr(o`?G$(I^27%*W7d4 zgZuyMdF;AtbGF~Vx31H7-t^w@$D1CoS~qQJikm3P{`=iqVXIFcI+)BXHRD$D&t7Dn zYd+2FpHG>Jd`&^Xm(T0Z&w25PO^B_({K)$o+UJ!2buS9}^5bx_T#2D~Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iFS) z5HmWhpjhSr00J9HL_t(Y$F)}9OH)xC|9p@4j1q|^lBo|m5|UnnGNC(*SzAgkz6rjK zz1#$!eGv8sh~QiHlMsR#J=FFP5d^bdvWGDRNrn!wS-Ul`t%cj}w}-Wyv6=VYd7cj6 z@8R>|^Z6Xk_YgDR1pp!npn;2-=K(;e2Co$DE+PsLQGl7}#s9z!HcS&lB9Z5RiOSgf z;PIV!ix$={N0ZTW0MK=+E3@QZdfDUb`DI0k__sLoZsvRi900a=x1GKxz8i_}iIZ0B z5=S|-rmvlKKX4CkW;Rb83&9^Ht)537uURF+%;7{Pac1c8kk5<~VOH`+W}|K3-oWjn zk_aoorGBJNtM}EB^>6D3>`Ld-GP{>;vP}R0Tf1AWW1%rMol8pq(0}T3ab>Y%>h;tG z(*!Q3ORrU5{=D2h`gHWFp3`M09_rA-nm4QZZ$bKJolbsf9H! z0JOKX=Pg+@(La%#yfXQ|R&Vv|YG-AykYZTQVD{GR%JjAAw}(HYAX^~^uLnQ*FZw^! ze}KTYZ;{*O{!;heldwmy5L@URe>Of+uWzt%z#_%8MQ?(a`r7(-N=Au@h`}HRLy+Kn zAupR{bICG6(I`^vPV9w4ad4qjAOQg(1Q(4WNg){oC_>>w2|T@?6o8L4YEXp2ilYor z4J4Z+*Uuc~)EhOAtEU+Nhzf8ce-+hpo{sz5@*B=5-N9-5fU5ui002ovPDHLkV1j(j BC*=SD literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/routepoint/right/merge.png b/Icons/map-icons/square.small/waypoint/routepoint/right/merge.png new file mode 100644 index 0000000000000000000000000000000000000000..730b8a2ecd1017d661c1ca36d3d5cda163387aa8 GIT binary patch literal 649 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D9FPI*C7!;n?AN(j182U56y&>6rW@u{tXn@absg^`~O7ZTtxSWjh$0Y z9yUII?u4;{fx!{!BlCG5^Hjfh`&RbI0U&Vkoqo7s`t3&1Nt~ zv);D0m9q_>Au;p8%I-CrI$ArQ{_i@it-@z(vxG%h_?gf@qpRt!Jj2qi{SVQ6v+e#Z zz0dFe+wX{&6nKeMws7uxk?G4eSpB^Fy?l-Vr)J#B??vv-TEzcPLO{{5SzJS6rAJ{SDodb**a`Nw91ZM#Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iFS) z5H%1WK{mDk00GEJL_t(Y$L&@LrE)s!JD+ZsZug{+ z>~tV1anKrUwbF}eBhnOkER_?`0~YuvE-I~OOKpplj;9Slg5Ay)E3%YDRSTFoQ;+S& zMieV@Z72xN@^})kl})jo*l6l56)8P3V5O9I2Z|M<$>{iL_Oz$W%_Rlpy$5T@YrUn& z7lszj`kMP506-HO>zeMpMBAC|em8t2x^l8Ly_GqbJ2)I{AH25KFL7*8z`=$mL+}ez<~oBN?%_qE$CKA z3qD^^GT*@Pg2aXd;hcN-*W9XJbN$cb{{EOF5=q+m)#aAJ0b-#qu|HG#HVj`Z$7*6#6V|8ZQ3>?OUFW>Sn4931!fX6JlxnnvVBY!XVJIl zp2U*fdHScbeTSQe%3+5?w^$yxii=4-)~Q|~*gr?ZAfU8jrL*xEKn9N7>x zX@l883ESz5U2K?{57%df&ph$fM)*uZ);6sPuPfc6%%d63ZE5}C@{Ly(6wscoelF{r G5}E+o1g|y# literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/routepoint/straight.png b/Icons/map-icons/square.small/waypoint/routepoint/straight.png new file mode 100644 index 0000000000000000000000000000000000000000..f4827471fcc5433ad1c5e797d68609fadcacb95c GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D9FPI*C7!;n?AN(j19(uih4W+dA&I-Ufr_1>-X^jzq_k8V#svj(c;<&DRRq)0r2d>SmJG=N-pnIOab!u$s zx?L+xQ*&Z=Cy2jkQZ!nwWp_lM;qLr(%|QlUmN*vUF*@!Jq&C<)x?DRekAL*wZ5vr~km6jpP#Q=-MeQvKQiLqpQ>+fI={^{ z_V+h7`19w)fe-yFA`%i3D*D{xShVWdA}8E<@hLSS!Q#|`0}73Lj%yevOG-$@B}`6G zywqU8#?}_h6TvhwLVV64)q^gXzue6pa5FPEs~n!d%pklW=U%@h=VD+mFnGH9xvXE8?ARoeV;);(1a-S~%T$>TV$R>sQ6eaml}gq8lSFp}D9Q$4Rh z<>c)0yF1qi%zWy$xLn!A{F0+zVB3#<|ARGGRc#H`nU=mzfU$sk?zz;hA-B%dmh&`- zxSpQ1Y@SiiKd;@jlQOrSyK*o=T-_ZP^=2teG;$22-2mT4o_ku2oGMqZ#{2)PJa{*IC1M`)` w%_V0F&Nng@uzYEJt5W|&dq+X$AL&|#*!Wu0YgK#K0>h8N)78&qol`;+0B+%ix9D$m_eOo;r4hL$e`c@7;Y?tHR2==F2iKSay+X z-gAw0)%(+CiASw2&HVbCnXyPML5St>+o-o+B17Yy@7LdWRkoLJkB#G;OfH8BLDmd8 z3QT#8d-pJ~e`qwmmpsG%+k@_JjLa7%{k2%%%( oHxlpF2eIEt;W8^YvHzm<`bU*-UPzqG1BM%er>mdKI;Vst00qaLlK=n! literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/wpt4.png b/Icons/map-icons/square.small/waypoint/wpt4.png new file mode 100644 index 0000000000000000000000000000000000000000..e89106ce396f89ad29a0f754f5ea53419d0e0134 GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPmkDRzMH+$&BA_fLVZci7-5R22v2@8}S2&N?LSaHk|Y zzw6cguajEN-LiCPyuqLU|K+8p*;Re%SlH7e6sP~d;KBAMjm*_CPo8{f4U9c=00f#& zn=~%>&o{KI_z;lt{G4gdY_nXuUoS3pzvtok|5570*PoxSTiv^7I6pGt-=C^)Z#uut zH1_v5Hu&@B#DNd}DANRYd6m&H<9u(@Vp99p$rdr9CuEWE_z|d+{ W&6B`)^er%?7(8A5T-G@yGywoPIG|_% literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/wpt5.png b/Icons/map-icons/square.small/waypoint/wpt5.png new file mode 100644 index 0000000000000000000000000000000000000000..98740327186a7a457ddb92217a802dd13b706081 GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPmkDR!X!FpFuaRvrPbx#+^5R21iC);`-E)Zy+pRqz; z!|WQ@q@VzSR<1|o1+O1z{iu{-o!&IN*=b@^!15;Ng=txAt}e42lMH@FbB|@NMD^UV-~X8eb1?Uh$z;<*`_&iU-D*)z*eUwxktvjY3d zqq?Uj_!|YDxO}b;zqm?rc5j_>HqYkdr|j()cbt5&E3|bwdx3K-;|As` z@jdzfJ^qGs-`9BF=$yd*g0Vl4L+sC5-TEIgGkTpaFqbt-ec;Jqo_(MyqA5^;*@wy5 z&R3P|pwtF_8HVL`YlWV=t0Zvm_^d0^Q25Vx590#X`qc@YbEX1Ak-^i|&t;ucLK6U4 CV4nH_ literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/wpt6.png b/Icons/map-icons/square.small/waypoint/wpt6.png new file mode 100644 index 0000000000000000000000000000000000000000..1c35b20b957e516929b73942886875ea61955dc2 GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPmkDR!XRLQ@FgA5FeGM+AuAr`04PBipB93axVKTAW5 zMLMf>(gjCH7S_OmGQsKR?#g`OxBMnD3pKy_)hTy{;fKPFN-}f-XQQjSc~Vx>7w?ms}YyKa#!2b&8?VMpmH+0 z=Nq*3DdZb={V_dW{3~xi{!$Zwc0#yT|*|6-l1BZPB`$Ipgym9L-|fkamXq zfbIi^*arrGB$lr$e!yVCEZ6XN37=a7r^Epk3qP(IOlARWb`8((TV$|*FPq@Hh$pYX r_kqX_j)O_wtnV897YMWb>i@!f_D;<=!bP0l+XkK_Z^}M literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/wpt7.png b/Icons/map-icons/square.small/waypoint/wpt7.png new file mode 100644 index 0000000000000000000000000000000000000000..4abaa5004a9124c489ea1b472508b7bc6ef44543 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPmkDRy>N4xvSP6h@>W=|K#5R22v2@8}S2&N?LSaHk|Y zzw6cguajEN-LiCPyuqLU|K+8p*;Re%SlH7e6sP~d;KBAMjm*_CPo8{f4U9c=00f#& zn=~%>&o{KI_z;lt{G4gdY_nXuUoS3pzvtok|5570*PoxSTiv^7I6pGt-=C^)Z#uut zH1_v5Hu&@B#DNd}D&AnH|YY+#_1nvf9TxQaVr!PLgahs;1= zZ^`xnC{dG`kT9c5&oQTqyQwOXdncQP!%OZb&n6dNxR9PIQNqB`qFll}al=(VUGtAn8;yZ6}Dyp>z#{}#7U@pfv}U!~yHu~~Ed;++hHA4FVx9k#Q^NGR#iw<`VFYp308`6%!wBAQ`M#~rx> z_8kY9H_R7FU}S#4A>ntubH-~v2KF6nZu=(|NIC8Mqoesiazi8Y1KtevsT)M%-YU&c npXd8a{kVhpjFyiR>XYRaH`aEXZcA literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/wpt9.png b/Icons/map-icons/square.small/waypoint/wpt9.png new file mode 100644 index 0000000000000000000000000000000000000000..99914ac3dd7de42e3e6b1f7c6abe1b5d616817d4 GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPmkDR!n==q#;Ky{2#o-U3d7N^f%KIp|1D01xM{?ds} z3hc%k1jW}jHDz7pzH&;u;G*;wKHE0`00ZvuZ9+s>n>_cGC4j`#M343+zFrV zw7>@);!!0Ja`fiN-`_i(xjsT#%I2+Oo^04OS+Bn=MYF#3BwF0wR%c+Vu?zx(LnH}8)ybg1Y) z-c@$0Fe>_Mm1*qiyAf~8{GGN4%&3U_zaYd)p4;&A?z`veHor7Wuxct;8PBlC@_G6J z?hl-I7%M{;u<|q-88EF2Z8ZGA_QHX^BAiw4XWgDm8=GKO2EPW`2ZAqFGhMYf$ST0l m_Nq^Y(d+?p+MFlySH*+W8s;og`!5F!I0jEwKbLh*2~7Y1!U7WjXCpKex{x@TNJk^lU|BB<`AQyR)u=PaT_=FBa}&QE zf10|Ox?F8l#r$HPTqTEDGeKmYH{79y$`@*mfM6n+9K164yr37vTqTFKYQZ|-XR96n zX+`>`zt9yv@qXJUZZGQVb!$8~Zp^%z!CJCl0|>OuE)WEPSUBdz#lD>hegT>7jp4!6mz* z;(igSOClf#80a0?w5nz^`y~5Jom8*=cZ^a+8jS=ahWDV?(^_dQWFBWS@t$~Zv?p>^ zMeS-oY|j!N+#h?_*LVD;)1kNvz~<-qg^B+DQ`doRI#oLT=&cfq4R?|NfI{KpL*>lr z8-V=V$L|)PY1)Tm@_fqe7Q0KO^6Nb(0GOT4-tzkoo$Dw8K(Sb?%Cg5;Tl=xpXf&Dt ZKLG*OsJ)J?+syy~002ovPDHLkV1fp`1{?qY literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/waypoint/wpttemp/wpttemp-red.png b/Icons/map-icons/square.small/waypoint/wpttemp/wpttemp-red.png new file mode 100644 index 0000000000000000000000000000000000000000..1781a5e21ee2a90ada07f9c923fda12d49928781 GIT binary patch literal 552 zcmV+@0@wYCP)Z@0Gg zsrmfhuckQ>PN)Br+q3>}%(S#Tx$F0b?z!F0tBHid@-j`?>|q#QaGqv8p1IWgd{HJR zMRZ-Hrbgl*Td+L{{w}y#G5pf$45o&Mi{kZ)*le-~vIdd?NrDtXVw#o;z@4%Mjj@0tK@DEBU^o&qOog>u{01%69y!Afneg@c2`<9Cqn5OwN7!34Ut!mxoW@6>i1OQ7*(dUhgHy&3- q01%JIckTB2?9tKjP9~Gd0sI3#6|&nq25(LP0000QgIlEpL0BioXa^|+FDmjCp{{~nfs~h>BLx zgbIQvsEe?htucbpY>X%>DaFb;6PwX2MoGocc|Rno=)`{WCYx>J zfGp?BzDI#G-pS18N`14cU};l2erobiW6;F7@8t zx%<%Bb+)`ouZ>E4zsv0GdseiFRmCE6O-uPXmn2;g`Sh_i_rlwwB@uTC@kSL%AL6wa zq4^Ps2}CJ~2#*;S`W>vVI6^*?DtwDw&Cch`hEf?UX6WpIk6%DlK$a!i*EpLcrXSbpJ; zj<^TM25K5CZ_;(Om}QU+psb`|*d~IJeD40W>3dgh`1k$wj1w;n=Ww-@XTe`)-4ACW7Su#r9dF?&h75sqbRaI8jU^wZvud+sp%sYi*AFii z4-)^JF_2w$zURrgMRraH`j3eG%49ugDApu=NA|!$yOTSPZ~x@+KSVQi`ES*wb4u1X zbsp2L+CH=J#F>n=Gd7tAlv8U~d4;Cla*V&m!EhmJcG)B)mv3v@uglh$BploG>fvIJ c|6Ds5nRn&3o$liH0lI;~)78&qol`;+03V%6T>t<8 literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/wlan/closed.png b/Icons/map-icons/square.small/wlan/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..51b6894dc7d7c0d8c8955669212a6c087ef01259 GIT binary patch literal 616 zcmV-u0+;=XP)ysMkp;7MGSgkDhI9-IR2?VoeXZ_HB>%KA++7eFy-&WLfr9ho*k48u%?Lg82xMbc)o?Mad}>vTFZtJV5I5CpPZF2BMs><$Sd1uv)DEK@czq#^do%f*=le2|ON;c`}(S41#L4dP&pt6Sv#Fe;4d@ zI`m+%%ibYeNonUDso=*!xDK zL1>!xrqybFQdM;U0O0j{4_KD9YnnEXL?Z8WUDy8_q~&tCVi@K;7K=UQIL@9zKr zz;rrYq*AGiN~LnO2?GEiEX$t#>oaAu*$>G7zVk0`*wW)Kma8uS0000QL70(Y)*K0-AbW|YuPgfvMkyhE1-7+Eg@8hGC9V-A&iT2y zsd*&~KAFj>dBv$#3IU}_Ihn~W`MHUid0g#ltDXW?x_G)chFF|_J9(jKgMrAAqPy*W zhj#c}YHiYdpZL?XW1jWI9V`}C91}gOLZ0v3ci@xgQt$Edi9Gw0 Z?eA5Il4HkKKLnb`;OXk;vd$@?2>`q8P&WVo literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/wlan/open.png b/Icons/map-icons/square.small/wlan/open.png new file mode 100644 index 0000000000000000000000000000000000000000..8eebfa0534fc011655209e7a42f12868cdb5fe6c GIT binary patch literal 643 zcmV-}0(||6P)4Z&*i}7a1c~*D=xa+dXu9Lf^y*G z;2;S8fx=Z#5Q{d(D%L?EDx@SRU9K7pp7k!5Ooos~sO^I{eZTL+`@@p}0A3RWk;E`e z4fcpirNZX(`HwP!Ad(bCnNSox-Ura_cHaX4k}?d#)F_G`SF2TC z>2&)1v0?xKknY-Ytya6#>2!$MY<^a+*DrVZWV-|if+V6S-iV?IAPCxd&Yc}#81{TP z9IpEP{?cx@tM>wEG@2)VzyC0s&0b_OnRAcF^Gd7LKK(0zUav<=rP8~}WWq%vk+Vc1 zaWNi`uNa1TYc`vaoq$j%q|4=UXs_2hn$PFIaU4J4d0rF*L3BEut?6{S?sPgwg+k#C zNs_uh02YfyBM1WUdc7To!_i_{_U>%6*^I|={KV~ccQ}sYtyb%cttKG|;_JUYQ#c$R dO8)nqZvk33^OqB}a})po002ovPDHLkV1h@77?1z} literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/wlan/pay.png b/Icons/map-icons/square.small/wlan/pay.png new file mode 100644 index 0000000000000000000000000000000000000000..cb19e59a15bcbc59c9d33af32a80138c45a205f3 GIT binary patch literal 483 zcmV<90UZ8`P)wmF0dPq~ zK~y-)rBg9$!e9`+i=m<>AP60zEgGj2yvLi9|S=OvW6? zd7sT@PsL)<+FgUGAe+rbG)+5fx7*A4eC~9+-MdsO6=h+W1gq8R!?x|WYPBlI&y7aogoWi< zMO9UWe!qXw>-Cl##~~u(cDwZg5g;NGLe`VX8q~m_oivC{cyetey$V>h0t|fkL8EG%>?_} Z`4gtX5TBGU1?d0)002ovPDHLkV1oOU&XoWF literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/wlan/pay/fon.png b/Icons/map-icons/square.small/wlan/pay/fon.png new file mode 100644 index 0000000000000000000000000000000000000000..bb778407d4dbc45d40df25dd85e10ff50a947f59 GIT binary patch literal 934 zcmV;X16lluP)D4h zH+E6$AD}2GE-DDYE&^(+=t63%38kgUB-A9@G?Pg(Go3tU?!4|j$3;MN({J~|#|Pg7 z9)S6&55(%lGc6C&i2oAj!@iU@yp^wt(dF=wuWr?2_eXt;@5}5$xg#uSiP>1~BR8yQ z$ET5#7t;STD4pwn(eupYQc;IKyJ-lwcGnA4&o9b(c1sn8l7jB2VqzdhvN`aFaB|0+ z&MxN!z}A;fpRQ*MpWj+>Lf(jODkN^nYT zeet?o%dfwZzE^y5>Q7D0gMn5_DlQO0U<~xe1o4n0(Il8z(J!r zcL~y)n#H2Quf)F%xf+TUn9gXFfSIgjZC9fWDXZbt-z-(#NW>2f4cG2zP7YZ_gD^Sg z(%mcw2LxTsg3gGb;22IEQj}|kwO#X`tZi>hOr;%a9{jasP!h&F1qW=w8{-zkZIV|< z6ha$pAMDl)vw6e$-(0R_Lr6EDS#Pr?$*{l<2zuj^W*>A!pwfUs*>H2iFui8@WX7Xd z0b`&&B8ay2y6W6SyqIc{C;S$qVuBx*Jbu1wa1H#ltg!=vOY| zJ;6!old$Dzep&WNgaps`DGFu7l|_$qPV?OzkL~JSw9aOMr(vgN2wIYIE_+P^wF6Pv zcxfcUT0Mwg!4ut*stbMzJ_R8Q4z)^-4=8euAy+nxAKceC^622+6H6Zrzq=mldF}l7 z+5P@XLABd^2XY#QiVJo?kaNJP8)88i>rgy3_Q=-*?@XOmwQoLFwK&(^LT)Ze@i0cW zCz=E|vIf5;sJM_ROY)AulA7mw6vqzwGIr3Mxo|nNX#q0+^2G*ldHrnPyl#l2c2K-< zbt9Ze_NJcM*}PjXZ`Ut9oRoh*6e=x^wF{z3-)?&Q_gR2{07u1Rm5Li~i2wiq07*qo IM6N<$f?b8KNdN!< literal 0 HcmV?d00001 diff --git a/Icons/map-icons/square.small/wlan/wep.png b/Icons/map-icons/square.small/wlan/wep.png new file mode 100644 index 0000000000000000000000000000000000000000..d89000642b9400bb8edeb9d540898c3d4fdd6425 GIT binary patch literal 750 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

      ^^Ap| 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%0AOuy$+CFA|yfb9D2j6eKfPGkP4 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

      ^ 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
      h>GHf3k?-w@svdd5Y@V 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�{Rv}cciDB3D0Ab9 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%0D&SkAYCq0wh~YAOB?IYSaCH&aM@(4rpr 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 =2(`IiV+g(U-6HG`0Dwr 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 literal 0 HcmV?d00001 diff --git a/Icons/move.xpm b/Icons/move.xpm new file mode 100644 index 0000000..fb649dd --- /dev/null +++ b/Icons/move.xpm @@ -0,0 +1,31 @@ +/* XPM */ +static char *move[]={ +"22 22 3 1", +". c None", +"X c #777777", +"# c #0000ff", +"......................", +"..........##..........", +".........####.........", +"........######........", +"..........##..........", +"..........##..........", +"..........##..........", +"..........##..........", +"...#..............#...", +"..##.....XXXX.....##..", +".#######.XXXX.#######.", +".#######.XXXX.#######.", +"..##.....XXXX.....##..", +"...#,.............#...", +"..........##..........", +"..........##..........", +"..........##..........", +"..........##..........", +"........######........", +".........####.........", +"..........##..........", +"......................"}; + + + diff --git a/Icons/remove.xpm b/Icons/remove.xpm new file mode 100644 index 0000000..4a0522a --- /dev/null +++ b/Icons/remove.xpm @@ -0,0 +1,30 @@ +/* XPM */ +static char *remove[]={ +"22 22 2 1", +". c None", +"# c #ff0000", +"......................", +"......................", +"..###............###..", +"..####..........####..", +"..#####........#####..", +"...#####......#####...", +"....#####....#####....", +".....#####..#####.....", +"......##########......", +".......########.......", +"........######........", +"........######........", +".......########.......", +"......##########......", +".....#####..#####.....", +"....#####....#####....", +"...#####......#####...", +"..#####........#####..", +"..####..........####..", +"..###............###..", +"......................", +"......................"}; + + + diff --git a/Icons/reverse.xpm b/Icons/reverse.xpm new file mode 100644 index 0000000..504808f --- /dev/null +++ b/Icons/reverse.xpm @@ -0,0 +1,33 @@ +/* XPM */ +static char *reverse[]={ +"22 22 4 1", +". c None", +"X c #777777", +"# c #000000", +"| c #777777", +"......................", +"......................", +"......................", +"................#.....", +"................##....", +"..........#########...", +"........############..", +".......############...", +"......###|......##....", +".....###|.......#.....", +".....###..............", +"....###...............", +"....###...............", +"....###...............", +"....###...............", +"....###...............", +"....###...............", +"..#######.............", +"...#####..............", +"....###...............", +".....#................", +"......................", +"......................"}; + + + diff --git a/Icons/rotate.png b/Icons/rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..78bb2968f4c8133e20eb1b81735e30b890a116f2 GIT binary patch literal 819 zcmV-31I+x1P)bKG$OpkroAsseAusI#+jf_PXv>=z}veoH^&4bH2HE00eN(*R0@$OmT{j0qqrw=x7|yS0hHB7SW4{9LUtU`T05E z_<^=x%*`&m?tg!EVHGK2V&ePP-?}x`Xi-(YmB^GR=_0XiXdWSDhH~x(!}Yh;MSQ1u z>?M(&7YLV3)m1>|fz=45N=D_w(aUO#SW2Xit{Yy`^Cp=}2D)Z0+Zs6gm$}BoLX&FT zbnX>ttoNyw#_Ez3n>V=&mqgix5I!GXYd-RY>#tEKpX@)QR%opIRDxwH=?+(Sq1q^+zZq=T9Z zYU3}}R&n%1yja{_M9XT5$R#OuQ^nbKHj4fY$Qy!V^`SUYr$?xwxHsK}{1gW~Lc52^ xwU_KOSf3O#CryxtpND-v?FU-K{~fX7{sCU9i5inpMXLY+002ovPDHLkV1iF&evtqG literal 0 HcmV?d00001 diff --git a/Icons/rotate.svg b/Icons/rotate.svg new file mode 100644 index 0000000..14a38ad --- /dev/null +++ b/Icons/rotate.svg @@ -0,0 +1,565 @@ + + + + + + + + begin='' id='W5M0MpCehiHzreSzNTczkc9d' + + + + + + +2004-02-03T21:29:12Z + +2004-04-17T21:28:35Z + +Adobe Illustrator 10.0 + +2004-02-04T00:12:54+01:00 + + + + +JPEG + +256 + +256 + +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXzN59/Pfz7pH5iaja6fcRR6Zply9smntFGySLGeLGRyPUqxFfh +YU7ZrMuqmJmuQdHn12SOQgcg9c/Lj84/LHnWFLdGFhrYH73TJmFWoKloX2Ei/wDDDuMzMOojP3ux +0+sjl8pdzPcvct2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K +uxV2KuxV2KviH80//Jj+ZP8Ato3H/Jw5pc31n3vL6r+9l72MQzzQTJNBI0U0TB45UJVlZTUMrDcE +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 + + + + + + +uuid:67a1db2b-6f0d-4b65-99fa-82dd25da8f67 + + + +image/svg+xml + + + + end='w' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Icons/small-remove.xpm b/Icons/small-remove.xpm new file mode 100644 index 0000000..7b87771 --- /dev/null +++ b/Icons/small-remove.xpm @@ -0,0 +1,18 @@ +/* XPM */ +static char *small_remove[]={ +"11 10 2 1", +". c None", +"# c #ff0000", +"...........", +".##.....##.", +"..##...##..", +"...##.##...", +"....###....", +"....###....", +"...##.##...", +"..##...##..", +".##.....##.", +"..........."}; + + + diff --git a/Icons/src/actions/GPS.svg b/Icons/src/actions/GPS.svg new file mode 100644 index 0000000..9f87d5f --- /dev/null +++ b/Icons/src/actions/GPS.svg @@ -0,0 +1,73 @@ + + +image/svg+xmlG + \ No newline at end of file diff --git a/Icons/src/actions/align_nodes.pspimage b/Icons/src/actions/align_nodes.pspimage new file mode 100644 index 0000000000000000000000000000000000000000..cb40f92611414f83a7a86c28acb106393c7f4b08 GIT binary patch literal 4056 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 literal 0 HcmV?d00001 diff --git a/Icons/src/actions/break_apart_roads.pspimage b/Icons/src/actions/break_apart_roads.pspimage new file mode 100644 index 0000000000000000000000000000000000000000..3ca428b2f30522dfd990d444f8854cd234aab45e GIT binary patch literal 7513 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�!QDz;`(mVZ#cgeDs!*%&V*P zL87DO)njflgViY7FPAXCgz&AmMa#NsIyoSrcC1Ce8%=hImmA<`%=TBp84pYq25)Ug zSyzRp>r`1Uc{|UyW)$^NjC@`{C*9pV*XmaHbqb|)$!~lzC?PbTCTsXIJa`Wrf79Ji_)jz z$yh-+xnWec+&XU!qk>1Qe@sSYS~7xh-+y;4b}R*boIvD$MKbOIiXh**K;ZgHPsXqd zT1<#Ev2+IAm;_u+#O0X4JKR0$l z;6eL&GMoP#Khvi+om2Lx9`-faSfH=BWpFxFtKvj_P!%@YK8Th5EsL$WgM(!(+cnYB z?F3S^oU~c+W~~)SV_sYUzgR<<+v^@s!R3^3&u1yt)0&w%N@=mGiceVX*A2fp-?8pZ zdsy{hlTzf6Npa~HKedDU<7#cCw3tE86(z29(sPaR$6Qmvz%m01A3G3GAip>Go&k#6 zugEn$pa^oQ1jG^8xKQ{kkw8?l2w_04Ag6GB^JsY0rtT|5*`kS5N4+MD(V5!qp2IgK zb-We81JF@tkyF0(5eI^dR^PJdBSE2;h5hyta$=-Las&ejIN_&5QLe zyQ9cP_2YtRDJ|54YPcZ9XLj|{F(n6BfgZ?{)EXNhdP1!HF(DK%kbYl1f5m;XctdUil0I0NkOG<3gx*_wCdjg<#yIQ_gA3w#GoR&x&+}O zB7>t@ELodLlA6IS8KxiPx?b@ckw{j=HSA{zu~J=8dc^T9Hn;>kt;oI!z&VJGKQsGCPKHows8F!&(RV;nU7E-Jc1{#l7Z1j@S9Z*kT zZAAC;2&T-NCs}!`Ni6st4_m3HYH+{h zTMgFHMe3Scq(kX>vI|)7haHn5cm;?ca6wvpIS5W^4fer%zhuX>3Mhg^!9>*rvY01D zFpFv72R35pr2agX9{ztemLAnV8!HDiK^ugCz_+Cf!Rlj=-qR$LJH^7r>Xxg}v?sF1 z!2wzYb8_{0oHw1=`X7mv$H2M`t1`q~0%Wlk8LOD`opA=g=1*3 zg_Gv@v4z(#w!dW3z<(7$8pMDM(IyIv?f%EH7-ka|?3+z8B3!-Xa&fI3Lf~r3Am%Pi zM(A0VoKy*&$e$5lSPMMQV3;4^X$X?te}sAQp0aG{LY5{2rJ=lWV!k$S&wCicY=$ROMLGJ{kgl89X?^d*F%3H=C4a z-A7&J-R-AdcY@yaoy!gcxlJBR32u8|Kfpe7(E@b(`bw)^R`wm41S1M-%H3{zP7kB8 zS2Zoy!CeugBj0UZK0VM=K=&U4EeDOE1sYbv-~XP3*D&zEB+zj6gn^a-QuMo3vp==@&bdaTg34&Q6qe2H! z1+dVPH9+W=EYwrvxXDQ>5^uuKC0JtpP9pUo1KGe+@Pa@ZtfY`-v$Nt0%Xb9mffxZm z909?QV_1@kkos8ds`s7abFqPSO(quF-!;02vH?XA2j0m@RPMwb%&Y1j;W-fZs29 zM`;$&tGEDkf#w4u{AbG}eJnlB|7CC>= VMU~i#*;1FLYp`gUxFUJUzX0te{&)ZY literal 0 HcmV?d00001 diff --git a/Icons/src/actions/build_bridge.xcf b/Icons/src/actions/build_bridge.xcf new file mode 100644 index 0000000000000000000000000000000000000000..4dd749f6f4d4d02fc9e8a31997d2807613300675 GIT binary patch literal 1420 zcmZ`(O>5gg5S?Agvg)KHZJhRyLWOckAPxz{xdvKF2|nl$dM=71s{(&vyO13E6MEN8 z=l(K@{sZGk+c&agX+jfGH>w6u47CeCBx}cN!;%Vqv^T{xHIBlH_{QhJ(nOP_K z(wX`9u61#Kky}l0S(HvOdS5eI)~){sJo-4Fy8U46TbJc;fqbeX3$F8h94xG0-2djy zd44h&%)P}%AW#2Gt(omnJ_o~hMsx?Nn@@Vb zKl9v$_jNXLAI_&^9~4P;FazK>q5!jqd4}H>^K9>cGHzAkol3l0iC%BbRGB&Zp!@?N=J(oix1jcFNa zWB{vP6j3Ci2I-N$$qY2x>#KzorvJF;b-IjkM^GAp!) zJhRarvi2~IL)IQbd$`eV$7ECOW4G;$Do)zaZm;rQxn0swG69WgX+t}(N^F~KVMDtO z?L`Ld$d-9#vv$Eia zYS|7uQ%Qvl08M2LC6rDLK&odA_qqYrAfZyBaJz*v=~-dFzd~cpzNSpEhQc-TU8QPL oiWx)U&hUnN`R@Fa@9DSJIygE$yS}--`*L@CbA5JvbkNf15BHiv*#H0l literal 0 HcmV?d00001 diff --git a/Icons/src/actions/camera.svg b/Icons/src/actions/camera.svg new file mode 100644 index 0000000..8fbc60e --- /dev/null +++ b/Icons/src/actions/camera.svg @@ -0,0 +1,57 @@ + + + + diff --git a/Icons/src/actions/create_area.pspimage b/Icons/src/actions/create_area.pspimage new file mode 100644 index 0000000000000000000000000000000000000000..d94b62b72ed2c73874a865c3fa145741b72a1ab5 GIT binary patch literal 5254 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 literal 0 HcmV?d00001 diff --git a/Icons/src/actions/create_road.pspimage b/Icons/src/actions/create_road.pspimage new file mode 100644 index 0000000000000000000000000000000000000000..78ced182cbf9ad0079993264030273b0a70f9c71 GIT binary patch literal 5152 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 H7T@zPf}jk| literal 0 HcmV?d00001 diff --git a/Icons/src/actions/detach_node.pspimage b/Icons/src/actions/detach_node.pspimage new file mode 100644 index 0000000000000000000000000000000000000000..4ce8ee126b83afd18d1b21e9ddad3ccf3b151458 GIT binary patch literal 5383 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 OkqBvp3_E5M9{q2C5U0)n literal 0 HcmV?d00001 diff --git a/Icons/src/actions/join_roads.pspimage b/Icons/src/actions/join_roads.pspimage new file mode 100644 index 0000000000000000000000000000000000000000..b1903f1108fd6c9c17fd30605dcf06152523e3cc GIT binary patch literal 6057 zcmd5=2|Sfc8-LH@9FAj`rNR-}vzC@mD51I%@1N>E=7BN^OIhp-gY1_TchD0JJfe~N_{Kirgz(ePu(Rg8@a`W-gdHGNqDIpE`$4jM9sp$2;RX{Ew0g}Rn z`vGxq3V}!>bHS;3XuN_Lkw795$s{i5798mh-(h4SE@4@%RTL3Rd+Gu&QSIQ<@!WE& zQ(ny3R5l>51D?bAQ^^MIp4Jd^z;e>4^UY>a^_C`%x+uw3Eb`&~f#+e*`Ph7M;cX8$+~~?%`(xUc?6rPb zJrP&Oi2bJxPI>#iUQ*nq$N(e^oTzDNRnp&HBQkSK1!e&f2I?0PM$sD&upn z8C#B5)V@l(QS4fJ=tSYm+VTfKomr>b@Y#27!^?5E0qJ!A)Y>N~PM z6gx{EXBLeO3z1Q4A zpZ+R<=_FS9ZNAYN;9A#mVZ&9$*A{^>b2_E%hx%?z*!nFke^k-Zb3$aB?;Ee@i{h2X z#?q#gNJAIdJS~IshVN7vc(O*7s)O`=?jA6)tCcfjrBwQnu6F&Lnt0uDQF*_jyFAq#-MMAA^AB$8SQl5C{iOX^=X7Od#^ADTkE zC(fyD&*=V~wqvj$j5`m2Kvt$lN93DNN$gt%E?8}oJ}+y^+nio$!qAYosVn)TsFL4{ z6LOtew;5{(S=JhvaSHhE5M%j8VmqN>c#umCgC^ip6wfHXnIn=)V=2Zkkp!*@+ZwD zQ?Jjf+y18CaIW;wa34$a5da{-f1+l^t~;8>H~3BpxnLjC(vJK^c2Trzj8 z*m(4PLl{Kfw9#`k93roHI|Y%K8+;H?Y&FmsFLAK+d*~@GHle?ZnAni%>>*!+- zBqdTcjaN!aL}?l?+!72AC=T)smM&E|@=w#q+fWTx1rMy@x)!u$`yX9Gk_g`wp>4RT zB9QU4DY-aq+avdPt$J?qmW-!fABS_o1T@S;mCiSQCaSPOKkMGck{em{vi<hsK^gKG~C$%KCl>$xT=Xt?+NMV4V%f5Fb+xbAW9Q%c#}G%cTn;u*6rv9e_ zfZ_BNY$op*L$fIFEP~N!ylo01U2f&1vROooCzP6SuT1FEyA}b~$J2%J!19 z<1Lpuid#D!dVA?~=m95$k006^q7ag?m(Z&}tdwO0bZbUM1PU*wh5w*7lCVExrThg> zgo39EbS|1Bd-=o^A#0VNd5^jcstnQw-zT`^KeJzNe39(0E(>ft8Chy`N<+T-)k_T}b zXR9I_pY4kv@T&(S)#v+o{-Elu$SC`sDkATh?|A}$UkFFlSNspE89EChaMjJw59F{B z6e}n=Wt((ef)2Amb<*|t-u6;RT2pKhU;F(qPc}^5BkvoFn0NQE-QwDM+;49B-2M^_ z2_@Dae|sJ|Th+#1 zrx;iDg?=EGc0nnEg0m#t@97$Zb%6e{_@W^&6rbD%p2Wzi4R?U4_>f{SVzjlj3G^7n zM1s<=)K4H#JWN{v+zU&c1O~2Q_oMs4$uL?wFc5Ga3}kx>I1d9m0cT|Z?$Dh}?sags z41~^0k>^5Akg*5fvZ?+5!6rIpQE(PQ`O4;@Pn|*}vfd#`Nsfb|i@kNk##8fGG8Et- z#Hg2;_GUb`v(*u!HYpBVBy#eW;J>fFoPVL)_tX)q-90^yK|z`NP72auByHaG^?o63 zodm6!^<>p16N{^FhyEbv&7u5`*T7QLO@q5PN!jyq)R&$MwH(Pl92Gf8XAfG@)IDp8@4-!gOGc3J~dZ!MO$F8)-p34nZ+9 z$%WXpCIgS$Y)$;w+d{@QZPxrzll@*b>3f>fXC0Y9p>Xp#X`LZ9Ka*g#Lzg&fg?Bq< zf@`7-iM(9{#T^O?ANrzf7SI@Rb!9R&114dzeEo_($ruNqqUZ&X&B~nnsz4wtBCAqU zqKR7G@oVt-*t_(c;4ju|rL?$ljuwB*kuI{&DKr0@hdNN&oO%9J(&aojAwrFEH~P}T z)1@Ob3#QIF7y%E>>_Lc*e>w<7{+mII-~?zoDOAHL@E|)nbhL|zp5FBK@xHy@4|S`4 zI@9XvO2p=#CSJy)_x9W9Y5jkE4WPAx;4FsnyRQLe98IvL%~V|2oYk!wq>w*2T)JF+ zv6gJy3jKY>M75B&UNw6-u}0ZywG?F!9%h4SYZ_my;j2E5*37ie5iF;jH5GRQlxL%&!tO+_5dOX!Z!67_b@ zo1*;CyFQ|EaQJivy-2)=o3epD2;q7tUq1naJ=}$z4M`gSSSlo^Q1_O*GU@qX&U&}S uwR~`o#6&6#kHK1|Eca)ua*?4(h5n?k&a;C#yy2T9`k*0>ySsbk0{#ZAR-<_U literal 0 HcmV?d00001 diff --git a/Icons/src/actions/node_4.png b/Icons/src/actions/node_4.png new file mode 100644 index 0000000000000000000000000000000000000000..5347c9f5e7f9a478768e8049412410a6644f654a GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*h@TpUD4nJ$Q=Y>#>1H*!5~fPj=qiz3>*8o|0J>k`I??Cjv*Ddl2Z~A1Xv%*D5SAGI;rEJ sB;JuNxuBtwk+&hlr)|@J=8qx_B^@k=yLa4S0%~ILboFyt=akR{04hKz1ONa4 literal 0 HcmV?d00001 diff --git a/Icons/src/actions/node_5.png b/Icons/src/actions/node_5.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a23ec6e58132079c42cdd3bec245c26f53bc94 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=_7YEDSN5BXe8K`oJM^F10EIXU zJR*x37~~FuFyrCOkYJ!7OS+@4BLl<6e(pbsAVcy!T^vIyZY3uqBm@XQd@$qm$wNg` z=lAAHP0&B6bLQYh$wf=vm|efu`S;uL{!{Ds)r%)QNl4rG&%~@zdPUd6OSiZ4m`Pu+ zO?;M|yt(4z-`P!E^7hVWUrw%f?Oc1&Yp5D${y7q|3d Q2heH;Pgg&ebxsLQ0HJVGmH+?% literal 0 HcmV?d00001 diff --git a/Icons/src/actions/plus_11_oxygen.png b/Icons/src/actions/plus_11_oxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..f2f3012fa4681d1c1cc0b0e054b4e7418f51c687 GIT binary patch literal 448 zcmV;x0YCnUP)dG&H40-D&6fdf!sGp?dJ)@jjo=Vx!r3=UTT+8)2V=TGf)e&YH!zkv@fq{q$XW zI~sM>F;oTtsvM1p-08z^AJ~)fBWu z7YdaTDlMKK3f^BCivenO6pd-X3&SHPOeYb8bi0000f3AWwZ6T+_j|u@e`_B*_w}3n zv>n#@Y}U5h;-hWr?e4W!+j{-RwF+7QHx82EISbKs@_?wJ9!pGdr~Zm_4ps~X&;SIQ zK$mGFa1Q_rjYE|1a|&n??O^>4ni+ydDJdyv4p2hxjGlV0!9=6{`I~I9J_F#pp2x zz`|a^2G|UE3#@Ie0l^@^a`Xpa5#V!>9W|2R0|uWU`2@TRb^+pjV-N&`!DQgZVlqjl z9E&X{$C8s{a}+piwgS45=gKQ6D5A#ZC@FCjmGBrpgr7kFiflPH8!!J`4VDsVC@3r% z2l9hz1cPLxlsmrp}Yu0*t zty{lgtKWD20o%5JzjIf3MC9&0QSk`}4jxKOI{ZW0k0(x^NddhgJCf8ZU!B?*)^Bp+A;*+tO?VUK=Y^xH|YdU1x?v-GpFN|~wj)G?{!S;xMB z6H7a)vy|1z=LRvWmd9P-Y}y)Cr_yG>;y`WVjb-^0XUsg~wZ`97q0na$+4|e_Kxsgi zMGXXA;@u;8Qsy7Fw(mang`+r*9w^y1vsl0B|-8mrbai95SCu2FMAowxC` zn+I+mtm=-|NuDXIDG>CC9}ErGijH~K*=jI!9RvdJvuOokC1sa=vujL}67&|$dX&(8 zeoRWUkY}LG+>rsQ3Sy6@j-6&%Mf-Ki&z&foOysx=XYLy+Yf{+&g#vTdudG2uaa zv8LEQe`-_7s3@88Dsw@-;q|RbT`}gmLE^m3-0=DCIhxMmO^3|Q5_26SB8f0!aoL)h zECX|;=eaSx=bqMg-tBVgKT)74s}-|mjF*ag@ zFyEjVQc-DAuySzuEUg~*R*~AB8|m9F*-0QM`F(Wxq79l$vo74Tm3Kboa(FNM>X`WL z#-wvqvWM)NC0peAqOq-IN1h9v~{J}IrYd(D9b1tW*Jn<3%=+nz22tb zU(lbmT^fH^qxhHL=PUDinq2*S^9$3}gnKI|6i?}M0_4uIm-S0v5LbuSAP8|xT81zH z2uUElWm@n#c#L=OqLv|e&k($!B|_9Ub?)L{6B!SNXXy!NCZgthuA#2gB>^ z>Btvic(V!vyPs3=&b>H3`Q~KA-s;H%@U~F!!aji4S~ZhR!}}faiG!PudlY(k)KkIL zJWz%i~DLa<5a%2Jbt!QW6gr;Q5K~_ zALkizf>j}Z?C(reO$^yJ>gUvKa-GA>`P*3W+VfMAb%wVe(5sl@Ygw%yHGaVmx5t7* zPIZQv-P|Ecn=?)7oZ?%(yzpU*lcIriWni~RFbkzH9x=g4v>1WbIl$h1tKZr!+9uQ& z0-AY$B9my0Pk3b{0wj<=ebMOe8-&>O-wK3QAH7xhLk1IXfds!*_@iap(W6%{C;@G5 z(fK}@BDujgEhuXNj{8s#C$Qj%3!El z;S_TC?VZd#eo%zu1$?C$8@ku!HG`giO15sB!V^3S{3#B#Fp2wo)diQQhLKfX|G8Tlshhv&WTSqpz33`-yVXs zVvZ{62i+jje(Jr?Z9rA9?7&2V)ih5P^@DD3aivKly+IHHja}G?q#4P(SgUzj5&f0X zaXEe6P}F6k#^6$mxnFb@lPn>;KhniY_7aM(U1c=g zh0w>w^x*cF5I)U`J9q-hL|SF5x+{B62lKt$kQu5ZysRBFmkzM~#{o9{{|NACgcP%b zE6)c3cGI|zCMX{eX#~yWr@Hi6_hq{D!84eyDYAqy=pkuFLPtp8y-~2%im?bnvz7;Y zO-<5Hr;p=}Ejfb}C|t|ic=@5Avk?p&JdAKfN?14+P9BKZAAM)EL#p99y!O@kx1!9`pN>UTA*1+L9gKfkm*)S=bZPzv(=|eNG5@+q@bB;e N{{QMbLT^9m|1T2VPVoQ$ literal 0 HcmV?d00001 diff --git a/Icons/src/actions/shadow.xcf b/Icons/src/actions/shadow.xcf new file mode 100644 index 0000000000000000000000000000000000000000..482dd4bf823f8938ab9264bf5652736ae41e8f42 GIT binary patch literal 1864 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 literal 0 HcmV?d00001 diff --git a/Icons/src/actions/split_road_a.pspimage b/Icons/src/actions/split_road_a.pspimage new file mode 100644 index 0000000000000000000000000000000000000000..ee5baf8d01662532c1f537800efa8c4c139837c2 GIT binary patch literal 6457 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 V-FAsboN1;$9gcII+~O#=_}^6oy|n-U literal 0 HcmV?d00001 diff --git a/Icons/src/actions/split_road_b.pspimage b/Icons/src/actions/split_road_b.pspimage new file mode 100644 index 0000000000000000000000000000000000000000..8cdfd4eecaeed2276475a6569e03aee159d11830 GIT binary patch literal 6820 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 + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Styles/Classic.mas b/Styles/Classic.mas new file mode 100644 index 0000000..e768b4e --- /dev/null +++ b/Styles/Classic.mas @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Styles/Lighting.mas b/Styles/Lighting.mas new file mode 100644 index 0000000..7772e84 --- /dev/null +++ b/Styles/Lighting.mas @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + diff --git a/Styles/Mapnik.mas b/Styles/Mapnik.mas new file mode 100644 index 0000000..1e663c4 --- /dev/null +++ b/Styles/Mapnik.mas @@ -0,0 +1,715 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Styles/MapnikPlus.mas b/Styles/MapnikPlus.mas new file mode 100644 index 0000000..0ca14b2 --- /dev/null +++ b/Styles/MapnikPlus.mas @@ -0,0 +1,1004 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Styles/Maxspeed.mas b/Styles/Maxspeed.mas new file mode 100644 index 0000000..2a492fc --- /dev/null +++ b/Styles/Maxspeed.mas @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Styles/Merkaartor.mas b/Styles/Merkaartor.mas new file mode 100644 index 0000000..77c54dc --- /dev/null +++ b/Styles/Merkaartor.mas @@ -0,0 +1,1085 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Styles/Mobile.mas b/Styles/Mobile.mas new file mode 100644 index 0000000..bb165e7 --- /dev/null +++ b/Styles/Mobile.mas @@ -0,0 +1,622 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Styles/None.mas b/Styles/None.mas new file mode 100644 index 0000000..9670f03 --- /dev/null +++ b/Styles/None.mas @@ -0,0 +1,2 @@ + + diff --git a/Styles/Styles.qrc b/Styles/Styles.qrc new file mode 100644 index 0000000..7c1e050 --- /dev/null +++ b/Styles/Styles.qrc @@ -0,0 +1,14 @@ + + + None.mas + Classic.mas + Mobile.mas + Mapnik.mas + MapnikPlus.mas + Maxspeed.mas + Lighting.mas + Bicycle.mas + Validation.mas + Wireframe.mas + + diff --git a/Styles/Validation.mas b/Styles/Validation.mas new file mode 100644 index 0000000..6a48c4f --- /dev/null +++ b/Styles/Validation.mas @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Styles/Wireframe.mas b/Styles/Wireframe.mas new file mode 100644 index 0000000..4c5e800 --- /dev/null +++ b/Styles/Wireframe.mas @@ -0,0 +1,680 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Templates/Brussels.mat b/Templates/Brussels.mat new file mode 100644 index 0000000..e13e35f --- /dev/null +++ b/Templates/Brussels.mat @@ -0,0 +1,99 @@ + + + + + Name + الإسم + Ime + Jméno + Name + Όνομα + Nombre + Nimi + Nom + Naziv + Név + Nome + 名前 + Navn + Naam + Namn + Nazwa + Nome + Название + Meno + Ime + Namn + Назва + + + + + Name (french) + الإسم (فرنسي) + Jméno (francouzky) + Name (franz.) + Όνομα (Γαλλικά) + Nombre (francés) + Nimi (prantsuse) + Nom (français) + Naziv (francuski) + Név (vallon) + Nome (francese) + 名前(フランス語) + Navn (fransk) + Naam (Frans) + Namn (fransk) + Nazwa (francuska) + Name (francês) + Название (фран.) + Meno (francúzske) + Namn (franska) + Назва (французською) + + + Name (dutch) + الإسم (هولّندية) + Jméno (nizozemsky) + Name (niederl.) + Όνομα (Ολλανδικά) + Nombre (alemán) + Nimi (hollandi) + Nom (néérlandais) + Naziv (nizozemski) + Név (flamand) + Nome (olandese) + 名前(オランダ語) + Navn (nederlansk) + Naam (Nederlands) + Namn (nederlansk) + Nazwa (belgijska) + Название (нем.) + Meno (holandské) + Namn (nederländska) + Назва (датською) + + + + diff --git a/Templates/TagTemplate.xsd b/Templates/TagTemplate.xsd new file mode 100644 index 0000000..10d481c --- /dev/null +++ b/Templates/TagTemplate.xsd @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Templates/Templates.qrc b/Templates/Templates.qrc new file mode 100644 index 0000000..eaa6760 --- /dev/null +++ b/Templates/Templates.qrc @@ -0,0 +1,5 @@ + + + default.mat + + diff --git a/Templates/default.mat b/Templates/default.mat new file mode 100644 index 0000000..f4c22a2 --- /dev/null +++ b/Templates/default.mat @@ -0,0 +1,2895 @@ + + + + + + Place + مكان + Mjesto + Místo + Ort + Τόπος + Lugar + Koht + Lieu + Kraj + Hely + Luogo + 場所 + Sted + Plaats + Stad + Miejsca + Local + Место + Miesto + Kraj + Plats + Місце + + + City (Pop. > 100.000) + مدينة (عدد السكان يزيد عن مئة ألف) + Město > 100.000 obyvatel + Großstadt (Einw. > 100.000) + Πόλη (Πλυθ. > 100.000) + Ciudad (Pob. > 100.000) + Suurlinn (Pop. > 100.000) + Ville (Pop. > 100.000) + Grada (Pop. > 100.000) + Nagyváros > 100.000 lakos + Città (Pop. > 100.000) + 市(人口 10万人以上) + By (Folketall > 100.000) + Stad (aantal inwoners> 100.000) + By (Folketal > 100.000) + Miasto (ludność > 100 000) + Cidade (Pop. > 100.000) + Город (Нас. > 100.000) + Mesto (Obyv. > 100.000) + Stad (mer än 100 000 inv.) + Місто (насел. > 100 000) + + + Town (10.000 < Pop. < 100.000) + بلدة (أكثر من 10000 نسمة و أقل من 100000) + Město (10.000 - 100.000 obyvatel) + Stadt (10.000 < Einw. < 100.000) + Κωμόπολη (10.000 < Πλυθ. < 100.000) + Villa (10.000 < Pob. < 100.000) + Linn + Ville (de 10.000 à 100.000 habitants) + Grad (10.000 < Pop. < 100.000) + Kisváros (10.000 - 100.000 lakos) + Paese (10.000 < Pop. < 100.000) + 町(人口1万~10万) + By (10.000 < Folketall < 100.000) + Stadje (10.000 < aantal inwoners < 100.000) + By (10.000 < Folketal < 100.000) + Miejscowość (ludność 10 000-100 000) + Vila + Город (10.000 < Нас. < 100.000) + Mesto (10.000 < preb. < 100.000) + Samhälle (mellan 10 000 till 100 000 inv.) + Містечко (10 000< насел.<100 000) + + + Village (Pop. < 10.000) + قرية (أقل من 10000 نسمة) + Vesnice (do 10.000 Obyvatel) + Dorf (Einw. < 10.000) + Χωριό (Πλυθ. < 10.000) + Pueblo (Pob. <10.000) + Alev (Pop. < 10.000) + Village (Pop. < 10.000) + Selo (Pop. < 10.000) + Falu (10.000 lakosnál kevesebb) + Villaggio (Pop. < 10.000) + 村(人口1万人以下) + Tettsted (Folketall < 10.000) + Dorp (Aantal inwoners < 10.000) + Tettstad (Folketal < 10.000) + Wieś (ludność < 10 000 + Aldeia + Деревня (Нас. < 10.000) + Vas (< 10.000 preb.) + By (Mindre än 10 000 inv.) + Село (насел. < 10 000) + + + Hamlet (a few houses) + مجموعة بيوت + Ves (několik domů) + Weiler (ein paar Häuser) + Οικισμός + Aldea (pocas casas) + Küla + Hameau + Zaselak (nekoliko kuća) + Apró település (néhány ház) + Frazione + 集落(数軒の家) + Sted (noen fÃ¥ hus) + Gehucht + Sted (noken fÃ¥ hus) + Wólka + Aldeia (poucas casas) + Посёлок (несколько домов) + Kopanica + Zaselek (nekaj hiÅ¡) + SmÃ¥by (enstaka hus) + Хутір (кілька хатин) + + + Suburb + ضاحية + Predgrađe + Předměstí + Stadtteil + Προάστιο + Barrio + Linnaosa + Banlieue + Predgrađe + Előváros + Sobborgo + 近郊住宅地 + Forstad/bydel + Buitenwijk + Poststad + Dzielnica + Suburbano + Пригород + Å tvrÅ¥ + Mestna četrt + Förort + Передмістя + + + Locality (named place) + المحلة (مكان/محلة ذات إسم) + Lokalita (pojmenované místo) + Ort (benannter Platz) + Τοποθεσία + Localidad (lugar) + Punkt (nimega koht) + Lieu-dit + Hely (nevesített hely) + Località (nome luogo) + 地域 (名前の付いている場所) + Sted (navn pÃ¥ sted) + Sted (namn pÃ¥ plass) + Miejsce (nazwane) + Localidade (nome do lugar) + Местное название + Lokalita (pomenované miesto) + Lokalitet (namngedd plats) + Місцевість (назва місця) + + + + Building + مبنى + Zgrada + Budova + Gebäude + Κτήριο + Edificio + Hoone + Bâtiment + Zgrada + Épület + Palazzo + 建物 + Bygning + Gebouw + Bygning + Budynek + Edifício + Здание + Budova + Zgradba + Byggnad + Будинок + + + + Area + مساحة + Područje + Oblast + Fläche + Περιοχή + Área + Ala + Aire + Područje + Terület + Area + エリア + OmrÃ¥de + Gebied + OmrÃ¥de + Obszar + Área + Область + Plocha + PovrÅ¡ina + Yta + Ділянка + + + + Name + الإسم + Ime + Jméno + Name + Όνομα + Nombre + Nimi + Nom + Naziv + Név + Nome + 名前 + Navn + Naam + Namn + Nazwa + Nome + Название + Meno + Ime + Namn + Назва + + + + Highway type + نوع الطريق + Typ silnice + Straßentyp + Τύπος οδικής αρτηρίας + Tipo de carretera + Tee tüüp + Type de route + Út típusa + Tipo strada + ハイウェイ タイプ + Riksvei Type + Wegtype + Type ferdselsveg + Typ drogi + Tipo auto-estrada + Тип автомобильной дороги + Typ komunikácie + Typ av väg + Тип дороги + + + Motorway + طريق سريع + Dálnice + Autobahn + Αυτοκινητόδρομος + Autopista + Maantee + Autoroute + Autocesta + Autópálya + Autostrada + 高速道路 + Motorvei + Autoweg + Motorveg + Autostrada + Estrada + Автомагистраль + Diaľnica + Avtocesta + Motorväg + Автомагістраль + + + Ramp to motorway + مدخل طريق سيارات سريع + Dálniční nájezd + Autobahnanschlussstelle + Είσοδος αυτοκινητόδρομου + Rampa de autopista + Kiirtee pealesõit + Bretelle d'accès ou de sortie d'une autoroute + Spoj na autocestu + Autópálya-bekötőút + Svincolo per l'autostrada + 高速道路の乗り口 + Adkomst til Motorvei + Oprit + Adkomst til Motorveg + Dojazd do autostrady + Въезд на шоссе + MotorvägspÃ¥fart + З’єднання з автомагістраллю + + + Trunk road + طريق جزعية + Víceproudá cesta + Schnellstraße + Carretera cortada + Kiirtee + Voie rapide + Autóút + Strada principale + 国道 + Stamvei + Expressweg + Stamveg + Droga ekspresowa + Автомагистраль + Motortrafikled + Магістраль + + + Ramp to trunk road + Nájezd na víceproudou cestu + Schnellstraßenanschlussstelle + Rampa de acceso a carretera + Kiirtee pealesõit + Voie d'accès à une voie rapide + Autóútbekötő + Svincolo per la strada principale + 国道の乗り口 + Adkomst til stamvei + Oprit naar expressweg + Adkomst til stamveg + Dojazd do drogi ekspresowej + Въезд на автомагистраль + PÃ¥fart till motortrafikled + З’єднання з магістраллю + + + Primary road + طريق رئيسية + Silnice I. třídy + Bundesstraße + Κύριος δρόμος + Carretera principal + Esimese klassi tee + Route nationale + Državna cesta + Elsőrendű főút + Strada primaria + 主要地方道 + Hovedvei + Hoofdweg + Hovedveg + Droga krajowa + Estrada principal + Главная дорога + Huvudväg + Головна дорога + + + Ramp to primary road + طلعة إلى طريق رئيسية + Nájezd na silnici I. třídy + Bundesstraßenanschlussstelle + Είσοδος πρωτεύοντος δρόμου + Rampa al camino primario + Maantee pealesõit + Voie d'accès à une route nationale + Spoj na državnu cestu + Elsőrendű bekötőút + Svincolo per strada primaria + 都道府県道の乗り口 + Adkomst til hovedvei + Oprit naar hoofdweg + Adkomst til hovedveg + Dojazd do drogi krajowej + Въезд на основную дорогу + PÃ¥fart till huvudväg + З’єднання з головною дорогою + + + Secondary road + طريق ثانوية + Silnice II. třídy + Landesstraße + Δευτερεύων δρόμος + Camino secundario + II klassi maantee + Route secondaire + Županijska cesta + Másodrendű főút + Strada secondaria + 都道府県道 + Fylkesvei + Secundaire weg + Fylkesveg + Droga wojewódzka + Estrada secundária + Второстепенная дорога + Cesta II. triedy + Sekundär väg + Другорядна дорога + + + Tertiary road + طريق ثلاثية + Silnice III. třídy + Kreisstraße + Τριτεύουσα οδός + Camino terciario + Kohalik tee + Petite départementale ou communale + Lokalna cesta + Egyéb épített út + Strada terziaria + 重要道路 + SmÃ¥vei + Derderangsweg + SmÃ¥veg + Droga powiatowa + Rua terciária + Дорога + Tertiär väg + Третьорядна дорога + + + Unclassified road + طريق غير مصنفة + Neoznačená cesta + Ortsverbindungsstraße + Μη κατηγοριοποιημένος δρόμος + Carretera sin clasificar + Klassifitseerimata tee + Route non-classée + Nerazvrstana cesta + Kisebb burkolt út + Strada non classificata + 級外道路 + Vei ikke klassifisert + Niet-geclassificeerde weg + Veg ikkje klassifisert + Droga gminna + Estrada não classificada + Дорога местного значения + Enskild väg + Дорога без класифікації (місцева) + + + Residential road + طريق سكن + Obecní komunikace + Ortsstraße + Αστική οδός + Camino residencial + Asulatee + Rue résidentielle + Települési út + Strada residenziale + 生活道路 + Boligvei + Weg in de stad + Boligveg + Droga lokalna + Rua residencial + Улица жилого района + Väg inom bostadsomrÃ¥de + Жила вулиця + + + Service road + Účelová komunikace + Zufahrtstraße + Βοηθητική οδός + Camino de servicio + Teenindustee + Route d'accès + Servisna cesta + Szolgáló/üzemi út + Strada di servizio + サービス道 + Bedieningsweg + Droga serwisowa + Estrada de serviço + Служебный проезд + Obslužná cesta + Serviceväg (liten gata) + Допоміжна дорога + + + Track road + طريق مشاة + Nezpevněná komunikace + Feld- oder Waldweg + Χωματόδρομος + Camino de tierra + Põllutee + Chemin + Földút + Strada forestale + 農道や林道 + Sti + Sti + Droga gruntowa + Грунтовая дорога + skogsväg + Грунтові дороги + + + Pedestrian priority road + طريق أولوية للمشاة + Put sa prioritetom za pjeÅ¡ake + Obytná zóna + Spielstraße + Δρόμος με προτεραιότητα πεζών + Camino con prioridad para peatones + Jalakäija eelistee + Rue à majorité piétonne + Cesta sa prioritetom za pjeÅ¡ake + Lakó/pihenő övezet + Strada pedonale con traffico limitato + 歩行者優先道路 + Vei med prioritet for fotgjengere + Primaire wandelweg + Veg med prioritet for gÃ¥ande + Strefa zamieszkania + Via prioritária para pedestres + Дорога с приоритетом пешеходов + Väg med prioritet för fotgängare + Переважно пішохідна зона + + + Pedestrian only road + طريق فقط للمشاة + Put samo za pjeÅ¡ake + Komunikace pouze pro chodce + Fußgängerzone + Δρόμος μόνο για πεζούς + Calle Peatonal + Ainult jalakäijate tee + Rue exclusivement piétonne + Cesta samo za pjeÅ¡ake + Sétálóutca + Strada pedonale + 歩行者専用道 + GÃ¥gate + Winkelwandelstraat + GÃ¥gate + Ciąg pieszy + Via pra pedestres + Дорога только для пешеходов + PeÅ¡ia zóna + Cesta za peÅ¡ce + Väg endast för fotgängare + Пішохідна зона + + + Footway + طريق للمشاة + Stezka pro chodce + Fußweg + Πεζόδρομος + Vía peatonal + Jalgtee + Voie piétonne + Staza za pjeÅ¡ake + Gyalogút + Sentiero + 歩道 + Gangvei + Voetweg + Gangveg + Droga dla pieszych + Passeio Pedonal + Тротуар + Chodník + PeÅ¡pot + GÃ¥ngstig + Пішохідна доріжка + + + Cycleway + طريق فقط للدراجات + Cyklostezka + Radweg + Ποδηλατόδρομος + Ciclovía + Jalgrattatee + Voie cyclable + Biciklistička staza + Kerékpárút + Ciclabile + 自転車道 + Sykkelvei + Fietspad + Sykkelveg + Droga rowerowa + Ciclovia + Велодорожка + Cesta pre cyklistov + Kolesarska steza + Cykelbana + Велосипедна доріжка + + + Bridleway + طريق الخيل + Cesta pro koně + Reitweg + Camino para caballos + Põllutee + Chemin équestre + Lovasút + Strada per cavalli + 馬道 + Kjerrevei + Ruiterpad + Kjerreveg + Ścieżka do jazdy konnej + Дорога для верховой езды + Cesta pre kone + GÃ¥ng-/Ridstig + Дорога для вершників + + + Steps + درجات + Stepenice + SchodiÅ¡tě + Treppe + Σκαλοπάτια + Escaleras + Trepp + Escaliers + Stepenice + Lépcső + Passi + trappsteg + 階段 + Trapper + Trappen + Trappar + Schody + Passos + Лестница + Schody + Stopnice + Trappsteg + Сходи + + + Bus guideway (not a bus way) + Speciální cesta pro autobus (né vyhrazený pruh) + Spurbus-Strecke + Recorrido de autobuses (punto de información) + Bussi abitee (mitte bussitee) + Voie réservée aux bus guidés + Buszvezetőút + Tramvia (non una strada per autobus) + ガイドウェイバス道(バス道ではない) + Pas dla autobusów + Автобусный рельс + SpÃ¥rbuss (ej bussfil) + Рейковий автобус + + + Unsurfaced road (old tag) + Unsurfaced road (stará značka) + Unbefestigte Straße (veraltet) + Οδός χωρίς επίστρωση (παλιά ετικέτα) + Camino sin asfaltar (etiqueta antigua) + Pindamata tee (vananenud tähis) + Route sans revêtement (étiquette dépréciée) + Burkolatlan út (elavult címke) + Non asfaltata (vecchio tag) + 未舗装道路(古いタグ) + Udekket vei (gammelt merke) + Onverharde weg + Udekket veg (gammelt merke) + Nieutwardzona droga (przestarzały znacznik) + Грунтовка (старый тег) + Obelagd väg (gammal tagg) + Дорга без покриття (застар) + + + + + Landuse + إستعمال الأرض + Využití plochy + Landnutzung + Χρήση γης + Uso de la tierra + Maakasutus + Utilisation du sol + Földhasználat + Suolo + 土地利用 + Landgebruik + Zagospodarowanie terenu + Землеиспользование + Raba tal + Markanvändning + Використання землі + + + Allotments + حصص سكنية + Pozemky + Schrebergärten + Κλήροι + Parcelas + Aiamaa + Lotissements + Parcele + Bérelt parcellák + Concessioni + 貸し農園 + Tomter + Verkavelingen + Tomter + Ogródki działkowe + Loteamentos + Сады-огороды + Záhradkárska oblasÅ¥ + Kolonilotter + горо́д + + + Basin + حوض + Vodní nádrž + Wasserbecken + Λεκάνη + Lavabo + Bassein + Bassin + Bazen + Medence + Bacino + 水たまり、窪地 + Basseng + Stroomgebied + Basseng + Zbiornik wodny + Бассейн + Vodná nádrž + Hamnbassäng + Водойма + + + Brownfield + Přestavba + Baulücke + Βιομηχανική + Zona industrial abandonada + Jäätmaa + Terrain en friche + Barna telek + Campo + 更地 + RivningsomrÃ¥de + Braakliggende grond + RivningsomrÃ¥de + Teren poprzemysłowy + Пустырь с развалинами + Brownfield (opustený priemyselný objekt) + Övergivet industri- eller affärsomrÃ¥de + Очищене місце під забудову + + + Cemetery + مقبرة + Groblje + Hřbitov + Friedhof + Κοιμητήριο + Cementerio + Kalmistu + Cimetière + Groblje + Temető + Cimitero + 共同墓地 + KirkegÃ¥rd + Begraafplaats + Kirkegard + Cmentarz + Cemitério + Кладбище + Cintorín + Begravningsplats + Кладовище + + + Commercial zone + منطقة تجارية + Komercijalna zona + Obchodní zóna + Büros + Εμπορική ζώνη + Zona Comercial + Ärimaa + Zone tertiaire (bureaux) + Trgovačko srediÅ¡te + Kereskedelmi övezet + Zona commerciale + ビジネス街 + Komersielt omrÃ¥de + Commerciële zone + Komersielt omrÃ¥de + Teren handlowy + Zona comercial + Коммерческая зона + Trgovsko središče + AffärsomrÃ¥de + Діловий квартал + + + Construction zone + منطقة تعمير + Građevinska zona + StaveniÅ¡tě + Baustelle + Κατασκευαστική ζώνη + Zona de Construcción + Ehitusplats + Site "en construction" + GradiliÅ¡te + Építkezés + Zona in costruzione + 建設中エリア + Byggeplass + Constructiezone + Byggeplass + Budowa + Zona de construção + Стройка + Gradbišče + Byggarbetsplats + Будмайданчик + + + Farm + مزرعة + Farma + Zemědělství + Landwirtschaft/Bauernhof + Φάρμα + Granja + Talu + Ferme + Farma + Gazdaság + Fattoria + 農場 + GÃ¥rd + Boerderij + Gardsbruk + Gospodarstwo rolne + Quinta + Ферма + Farma + Kmetija + BondgÃ¥rd + Ферма + + + Forest + غابة + Å uma + Les + Wald + Δάσος + Bosque + Mets + Forêt + Å uma + Erdő + Foresta + 森林 + Skog + Woud + Skog + Las + Floresta + Лес + Les + Gozd + Skog + Ліс + + + Greenfield + حقل أخضر + Výstavba na zelené louce + Bauland + Campo verde + Roheala + Espace vert + Zöld telek + Campo verde + 建設予定地 + ByggeomrÃ¥de + Ontwikkelingsgebied + Byggeplass + Teren pod zabudowę + Пустырь + Greenfield (Projekt na zelenej lúke) + Tidigare outnyttjat omrÃ¥de (greenfield) + Ділянка під нову забудову + + + Industrial zone + منطقة صناعية + Industrijska zona + Průmyslová zóna + Industriegebiet + Βιομηχανική ζώνη + Zona industrial + Tööstusmaa + Zone industrielle + Industrijska zona + Ipari övezet + Zona industriale + 工業用地 + IndustriomrÃ¥de + Industriële zone + IndustriomrÃ¥de + Teren przemysłowy + Zona industrial + Промышленная зона + Priemyselná zóna + Industrijska cona + IndustriomrÃ¥de + Промислова зона + + + Landfill + مطمر نفايات + Skládka + Deponie + ΧΥΤΑ + Vertedero + Prügimägi + Décharge + Deponija + Szemétlerakó + Terra + 埋め立てゴミ処理地 + Avfallsdeponi + Vuilnisbelt + Avfallsdeponi + Wysypisko śmieci + Свалка + Skládka odpadov + Deponija + Deponi (soptipp) + Звалище + + + Military + عسكري + Vojska + Vojenský prostor + Militär + Στρατιωτικό + Escuela Militar + Militaarala + Militaire + Vojska + Katonai terület/gyakorlótér + Zona militare + 軍 + Millitært + Militair + Millitært + Teren wojskowy + Militar + Военное + Militärt omrÃ¥de + Військове + + + Recreation ground + ميدان الألعاب + Rekreační oblast + Erholungsgebiet + Χώρος αναψυχής + Zona de recreación + Puhkeala + Aire de jeux + Rekreacijska povrÅ¡ina + Rekreációs terület + Zona di svago + 遊び場 + RekreasjonsomrÃ¥de + Recreatiegebied + RekreasjonsomrÃ¥de + Teren rekreacyjny + Место отдыха + Rekreacijska povrÅ¡ina + RekreationsomrÃ¥de + Зона відпочинку + + + Reservoir (water) + خزان (مياه) + Rezervoar + Přehrada + Speicherbecken + Υδατοδεξαμενή + Reserva (agua) + Vee reservuaar + Bassin de retenue + Spremnik (voda) + Víztározó + Riserva (acqua) + ため池 + Reservoir (vann) + Waterreservoir + Reservoir (vatn) + Zbiornik retencyjny + Reservatório (água) + Водохранилище + Rezervoar (voda) + Vattenreservoar + Водойма + + + Residential zone + منطقة سكنية + Stambena zona + Obytná zóna + Wohngebiet + Αστική ζώνη + Zona Residencial + Asula + Zone résidentielle + Lakóövezet + Zona residenziale + 住宅地 + BoligomrÃ¥de + Residentiële zone + BoligomrÃ¥de + Zabudowa mieszkaniowa + Zona residencial + Жилой район + Obytná zóna + BostadsomrÃ¥de + Жила зона + + + Retail zone + بيع بلمفرق + Trgovinska zona + Nákupní zóna + Einzelhandel + Ζώνη λιανικού εμπορίου + Zona de venta al por menor + Kaubandustsoon + Vente au détail + Kiskereskedelmi övezet + Zona particolareggiata + 商業地 + HandelsomrÃ¥de + Handelszone + HandelsomrÃ¥de + Strefa handlowa + Zona de retalho + Розничная торговля + DetaljhandelsomrÃ¥de + Торговий квартал + + + Surface mineral extraction + منجم إستخراج معادن + Povrchová těžba + Steinbruch + Επιφανειακή εξαγωγή ορυκτών + Explotación minera en la superficie + Pealmaa kaevandus + Mine à ciel ouvert + Külszíni fejtés + Superficie di estrazione di minerali + 露天掘り鉱山 + Overflatebrudd for mineraler + Oppervlakkige ontginning van mineralen + Overflatebrudd for mineraler + Kamieniołom + Extracção mineral á superficie + Открытый карьер + Mineralutvinning (vid jordytan) + Видобування корисних копалин (карь’єр) + + + Village green + مرج/بستان قرية + Městská zeleň + Dorfwiese + Parque municipal + Roheala + Espace vert + Falupark + Villaggio verde + 里山 + Dorpsgroen + Łąka wiejska + Зелёная деревня + Byallmänning (gräsplätt) + Суспільні луги + + + + + Oneway + إتجاه واحد + Jednosměrka + Einbahnstraße + Μονόδρομος + Una sola vía + Ühesuunaline + Sens unique + Jednosmjerno + Egyirányú + Senso unico + 一方通行 + Enveiskjøring + Enkelrichting + Einvegskjøyring + Jednokierunkowa + Sentido único + Односторонняя + Jednosmerka + Enosmerna + Enkelriktat + Одностронній рух + + + + Amenity + خدمات + Občanská vybavenost + Nutzung + Ευκολίες + Comodidades + Hüvis + Équipement + Szolgáltatás + Attrattiva + 各種施設 + Faciliteit + Miejsce + Инфраструктура + VybavenosÅ¥ + Facilitet + Інфраструктура + + Arts centre + مركز ثقافي + Centrum umění + Kulturzentrum + κέντρο τεχνών + Centro de Artes + Kunstigalerii + Centre culturel + Kulturni centar + Művészeti központ + Centro culturale + 美術館 + Kunstsenter + Cultureel centrum + Kunstsenter + Centrum kultury/sztuki + Centro de artes + Центр искусств + Centrum umenia + Kulturni center + Konstcenter + Арт-центр + + + ATM or cash point + آلة دفع نقود أو نقطة دفع نقدي + Bankomat, výběr v hotovosti + Geldautomat + ATM ή σημείο μετρητών + Cajero automático + ATM või sularaha + DAB ou point de payement + Bankomat + Pénzkiadó automata + Bancomat o ritiro contanti + ATMやキャッシュディスペンサー + Minibank + Geldautomaat + Minibank + Bankomat + Caixa Multibando + Банкомат + Bankomat + Bankomat / uttagsautomat + Банкомат (пункт видачі готівки) + + + Bank + مصرف + Banka + Banka + Bank + Τράπεζα + Banco + Pank + Banque + Banka + Bank + Banca + 銀行 + Bank + Bank + Bank + Bank + Banco + Банк + Banka + Banka + Bank + Банк + + + Bank with ATM + مصرف و آلة نقود + Banka s bankomatem + Bank mit Geldautomat + Τράπεζα με ATM + Banco con Cajero Automático + Sularahaautomaadiga pank + Banque et DAB + Banka s bankomatom + Bank pénzkiadó automatával + Banca con Bancomat + ATMのある銀行店舗 + Bank med Minibank + Bank met geldautomaat + Bank med Minibank + Bank z bankomatem + Banco com caixa multibanco + Банк с банкоматом + Banka s bankomatom + Banka z bankomatom + Bank med automatuttag + Банк + Банкомат + + + Beer garden + جنينة جعة + Letní hospoda + Biergarten + Terraza + Õllekas + Jardin à bière + Sörkert + Giardino della birra + ビアーガーデン + Biertuin + Ogródek piwny + Пивной сад + Biergarten (uteservering för öl) + Генделик + + + Parking for bicycles + موقف للدراجات + Parking za bicikle + Parkování pro kola + Fahrradstellplatz + Στάθμευση ποδηλάτων + Aparcamiento de Bicicletas + Jalgratta parkla + Parking pour vélos + Parking za bicikle + Kerékpártároló + Parcheggio per biciclette + 自転車駐輪場 + Sykkelparkering + Parkeerplaats voor fietsen + Sykkelparkering + Parking rowerowy + Parque de estacionamento para bicicletas + Велосипедная стоянка + Cykelparkering + Стоянка велосипедів + + + Bicycle Rental + إستئجار دراجة + Rentiranje Bicikla + Půjčovna kol + Fahrradmietstation + Ενοικίαση ποδηλάτων + Alquiler de Bicicletas + Jalgratta rent + Location de vélos + Izanajmljivanje bicikala + Kerékpárkölcsönző + Noleggio biciclette + 自転車レンタル + Sykkelutleie + Fietsverhuur + Sykkelutleige + Wypożyczalnia rowerów + Aluguer de bicicletas + Прокат велосипедов + Požičovňa bicyklov + Najem koles + Cykeluthyrning + Прокат велосипедів + + + Bureau de change + صرّاف + Mjenjačnica + Směnárna + Wechselstube + Casa de Cambios + Valuutavahetus + Bureau de change + Mjenjačnica + Pénzváltó + Cambio valuta + 両替所 + Vekslingskontor + Wisselkantoor + Kantor + Обмен валюты + Zmenáreň + Menjalnica + VäxelbyrÃ¥ + Обмін валют + + + Bus station + محطة نقليات عامة + Autobuska stanica + Autobusové nádraží + Bushaltestelle + Σταθμός λεωφορείων + Estación de autobuses + Bussijaam + Gare routière + Autobusna postaja + Autóbuszállomás + Stazione autobus + バスステーション + Bussstasjon + Busstation + Bussstasjon + Dworzec autobusowy + Estação de autocarros + Автовокзал + Autobusová stanica + Avtobusna postaja + Busstation + Автостанція + + + Cafe + مقهى إستراحة + Cafe + Kavárna + Cafe + Καφέ + Cafetería + Kohvik + Café + Kafić + Kávézó + Cafè + カフェ + Kafe + Café + Kafe + Kafejka + Café + Кафе + Kaviareň + Kafé + Кафе + + + Car Rental + إستئجار سيارة + Rentiranje Auta + Půjčovna aut + Autovermietung + Ενοικίαση Αυτοκινήτων + Alquiler de Automóviles + Auto rent + Location de voiture + Iznajmljivanje automobila + Autókölcsönző + Noleggo auto + レンタカー + Bilutleie + Autoverhuur + Bilutleige + Wypożyczalnia samochodów + Aluguer de automóvel + Прокат автомобилей + Požičovňa áut + Najem avtomobilov + Biluthyrning + Прокат автівок + + + Car Sharing + مشاركة سيارات + Sdílení aut + Autotausch + Κοινή χρήση αυτοκινήτων + Compartir auto + Autojagamine + Co-voiturage + Közös autók + Car Sharing + カーシェアリング + Bildeling + Autodelen + Bildeling + Wspóldzielenie samochodów + Partilha de carro + Совместное использование автомобилей + Bilpool + Погодинний прокат автівок + + + Cinema + سينما + Kino + Kino + Kino + Κινηματογράφος + Cine + Kino + Cinéma + Kino + Mozi + Cinema + 映画館 + Kino + Bioscoop + Kino + Kino + Cinema + Кинотеатр + Kino + Kino + Biograf + Кіно + + + College + كلّية + Koledž + Vysoká Å¡kola + Gymnasium + Κολέγιο + Instituto + Kolledž + Établissement d'enseignement supérieur + Fakultet + Főiskola + College + 短大 + Høyskole + Campus + Høgskole + Szkoła wyższa + Universidade + Колледж + Högskola + Коледж + + + Court house + محكمة + Sud + Soud + Gericht + Δικαστήριο + Juzgados + Kohtumaja + Palais de justice + Sud + Bíróság + Corte + 裁判所 + Rettssal + Gerechtsgebouw + Rettssal + Sąd + Tribunal + Дом правосудия + Sodišče + Domstolsbyggnad / Tingshus + Суд + + + Crematorium + محرقة جثث + Krematorijum + Krematorium + Krematorium + Κρεματόριο + Crematorio + Krematoorium + Crématorium + Krematorij + Hamvasztó + Crematorio + 火葬場 + Krematorium + Crematorium + Krematorium + Krematorium + Crematório + Крематорий + Krematórium + Krematorij + Krematorium + Крематорій + + + Source of drinking water + نبع ماء صالحة للشرب + Izvor pitke vode + Zdroj pitné vody + Trinkwasser + Πηγή πόσιμου νερού + Manantial de agua potable + Joogivee allikas + Source d'eau potable + Izvor pitke vode + Ivóvíz + Fonte di acqua potabile + 飲み水の水源 + Drikkevannskilde + Drinkwaterbron + Źródło wody pitnej + Fonte com águo potável + Питьевая вода + Zdroj pitnej vody + Vir pitne vode + Källa för dricksvatten + Питна вода + + + Fast food + وجبات سريعة + Rychlé občerstvení + Schnellimbiss + Fast food + Comida Rápida + Kiirtoit + Restauration rapide + Brza prehrana + Gyorsétterem + Fast food + ファーストフード + Fast food + Fast food + Fast food + Fast food + Comida de rápida confecção + Кафе + Snabbmat + Забігайлівка + + + Fire Station + فوج إطفاء + Požární stanice + Feuerwehr + Σταθμός Πυροσβεστικής + Estación de bomberos + Tuletõrjedepoo + Caserne de pompiers + Vatrogasci + Tűzoltóság + Pompieri + 消防署 + Brannstasjon + Brandweerkazerne + Brannstasjon + Straż pożarna + Bombeiros + Пожарное депо + Požiarna stanica + Gasilski dom + Brandstation + Пожежна станція + + + Fountain + نافورة + Fontana + Fontána, kaÅ¡na + Springbrunnen + Συντριβάνι + Fuente + Purskaev + Fontaine + Fontana + Szökőkút + Fontana + 噴水 + Fontene + Fontein + Fontene + Fontanna + Fonte + Фонтан + Fontána + Fontän + Фонтан + + + Fuel + وقود + Gorivo + Benzinka + Tankstelle + Καύσιμα + Combustible + Kütus + Station service + Gorivo + Benzinkút + Benzina + ガソリンスタンド + Bensinstasjon + Brandstof + Bensinstasjon + Stacja benzynowa + Combustível + Заправочная станция + Bränsle + Заправка + + + Small place of burial + مقبرة صغيرة + Malý hřbitov + Grabstelle + Μικρός τόπος ταφής + Pequeño cementerio + Väike matmispaik + Petit cimetière + Malo groblje + Sírhely + Piccolo luogo di sepoltura + 墓地 + Gravsted + Begraafplaats + Cmentarz (mały) + Могила + Majhno pokopališče + Liten begravningsplats + Цвинтар (малий) + + + Hospital + مستشفى + Bolnica + Nemocnice + Krankenhaus + Νοσοκομείο + Hospital + Haigla + Hôpital + Bolnica + Kórház + Ospedale + 病院 + Sykehus + Hospitaal + Sjukehus + Szpital + Hospital + Больница + Nemocnica + BolniÅ¡nica + Sjukhus + Лікарня + + + Library + مكتبة عامة + Biblioteka + Knihovna + Bibliothek + Βιβλιοθήκη + Biblioteca + Raamatukogu + Bibliothèque + Knjižnica + Könyvtár + Biblioteca + 図書館 + Bibliotek + Bibliotheek + Bibliotek + Biblioteka + Biblioteca + Библиотека + Knižnica + Knjižnica + Bibliotek + Бібліотека + + + Nightclub + نادي ليلي + Noćni klub + Noční podnik + Nachtclub + Νυχτερινό Κέντρο + Club nocturno + Ööklubi + Boîte de nuit + Noćni klub + Éjszakai szórakozóhely + Nightclub + ナイトクラブ + Nattklubb + Nachtclub + Nattklubb + Klub nocny + Discoteca + Ночной клуб + Nočný klub + Nattklubb + Нічний клуб + + + Parking + موقف سيارات + Parking + ParkoviÅ¡tě + Parkplatz + Χώρος στάθμευσης + Aparcamiento + Parkimine + Parking + Parking + Parkoló + Parcheggio + 駐車場 + Parkering + Parkeerplaats + Parkering + Parking + Parque de estacionamento + Стоянка + Parkovisko + Parkirišče + Parkeringsplats + Стоянка + + + Pharmacy + صيدلية + Apoteka + Lékarna + Apotheke + Φαρμακείο + Farmacia + Apteek + Pharmacie + Ljekarna + Gyógyszertár + Farmacia + 薬局 + Apotek + Apotheek + Apotek + Apteka + Farmácia + Аптека + Lekáreň + Lekarna + Apotek + Аптека + + + Place of Worship + معبد + Bohoslužebné místo + Anbetungsort + Τόπος Λατρείας + Lugar de culto + Palvekoht + Lieu de culte + Mjesto bogoÅ¡tovlja + Vallásgyakorlóhely + Luogo di culto + 祈りのための場所 + Tilbedelsessted + Gebedsplaats + Tilbedingsted + Miejsce kultu + Место поклонения + Kraj čaščenja + Religiös helgedom + Культове місце + + + Police Station + مركز شرطة + Policijska Stanica + Policejní stanice + Polizeidienststelle + Σταθμός Αστυνομίας + Estación policial + Politsei jaoskond + Poste de police + Policijska stanica + Rendőrség + Stazione di polizia + 警察署・交番 + Politistasjon + Politiekazerne + Politistasjon + Komenda policji + Esquadra + Милицейский участок + Policajná stanica + Policijska postaja + Polisstation + Відділення міліції + + + Post Box + صندوق بريد + PoÅ¡tovní schránka + Briefkasten + Γραμματοκιβώτιο + Buzón de correos + Postkast + Boîte aux lettres + PoÅ¡tanski sandučić + Postaláda + Cassetta delle lettere + ポスト + Postkasse + Brievenbus + Postkasse + Skrzynka pocztowa + Marco de correio + Почтовый ящик + PoÅ¡tová schránka + PoÅ¡tni nabiralnik + BrevlÃ¥da + Поштова скринька + + + Post Office + مكتب البريد + PoÅ¡ta + PoÅ¡ta + Postamt + Ταχυδρομείο + Oficina Postal + Postkontor + Bureau de poste + PoÅ¡tanski ured + Posta + Ufficio postale + 郵便局 + Postkontor + Postkantoor + Postkontor + Poczta + Correios + Почтовое отделение + PoÅ¡ta + PoÅ¡tni urad + Postkontor + Пошта + + + Prison + سجن + Zatvor + Věznice + Gefängnis + Φυλακή + Prisión + Vangla + Prison + Zatvor + Börtön + Prigione + 刑務所 + Fengsel + Gevangenis + Fengsel + Więzienie + Prisão + Тюрьма + Vezenie + Zapor + Fängelse + В’язниця + + + Pub + حانة + Bar + Hospoda + Kneipe + Pub + Bar + Pubi + Bar + Kocsma + Bar + バー("Pub") + Pub + Bar + Pub + Pub + Bar + Пивной бар + Krčma + Pub + Шинок + + + Public building + مبنى عام + Javna zgrada + Státní úřad + Öffentliches Gebäude + Δημόσιο κτήριο + Edificio Público + Avalik ehitis + Bâtiment public + Javna zgrada + Középület + Edificio pubblico + 公共の建物 + Offentlig bygning + Publiek gebouw + Offentleg bygning + Budynek publiczny + edificio público + Общественное здание + Javna zgradba + Offentlig byggnad + Громадський заклад + + + Public Telephone + هاتف عمومي + Javni Telefon + Veřejný telefon + Telefon + Τηλέφωνο για το κοινό + Teléfono Público + Taksofon + Téléphone public + Javni telefon + Nyilvános telefon + Telefono pubblico + 公衆電話 + Telefonboks + Publieke telefoon + Telefonboks + Budka telefoniczna + Telefone público + Общественный телефон + Javna telefonska govorilnica + Publik telefon + Громадський телефон + + + Recycling Facilities + مرافق إعادة التدوير + Recyklační místo + Recycling-Einrichtung + Εγκαταστάσεις Ανακύκλωσης + Facilidades de reciclamiento + Prügitöötlus jaam + Point de collecte pour le recyclage + Reciklažno dvoriÅ¡te + Újrahasznosítás + Impianti di riciclaggio + リサイクル施設 + Resirkuleringsanlegg + Recyclagevoorzieningen + Resirkuleringsanlegg + Centrum recyklingowe + Instalações de reciclagem + Переработка отходов + Återvinningsstation + Контейнери для сміття + + + Restaurant + مطعم + Restoran + Restaurace + Restaurant + Εστιατόριο + Restaurante + Restoran + Restaurant + Restoran + Étterem/vendéglő + Ristorante + レストラン・食堂 + Restaurant + Restaurant + Restaurant + Restauracja + Restaurante + Ресторан + ReÅ¡taurácia + Restavracija + Restaurang + Ресторан + + + School + مدرسة + Å kola + Å kola + Schule + Σχολείο + Escuela + Kool + École + Å kola + Iskola + Scuola + 学校 + Skole + School + Skule + Szkoła + Escola + Школа + Å kola + Å ola + Skola + Школа + + + Taxi + تاكسي + Taxi + Taxi + Taxi + Ταξί + Taxi + Takso + Taxi + Taxi + Taxi + Taxi + タクシー + Taxi + Taxi + Taxi + Postój taksówek + Taxi + Такси + Taxi + Taxi + Taxi + Таксі + + + Theatre or opera house + مسرح أو مسرح غنائي + PozoriÅ¡te ili opera + Divadlo nebo opera + Theater oder Oper + Λυρική σκηνή + Teatro o casa de la ópera + Teater või ooperimaja + Théatre ou Opéra + KazaliÅ¡te ili opera + Színház vagy operaház + Teatro + 劇場やオペラハウス + Teater eller Operahus + Theater of opera + Teater eller Operahus + Teatr lub opera + Teatro ou Casa de opera + Театр + Divadlo alebo opera + Gledališče ali opera + Teater eller operahus + Опера, театр + + + Toilets + مراحيض + Veřejné záchody + Toiletten + Τουαλέτες + Baños + Tualetid + Toilettes + Zahodi + WC + Toilets + トイレ + Toaletter + Toiletten + Toalettar + Szalet + Casas de banho + Туалеты + Toalety + Stranišča + Toaletter + Туалет + + + Town hall + بلدية + Gradska skupÅ¡tina + Radnice + Rathaus + Δημαρχείο + Ayuntamiento + Raekoda + Mairie + Gradska vječnica + Városháza/közösségi épület + Municipio + 役所 + RÃ¥dhus + Stadhuis + RÃ¥dhus + Ratusz + Муниципалитет + Radnica (obecný úrad) + Mestna hiÅ¡a + RÃ¥dhus / Stadshus + Міська державна адміністрація. + + + University + جامعة + Univerzitet + Univerzita, vysoká Å¡kola + Universität + Πανεπιστήμιο + Universidad + Ülikool + École supérieure/Université + SveučiliÅ¡te + Egyetem + Università + 大学 + Universitet + Universiteit + Universitet + Uniwersytet + Universidade + Университет + Univerzita + Univerza + Universitet + Університет + + + Waste Disposal + رمي النفايات + Kanál, místo pro odpadky + Mülldeponie + Απόρριψη αποβλήτων + Vertedero + Prügila + Déchetterie + OdlagaliÅ¡te otpada + Szemétlerakó/gyűjtő + Smaltimento rifiuti + ゴミ箱 + AvfallshÃ¥ndtering + Afvalverwerking + Avfallshandtering + Wysypisko śmieci + Lixeira + Мусорный контейнер + Avfallsdeponi + Майданчик збору відходів + + + + + Religion + الديانة + Religija + Náboženství + Religion + Θρησκεία + Religión + Usk + Religion + Religija + Vallás + Religione + 宗教 + Religion + Godsdienst + Religion + Religia + Religião + Религия + Náboženstvo + Vera + Religion + Релігія + + Buddhist + بوذي + Budist + Budhistický + Buddistisch + Βουδιστής + Budista + Budistlik + Boudhiste + Buddhista + Buddista + 仏教 + Buddhist + Boeddhistisch + Buddhist + Buddyzm + Budista + Буддистский + Buddhism + Буддизм + + + Christian + نصراني + Kršćanski + KřesÅ¥anský + Christlich + Χριστιανός + Cristiano + Kristlik + Chrétien + Kršćanski + Keresztény + Cristiano + キリスト教 + Kristen + Christelijk + Kristen + Chrześcijaństwo + Cristã + Христианский + Krščanska + Kristet + Християнство + + + Jewish + يهودي + Židov + Židovský + Jüdisch + Ιουδαϊκό + Judío + Juudi + Juif + Židovski + Zsidó + Ebraico + ユダヤ教 + Jødisk + Joods + Jødisk + Judaizm + Judeu + Еврейская + Židovska + Judiskt + Іудаїзм + + + Muslim + مسلم + Musliman + Muslimský + Muslimisch + Musulmán + Moslemi + Musulman + Muslimanski + Muzulmán + Musulmano + イスラム教 + Muslim + Moslim + Muslim + Islam + Muçulmano + Мусульманский + Muslimanska + Mulimskt + Мусульманство + + + + + Denomination + تسمية + Denominace + Konfession + Δόγμα + Denominación + Usutunnistus + Dénomination + Vallási felekezet + Denominazione + 宗派 + Trosretning + Waarde + Trosretning + Wyznanie + Denominação + Конфессия + Vyznanie (cirkevné) + Samfund + Віросповідання + + + + + + + + + + + + + + + + + + + + + + + + House number + رقم المنزل + Kućni broj + Číslo domu + Hausnummer + Αριθμός σπιτιού + Número de casa + Maja number + Numéro de Maison + Kućni broj + Házszám + Numero civico + 住居番号 + Husnummer + Huisnummer + Husnummer + Numer domu + Número da Casa + Номер дома + Číslo domu + Husnummer + Номер будинку + + + + House street + الشارع حيث المنزل موجود + Domácí ulice + Straße zum Haus + Calle de la casa + Majatänav + Rue de la Maison + Utca/közterület + Via + 住居街 + Gate + Huizenstraat + Gate + Podjazd + Улица + Husvägen + Житлова зона + + + + Number interpolation + Interpolace číslování + Nummerninterpolation + Παρεμβολή αριθμών + Numero de interpolacion + Numbrite polaarsus + Interpolation de numéro + Számozás + Interpolazione numerica + 番号展開 + Nummerinterpolering + Soort huisnummering + Nummerinterpolering + Interpolacja numerów + Interpolação do número + Интерполяция номеров + Nummerisk interpolering + Вставка номерів + + even + مثنى + paran + sudé + gerade + Ζυγά + pares + paaris + pair + parni + páros + pari + 偶数 + partall + even + partal + parzyste + mesmo + чётные + párne + jämn + парний + + + odd + مفرد + neparan + liché + ungerade + Μονά + Extraño + paaritu + impair + neparni + páratlan + dispari + 奇数 + oddetall + oneven + oddetal + nieparzyste + нечётные + nepárne + udda + непарний + + + all + الكلّ + svi + vÅ¡e + alle + όλα + todos + kõik + tous + sve + mind + tutti + 全て + alle + alle + alle + wszystkie + Tudo + все + alla + всі + + + + + + + + + + + + + + diff --git a/Templates/mine.mat b/Templates/mine.mat new file mode 100644 index 0000000..98b4c39 --- /dev/null +++ b/Templates/mine.mat @@ -0,0 +1,2803 @@ + + + + + + Place + مكان + Mjesto + Místo + Ort + Τόπος + Lugar + Koht + Lieu + Kraj + Hely + Luogo + 場所 + Sted + Plaats + Stad + Miejsca + Local + Место + Miesto + Kraj + Plats + Місце + + + City (Pop. > 100.000) + مدينة (عدد السكان يزيد عن مئة ألف) + Město > 100.000 obyvatel + Großstadt (Einw. > 100.000) + Πόλη (Πλυθ. > 100.000) + Ciudad (Pob. > 100.000) + Suurlinn (Pop. > 100.000) + Ville (Pop. > 100.000) + Grada (Pop. > 100.000) + Nagyváros > 100.000 lakos + Città (Pop. > 100.000) + 市(人口 10万人以上) + By (Folketall > 100.000) + Stad (aantal inwoners> 100.000) + By (Folketal > 100.000) + Miasto (ludność > 100 000) + Cidade (Pop. > 100.000) + Город (Нас. > 100.000) + Mesto (Obyv. > 100.000) + Stad (mer än 100 000 inv.) + Місто (насел. > 100 000) + + + Town (10.000 < Pop. < 100.000) + بلدة (أكثر من 10000 نسمة و أقل من 100000) + Město (10.000 - 100.000 obyvatel) + Stadt (10.000 < Einw. < 100.000) + Κωμόπολη (10.000 < Πλυθ. < 100.000) + Villa (10.000 < Pob. < 100.000) + Linn + Ville (de 10.000 à 100.000 habitants) + Grad (10.000 < Pop. < 100.000) + Kisváros (10.000 - 100.000 lakos) + Paese (10.000 < Pop. < 100.000) + 町(人口1万~10万) + By (10.000 < Folketall < 100.000) + Stadje (10.000 < aantal inwoners < 100.000) + By (10.000 < Folketal < 100.000) + Miejscowość (ludność 10 000-100 000) + Vila + Город (10.000 < Нас. < 100.000) + Mesto (10.000 < preb. < 100.000) + Samhälle (mellan 10 000 till 100 000 inv.) + Містечко (10 000< насел.<100 000) + + + Village (Pop. < 10.000) + قرية (أقل من 10000 نسمة) + Vesnice (do 10.000 Obyvatel) + Dorf (Einw. < 10.000) + Χωριό (Πλυθ. < 10.000) + Pueblo (Pob. <10.000) + Alev (Pop. < 10.000) + Village (Pop. < 10.000) + Selo (Pop. < 10.000) + Falu (10.000 lakosnál kevesebb) + Villaggio (Pop. < 10.000) + 村(人口1万人以下) + Tettsted (Folketall < 10.000) + Dorp (Aantal inwoners < 10.000) + Tettstad (Folketal < 10.000) + Wieś (ludność < 10 000 + Aldeia + Деревня (Нас. < 10.000) + Vas (< 10.000 preb.) + By (Mindre än 10 000 inv.) + Село (насел. < 10 000) + + + Hamlet (a few houses) + مجموعة بيوت + Ves (několik domů) + Weiler (ein paar Häuser) + Οικισμός + Aldea (pocas casas) + Küla + Hameau + Zaselak (nekoliko kuća) + Apró település (néhány ház) + Frazione + 集落(数軒の家) + Sted (noen fÃ¥ hus) + Gehucht + Sted (noken fÃ¥ hus) + Wólka + Aldeia (poucas casas) + Посёлок (несколько домов) + Kopanica + Zaselek (nekaj hiÅ¡) + SmÃ¥by (enstaka hus) + Хутір (кілька хатин) + + + Suburb + ضاحية + Predgrađe + Předměstí + Stadtteil + Προάστιο + Barrio + Linnaosa + Banlieue + Predgrađe + Előváros + Sobborgo + 近郊住宅地 + Forstad/bydel + Buitenwijk + Poststad + Dzielnica + Suburbano + Пригород + Å tvrÅ¥ + Mestna četrt + Förort + Передмістя + + + Locality (named place) + المحلة (مكان/محلة ذات إسم) + Lokalita (pojmenované místo) + Ort (benannter Platz) + Τοποθεσία + Localidad (lugar) + Punkt (nimega koht) + Lieu-dit + Hely (nevesített hely) + Località (nome luogo) + 地域 (名前の付いている場所) + Sted (navn pÃ¥ sted) + Sted (namn pÃ¥ plass) + Miejsce (nazwane) + Localidade (nome do lugar) + Местное название + Lokalita (pomenované miesto) + Lokalitet (namngedd plats) + Місцевість (назва місця) + + + + Building + مبنى + Zgrada + Budova + Gebäude + Κτήριο + Edificio + Hoone + Bâtiment + Zgrada + Épület + Palazzo + 建物 + Bygning + Gebouw + Bygning + Budynek + Edifício + Здание + Budova + Zgradba + Byggnad + Будинок + + + + Area + مساحة + Područje + Oblast + Fläche + Περιοχή + Área + Ala + Aire + Područje + Terület + Area + エリア + OmrÃ¥de + Gebied + OmrÃ¥de + Obszar + Área + Область + Plocha + PovrÅ¡ina + Yta + Ділянка + + + + Name + الإسم + Ime + Jméno + Name + Όνομα + Nombre + Nimi + Nom + Naziv + Név + Nome + 名前 + Navn + Naam + Namn + Nazwa + Nome + Название + Meno + Ime + Namn + Назва + + + + Highway type + نوع الطريق + Typ silnice + Straßentyp + Τύπος οδικής αρτηρίας + Tipo de carretera + Tee tüüp + Type de route + Út típusa + Tipo strada + ハイウェイ タイプ + Riksvei Type + Wegtype + Type ferdselsveg + Typ drogi + Tipo auto-estrada + Тип автомобильной дороги + Typ komunikácie + Typ av väg + Тип дороги + + + Motorway + طريق سريع + Dálnice + Autobahn + Αυτοκινητόδρομος + Autopista + Maantee + Autoroute + Autocesta + Autópálya + Autostrada + 高速道路 + Motorvei + Autoweg + Motorveg + Autostrada + Estrada + Автомагистраль + Diaľnica + Avtocesta + Motorväg + Автомагістраль + + + Ramp to motorway + مدخل طريق سيارات سريع + Dálniční nájezd + Autobahnanschlussstelle + Είσοδος αυτοκινητόδρομου + Rampa de autopista + Kiirtee pealesõit + Bretelle d'accès ou de sortie d'une autoroute + Spoj na autocestu + Autópálya-bekötőút + Svincolo per l'autostrada + 高速道路の乗り口 + Adkomst til Motorvei + Oprit + Adkomst til Motorveg + Dojazd do autostrady + Въезд на шоссе + MotorvägspÃ¥fart + З’єднання з автомагістраллю + + + Trunk road + طريق جزعية + Víceproudá cesta + Schnellstraße + Carretera cortada + Kiirtee + Voie rapide + Autóút + Strada principale + 国道 + Stamvei + Expressweg + Stamveg + Droga ekspresowa + Автомагистраль + Motortrafikled + Магістраль + + + Ramp to trunk road + Nájezd na víceproudou cestu + Schnellstraßenanschlussstelle + Rampa de acceso a carretera + Kiirtee pealesõit + Voie d'accès à une voie rapide + Autóútbekötő + Svincolo per la strada principale + 国道の乗り口 + Adkomst til stamvei + Oprit naar expressweg + Adkomst til stamveg + Dojazd do drogi ekspresowej + Въезд на автомагистраль + PÃ¥fart till motortrafikled + З’єднання з магістраллю + + + Primary road + طريق رئيسية + Silnice I. třídy + Bundesstraße + Κύριος δρόμος + Carretera principal + Esimese klassi tee + Route nationale + Državna cesta + Elsőrendű főút + Strada primaria + 主要地方道 + Hovedvei + Hoofdweg + Hovedveg + Droga krajowa + Estrada principal + Главная дорога + Huvudväg + Головна дорога + + + Ramp to primary road + طلعة إلى طريق رئيسية + Nájezd na silnici I. třídy + Bundesstraßenanschlussstelle + Είσοδος πρωτεύοντος δρόμου + Rampa al camino primario + Maantee pealesõit + Voie d'accès à une route nationale + Spoj na državnu cestu + Elsőrendű bekötőút + Svincolo per strada primaria + 都道府県道の乗り口 + Adkomst til hovedvei + Oprit naar hoofdweg + Adkomst til hovedveg + Dojazd do drogi krajowej + Въезд на основную дорогу + PÃ¥fart till huvudväg + З’єднання з головною дорогою + + + Secondary road + طريق ثانوية + Silnice II. třídy + Landesstraße + Δευτερεύων δρόμος + Camino secundario + II klassi maantee + Route secondaire + Županijska cesta + Másodrendű főút + Strada secondaria + 都道府県道 + Fylkesvei + Secundaire weg + Fylkesveg + Droga wojewódzka + Estrada secundária + Второстепенная дорога + Cesta II. triedy + Sekundär väg + Другорядна дорога + + + Tertiary road + طريق ثلاثية + Silnice III. třídy + Kreisstraße + Τριτεύουσα οδός + Camino terciario + Kohalik tee + Petite départementale ou communale + Lokalna cesta + Egyéb épített út + Strada terziaria + 重要道路 + SmÃ¥vei + Derderangsweg + SmÃ¥veg + Droga powiatowa + Rua terciária + Дорога + Tertiär väg + Третьорядна дорога + + + Unclassified road + طريق غير مصنفة + Neoznačená cesta + Ortsverbindungsstraße + Μη κατηγοριοποιημένος δρόμος + Carretera sin clasificar + Klassifitseerimata tee + Route non-classée + Nerazvrstana cesta + Kisebb burkolt út + Strada non classificata + 級外道路 + Vei ikke klassifisert + Niet-geclassificeerde weg + Veg ikkje klassifisert + Droga gminna + Estrada não classificada + Дорога местного значения + Enskild väg + Дорога без класифікації (місцева) + + + Residential road + طريق سكن + Obecní komunikace + Ortsstraße + Αστική οδός + Camino residencial + Asulatee + Rue résidentielle + Települési út + Strada residenziale + 生活道路 + Boligvei + Weg in de stad + Boligveg + Droga lokalna + Rua residencial + Улица жилого района + Väg inom bostadsomrÃ¥de + Жила вулиця + + + Service road + Účelová komunikace + Zufahrtstraße + Βοηθητική οδός + Camino de servicio + Teenindustee + Route d'accès + Servisna cesta + Szolgáló/üzemi út + Strada di servizio + サービス道 + Bedieningsweg + Droga serwisowa + Estrada de serviço + Служебный проезд + Obslužná cesta + Serviceväg (liten gata) + Допоміжна дорога + + + Track road + طريق مشاة + Nezpevněná komunikace + Feld- oder Waldweg + Χωματόδρομος + Camino de tierra + Põllutee + Chemin + Földút + Strada forestale + 農道や林道 + Sti + Sti + Droga gruntowa + Грунтовая дорога + skogsväg + Грунтові дороги + + + Pedestrian priority road + طريق أولوية للمشاة + Put sa prioritetom za pjeÅ¡ake + Obytná zóna + Spielstraße + Δρόμος με προτεραιότητα πεζών + Camino con prioridad para peatones + Jalakäija eelistee + Rue à majorité piétonne + Cesta sa prioritetom za pjeÅ¡ake + Lakó/pihenő övezet + Strada pedonale con traffico limitato + 歩行者優先道路 + Vei med prioritet for fotgjengere + Primaire wandelweg + Veg med prioritet for gÃ¥ande + Strefa zamieszkania + Via prioritária para pedestres + Дорога с приоритетом пешеходов + Väg med prioritet för fotgängare + Переважно пішохідна зона + + + Pedestrian only road + طريق فقط للمشاة + Put samo za pjeÅ¡ake + Komunikace pouze pro chodce + Fußgängerzone + Δρόμος μόνο για πεζούς + Calle Peatonal + Ainult jalakäijate tee + Rue exclusivement piétonne + Cesta samo za pjeÅ¡ake + Sétálóutca + Strada pedonale + 歩行者専用道 + GÃ¥gate + Winkelwandelstraat + GÃ¥gate + Ciąg pieszy + Via pra pedestres + Дорога только для пешеходов + PeÅ¡ia zóna + Cesta za peÅ¡ce + Väg endast för fotgängare + Пішохідна зона + + + Footway + طريق للمشاة + Stezka pro chodce + Fußweg + Πεζόδρομος + Vía peatonal + Jalgtee + Voie piétonne + Staza za pjeÅ¡ake + Gyalogút + Sentiero + 歩道 + Gangvei + Voetweg + Gangveg + Droga dla pieszych + Passeio Pedonal + Тротуар + Chodník + PeÅ¡pot + GÃ¥ngstig + Пішохідна доріжка + + + Cycleway + طريق فقط للدراجات + Cyklostezka + Radweg + Ποδηλατόδρομος + Ciclovía + Jalgrattatee + Voie cyclable + Biciklistička staza + Kerékpárút + Ciclabile + 自転車道 + Sykkelvei + Fietspad + Sykkelveg + Droga rowerowa + Ciclovia + Велодорожка + Cesta pre cyklistov + Kolesarska steza + Cykelbana + Велосипедна доріжка + + + Bridleway + طريق الخيل + Cesta pro koně + Reitweg + Camino para caballos + Põllutee + Chemin équestre + Lovasút + Strada per cavalli + 馬道 + Kjerrevei + Ruiterpad + Kjerreveg + Ścieżka do jazdy konnej + Дорога для верховой езды + Cesta pre kone + GÃ¥ng-/Ridstig + Дорога для вершників + + + Steps + درجات + Stepenice + SchodiÅ¡tě + Treppe + Σκαλοπάτια + Escaleras + Trepp + Escaliers + Stepenice + Lépcső + Passi + trappsteg + 階段 + Trapper + Trappen + Trappar + Schody + Passos + Лестница + Schody + Stopnice + Trappsteg + Сходи + + + Bus guideway (not a bus way) + Speciální cesta pro autobus (né vyhrazený pruh) + Spurbus-Strecke + Recorrido de autobuses (punto de información) + Bussi abitee (mitte bussitee) + Voie réservée aux bus guidés + Buszvezetőút + Tramvia (non una strada per autobus) + ガイドウェイバス道(バス道ではない) + Pas dla autobusów + Автобусный рельс + SpÃ¥rbuss (ej bussfil) + Рейковий автобус + + + Unsurfaced road (old tag) + Unsurfaced road (stará značka) + Unbefestigte Straße (veraltet) + Οδός χωρίς επίστρωση (παλιά ετικέτα) + Camino sin asfaltar (etiqueta antigua) + Pindamata tee (vananenud tähis) + Route sans revêtement (étiquette dépréciée) + Burkolatlan út (elavult címke) + Non asfaltata (vecchio tag) + 未舗装道路(古いタグ) + Udekket vei (gammelt merke) + Onverharde weg + Udekket veg (gammelt merke) + Nieutwardzona droga (przestarzały znacznik) + Грунтовка (старый тег) + Obelagd väg (gammal tagg) + Дорга без покриття (застар) + + + + + Landuse + إستعمال الأرض + Využití plochy + Landnutzung + Χρήση γης + Uso de la tierra + Maakasutus + Utilisation du sol + Földhasználat + Suolo + 土地利用 + Landgebruik + Zagospodarowanie terenu + Землеиспользование + Raba tal + Markanvändning + Використання землі + + + Allotments + حصص سكنية + Pozemky + Schrebergärten + Κλήροι + Parcelas + Aiamaa + Lotissements + Parcele + Bérelt parcellák + Concessioni + 貸し農園 + Tomter + Verkavelingen + Tomter + Ogródki działkowe + Loteamentos + Сады-огороды + Záhradkárska oblasÅ¥ + Kolonilotter + горо́д + + + Basin + حوض + Vodní nádrž + Wasserbecken + Λεκάνη + Lavabo + Bassein + Bassin + Bazen + Medence + Bacino + 水たまり、窪地 + Basseng + Stroomgebied + Basseng + Zbiornik wodny + Бассейн + Vodná nádrž + Hamnbassäng + Водойма + + + Brownfield + Přestavba + Baulücke + Βιομηχανική + Zona industrial abandonada + Jäätmaa + Terrain en friche + Barna telek + Campo + 更地 + RivningsomrÃ¥de + Braakliggende grond + RivningsomrÃ¥de + Teren poprzemysłowy + Пустырь с развалинами + Brownfield (opustený priemyselný objekt) + Övergivet industri- eller affärsomrÃ¥de + Очищене місце під забудову + + + Cemetery + مقبرة + Groblje + Hřbitov + Friedhof + Κοιμητήριο + Cementerio + Kalmistu + Cimetière + Groblje + Temető + Cimitero + 共同墓地 + KirkegÃ¥rd + Begraafplaats + Kirkegard + Cmentarz + Cemitério + Кладбище + Cintorín + Begravningsplats + Кладовище + + + Commercial zone + منطقة تجارية + Komercijalna zona + Obchodní zóna + Büros + Εμπορική ζώνη + Zona Comercial + Ärimaa + Zone tertiaire (bureaux) + Trgovačko srediÅ¡te + Kereskedelmi övezet + Zona commerciale + ビジネス街 + Komersielt omrÃ¥de + Commerciële zone + Komersielt omrÃ¥de + Teren handlowy + Zona comercial + Коммерческая зона + Trgovsko središče + AffärsomrÃ¥de + Діловий квартал + + + Construction zone + منطقة تعمير + Građevinska zona + StaveniÅ¡tě + Baustelle + Κατασκευαστική ζώνη + Zona de Construcción + Ehitusplats + Site "en construction" + GradiliÅ¡te + Építkezés + Zona in costruzione + 建設中エリア + Byggeplass + Constructiezone + Byggeplass + Budowa + Zona de construção + Стройка + Gradbišče + Byggarbetsplats + Будмайданчик + + + Farm + مزرعة + Farma + Zemědělství + Landwirtschaft/Bauernhof + Φάρμα + Granja + Talu + Ferme + Farma + Gazdaság + Fattoria + 農場 + GÃ¥rd + Boerderij + Gardsbruk + Gospodarstwo rolne + Quinta + Ферма + Farma + Kmetija + BondgÃ¥rd + Ферма + + + Forest + غابة + Å uma + Les + Wald + Δάσος + Bosque + Mets + Forêt + Å uma + Erdő + Foresta + 森林 + Skog + Woud + Skog + Las + Floresta + Лес + Les + Gozd + Skog + Ліс + + + Greenfield + حقل أخضر + Výstavba na zelené louce + Bauland + Campo verde + Roheala + Espace vert + Zöld telek + Campo verde + 建設予定地 + ByggeomrÃ¥de + Ontwikkelingsgebied + Byggeplass + Teren pod zabudowę + Пустырь + Greenfield (Projekt na zelenej lúke) + Tidigare outnyttjat omrÃ¥de (greenfield) + Ділянка під нову забудову + + + Industrial zone + منطقة صناعية + Industrijska zona + Průmyslová zóna + Industriegebiet + Βιομηχανική ζώνη + Zona industrial + Tööstusmaa + Zone industrielle + Industrijska zona + Ipari övezet + Zona industriale + 工業用地 + IndustriomrÃ¥de + Industriële zone + IndustriomrÃ¥de + Teren przemysłowy + Zona industrial + Промышленная зона + Priemyselná zóna + Industrijska cona + IndustriomrÃ¥de + Промислова зона + + + Landfill + مطمر نفايات + Skládka + Deponie + ΧΥΤΑ + Vertedero + Prügimägi + Décharge + Deponija + Szemétlerakó + Terra + 埋め立てゴミ処理地 + Avfallsdeponi + Vuilnisbelt + Avfallsdeponi + Wysypisko śmieci + Свалка + Skládka odpadov + Deponija + Deponi (soptipp) + Звалище + + + Military + عسكري + Vojska + Vojenský prostor + Militär + Στρατιωτικό + Escuela Militar + Militaarala + Militaire + Vojska + Katonai terület/gyakorlótér + Zona militare + 軍 + Millitært + Militair + Millitært + Teren wojskowy + Militar + Военное + Militärt omrÃ¥de + Військове + + + Recreation ground + ميدان الألعاب + Rekreační oblast + Erholungsgebiet + Χώρος αναψυχής + Zona de recreación + Puhkeala + Aire de jeux + Rekreacijska povrÅ¡ina + Rekreációs terület + Zona di svago + 遊び場 + RekreasjonsomrÃ¥de + Recreatiegebied + RekreasjonsomrÃ¥de + Teren rekreacyjny + Место отдыха + Rekreacijska povrÅ¡ina + RekreationsomrÃ¥de + Зона відпочинку + + + Reservoir (water) + خزان (مياه) + Rezervoar + Přehrada + Speicherbecken + Υδατοδεξαμενή + Reserva (agua) + Vee reservuaar + Bassin de retenue + Spremnik (voda) + Víztározó + Riserva (acqua) + ため池 + Reservoir (vann) + Waterreservoir + Reservoir (vatn) + Zbiornik retencyjny + Reservatório (água) + Водохранилище + Rezervoar (voda) + Vattenreservoar + Водойма + + + Residential zone + منطقة سكنية + Stambena zona + Obytná zóna + Wohngebiet + Αστική ζώνη + Zona Residencial + Asula + Zone résidentielle + Lakóövezet + Zona residenziale + 住宅地 + BoligomrÃ¥de + Residentiële zone + BoligomrÃ¥de + Zabudowa mieszkaniowa + Zona residencial + Жилой район + Obytná zóna + BostadsomrÃ¥de + Жила зона + + + Retail zone + بيع بلمفرق + Trgovinska zona + Nákupní zóna + Einzelhandel + Ζώνη λιανικού εμπορίου + Zona de venta al por menor + Kaubandustsoon + Vente au détail + Kiskereskedelmi övezet + Zona particolareggiata + 商業地 + HandelsomrÃ¥de + Handelszone + HandelsomrÃ¥de + Strefa handlowa + Zona de retalho + Розничная торговля + DetaljhandelsomrÃ¥de + Торговий квартал + + + Surface mineral extraction + منجم إستخراج معادن + Povrchová těžba + Steinbruch + Επιφανειακή εξαγωγή ορυκτών + Explotación minera en la superficie + Pealmaa kaevandus + Mine à ciel ouvert + Külszíni fejtés + Superficie di estrazione di minerali + 露天掘り鉱山 + Overflatebrudd for mineraler + Oppervlakkige ontginning van mineralen + Overflatebrudd for mineraler + Kamieniołom + Extracção mineral á superficie + Открытый карьер + Mineralutvinning (vid jordytan) + Видобування корисних копалин (карь’єр) + + + Village green + مرج/بستان قرية + Městská zeleň + Dorfwiese + Parque municipal + Roheala + Espace vert + Falupark + Villaggio verde + 里山 + Dorpsgroen + Łąka wiejska + Зелёная деревня + Byallmänning (gräsplätt) + Суспільні луги + + + + + Oneway + إتجاه واحد + Jednosměrka + Einbahnstraße + Μονόδρομος + Una sola vía + Ühesuunaline + Sens unique + Jednosmjerno + Egyirányú + Senso unico + 一方通行 + Enveiskjøring + Enkelrichting + Einvegskjøyring + Jednokierunkowa + Sentido único + Односторонняя + Jednosmerka + Enosmerna + Enkelriktat + Одностронній рух + + + Amenity + خدمات + Občanská vybavenost + Nutzung + Ευκολίες + Comodidades + Hüvis + Équipement + Szolgáltatás + Attrattiva + 各種施設 + Faciliteit + Miejsce + Инфраструктура + VybavenosÅ¥ + Facilitet + Інфраструктура + + Arts centre + مركز ثقافي + Centrum umění + Kulturzentrum + κέντρο τεχνών + Centro de Artes + Kunstigalerii + Centre culturel + Kulturni centar + Művészeti központ + Centro culturale + 美術館 + Kunstsenter + Cultureel centrum + Kunstsenter + Centrum kultury/sztuki + Centro de artes + Центр искусств + Centrum umenia + Kulturni center + Konstcenter + Арт-центр + + + ATM or cash point + آلة دفع نقود أو نقطة دفع نقدي + Bankomat, výběr v hotovosti + Geldautomat + ATM ή σημείο μετρητών + Cajero automático + ATM või sularaha + DAB ou point de payement + Bankomat + Pénzkiadó automata + Bancomat o ritiro contanti + ATMやキャッシュディスペンサー + Minibank + Geldautomaat + Minibank + Bankomat + Caixa Multibando + Банкомат + Bankomat + Bankomat / uttagsautomat + Банкомат (пункт видачі готівки) + + + Bank + مصرف + Banka + Banka + Bank + Τράπεζα + Banco + Pank + Banque + Banka + Bank + Banca + 銀行 + Bank + Bank + Bank + Bank + Banco + Банк + Banka + Banka + Bank + Банк + + + Bank with atm + مصرف مزود بآلة نقد + Banka s bankomatem + Bank mit Geldautomat + Τράπεζα με ATM + Banco con cajero automático + Pank ja sularahaautomaat + Banque avec DAB + Banka s bankomatom + Bank pénzkiadó automatával + Banca con Bancomat + atmのある銀行店舗 + Bank med Minibank + Bank met geldautomaat + Bank med Minibank + Bank z bankomatem + Banco com caixa multibanco + Банк с банкоматом + Banka s bankomatom + Banka z bankomatom + Bank med automatuttag + Банк + Банкомат + + + Beer garden + جنينة جعة + Letní hospoda + Biergarten + Terraza + Õllekas + Jardin à bière + Sörkert + Giardino della birra + ビアーガーデン + Biertuin + Ogródek piwny + Пивной сад + Biergarten (uteservering för öl) + Генделик + + + Parking for bicycles + موقف للدراجات + Parking za bicikle + Parkování pro kola + Fahrradstellplatz + Στάθμευση ποδηλάτων + Aparcamiento de Bicicletas + Jalgratta parkla + Parking pour vélos + Parking za bicikle + Kerékpártároló + Parcheggio per biciclette + 自転車駐輪場 + Sykkelparkering + Parkeerplaats voor fietsen + Sykkelparkering + Parking rowerowy + Parque de estacionamento para bicicletas + Велосипедная стоянка + Cykelparkering + Стоянка велосипедів + + + Bicycle Rental + إستئجار دراجة + Rentiranje Bicikla + Půjčovna kol + Fahrradmietstation + Ενοικίαση ποδηλάτων + Alquiler de Bicicletas + Jalgratta rent + Location de vélos + Izanajmljivanje bicikala + Kerékpárkölcsönző + Noleggio biciclette + 自転車レンタル + Sykkelutleie + Fietsverhuur + Sykkelutleige + Wypożyczalnia rowerów + Aluguer de bicicletas + Прокат велосипедов + Požičovňa bicyklov + Najem koles + Cykeluthyrning + Прокат велосипедів + + + Bureau de change + صرّاف + Mjenjačnica + Směnárna + Wechselstube + Casa de Cambios + Valuutavahetus + Bureau de change + Mjenjačnica + Pénzváltó + Cambio valuta + 両替所 + Vekslingskontor + Wisselkantoor + Kantor + Обмен валюты + Zmenáreň + Menjalnica + VäxelbyrÃ¥ + Обмін валют + + + Bus station + محطة نقليات عامة + Autobuska stanica + Autobusové nádraží + Bushaltestelle + Σταθμός λεωφορείων + Estación de autobuses + Bussijaam + Gare routière + Autobusna postaja + Autóbuszállomás + Stazione autobus + バスステーション + Bussstasjon + Busstation + Bussstasjon + Dworzec autobusowy + Estação de autocarros + Автовокзал + Autobusová stanica + Avtobusna postaja + Busstation + Автостанція + + + Cafe + مقهى إستراحة + Cafe + Kavárna + Cafe + Καφέ + Cafetería + Kohvik + Café + Kafić + Kávézó + Cafè + カフェ + Kafe + Café + Kafe + Kafejka + Café + Кафе + Kaviareň + Kafé + Кафе + + + Car Rental + إستئجار سيارة + Rentiranje Auta + Půjčovna aut + Autovermietung + Ενοικίαση Αυτοκινήτων + Alquiler de Automóviles + Auto rent + Location de voiture + Iznajmljivanje automobila + Autókölcsönző + Noleggo auto + レンタカー + Bilutleie + Autoverhuur + Bilutleige + Wypożyczalnia samochodów + Aluguer de automóvel + Прокат автомобилей + Požičovňa áut + Najem avtomobilov + Biluthyrning + Прокат автівок + + + Car Sharing + مشاركة سيارات + Sdílení aut + Autotausch + Κοινή χρήση αυτοκινήτων + Compartir auto + Autojagamine + Co-voiturage + Közös autók + Car Sharing + カーシェアリング + Bildeling + Autodelen + Bildeling + Wspóldzielenie samochodów + Partilha de carro + Совместное использование автомобилей + Bilpool + Погодинний прокат автівок + + + Cinema + سينما + Kino + Kino + Kino + Κινηματογράφος + Cine + Kino + Cinéma + Kino + Mozi + Cinema + 映画館 + Kino + Bioscoop + Kino + Kino + Cinema + Кинотеатр + Kino + Kino + Biograf + Кіно + + + College + كلّية + Koledž + Vysoká Å¡kola + Gymnasium + Κολέγιο + Instituto + Kolledž + Établissement d'enseignement supérieur + Fakultet + Főiskola + College + 短大 + Høyskole + Campus + Høgskole + Szkoła wyższa + Universidade + Колледж + Högskola + Коледж + + + Court house + محكمة + Sud + Soud + Gericht + Δικαστήριο + Juzgados + Kohtumaja + Palais de justice + Sud + Bíróság + Corte + 裁判所 + Rettssal + Gerechtsgebouw + Rettssal + Sąd + Tribunal + Дом правосудия + Sodišče + Domstolsbyggnad / Tingshus + Суд + + + Crematorium + محرقة جثث + Krematorijum + Krematorium + Krematorium + Κρεματόριο + Crematorio + Krematoorium + Crématorium + Krematorij + Hamvasztó + Crematorio + 火葬場 + Krematorium + Crematorium + Krematorium + Krematorium + Crematório + Крематорий + Krematórium + Krematorij + Krematorium + Крематорій + + + Source of drinking water + نبع ماء صالحة للشرب + Izvor pitke vode + Zdroj pitné vody + Trinkwasser + Πηγή πόσιμου νερού + Manantial de agua potable + Joogivee allikas + Source d'eau potable + Izvor pitke vode + Ivóvíz + Fonte di acqua potabile + 飲み水の水源 + Drikkevannskilde + Drinkwaterbron + Źródło wody pitnej + Fonte com águo potável + Питьевая вода + Zdroj pitnej vody + Vir pitne vode + Källa för dricksvatten + Питна вода + + + Fast food + وجبات سريعة + Rychlé občerstvení + Schnellimbiss + Fast food + Comida Rápida + Kiirtoit + Restauration rapide + Brza prehrana + Gyorsétterem + Fast food + ファーストフード + Fast food + Fast food + Fast food + Fast food + Comida de rápida confecção + Кафе + Snabbmat + Забігайлівка + + + Fire Station + فوج إطفاء + Požární stanice + Feuerwehr + Σταθμός Πυροσβεστικής + Estación de bomberos + Tuletõrjedepoo + Caserne de pompiers + Vatrogasci + Tűzoltóság + Pompieri + 消防署 + Brannstasjon + Brandweerkazerne + Brannstasjon + Straż pożarna + Bombeiros + Пожарное депо + Požiarna stanica + Gasilski dom + Brandstation + Пожежна станція + + + Fountain + نافورة + Fontana + Fontána, kaÅ¡na + Springbrunnen + Συντριβάνι + Fuente + Purskaev + Fontaine + Fontana + Szökőkút + Fontana + 噴水 + Fontene + Fontein + Fontene + Fontanna + Fonte + Фонтан + Fontána + Fontän + Фонтан + + + Fuel + وقود + Gorivo + Benzinka + Tankstelle + Καύσιμα + Combustible + Kütus + Station service + Gorivo + Benzinkút + Benzina + ガソリンスタンド + Bensinstasjon + Brandstof + Bensinstasjon + Stacja benzynowa + Combustível + Заправочная станция + Bränsle + Заправка + + + Small place of burial + مقبرة صغيرة + Malý hřbitov + Grabstelle + Μικρός τόπος ταφής + Pequeño cementerio + Väike matmispaik + Petit cimetière + Malo groblje + Sírhely + Piccolo luogo di sepoltura + 墓地 + Gravsted + Begraafplaats + Cmentarz (mały) + Могила + Majhno pokopališče + Liten begravningsplats + Цвинтар (малий) + + + Hospital + مستشفى + Bolnica + Nemocnice + Krankenhaus + Νοσοκομείο + Hospital + Haigla + Hôpital + Bolnica + Kórház + Ospedale + 病院 + Sykehus + Hospitaal + Sjukehus + Szpital + Hospital + Больница + Nemocnica + BolniÅ¡nica + Sjukhus + Лікарня + + + Library + مكتبة عامة + Biblioteka + Knihovna + Bibliothek + Βιβλιοθήκη + Biblioteca + Raamatukogu + Bibliothèque + Knjižnica + Könyvtár + Biblioteca + 図書館 + Bibliotek + Bibliotheek + Bibliotek + Biblioteka + Biblioteca + Библиотека + Knižnica + Knjižnica + Bibliotek + Бібліотека + + + Nightclub + نادي ليلي + Noćni klub + Noční podnik + Nachtclub + Νυχτερινό Κέντρο + Club nocturno + Ööklubi + Boîte de nuit + Noćni klub + Éjszakai szórakozóhely + Nightclub + ナイトクラブ + Nattklubb + Nachtclub + Nattklubb + Klub nocny + Discoteca + Ночной клуб + Nočný klub + Nattklubb + Нічний клуб + + + Parking + موقف سيارات + Parking + ParkoviÅ¡tě + Parkplatz + Χώρος στάθμευσης + Aparcamiento + Parkimine + Parking + Parking + Parkoló + Parcheggio + 駐車場 + Parkering + Parkeerplaats + Parkering + Parking + Parque de estacionamento + Стоянка + Parkovisko + Parkirišče + Parkeringsplats + Стоянка + + + Pharmacy + صيدلية + Apoteka + Lékarna + Apotheke + Φαρμακείο + Farmacia + Apteek + Pharmacie + Ljekarna + Gyógyszertár + Farmacia + 薬局 + Apotek + Apotheek + Apotek + Apteka + Farmácia + Аптека + Lekáreň + Lekarna + Apotek + Аптека + + + Place of Worship + معبد + Bohoslužebné místo + Anbetungsort + Τόπος Λατρείας + Lugar de culto + Palvekoht + Lieu de culte + Mjesto bogoÅ¡tovlja + Vallásgyakorlóhely + Luogo di culto + 祈りのための場所 + Tilbedelsessted + Gebedsplaats + Tilbedingsted + Miejsce kultu + Место поклонения + Kraj čaščenja + Religiös helgedom + Культове місце + + + Police Station + مركز شرطة + Policijska Stanica + Policejní stanice + Polizeidienststelle + Σταθμός Αστυνομίας + Estación policial + Politsei jaoskond + Poste de police + Policijska stanica + Rendőrség + Stazione di polizia + 警察署・交番 + Politistasjon + Politiekazerne + Politistasjon + Komenda policji + Esquadra + Милицейский участок + Policajná stanica + Policijska postaja + Polisstation + Відділення міліції + + + Post Box + صندوق بريد + PoÅ¡tovní schránka + Briefkasten + Γραμματοκιβώτιο + Buzón de correos + Postkast + Boîte aux lettres + PoÅ¡tanski sandučić + Postaláda + Cassetta delle lettere + ポスト + Postkasse + Brievenbus + Postkasse + Skrzynka pocztowa + Marco de correio + Почтовый ящик + PoÅ¡tová schránka + PoÅ¡tni nabiralnik + BrevlÃ¥da + Поштова скринька + + + Post Office + مكتب البريد + PoÅ¡ta + PoÅ¡ta + Postamt + Ταχυδρομείο + Oficina Postal + Postkontor + Bureau de poste + PoÅ¡tanski ured + Posta + Ufficio postale + 郵便局 + Postkontor + Postkantoor + Postkontor + Poczta + Correios + Почтовое отделение + PoÅ¡ta + PoÅ¡tni urad + Postkontor + Пошта + + + Prison + سجن + Zatvor + Věznice + Gefängnis + Φυλακή + Prisión + Vangla + Prison + Zatvor + Börtön + Prigione + 刑務所 + Fengsel + Gevangenis + Fengsel + Więzienie + Prisão + Тюрьма + Vezenie + Zapor + Fängelse + В’язниця + + + Pub + حانة + Bar + Hospoda + Kneipe + Pub + Bar + Pubi + Bar + Kocsma + Bar + バー("Pub") + Pub + Bar + Pub + Pub + Bar + Пивной бар + Krčma + Pub + Шинок + + + Public building + مبنى عام + Javna zgrada + Státní úřad + Öffentliches Gebäude + Δημόσιο κτήριο + Edificio Público + Avalik ehitis + Bâtiment public + Javna zgrada + Középület + Edificio pubblico + 公共の建物 + Offentlig bygning + Publiek gebouw + Offentleg bygning + Budynek publiczny + edificio público + Общественное здание + Javna zgradba + Offentlig byggnad + Громадський заклад + + + Public Telephone + هاتف عمومي + Javni Telefon + Veřejný telefon + Telefon + Τηλέφωνο για το κοινό + Teléfono Público + Taksofon + Téléphone public + Javni telefon + Nyilvános telefon + Telefono pubblico + 公衆電話 + Telefonboks + Publieke telefoon + Telefonboks + Budka telefoniczna + Telefone público + Общественный телефон + Javna telefonska govorilnica + Publik telefon + Громадський телефон + + + Recycling Facilities + مرافق إعادة التدوير + Recyklační místo + Recycling-Einrichtung + Εγκαταστάσεις Ανακύκλωσης + Facilidades de reciclamiento + Prügitöötlus jaam + Point de collecte pour le recyclage + Reciklažno dvoriÅ¡te + Újrahasznosítás + Impianti di riciclaggio + リサイクル施設 + Resirkuleringsanlegg + Recyclagevoorzieningen + Resirkuleringsanlegg + Centrum recyklingowe + Instalações de reciclagem + Переработка отходов + Återvinningsstation + Контейнери для сміття + + + Restaurant + مطعم + Restoran + Restaurace + Restaurant + Εστιατόριο + Restaurante + Restoran + Restaurant + Restoran + Étterem/vendéglő + Ristorante + レストラン・食堂 + Restaurant + Restaurant + Restaurant + Restauracja + Restaurante + Ресторан + ReÅ¡taurácia + Restavracija + Restaurang + Ресторан + + + School + مدرسة + Å kola + Å kola + Schule + Σχολείο + Escuela + Kool + École + Å kola + Iskola + Scuola + 学校 + Skole + School + Skule + Szkoła + Escola + Школа + Å kola + Å ola + Skola + Школа + + + Taxi + تاكسي + Taxi + Taxi + Taxi + Ταξί + Taxi + Takso + Taxi + Taxi + Taxi + Taxi + タクシー + Taxi + Taxi + Taxi + Postój taksówek + Taxi + Такси + Taxi + Taxi + Taxi + Таксі + + + Theatre or opera house + مسرح أو مسرح غنائي + PozoriÅ¡te ili opera + Divadlo nebo opera + Theater oder Oper + Λυρική σκηνή + Teatro o casa de la ópera + Teater või ooperimaja + Théatre ou Opéra + KazaliÅ¡te ili opera + Színház vagy operaház + Teatro + 劇場やオペラハウス + Teater eller Operahus + Theater of opera + Teater eller Operahus + Teatr lub opera + Teatro ou Casa de opera + Театр + Divadlo alebo opera + Gledališče ali opera + Teater eller operahus + Опера, театр + + + Toilets + مراحيض + Veřejné záchody + Toiletten + Τουαλέτες + Baños + Tualetid + Toilettes + Zahodi + WC + Toilets + トイレ + Toaletter + Toiletten + Toalettar + Szalet + Casas de banho + Туалеты + Toalety + Stranišča + Toaletter + Туалет + + + Town hall + بلدية + Gradska skupÅ¡tina + Radnice + Rathaus + Δημαρχείο + Ayuntamiento + Raekoda + Mairie + Gradska vječnica + Városháza/közösségi épület + Municipio + 役所 + RÃ¥dhus + Stadhuis + RÃ¥dhus + Ratusz + Муниципалитет + Radnica (obecný úrad) + Mestna hiÅ¡a + RÃ¥dhus / Stadshus + Міська державна адміністрація. + + + University + جامعة + Univerzitet + Univerzita, vysoká Å¡kola + Universität + Πανεπιστήμιο + Universidad + Ülikool + École supérieure/Université + SveučiliÅ¡te + Egyetem + Università + 大学 + Universitet + Universiteit + Universitet + Uniwersytet + Universidade + Университет + Univerzita + Univerza + Universitet + Університет + + + Waste Disposal + رمي النفايات + Kanál, místo pro odpadky + Mülldeponie + Απόρριψη αποβλήτων + Vertedero + Prügila + Déchetterie + OdlagaliÅ¡te otpada + Szemétlerakó/gyűjtő + Smaltimento rifiuti + ゴミ箱 + AvfallshÃ¥ndtering + Afvalverwerking + Avfallshandtering + Wysypisko śmieci + Lixeira + Мусорный контейнер + Avfallsdeponi + Майданчик збору відходів + + + + + Religion + الديانة + Religija + Náboženství + Religion + Θρησκεία + Religión + Usk + Religion + Religija + Vallás + Religione + 宗教 + Religion + Godsdienst + Religion + Religia + Religião + Религия + Náboženstvo + Vera + Religion + Релігія + + Buddhist + بوذي + Budist + Budhistický + Buddistisch + Βουδιστής + Budista + Budistlik + Boudhiste + Buddhista + Buddista + 仏教 + Buddhist + Boeddhistisch + Buddhist + Buddyzm + Budista + Буддистский + Buddhism + Буддизм + + + Christian + نصراني + Kršćanski + KřesÅ¥anský + Christlich + Χριστιανός + Cristiano + Kristlik + Chrétien + Kršćanski + Keresztény + Cristiano + キリスト教 + Kristen + Christelijk + Kristen + Chrześcijaństwo + Cristã + Христианский + Krščanska + Kristet + Християнство + + + Jewish + يهودي + Židov + Židovský + Jüdisch + Ιουδαϊκό + Judío + Juudi + Juif + Židovski + Zsidó + Ebraico + ユダヤ教 + Jødisk + Joods + Jødisk + Judaizm + Judeu + Еврейская + Židovska + Judiskt + Іудаїзм + + + Muslim + مسلم + Musliman + Muslimský + Muslimisch + Musulmán + Moslemi + Musulman + Muslimanski + Muzulmán + Musulmano + イスラム教 + Muslim + Moslim + Muslim + Islam + Muçulmano + Мусульманский + Muslimanska + Mulimskt + Мусульманство + + + + + Denomination + تسمية + Denominace + Konfession + Δόγμα + Denominación + Usutunnistus + Dénomination + Vallási felekezet + Denominazione + 宗派 + Trosretning + Waarde + Trosretning + Wyznanie + Denominação + Конфессия + Vyznanie (cirkevné) + Samfund + Віросповідання + + + + + + + + + + + + + + + + + + + + + + + Name + الإسم + Ime + Jméno + Name + Όνομα + Nombre + Nimi + Nom + Naziv + Név + Nome + 名前 + Navn + Naam + Namn + Nazwa + Nome + Название + Meno + Ime + Namn + Назва + + + + Name (french) + الإسم (فرنسي) + Jméno (francouzky) + Name (franz.) + Όνομα (Γαλλικά) + Nombre (francés) + Nimi (prantsuse) + Nom (français) + Naziv (francuski) + Név (vallon) + Nome (francese) + 名前(フランス語) + Navn (fransk) + Naam (Frans) + Namn (fransk) + Nazwa (francuska) + Name (francês) + Название (фран.) + Meno (francúzske) + Namn (franska) + Назва (французською) + + + Name (dutch) + الإسم (هولّندية) + Jméno (nizozemsky) + Name (niederl.) + Όνομα (Ολλανδικά) + Nombre (alemán) + Nimi (hollandi) + Nom (néérlandais) + Naziv (nizozemski) + Név (flamand) + Nome (olandese) + 名前(オランダ語) + Navn (nederlansk) + Naam (Nederlands) + Namn (nederlansk) + Nazwa (belgijska) + Название (нем.) + Meno (holandské) + Namn (nederländska) + Назва (датською) + + + + + + + + + diff --git a/cmake/CMakeDMGBackground.tif b/cmake/CMakeDMGBackground.tif new file mode 100644 index 0000000000000000000000000000000000000000..2bc64c52e951ff9813a41e67818ac333dc5bafcf GIT binary patch literal 213169 zcmeFa2Urx#x~N?0cFT2Nirxh1_oV002Aq z0!RT0iO|S@07ddOo<|B$-(xQ%Mk6sPQf-RFB;U))koV-@U|9A?JhwQA70f0-l(Fo0N|1=En`&~2*bky-q``!F}0==D8 zB|=04JY0bQGcr1H0LtV5c#ohuMgagRvKw7wPisfL@~t6*UKdUj}7ti^!8T_QO4n&eH>jBk$A0G z42S)i60lzxXN??-hL4{MR$5eAR9r+W#3M)&w_^iV$tqE9e@uJ@%HCk>*8A!cNe6n@{q+WW8F`v*9S=^<~Vk?|l2Vv^$G@*?7rB9aPX zKek6|4Gh*>d;5!i9j&O7kC#{o-d9XQR9wu<>z`Wq2WSQTvA_Scg}-^IuZx(ei@#5x zpOcGLkc)Q!?~gn6^$hg?ai4+yE^9?!kK5DPRSY?(uY3Nn&Dxn?Z?lHc&BM$0Ym2q) zA2Xeu*7JM={XDL%mpnn?ATFrkr5M+1j{r^+;KX`pT zmakkDHGP}{*LJF>sf=4YUPWggCl6=Euc4!y4BkmzTwKJ-MOscoT2j_U#8JV~Nkm*i zPFBuQ-ceji!S#o(^t}B8@ZL@?Yh59oi+Uja$jQjMILS#$i8x6*;YFlnP54MGYzYxuQ^ zhcx=y83IaC!_NgD;NxfR2ov&D>?=w+R-^b}|!>`FM&TEtT`*c>vyNP{$ zt0eZbp27sQcm;>e9i9QWU&%)mhLM*vD|*E_|p0-6Q-`g(e}`291Oe~9ug@_uOlUCRHe`HyMeT5I_Dh9Xx4 z_W+|{@1O4eKS})7gT9B8i?_ee&kp^^ly6vmxTzt>{H+YRSt9pdvGtqpcP-Xt&VS?f zUAO! zT3`Pn>0cGoI3u6Pk<|$-lA!A3>lc8;4oEB;9N@ba=O8f?@^tEq#KlM~?1vm668El^ zJARAbti^6$vAln~o{avMy^%-PCQL6($Hnh6>o*w{; z3;)d{t^PL~{`r09CZD-%t&(>`F$J*gdq$|I0`MTEq{!ME zD(~Cs=GR`n=6-wm*DH1em0_cIq%1TPG3t2ZDrZ?vI-;hdiF~1@$fhK1CzGntAZ6}U zU1w7TzGDVkGIzR|Ry$YPi{hYxek9 z-5Oh5iKut*wN?_?L=zt~ILlh&D#v-W+1bxV>712FcFV|hwwm!^HoiAN32hyX_`-;?6`snEj6P zRwX@eg7(|f_5{~He;0CSkII%^)noHv;d|=bZVbMy4*kNda=vGJ>GR`Jk9A_^|+fm^|SaNq2)R* z2|Y|NW)|Gp*;*mel0J1ycvti6gam=yt`#sn(FJM-1Rx{VDwQ;*@aV{BgJRx<(mY`I ze+2@J0qVROfsBkAaAfYJ4>chGcAa*nWPZKQlmXeoGt$j~-HZTqj0hlE6L5D4g0L=t z>aif8R_p*hb7HpIaR<;~OF+>C0Mx>?o|y$j@v7?4V}gL!hFame3xPuBlvx+QK_Or| zc8PwQEg&m2@2s4z^%>Z}G?Sy@=G6+gt^mHp-S+2tyvT~_RjFx4Ios+0d5G=dEq_deQ|+&iiLkw5gyNC^ zqAIF%7$x%@ICJHZ96d%SwvWIcb=kCF00@6p#i-<=Kbin46=VM!^FXtnwqR#~Y6?|c zv=l!*5N$|h;-sii1#FagBc8&5MZ6h+rqn}UCxRBkowV;0q3GtLuuFRZn!_2enOpz| zbpVLu%p0>i1U95^XuZpc1@^oIAe{-=uDJu>hsaZaP~NCrF`!LvwJc|wdj;6^F$zZ| z2&g-4B5hQm_hkrRejqwMg9uJ0`|D3{Z)a>>P;Sq7v!e2NgY)hQ`bXBNV9~mGcYv+r6&ZGtq}p8r8#(`J=gj>0mD1%3THNrFg|bM^a`bV;$%q!0kxMJP=3}0 zOU$ef6H*%+_t6Dr5y1JD%lF%*f!p0zsBH{kzMcRTE(lZ>F!p=xdoK7J9(D~elNST* zv*XdnPqkAu<@E>xsSu_G)o3m*K|t{Vqrg7avhlIOM9~8R<>cA%y~TirtIf>nFD< zK()GIpYvw|isb!BcBej-OagIsi9o6{T68GRsBPZy;#R}ViVI6aT--a;{vXTR+ z!qb^H8kez+mdLYDJ54dnAc>m{(e{i_7Fpq58EhMe8M;qW0GiM zxK+!#*qYs@+1F_|uA&UMHFi*#HtGWMe(0Ag9Eu_D=F?zImhuhP5s)R$%NoUDrUX(3t ze2Q~!)VB}3clNEqeCd{P0w9+%xG(l%Ql=gZpV--9yEC8m{BU~y2F-4?evc{;Ae=dF zW|C}hU{cn#zhV;>?L+TTf5C!{HiM+nK<|N)z!-`u)9;ws!*q#lnlV@O=UQ_Tj&m$> zb&zvOBahy%g-!DK1UF)VtI1;&4e14dHcyIemgs%2kq2sK?*3!GEmoI!WnDr1{YUd?Yz|v((JJicanld|P z7aLWsOZG_>qY6|kt!A*g);T4rK)U$1&zjvI38qd9!z-2adn-d!Zj&jhq${ zRbZUY@NUP}Ak%a1_)6nk0*R@Ujp71*?S zd@)l67@r0T?i+8w76w5;5{CjL5oiF^A|E7AM>=zL5Kv~(FIu-(TYh|X+V;F-X+`fX z-O+o4&+0;S?T^<~h;4MVGf0@#7P_mIcT1xXoY$4aJ`^?3r z2QKI~tD-N`V1cZp_I4gq@8j_`C)MUe%rD(#$uLT|cQ5vs&GEt=%WCc?)lxwMpqSrI ze_(&^vu4$M-Gt~Z+UEPO@Labe$pq+=Zvg4xP{4-aQ=e@F+$EjZ_wK%X56-EjziLM= z?%MPR&K68qON0ws^G;fFm>yNXK}G;_9(^|3a(N^gMhby7n&uE9b(iLS{WB$U=QV=P zoK=iDx=(p$X@z2Ym#S*)_<{Y${cR}P+HB?Z^>t3ZFAZ+TsVI+1pFJ~A%L16%j`!b0 zn|cp%>RkA|&1=ww%}GHzCfAmR-t$s7M)r0uO9Y;=B!PH6{l%mD^Ga^TAI_AMjP+Yz zIqWmIQnyTjO6)D~Pq|I~<&1;h3oEs8`utgs>78N;zLo-+c)h!ichk5^^2NW)8>}GWO9;S2c-;k{p|wpU_@Gb;w`_-TS1cddcgErmBg8}v>1@q*#w>(J@;_ubo0mWHY3x&w`u@I8x`}|Zc_p~L-!4bKUOae4UU_{h@Ax+M|Y^bQXN2vDNdYRwx6esITXe>G;4Mw^59;t z>6QD{OS)I0*msuQR|Qv=Re|6kQ*K>ZAquz6n#W(J0?IGZif&2qLG*8=p2eC_d}w8* zX54%1Q9~}pz?67=$S~@D=B4cG7HCc&>G(|N?!frNhBmtF%105} z%rKxX%f!AKPswv$86PCerzD$@{opfa^){GFyn@QNnyRcum})$=|c z#u4fPtvR4mr!SyK`jXb>e>Bu^(KXr|xT>h$>om2?+P(6-0Y`IzAg zm{yvReO(2M*oS4a>dMSzj4U*b0teim9PpH!^%a;EH^pt}n3d%uHoOdBQiuPU6$R5WGcH&`dYbrb4>5n*N)^iQ4(>!b@+Zo^0an8Qrk{IJU z@QR1NQ8aRiTZE;f_~t17rhOhY&nSkIl$wNBNt#xcx8Xd`{=+4S19yBAc{=8}{Q!?^ z9H0{i`HqncXzc6LO*p1V`V_|0H)Dz2JKhNjOfyn8(&k=~|BO!h+`>#f3^S2tf#-@uWcg&nw>l;S@ie8J>1gG?3dMoBF`9ePRxqaGbbr!-AXKE}M zd7<09fQsdb$*zs+Ku4#;t8B($W;tmt^j#qb`4s*cpyuUPlz4T1R zHQpzcR#&pOH+LzaljWWe=AOhzW+ccrR<6Eryyux?=AtN&wliXc4(kBW^B5sBZoaZF zTwAy1k0|e;kKf^uv7^jGd|pVsTtt0d+=y|bsQ!+I>&M^W_6v^$U|Wbc)L9k?C{2c) ztx@}Kmt)W)w0l&m7TT!=;`UKz`eJ8$Z%`MK<$=kxMRH^%L7FJ6*RB;sLwW6^kO;{Z z^oINAO=w3YZ;9YZ#c@vrq=ke!OE0}k!qf<)4>&baAA0?`IPbH7bmjf>S{|I6K8{X5 zvAMW0L-*y19^WZF$EsTgPGU39*~ZrJw%uC*C_z;1&U%!D0{|9GLYk~p*VSJ#bxS*X z7$&tCHcuKcNtwyWm<1}B7369-j!ez=_l@=&%w*ay5wM-w0Nl68r){}xj7fg?PoYt3tk1?|VR0GKhEgVtG&?AG$t53R%QI6N zy7l4Wwkxng+lcaPFr2Y2$@eP%q)_`$`fW%|$LeN|ENcA+Et~zyC!!f|2lIM>K5mN8jDq=dhQNlYNoj!Jrg9b zy_69;l>_QR)@^~2$}t{9ho9S-{pQIm^V82}RAC=E zMo4hH!J?EKGYEl|*yWT8oU#MuxlVQJ-o$4yv^T}11$bId((QjUE>A9W{rJ!b_2f*! zzD7pSnMD4EcqyPpO;%e##>zW?!@V1Zgp8@cS*ZkCzTESTR3DNl*;28&S$Idv-1v#y zCadGNd8|vTfvu$C5TlrRQV0UICjHl~8wk z1-3jzvb-?N#ZV66oNx+j>JteQStCB#mP-daS>Hz;?`|_7d*mIMzg-|hAG>tK4SfXn z`i$VU7h-D=1FV{{}!LI^9cgj{)h{Llo#SiE_6T0j-tG%`3T#8{G50p_M`EmkLIDr zt%X^qQigT0%jDxYYC`;bM#)d)OxLj2ZFJHl1+E&)vT9l2+={&>i!aj^f21nAMN{^P z-gq;uu=~9M24{M99yN58{V=dqbH&cL*7~(>DIUP~fAq*#zA(b_$(5G3;cofMFRIeD zR~i+3kD6lp`*U!q0|AkK(?ua8$|dr%r%kzJeUGG6I?Si(w_a@DW_tXYzK&SMYiyao zrSkAC{AuScMhTg;ACt3rhBvlP_C$x|V6GCjlv|a38JpL2PjZ)! zH`ikV$ZqfjEN?lpd<8-(l|~${s%NNb#A3TFC|TPi9p~B}UE4T9x8wT2L#Zi7=@-{f z06Uc&*{Z^iW;SS~@i-^l7xa$D?(#JpP0N-mEsiTK1)|Fwx5GFZ+buheXq~@xKVMlX zMwmI=T%87`q&jGKLg)IOOF^XAviRussyxl!e#7aVH(v`39LBauwJULU){1nlh|AVs zg`|D#8`H8a9|~lPU2IRghkYv8{q{aU9bDQWuyhQtApg%Ljrmdc4~|UZGP-$zR@Y8( z37lgiNWBgr=0uI8rT0r?PYh|R#(lc$wmYBUvBG(N9OmL%2kb|O+-sdYAH16#X?6!6 zEm7z0j~>MimU`D-;~A`Muf3_hQg_4At>+bqd~M9gDdM&_Iy>{3t4y4-!%}DCW-ShV zXgo(^l7~9|UXLTwM3pnkM21C3`9&{|YJcgrCp&~jZi|eJJb2=mddr&|bA1p~%0(bz zK6g`{ZIpj_GthyJR>1moOG)|ujoTelxIQ;y2E6WfE#5nmF!NaMPJnvpHmT|{Z{r{? z%rX^oEaC7r^G}r35h!ya8n^Gobb`nG+59MW=f3e}DpUtfsXnsKO)3}@Y{)ZIRx(s> zwWo^rcI_L|*f%!i@zEx)&QZQv-YtCN_FMX}#q6=s#(hQiEz7%w4)00*Xw-DZF_Un5 z)M;pPa)-n$^0>E(6&RA4QxTf06Pa6;crVX87a{Y$PWk<++PsS9;&X-h2!r`mlLZxv z1?PqNI-7-6{Gy7>VuZVBo&93nfhCo|rHIg_e742a@MV?Q<%opkI-zCmxKHnC?t znhd;U|8~=fu9*+vCA;7DanvfD@DRJ+@3 zp9uL;y`m=`3!6__Ua=|Zv6|n#a;)8>;+fYH`>F1?p|-tmLpZoL(Iwn{dEf)biJ8@` zwh8}_oLt#P7rRFN6$elE_*4(R4gSovxz6eC*!$2Gt}|9w`X0?4Jj~6V-9EYSDSU=& z_5RxrE2}E+NJ&sUZ=X_-sJ_!=BvbQs3Pm@R#qd(9`xb7a67@YKMx)_7x}8pA7HvU& zM}lt`qvoup8HwfrbK6Z?voTI=imyi9*tKWx_;c!bk=k(S%#lX(==$NVbL(Ey%;4Aa zb3UHhJQq+Pw9~KfGRMx1<<~`a`HkKpZP_^AB%$xm_i#p^QTmCDfxmNqPa9*vO9ey! z!q-iPjOFi@jr>PHmbNo4kf<34@NdX9W|CplG6`_m9BslB$g5`>P}rwyT7Fl`z|7A= z%+PFsOv6NrX+g)#d_l{M)V#vN*2-cby2H{^rf9#dXy0IN@wZ!2-{n0h=khGr zI@|tv=$_yr+mN9fci)GbX4fu7>|G}Pba+@^fGS$Qmy0eIAL3jP^P(z_H$lhx@RlQv z%XfAqzLX!|epH=xNF~iVly@n0v|8INOQ~;%Rkq8A=z?S83g`BpQ0o!!Ipr4mvMG1s zCVBK($q!%R3*0|yQ07l6x}G?1)A#7i#eHD~!UO_<-+BE_zw>%ReOID2V;f#v|A~H= zOk2i&Drti!Yu|ZgT&k8geDZav|Fwsb(Nh{Swa1xTxmAsy8Zc{hWVkSBcdmWs^}sw_ zXx9^_HW?<-CO??>>bPi9<*TqASw)j6LssWrZ%!$!pHw_ua(Rlf@^bOi@tK%nG{^^|N?AL7!k4CQW?;kg`FFOW?}Bjby_B~j zRms1Q_|_!THTv!T@T`Tvkx+m|ITOJS0s4;XZ7S1MFq*cP?6s znRE$W+_W3Du!5oMe?6Fwe66E8oN6u2#XuRW{vx$EUX}$A@ z)p*i$N7HSjPn!s3sSjRzO!5UUgleq^xn+PsA?wjZM&JCGNVT)ZuQGSbaHZ)LnU0!K zCQF_*xoG}6Yj?$-t2QN;Q)!d?EB6|m0mTGhar%H_Y5(-GXMwk09H_RN$-3nKWh%6G z&)e*03#+Ke;#*||ibbw8XOw~K`&3mxlGflnmupwKS0cAt9q#kTsd;bF z5HC7jC7du+!J#_eES|8he14$1toMfP;Nogz!wc8>kJ$@8HnKfV*Vsh4RnB%y27F9C z^w#QX-*nKYQ@uu;=?mV+IW3t=mnv~@RL%zilZB}YjtZfSJfkFdG@@+wdj zXN+5__m!q2RTDSG1UKZNK4Bz%Is?9_Jhl^~))4P3LO1!&tI%tT@VwXvC`Jw28a)qf zy>`bWU@xn-=(SU9+E>ecIJTzoykOL#;cX^q-X_^Wr6VbQly5uzn+yTHYks9cJ0-)q zSI$l5Pzbe1KCP^O;5S+)t}jHIAEdwY&8425@1=WW4K6X&${9*!_DLG|l(N zF?=$=s>)*)OQLRkHFHX1TSn7Ev`M)Ex31niC+|+vGG>Nd+Xymp%7Dq8Qvaz86SLma zKpDd~X3SbLhQjX$RV=z?GA^5T2Ud9Zby+l4p?k`w!_YlJ%yI3OmHbDY#k#uEFIfWn z)4-a=<@`R;V=|XLZMWXd_7aq`umdJR)A#+h$=0?6*bA*x2l5%X)Q{WW$QmykSSosZ zh}X(xEpZ_U5_aj`R?9Lezeea zvv&5mt(zH1WNe15Q71fZRvs`_?ti%B{UYLnlVI-(F4iK1o4Q@3S?9>%_}}Et`(MvvcDv_kAd;fYYjp7fU}d za9{46pWgW8vav%GI;rpNw;1L6Kj1Gan^4x-+j{R*yj$}_y%oIgzS{G_>GOjV5ix1huitlD_rNVq=!D*?{Y`x+0xZ_j^Rs9bGr{ZTNr*? z73)bj6yf&V&h=#B(%r+{H=gw!UhR5f@3KuJKf;$RamOn%*-yrLno+y5c* zu{NceydWWuk2#v&l}7El4B7A~cMN?T152+m=7sc@So*@Vjn)=a_yDmuYDqRd9T}{uD!ePhyYjDnSDt1!?7BW} z>pfWNb>i??_2h|^$y;yP7N=|8o|v((eLFx$mg>vFP17{OA;xfbHfIy_y*ZBLvHNp& zS48~$PS(k^^$)Zww9m8XC_kP*B@);%KWJoO8OVuz3IAl!2j91t8Sm1+#MwsnY{~v@ zxMJ|B)z}xULv#r*KWywt9{q6IGk5I6(9t4n7}uGSse5~_T%G=uCRZ`@nVVYY{O7%5 zZ3>@ORk{}HRgC(UzR+D6T>f(A@{SfWdc1dn!}w8<)BF^XUs*W z+RL#&&zUaDSieJ!Rfuf3;aJpTS6a2M!>bPSJTW@QXd2}WC|ip8W9ds-SgMe#NQ}g` zcemLztUWF8g>v!6Z;G07Lg_|O$X8(GI89S`Rn=9v{dEMgva$f&{!#*e-N}c0UWNYu zrS7lo99sAn5`g|g|Nlb${_ zF4F(f1AzYjt^7w!E-5L=%**(k}uJAoQJz-&C1qB74KYy;Qtel#fN=iyXa`g4}-@SW> z^oh*1{QP`mk4VDp+qaSXNLpGN@<8?bOabWs-^zc)!@|Ns#Ok)THbh{=YD8B(Jv~Io z-rip1xn*#0aBOT0sk(9F2I4c4Ur|x<@ZrO6#+H?pAwgqfK@U4kHgX$kiCRo+B!5-MaPe-MioXeDmf_eSJMrhyai2q0x(rRXA26_8iZP5R}mH)_P z|C@gM_U$`<{5TRLSLW>OY{Y6#PEO=45+JY0L(bc`Z;=4`bTBzNdF03uMBu)@KIDlA zd4@qAX^^+bhv?ba*$WpgAZdu_2M!!S0%SuPj*N^T{cPE?1xZ5!T1MH_8$=$nm@7o0N@bEyMg^;wEn3$!d zrIwZ!Jx+0JF+S=O49pv!g!~OmJ$c6peL_nG#wj;?%fJ_tQV*>J7 z1DOTLTO>eUf42?#|M&495&qkTNQeaARQyNT+TU-YBIWDBe@t6%`>pE7g!K-;1wZz) z-fF$-HwmEse;@yU6XpI^!-W1r|NmA({tq7v^#AYRKk}T9JkP`Jf0zLBa0vbXJNW-U ze9?ouTPFbhhyJh2@EZouf9U^jsQvnoq5shTbs2uc0QwL8{|&WYA2ReG`oAv2Zx}%T zq5r?3_Ul82{zL!QW%vyP=s)!TH`IQ8$k2c2|GEsnVF3My{{M#BuMZje5B*=4;WrGR z|Iq*6Q2X^EL;s=w>oWX?0rVgG{~Kz*K4j=W^nYE3-!OpwL;rt6?bnA4{fGXq%kUcp z(0}OvZ>atHkfHz3|8*ID!vOjZ{r?TMUmr5`ANs#8!*3Ws|DpfCq4w)ThWNJ5zhMCVhyMSD+OH28`VakIm*F=Ip#RYS-%$JYAw&P6|LZdR zh5_^+`u`hhzdmH>KlFcHhJQDhpPxs5p?Li#mj2!5e}{bNKlJ}kdx-dt{01@d8?66( zX94sd`u~6FKQaZrZOCsEum3RLpYHR2xFPf(`v0euLw=R@AMXG07r7VwFPa6=f9U_u z{YQR)`wzMQk0az>@a@Otf8P0DUJLz){{LLUKj;6qiGs|6zxk(Q=s)!TzsY~(m*_u! z{P^?E|MFVsKlK0S68?$n|IEzH^78V}yZxKgLjR%ve_F+F>z_Yi=>MN~Z~gl(B>2;v{Iw0C|Iq(GZ6Kok-+zVY z=c9xEL;rtn$gf=s{fGYl+J^spbkKk3|IZEiwQHgO(EnfC@Sl$k`Vam8xgo!HE%YDy z|7#om^U*>7q5nTOM;6_|HcN{fGYl+>l?p z7WxnU|FsSO`RJhk(Epzs@@v;Z|DpfCw&6b?9rPdi|8qlr?ONzR^#9j3{O6;C{zLzN zZpg1)3;l=w|JsKCe00!%=>N|R`L%1I|Iq(m+wh-{4*C!M|G6Q*b}jTD`u}Si{`1j6 z|DpdsH{{o@h5keTe{I8mK04?>^#A9E{Mxn9f9U_OZTQbe2mOcs|J;yYyB7Kn{r|NM z|M}>k|Iq)R8}e({LjR%vzqa8&A06}``u}r7e(hT5|6lGu@(YP@`>P0KW@i570{rF& zzzVm&jsPVkkN_kA2|xmn03-kj zKmw2eBmfCO0+0YC00}?>kN_kA2|xmn03-kjKmw2eBmfCO0+0YC00}?>kN_kA2|xmn z03-kjKmw2eBmfCO0+0YC00}?>kN_kA2|xmn03-kjKmw2eBmfCO0+0YC00}?>kN_kA z2|xmn03-kjKmw2eBmfCO0+0YC00}?>kN_kA2|xmn03-kjKmw2eBmfCO0+0YC00}?> zkN_kA2|xmn03-kjKmw2eBmfCO0+0YC00}?>kN_kA2|xmn03-kjKmw2eBmfCO0+0YC z00}?>kN_kA2|xmn03-kjKmw2eBmfCO0+0YC00}?>kN_kA2|xmn03-kjKmw2eBmfCO z0+0YC00}?>kN_kA2|xmn03-kjKmw2eBmfCO0+0YC00}?>kN_kA2|xmn03-kjKmw2e zBmfCO0+0YC00}?>kN_kA2|xmn03-kjKmw2eBmfCO0+0YC00}?>kN_kA2|xmn03-kj zKmw2eBmfCO0+0YC00}?>kN_kA2|xmn03-kjKmw2eBmfCO0+0YC00}?>kN_kA2|xmn z03-kjKmw2eBmfCO0+0YC00}?>kN_m`-%5a>GHmpYl!b;OMjdZlujpPcg$c*=1v#WYUfIOu^fF@Gljx#FS(P3Zf4b^i{UDH#_r~d z{4B{jg{B_nH(g{;8C@{nXQ5bRSz=Xex!>aENm@#~GHXxE?fl2u+{$-*S>AG~9Q3KO z^S0Vv)IA+sv&YBk*4W}oM7@KrwSw|N%J@5u2drycGceRMPV%=%D@WiQwAj??MjkQQ4B+HgPO4oU6|5#^BrKLx=aOobQ=l z`g}OT=B?G+&#U$H)MTjoRACyD26}yFvW6p1_tJ{J*zYs626Em{MDo=|j<$6)Um$ z-eV%kPJJx;B@TU-UZ>ppS(1x9`j6ht-S>>8t-|ZsvFTc$IwEJofq`t1Hvhp*22VQ% ztn3Gahc+dTg$`w3+O&VDr)?qpdG_>5L`Tm(ROE1uC{6SWR{i)$ytOxH{0M6be?otc zx6qN7tdC@pU*=3@#X0rSYNd_liW+3J$yb_WjpcgVXOFWbMy9&jlzN?*V0#ppJf1rg ze&*F?+Ss$ts%H`kCN~>q6-{Q*CZBt~Ii=|0>*K{O=U?|fswkN{K2ys)wfW24t8Y$- zwq3t{khY^@`h@r3jTt5`i>jFurPH_GvbPvi_}I>@)V<@NBfaqUBsWddEQb;E-Ga|z zZ1?9lj`BZv%MmQp@}8qzrfpK`hC=&1C!JQuOS>h#CkvcL7F~nkayC7SoJU>ydIp0% zo-J{<2M%_I-w1ua%taUbqIGa7;pGP|qpY#}hvjl7K5`u`nrz$?d~xa%S9`^D&6gY1 zZ$ER>-JPxCT566tvsV|mtPoHNO9YZFqktmfO8ci(?)LfHhlct-uGWL+1f!D0gbUPw zoRpFWeViPC>m<(y7@~{~H?YWkd`D5v21xGF0@O2#dhjAf73^y?1|mGFfYrA+aYw^3 zfGU)TDtok9!`jnixY~oo_YI)L90K5}8UQ1BwJq>|xEvC~}=Lz;!?$&|yj_ z&Vq>}s=z|)F`#^jO52o{1Soo20hspyz*JV#Jr!L*06?M@sLXx@6n8=aN#_o=D#h)5 z0C1X81IlV@fI5_*>a<%MfLpxv;8D6}S-=BhKvsB14ht|$w3KAgYA@(>%thH~;x$GX zSThZUn2%_^WXO5yt-yIyXLKVQQ;HschTho5T=P;Jk?dXLjBJ^YJY-H7Ofcp?oe5Pw zWAut?Gc#?1R)NVR!=@FHRlW0ov4S3zeo@4#tDbB_*N%YYD}Yj#o&^0s#K)!{&2Hh> z=M^h81IRfaZCtno*n(5Z?DsNr?5(G^qX%TMH}JEpCoRR;lJ7gsv2h$T63S|EdCzvT z+ehJ4yW9L`PL`v3MNd4&o<8)>*PQDCT-)hM+TB6WbUkhIW0Y4d5R_-gI71DRUhc;o z>?#Adt9q@ay?G zA3viu=f`CF&;e9$!<{R<2FUzgE?evx23I6_w=Mftiyoz?6s*%{NCXraQMmnv4!~@? zf&ZO3;%UZVu%~?(WFhhxP$?VFYcXn>1h}y4n9RrW>X`-Rs6Rc#n+( zh!DmmO%>49OCNT3SoU_YSliBiZn*yx(Ts&0qQM#!|Wt(*o}b7-b&0Es0ZTj55;e9 z_g|sV=m-ekvg?V=3C#jlZIgV3QxjEGIts@-2X4j$&I@h?8%~Yz>Sqsw$QJ>VCQUB^ ziXxqOa*u1l#pTmcw6-4uXvm3y`199aeL6gG>+Qi+il*5^VQywylr^h>Ot`x!0NiH? zDBmoM`>juaY}4Fh?z&+hRX3MsPQ>9bs;IgnSg_T>7*P946KmtkKVXKNqX>Yb!EZAK zw)27dFbkd97Tqm8jCvl)V$4Qr@B^#_#truV95xtyLJJeszsqO**r>D0K#A;vRCA6bBNWMA>i zdq|Oe{u&K+{bG6wsQ>{LE}$#C8=$uuv1(9rjnM=8&P-ynMokDGij00E(l48XhB-27 z(~{BxanA&X1Zww@eH+Pbyu@9ZnsPE&ob*FePxEcm!C&gKO^w;1%zbdyi=ax(_XVuy zI&zYBr3$C!8VA?Ul5LGl2l-K0#R+48&Zx8%Ctjc>kTS86O1l~P0&2IX51d|)!8;V<+2rK7y=+m1IK%<0Dvu~?qLIt1%&cr z*RXQ0Gvi2^MK4=~UA5fTWqUbOl32)=4}g~w53cb#0B3gV3J)g5?8u?b17!QtQZw^e z!A|U=+8%mUfPPfBts+c~PW}r3v`q}w#BP_eo~s1#3Z2i60_c`a$X%c>>}L6(T@_D7 z5;=kLsUmVeDL>}=WcNXneO?xqE0Pnh6jJbwaa_f)TRsJ7TVFNf)F(xmRYdCjkz{!d zM>gMJLi$Nn*XC~lU}l0oS5TP%sBXq+;s$+zXlX~zVUl;ig6B414|xnoWZ&-*7)D*O zXr$O;J{7a;h4p0~`7=)`@x>Mv9HhGg4Mz{eP#2?|yB!+p38+gkzF_k^V}N3nCibbK z0vm;B3LK?@31M`XwZ;ba*raRE7&3_V7q(TJDu$CV4W0B9C)rYgwg;%9BvsN2Y&qRk zJ@U0%-8exC;i?}&!G<~Cp|>A}@#JFq8@TFv8i4Jt+} zkP^A*H|Y^?73p6}x-vOE_0w#as#fA&u4zECqO%#vV-g&?iHE{%hGs z!^6Ws|G?bV#Hf0}^f~k7rP7^3_2AH0%rPm7;FAzwD zAJo8;jkh&#N*{c)^6wPH-(`q-1n1^%!DTG%hk6rf4uaYWZSoLEO79w@PcQ zj?A8xyB{*2afRUtMwo{W9KidjX>K_&nKc?m!L15N;|qAIcD2kNuCf)6KgYvyV6@AW zRROtyN2~f0A9eshvU*E`oQ>e8}_nzZh_0H$|0 zgLQhHMhGC{QsX|AeF4gi@u${ zw<(MXAt&o@eXcfJshiwUx14!<|D(-VGt806+ZWl11#hz7&)ohrq{5ocW-P~s&&D{J zi4kyAPARx59pr&dO+KcQor!U3a9+lj>Nu(^p5mZB>XJKPzo1q&7fFob zMK3>3!K82q9&Ds~D=nBLz3mz%u`JJBqApS#6P=l+$4rb~l6;9h|1M5wl9od?Wy||$ zdGXX88o~+tK4~_|5PAELdAOxCGZ4_H)0_9P;&)S`mN-LBY9&%IoA1W_*pMIX(useSDv5EotGI3^r`v0B6YfPH(ttNLSweKJgrnszn5ci zKkWD&(<2uiv_(@3<>pW*A&<-&V)>r?a??{82wdXVUO zt~W~hW$TvDhlnv&sF>53qz%V0B8fsVjLUlnqZXNjWjgfP}P- zGU=ZF28NqVjY8X~<#MI;jpOvEQuHHN^b1?`GTTT%>ch^OmgeN0^JTKbal3Fg38dFs z^zNSYti;?gK4tr!l_3g4(0rr|ubVEDjl^*fu z)>Sl-k7_qgX>-1i|Ds<yjX}%L9q!N(1fH?!F^Zf znlVxD$=v}TF|M_ywY4{C*EKH^roF7bakS#vJpEkf-8bOOi}lT4T|82-YrfuK${fS9 zBxn1QlJuG!R@!hb4dc{QJbX-lT3WCy@`+906ZfM}4*E42C`vGI$JDZITiJ|WU{~W~ zG3k^r8IJFmox<2-J2`QsQX<5diTt!#^P{|#qy_FHNv$VBJXC7w23D)e@?xCxpqO2 zJK@zJg}QJGA14M!My3ml#J5pW`=OMhFp0enhFLNCC?(!Th0w6cH=4O z$1%+2c9=JUxp%5CgxdfJ*|5gtr-u+PYiXDT$@xa@ko45vd6tlRI-hp~fh-<_n?Uu} zCN@?}UP#xX-rZ6bx2xiGg28dYu@gkjlYPCn`$f*wuH-ckWBYN{#G=^3mAC>WbT2W= zI){;%e1x_(>4;V`aV({OIQoIAr}FmJw!yQM&kS){q?i&D&G%_n%0tUq8YQeV3v@Nv zM`wsJo5+wg*ka zOiwouc~@naMh%TWMAygFruq>8&EAX38Po5`yjCzGTTfJ}7(3+eeQbHEZ-}U_AG;um z#$-M&5XLw?ylH*Rfd!4uiy7WQI&7Ej;2t|1GKOh;bw$~8sALqw`Q{Q|yg=3rk^gOC z$vlzWa4-M+9keV&=7o9?V?%R;82I>xb)0Ng2c~s*eMl0!h57vu3!=gG0f#KDG3};I zCK)2pVMPGHAsWvbi5JPmD^8Y{GV7DQ!=Gw=5p!s-!m!i-$KHDYHMO>D|4%{-z4sPE z=w0bWdhfl7^xj3JiG)xLy+~C+K$=RIA|O?&3Ifu*G(iMGK|xW!=-&Ih`#tB({O8P^ z`Oi1s?8#*Eu(HaKSy}hGuIIjf!Dm`J5O+3^aK0kR&h;u?&IgZ_cN7&XM0A}eAn}UV z5`-5s-abOuKlc0*A&g7N^0^RZi`RZXaVf5Wu;A_VmJUXJdyzL|mZiD+U8C)TC5(P= z_mxW~hnU$X0F0TyJWpbbfb6LbMvv%Ty)Z_|XL?H!Mup(+{TU62U;mIeas+$MQpZvLwENt*`>8=WGUcw<*M$(Gn>R|^XSouz9mjceu^hRr51$98M< zYJ)>MOOGMki2&vVL#E$hP>qoqkJT}QCd3*oB|F0|6ZG!)D&GvIr2}QlM#J{QVP#m}gHL#!@im z-PVm469%SOD585!YoxDdz?K&E88B=Pfhu`<3~I~646*W@-GmyhDv!>m{(fE!oDi3ys(04o%Q7n7?!j8NKf&sP<0$iz6z}*I*lCxA+dk zdsjV~ANdMk{23DJ z@Rvp7c0xfwCTIB_v4Hw}FZW9a;4x+1^y~Fml}FN$4F<8>m95|U2>W$j$2}t*qD@eQ zSLPCAr0`r7SHG$pc-7*=Cx5A+DCwXCoezY-p~(fKKHDIjIvaz7NiZii-Aag$)CXt* zEuL3F_|19g;zG)>8>W;V*)7!pE(|ft`V}71nfDv!n8eD=wQ|foK)_nu{`M+s^`cKBTxxmu=-$? zeR3}Pnb7PyYY^c*qhN}-U^wxZSW&R7M6lK~B3$KbAil$Ah1TPalSI@j>3Cn!g8ugv zu#_|V@^6Hio)3hVQ&v_!cbgj5nMwUL56X=S`H2c8kEZaKCI4~4+!J%xq8GO6{}6R+ z)VUq1lyg+c41vdfglB3P5W}1|8grnlab06{+7lftdZ+&}m*06onKYBKyO2n;e*c0zxRg)0iEVzA! zk=qElnVV1<_EHpMTVsN%&-%uZ{Y_l@n?~(7v$+VzbQJ!YC`h((FtB{puM1;;EZkFYll#*T*^566^D)p=T;Qp! z1cfOA{s zD&cwd54@2BIB#Fe;__c`1nOCo)SXBWR{=<;4si)Jabr|)X_yAwnr&+>y{Et7#Sb_) zTKmjIs8>vTx7hm5e2W|03Tn6Wn~fOQK8fhE_n$q-C%}v8a}1cfp}|9&)S`Iw>fBB2 z(QQC{VS?7r1(=LkPlO#p7S)-_Je5e7l>q6Z#|_Orkd;Bi+5*7&79qEK4dD5^an}Nf zz_Zql(;kq^Eh)SW7@r;j>T-ME6D54V9!T^erYfQbI(zH>>$Xczdw^nvlnEe=?12pR zgSxMPh&^Iu_rudwbt=PCAlajY!v-jgq=CG$R)RJ@3c3UzF45fN9erG0Ad0z7F$XR_ zdl7LAa3>hRRkh*yP8t-1#Hyk1)}|mIpy+icRZTy9MIjZ)pikAmQ)c3?9_aP{6T6}6 zRH8y!fX?Y9!;&lC6e-eY`BAt{^(lo{=KzuJiyK5GD6%7!lx%8gATX+XCL@W$5nRjb zhpX*89-dSpJ1M^EQowS_|Iq=jiWw`R%J`H5rP_p<9izs?R3wMiq*)=K&g4|5nBHr% zWf_BN!3YjRp>hdrf8uMMph%RM1D9uqeI)f%>%UHg zSoHuNmkK0p9w2WCUvXMc0%2bFJ;T@lR}8u(!nOxu9&jHv2^YKE1I?7{H%1&^UGBlr zA>;I$M*;n^HGsdWg!4mN-U0F1&%ylZokaR43eMKKc~$`NW_T_agTl+<1;DC<&dXT| z*rwihb5jENVN5G7ErShuFgO8in8tb=vG*pz^_!X2yTZRIL!czb{wOwAF zE%RgK2hunut4|I>On4o`l|aP13ZBY(ATcNkv?6*S{)Z(Gda5h=A>9*wb%XYE*iS56 z$^nI=xdY6(J1s5h23E2AdUc+1C%WA$#hH(Q_w*_?olO#iFo}9x9^gwOHHMOD0gxr3 zJKVw_2^2*n$zMX@<-wEW$*IRR2s5i4}Rxyc4#K&B(Opfn%Bz)9@ZZpWd&gIGhgP zNJnq>NqK-vh@4#{q_KkoHSNr9_>ieMUNO{wV#)(RUCM>tn)%i?g=^yp*2oiJn#uEB z0P7mRhgMahRF8!4u-6J3_A5*JtSJO>4C5%-b^)OB!tfb~mm6z9V%g-K;gTc6UVI+_ zA(ec|kb1WV$c#}TUiW~Ff*vRXfP9l(eW{uc*-ROw0JQEUw+fw4ekwsCFAXOclJ)?t zajI2HO&U#{&4IZNDKD$ar)RJpXk^mvS2JE%MsXm+;&_O|fL*b^NYID`-c>0H6z&}C zqL&}9Ynhlu=?o%4nU5E-3HK~Z$|y6o!wO!32XA6jAU=R!Sx@6N91u^lG*1#%sqJ!c zmqVEpru-Im>>=}2QOhEq{*WJaco(q)TGBb}sx+cmH5L}h3X z%X$|Bh{RG2=FTzN$eM)kc4AUTNnK%?-D4&)dz_6H^s6OD@2?%|H z^G$`-xvfkA*>Z!VD((wq)=^F;tQ$l0gZf28v;ib5uRCnP>cDjjk*j27Cje|~8v~KK zUXrE3*~d9WyS3$yG*KSksk?EskOSW=P;Xg!I| z_b752zbw4#jXkWO?VGbFaV(ICKip=0HWx)fduM=cZ#~=#)Bf-@t4xQ$ zY5*~i;Fa>S$)LYdA$4lDou|EE9bH>eI(&>)0 zG9>D;JPJwDdOO|&sCVwl%a0^?)lRQ9xbG!u9Mf3{g);>0q|nSXIU*;fmvD1$wB^<- z)4b%E6>H_9RYc+WQMvfFlNHqOCI#%w^Z=5*OsBfIQ8JN_@v4xk&b&cdw1Qt#Qb*3a zA3UZW>z7mX@MSG;`dl%+uxRh&TiDzz#&X@@8xmYuXHJW*0u0{@08p5+J;4AR=BIi2 z88*qiL0m_aan<%R7pLi=>$XoJmDB#-n;&L(tfZl;oNwPgDC%V62 z>-12_M^<969huk4A+dowdUT+O%(8ew$)Hb!!^li?{uJP)x;VU(zQT_r!J4?yj>N`# z6b%=6sMK3Yk`yJjw+svFx~_+tzEa?85Whst7T-d=%DhqRlJ^n6z2x;1*1buz3MDaL z?iV8*q0gEDR0dkZz4=j_chgh0h^TDZTiW(mBG-aDTUWlljr_3uvnP}tZ|$5X?y%qA zZ^*b|{is3`!D?EPizIfwhqI2j^Eiu2{ffw(ZU}+`2B0EpcE>pe$eV&bp2da@n{jRU zTt=RhU6g%KoRh~68B(@x8+a+XcZzz5n_%aC4~JJ|${hggMkePwc@I8Lmom7IM%;cLj%PA-a?5|to89|>D_YRzC&4;k&&<0S zJn&U_wbgx{`-`E{mtqE^-Ipv50B4+v(}iXLLJsNMF2&9&2XJ$XC><-QiM&+<1eb_~ zFK?5%5JP8v4wE6$pR z!0_TV5n8WN5a5J}fMDIv3_=t*U1yl?0WCdqB2LMdoiNCB693Y%IYKgIA`Fl{#i?W_ z>hDJ+JjG6>ucFpPH|j~SCu_jEp-KgD`a4eF_l`Y@d9LpeY43&*$MwCX4ZwlZ9f~%v z5ggCVUTf+mw>c>#PIP+B3<1&^JkX+;}oJ-bN*JQ*|Y zGEUrMqP)*!T*;L2Fm2o?)n$OF5B_cxE&QH_5&4xHLG)R8lH-j!D*#RKE{=L(KysZ? zJ>6R6IHH$>wtfzoHYbCVCHUe!$W=-XwHF-8p$B+03aQD6v{V9eDp_EI2)dZ*x%aa(b}f#z)udTzheWStR{T<^7v6ctu0JgxHdx zq2#Ax2$io8Y@LtQ`#SIXs8lTibuosa^qF+>y!2k741z}{utnseMqHmJyQzV3U@lvk zk-8RxaKJjXbFCagn^KAX67=(rY8aw&i#E>uMBt`T(N6;*@)hq{*br+FUWOsaD#{r_#RC|=wh{$SbQaRDM zZLKk~r-?^37SJlF!lUqMU07F+$YoQ?-9p6A=p%xy-8+?g5F>PLo%5RCWixUUT22#l z9+PYVlW7rC=$?sZB0r!; zl21F_pLPi}v7!^uK%`odJR>UH6}@eWLIuSN2nfO~yZ7Pp#o4YSdcwSCoyxhmb(YPc+ z8)n(ZV?}9ZjH?$d#%?{OL^newd|*kj?!;!n6rfQoJVC1~iHo?1$y7oKot#~uy@{rc zF_lzwp;L9S&~(Ysbs6_Gb?09hoBIq!@HnpVl-?AX_zs6UogNq)l+qd=7&)!sifj_` z^sr4hNh&EVcyXNz8Ambjbs>_kHcGSv(nzSHrR;_EMEP9UMJXX>A2~*bU-r(SP$UA^ zyGBW-keKKAIg>&sj4I`?cuSjBraeA;+R(H(d#Erp>#-#xc;8+<7qpl|TodwLf9%Jb z>*s0bfnfIMDzKqD)y+8W)g@c<$81HKZA_0j7=$9*_R43l&h`Ml z0J(S*IwbSyCcE3iIgopzP5v7(^@wCoEqgEXU{6X$8nJhzz&N^%iypCqTL| z;G|W<5ddh5xJB}Bpg+jp>O$auk}h42&3&FrKQ?pJ84{YCkass>?p`9p{X~_ckV+mN zC`Zt(t2geGI{H}%C^IG#_7td+NcXO?2N@xgWW$_h$U_$%tUEiQq*7Hrzu2ApVMUGu z9gsBj;PhJ?`*J9%Rh+0*)x8y`R@%S+#f8&thVckrC^WVOj^PX{v3MRMXoW0LuY)N zM29YWs%TU-mI+C~xJtEVQ%Qu8s!7QH6m!q3(B8X5GhY#WfuRfJ&g6k1;s|s5OvIqU z`+34I?{2n!$Xj<+51~RZ)FOiH(4|}kdvc87+S#Q%%3hZd;q2z6l0V7@1dvdraHq-| z9<=Lp)H+|qMnWaex3b0xn`;c5;V2Yi)wwL@G$&Eu>&0Lu>E>{G<4`AdB9ixnvWPVI z=?9-pO9udsOcOoyon|Lob`HziwcXM1~lZNLd>D zP=-Hu2*}VjQh6CaQ-(;SzOn&U7BBUT>L9$wqf}nd9bF|tJJ+OnA;Mn*2LEJZ)Y6-@ zVkc%tV`+rV7Wvgz?tKhd!jT@wDi>9yHB_|u`O|-Dm;FRDl(e(s5@bmW^O9@XDyp!z zA5kD8nmqF-Ic&T5DhcVn4RgzlZ7)t1dG2*4%y*8tr$lUZp}Sl8Xj{FcOI)drf%Y@X zLHNW=j=9fwy-F1H4{m)Gx~3A75{gT;?o6ziEW}K3*9co9M%o=95>6lb#HIS&U0XZ& zh6*BvmZFAPVurOoG!9WHRqFuSctq^B!F^In%RXc%oo7L@7?TUqYDyY0O~T;CeFJ*& z$+2XETQYYHD@3h&M$8NP+~D|eY#(Cu*h`eh=#`Um^5bhz=qq;939(Y{Nk_$3Gi-o# zpQDvN-Ll5h@b=g`W7oRVtCvA;xz(;s!A9%RkX|yt!h%S@nv7JXb0_S-m}_hy9s8LM zS;!R9$(FE;XjkCojueU53|5BrXo z&W5Ql%Qxw^taoJRBayi^Qf>W$EL#s}csUB(%3>4c&*w4gT(jr5mh6U>3STTOzgos4 z7_KBQIm{y@Zp6qXiji8^LwOwD_}&s%5*^jl_T`x^<(c!`+(1l`6%nnD0bYVlJzEFF z-GUe2iFOe5Dz8fh&@rx$-T0%oG(jOY!()4YlFP8~5z8KX6GoNxi ztrqzHVO647z_^pA^JZnGC~47O3)>R|p6V$oPEd(A*+l|Fp|BhrF3D75RF9W%Yn<` zF?n84#2~t6;r;~C0ea^o2^Mu67zU7PyY~0~bN$#z8M2V}o2&4tur#LYhehRln z0BWGLmTo1^MoAc_vi5E#08~=OD~%i(LHoq0Q#3X*=8kVFb7W|3W?G9E8S`c9Y-P@0 z>v9y!*W12r-Lw)YQ)uw^_WbdWXyp>4oh%y(whZlZlijR^;7cXO56s?WTXFuV|M^Il zRbm_}+XEb}dPtJQPxUu=>}>9kmMTye=&{c`G9cg*psIOFpFos{agU#rmcOBB(6LKX7h%bi$;*TK!oW* z51tUVlcqOA_7nwL+0-1i0L6`Q5LCi{^I8wM(v-k8k5!%6?ysBX{lQ0VRBXmE`C~f- zvUUdb^bHFK4Bu7=$Nc5)CG41lEAY3Z+@_!a;yn+<_;3LZ3EkId9ZG+!Xfxx^CJd+t zP*pf2k_-?OT#A7mQ2_b=8eK~gRASKKE9x2?wMo)+Tz4joh9-X&O|hvEHqD0PD7e-I znp+61M)5SH_64(CZtaGTjWybXSrq{9V`J78T{yTU%ro?~3qU{7C{U16ivpcdIKY$S zReiq#*i6#_&RBiFc*rX_WayG%&~CSq-mN>=+{TN6s~U1Jjt-D#1pu2#zMwnGEkb$5 zdVHF}k^p+`qxcC5PeKC_G+!vVIxQSgnvfuIb*81>^H@(x}1%D6JPm z+>^Qbwj}|v)hCu=2qRT_q&OU_3Vhu7Smn!eM}akNd^r z3-#Fctn+a|`KcJ#jk`S0It@hOR2rtk25FbX4aqo`5T_=0NQy7 zd5Gc{d$ta!L%)ImI0guw6$9@buW%cu>*2)^%J+caRttc2ed+jswxWgDp^^5j{e(9%D`uBIv3=Te&@|i2qSx9jR89*vK+yvN8yIUSeYm~? zM_Lsxz&)l1&`eSQYzge&+3FVOP;x3C5h{VHIQ)7S86MsxjcVv6V(h)&jtAhN;IiF| zB~@(-gxE=63l^@$>zQN6wV}~WpycLKdy-G>bj>i4QiD%j`T?y|lVuWaMyYyU8@dQQkaBG^)G3EBrZ)=lsJ6zYB^yqx>B4@K02VTLlh z3hqr`l&BxxFl;+hbU*%COoJb7Bul95As%(lj4jTnol(^zn7oumBf(gfPhCr&uyo2T z#kgHY)8mA_j3z$AM0#0+kBg_ArXt&<-CEZ(SfqlcKW);>Ro}B&s*+~A(6l|w(DS&q zBI`$qnQVfwmxSg6TJCbQrfefGSHp+28V}56ADDYJTUIv9R-3oCS$dt=SJTEfSjc2s zJmPY%p{;1PXrH(B4)#xyxbwtPcGu3kIi!wuyVJ5UKuPJJXwm;PTJ$x&$S9fl-=anD z70CMu(^)CYDZ-UuMaCq*qD4M-^n;XtM2mb{)EutqL=PUlk7WN_w1~1=A32igQ~0-N zQO(uM4MHz6{}wHx7t(vJH~qJ0QO#?$UAezSi>R{pmBzFF6)o}(Q=XVg`B$_^yl|4{ zZ_y%sp?{AS9sGN=sCDLV(IWkW$Bg}{Z#Nlp+89er~1Tkp@{yYV+BR?>61c#yR2Y^DA)PVg>}A> zpB1`;m%kK#h;$E8_!;-+v`8ey==73e_SRXEf1zyHrKs}VuSIn=$gh{WoAXpyoN53WNKV~mj>*`-r40!LhqSfiBf-cxPDH)?!w2DQ{G zPwa@_#EJ!qwlJz%`I5eQ<{qEE&89jRNxmQ`hoK}xs97bCIAJf?#=_icGsIL**NhX5 z4futvN@$(>t&@y>od!bN=r?d3lXY@LG^9rvH`F|hj&dY4=9ZZ^(4Hw7gR+`d`>ZQ{ z@@bR@mo(?ji#7_P(oM)zw9E+MF5(FpCc+wQo|K#}u^E{rdRtm&d|aFT`L{LNb+y|R zc(!m$E|^?5*0I*-+fu%sm04k-GjAvG{N?^I1HCAcfh777~q?F=898$1+{y>IR{ zVEsr3{b;(q({c}*^r$($(Zc3skpQcEjd^X0PxN0Bhvo>C#|6sfBmv;vd{kh zP@ARjHnrUCAiubYb~OwN^-q=fpH_)~0;vB4Q2+M=s3V`gvl~vIH2##D|MG)9ZR@O- zJ!JP+0QKbi1NPR_pKG`flo3fr_YNUsO^q-bEAW+`u;Q%6Qr<9k3iVjFUd zXxm=M_zG?HxAA?%UWn%-MYaT==24S5=~=UiR)~*aC+Fo}CgfwQ#6;3-Sx;=0kXVeG&CoxS?gad}Y(wJ=6W=R|#i| zJ9v<5x4%Xk*^nwPMdFsw2*(@E3J7@wQGYx zn`8SN779(LYV;n`8ay;NhnPKVwti&pD>ky(%F{Kl+b%eYmalr&i+4=fOCd+w`05TUy>ZL?_S{X(I-g>G!Y)}+I(rn#-v z;{D8`K$!mlUN5)B*Eg4KQvyc_A^&?-!QmAX9MEFtzdX(O|0|YY>w2gCA6Noe0^G)h z{{~B7G35H00=LKb0r27aK>DAt1Qwp|FaCukxMrikoy!<`T}>3|QSd@yaXef8g(c|R z{vwsP`gbfryLW2=h#rt|0ET9O;C+zXzpw-fLpUREkHaIc{KgV&d@AgO(F72DnK}8U zNdETAUs!^q`=ii5umtHotORX_w|AP5hEMR%JAga~7EAC;J5Z9S4JjS5{0El61-Vlm z@VIIZLRoG57nWe}4b{-(Us!?~5bOwm+oe_;too;nKtr5(&d^iYuR7b`P8 z@ED`vxWxcmOdgOKyIs96_ljITTK+FA0rLgc*W%+9`lc?+%m#2$Jk3d(U)mut>x<4W zEP?*(tap4WMnfMTskJ}$S=D$wt^W&4;M1!+J)PoeJ(FE+YNU5U)n;baWNvJ0MMsLo z5~Q9uI?dDRXS>d)GzY3y2dk}KnUM6Y@y22ani}UmFL(Mc(UbN+DEz_;ZY~qYl{4F9 z1`qwA9ZGWccOzEmM^A1P(eHqp4#WeqyvvX6zF@Hg2DF+hbHBAiirCE}`XA8#X^I!0 zyw+J~OBP#u5xMR0!U@Fmtzt(UmdPHGezhK=aNoEJ5K@84F0x#j|URdG2?F zQ||8)U-2*dr5!38tv?IDcGi)zEA?Xfg(XPf&aHjVOg7N)P=^EC)DWQ?l44m~H1bP3 zB-I_*{=yQ#Rz{nA4LBXn_ZMGbwL>oc?r-f-`yoR6^S=MrdPvXFjXI$hlLd-mSnY72 zF!-Skng#7vU{}Cm3G`C15C?y|*@f=}Y$wM{x%zVyD?JLuP`Dd@>f-O zxXSaZD!dpv30-wjOD?#581+j#SUk;H6USBs!L9D0ro=Uf7Ru-XRyz=VFaD(+de&~;>HQjIn?F~#@-woCK~IrFkz|;*L5lqykrFi=AL$~Cu6HZ3jTn{2p!cmuB5;s zNsZ|Y2Ip&mshSTjYF@ZmN7mSBd9-jzbDD#N^Ef(PlTLP6`k>$r1#r$}($JbJha<0L zWNIX;jL4APFVjoPob)rez)Q*Fid!O?X<@7#OxH`+bSJB^)`BgcL%=n*LFj6xwT|0E z6E3snT$A_9I%i=b+YpnS+qe~4ISpdmY9kj+zPjqo7wB!Xyvlpjkb5toTw=S|FaNfi zpZ=trxZ9Cl&i)l|1IAIA=RS*t)V0?s!g}T0Dd&AF@Iwu)-|O(0eYt0PCFE7(olPCp ztb0>rXo|K^${uPR_nMHEMmTm#Rj!l;$7~74)~YHy4Mx|?ITk1GC|uwzXD>6kkZf`R zeXYlikB>|Ew#mG!mS?b7s(4O5wKT%JxKN_fq&CmAJ(6~}ToGBnRHk|-&Ui~m;Q_5M zn;BD{`ZTr*2VZ)qy^wA0)zAE3+9h@Vd|4OaM$LcEqQ>mTS`o(W&(^cM23 zHGJMQ6*dUC6@uzaG@i`1pMTk_5iS`s2)F!3YK{DUtHG$HXTnC(yJ|nF(Zrx@UQY16 zpwABtvogFpUpig)@i5xg<0q9mF3L{n7bt3ZO)kt!x%vh-1X>jNsAtpq)C|-$NN%rO zV)hi{|JYS6`FY)vI3&i73lcM# z`ah;E@AigmvaWQ}*W|D8p6}L}Q*`Ez9WO=fMlR7Fq@)GR%6A+^9qfPZVIYT6d^<*a zc0THPA_5lV8DkEk@q6BWEoFL_5*yGT-D%}cX5qsfUQ6nblovv!xg?bksIK?yZDjPl zyf2A?u{ZiphnP$+TU@X0t*v=7%ck+(J?$zU+u&QOjuoGnjEz*q5k_J3=Ea~JeC8iV z@(qz|f)BFyaty?qO0%t58ge&UbY3#1`n%qjL3@t5j2gcZb9=gcF-R<#BTizqC<&d50R`pnlEE2z-Q5+6`;+#)=y(uUE`4g-f zTjsV;{-Ivb9%16y#P=Xr?Qk;gYVVei>7xzq*cqlVk#~)i&bzi{Gj~2ndXk3K?N}6x zSomez??*SBNDj}NQrlABHPv}+@M6LEv9+&4jYSKkXUp?1-uufDm6D&|WG;$ld6X^Q zm!jKEj<5{&oBhy6$U2%W>m1^5=Ums?ayHZ9Qnl+7()9$_Zn=N}E&qK@t&WR-c!@q< z{ea+EXiWRsCJ(RmvR!}Z5OkHrJ=HhHMDN2^k)(V`rp5~UNSJEQ%lYE(AB*gorB_9^ zZM$z$p1+MdyC<`JW2i7_cEIz?g@7kFzLf?XgiVC2j#WuFkNBnDe!bq!^Nv-&!l?6m zr);J5hHXqu@N6_!FctmYa$4cZ*vR~HP(+s`ebe>1?x~KDzyrHi?bO0=mLrD3KG?la z4!L=@dQK4iA@W;qs6FYMud}g7Y$Ai9D|YKoLoz;IF^mi&=i53T%AdbtI~umC@b-8X z`z1`948J_R(<$}f{;K_)iEDo@4J6c+4P0&!%D=W_Ce>D-cx(B)^qZN zqaT_hl|PxcZmbr5+R1(SmEG`Nr1k7^SL^&Yd%yH+QEgv-61+K!ia5GyKYI2fZSy;O z-RGODbzi$fj(*s`I{56r`~Bz8S)QWv_o&tLpKqW4OoxB~LQok3j7TA(v=Da@2n8eL zkORuS0U76l)(b(m^P%ZtH~}&^6^1xQ3b>-`xNelV6xz6l#&}%axZ~z{^>%n$v2ghR z-o4g82&jJ$Q2!vH{-+42e-!vX3jF_N1^!P}_@^rTQx*QH3jf#mvgs5w;0M435C8xa z`vef2-{Tz|?C{U=0`?6kc8rUCyS^I=aQ&+)HqDIvH33-bcw*mbD>T>fjn zw119&ZBO^-7=<0v|GEAX?D|X)yx+$y#*Uf)99Ln-EPvY%D+CG%u-hGCm-GI){MT{$ zu;X8^5P$;|{fK_gaYy+D3B z@KI^}7ee-zSNmTOvVVBBzYwxWN~%8*vVZII_z#5a?>-NrU}|hU=ud>~f9mtVB4nF| zo@XN4{)UhprT(`*kFg}Z&VNJ5lHw``v*eymseZk%Q%(Y`5Pe{X+QVdtNjBZtDmi8`L{lgn%`dSZ-ngAZ0nZq1OI`L zoeo~k_5FpAO^OUyv8>tu?bZH)kX>US!;7BCtswmE)yBQa`wJnvp7-!1#%b<1LiU$e z%lIckR&#^#lKEc<*|EJF6Ez@POG zgzU%UmQMmjH->@hClo~g6$+PL4dB>`2>gMN{nh7zMaU*?ycix*^a0F~!{Ay73R1a> z!Xt3fb3Gk`o&yw%J>Xk5mbDy?Vx>=qd^`o5_Pf*;Vs<9eWnrTyPZ-z;JYy-c6v-cb z8}yZxE!XhD^j`2c*1}HVeARLkYZnF1&@c!L>w*0=g1GOaEo6kYP3k;I?2tzbCF|Q4of>=je>NVj#1=!xxzX zpk#6he{oZFZ@Zjnm}a|%x!LBrp2a)oyMDsOXpswT=sD}VTI4+wb3XiT45HG9~33;zUbQ@Gp_^?Q_2o08CfaA6Rs3PL^Q!#Kz zbO*c|3mL|d+YajXKPSNH4Y0=LJd@mFOFw2{ERRV%1YY>8Yz<5{+@Cy5gt068cpFuql(F(mA~{! zkON@^$Q#4~*-kMacxvjiUxvn?s|UDQwp^tM5dc0hD1n+}6yVdi{%(0OACJ1B3E=at z>DnY|G86-MO)OK>`E_duhm#@z!SE~hXAmh{4%K2Q2rLm3dR06&^$b2|%g~gGf=VXL zJ;Wd8+oy8?JlY?LWL&B529>GsVmYruu7=4lZ4A*`r$iFm$Sk@otgEp-!CflBS(cS^+a%mr$J1P(JgX(w#AbP$9Ri|vnI&d^jd3se zl2Ncx{iiun|Y!B}}HSS^}?4990B`u?5 z7JxAuOO&sF^;J`ow>bnH`x&fF_qks$CbFs+B7RAw2v=GwY3oOE)$bF2^wE*Kb|FUIOm8B$f54bvm|!B zAr>Dn!~85Sgxpcq&)6$;rU%==FLBtU>@=6D$nzde%HjxF(}vgXIEWjciQyCyKX_W46erqK` zMbQ-H&Sey-hO&g92S!8%ofd10tEz|qB`BW#DY1T5~p zWmuw>h?3B38XsnnFQXy%RN021A5QHuGB7+{RI z<$#k#aoIs!2``nh7&38-mF^w7+csQ853N}8{iMc2E*Vbm8as(Zls z0{K*UVcNUzE+DwRZdN@3?>#F97ezKK&>+Z4D^=qQLQKsa z({^YoB1P=Hj$-dGV0HILB>+E*)m&WaBVJ0*Na}`@_n(Lay|pvEx0j|n@p-K8b*JKk z6BnMQuRnyoMp^ECzt{TZ=Fd0hQMsRf+?)Lt6?K>>-K$C*bqw&tf%u|9M*zBDIH=A6 z-OkAZ+p`7$sT7g=EG2u9Q^hwfi%NVvo(Uc%T#qh1 zR6{|QW9rdy)r{=xr9E&o2U@+-`_tV-V**|P(Sws~o%DnvMFIj)(1rGfNf@W$Eu2*h zKN$cFDtYMmSOJMph8hzesJt+bXe#T4OAsuh;M#?YNiszbJus+|HWNh*=L(3Gh9!%# z_KT^)rBpAvsw!cg*;YKes`U&7gXuBiRWk`VwJNv8R5h`7#Y|6x@nEN4B0jwB7PZS{1+5u`FT-q=| zQKkE+44nWz)YV^X?YN+#RaJ#ayzoRWH#!VjeHQ?8?P1J_&bJnlTzGN9NY))(BcNT+ zKhj?a+l(337Q@1^ha*z8lK2OtF(RCA2zJo5dgk|z9J48SFrLyV!4zT=St0MmfhWna zg3ZKpT^PiN_{qa)!59+UI4zf3(uV4T8eT*$=ubck?G!}#UX z$FZ$rJMs8ja03(@M&P=@^9@X~vWYHN%qhU9B`;>C4KuS!DwB}JAO%drLZ5TIdY$ze^JzYA z1JNjrRyRq8Mc8ZY5Wxg1v1}yFmSx=`TB%?HmZFEKkDgkVHv29!QR84i>S)30WFh2i zq2OYn?`mP^X5n$q_{rVd0g-)K{K`r|6K#nSjV~g6gBq!0hK6AW%I0{Lfyw0?GQA70D3bb8$Y286x`K0USljGG>=5`XTzTL-g zWe{*>S`l(vF`%vZmgb~0d7D^7%sIxgL|`|DDe}^Lne zw8W>YAU*a`M^6lFkR;faLT>^S7uM2)mbU`(enS6zT5>62E%ghmEbZ50};jE6Oh0%Q_MqQ=cT(rBMzlGlfk8$65q zPbXghc>Hn!3d8zTiWg(|Tv>2`r6FY%GdgzpWY~^qenK?EAn0cg@v3Q6;_K(D7$HB< zc?jEYvE1U9tO4&McKevAf6M3FoaF|0+?fGSPq(^%ItpP7c zv=hK&HD4isagi>hr>N-P!m!{8#BpCb7JDZ6rMl#G#aya{cZsZEuq7&0lFMt$OLa6}adgzTuFvQcG8#~^!X$p=+ibJyVp&we+G-N8 zT{BI!tBn!VunIxtcp>;rVf$@)=P?E6l}pYCiq1cjT*#DNSe@+;?`WG#53JLI!^GkC zTNtiL>@Tfs=Ambr{026o*3uLE?{9T^pmnH)V6|%IpYEC8RG$sFqYdLydCmH`of2;6 z3)`03@IbGG*Vrvh>gULAc_fp4J%C=ZkR&6Gfn%x!DqiMUZdFrlJ&AYycu+Iu=&*)y zyP&wO;d=SN4Yp$L>KfhRXJzoZc!O(bx%gJm|7q_$fSUOGb-y8$Clfgp;Afb=FsMaA+*M7jcs^b%?S5eU5rp_j8k&m7-#&OP_EdGEY; zmP}@Uv+O1ThRL(vJkRGbAmVtZgeGHttX#)&NesQdYu!&E&g*4aU$d$7w`mEm849$S z53<<}zC|Cx)pGrS-;haJrZ!-y`Dg}_Ly<3Oh2uvYS=UF13h+i3e4dPssEm-!fpj=Pl@v@Jd$gh#SBL((7<%QIUuiH- z@W!-;W@w`nPx0gu+A`=VeHJbz=d|uNf-4tQea}`+cgmp6_E!95&jOr4Z^C=L+eZ#90r{c!$ib zen&WtJW}}4z%p7$9K%(1e9G@S-Q9Emr4ZYaQc>Z73y8j(#fTF*pMTp1_ha@||NPst zCkpGGa1pa}mqO;$@dVH6g`r)i`8}sSz?lK&%uV4eT4sMVv0qKBOGgMd=3m;FjuQx1 z?4Offapu*J(RQ|=MZOj95c`%DIjWF?JK_X?+!bn=w08-z-_)ozmUJ$dS_v1)DKyN*ZpQ5j6uC0>x*qrXDZ!`t zI>zN13@_Dx`)l0njIvrI0hebF6FiR)nFV3yuJ4;E*A8Ad_Z(3ma(+V8#q5l;gp^yW zwA-+Z+k&jyo}4?w)k_+b2jmADhdvGMEaFD32irm~xDp8O%!eFT`AyAmXV}ZCapq=o{46OsoY@$(uR&FZH*^;xu;Op>ZKUc8J*=wi7160N&Qgk7)wMh z($zcEgCZJHpE`@9FJIxC{}AQ*dD!CydWGB9tH{r*%HOLsz-u_rYa!_9-nA%MR!y08 zaatqN(R)fmZxE(~jVEKTk6mmX$#r**Y@e$^i1yh6_f85GS_mvN+v+uKP zsLzMZ!m13Wo=n?0Og06h1un$*ypKk2*vT^wnS0_Cs^i_xoW}{Qewhp@{7C3@2x$@J zLU7hfNqgh+WZ1n9jPTs`9pl+x`?7H+XltR$Z?D>)p~j#4lm8j;-FV0w@#vhfR`kht zBUy2y2h|axd=)R#lXN+p6L_|Y(Y`d#a8hl}&NzlkE}T=tU-ViKp2bDTkS*csxc;9O z0-ws~`w@|EU_7BD_=+0IUeZstv+Jn1Ns9$Dgwa-X*oF85Gdr3qw? z-928gdrojyeo=UDyf>2gSL;NA#AI7i*p6|jA75aA_aii?_5v={kn-yovHy0U(T0(* zSUrQGP^Zt@00Qpu5n#G1cR)!F=%EFEaZ|YncLB;b-l6>$0KPAlS{sxRDBd__s}3Le ze6(<)3bte8PCfQ~ikfw&Pc6~oN`{6_=Oz_(`1KsETV1{=fdrL&9ow$WaD_ab=jhvb z-~T>0wf?3{?*{E2-(Ft%&uS_Vn5f+%PhGl5p@?F+2VbcMMDxv4y8*iX^{_}QfWg6r z-lQ5REd$OY%S7mw{k72O?e)q2CQKEgJG%uW7lNW_wMJ zlH>Y^maA~OU`onMtrw_`cA+_ywY%`rTDo|&i2(+W53tbhMyJ~vcH=8tjC;_7KBhhRoe=Y0 z3}+Pjt$oft^*%YE!8$+EBnzNOOwqS81evDx!IUpQ09WAJ<}0iVyiK+QkO1nQ4>JC`d)$x)!c!%$QpJ4-suF_%b#ol^u_WL$@oO+DEtrbh8=xuOR5G5F z10Lq&FeLCO+A5u(dq~78*rjG~d_|>Cl&5uV(~q%x8-w~ z;QRI?+A=bZa=`G%eoT&fkdrR^=%Va;UNXK1Yv z8}lS%h`qW20Jt9_fDGBVN$w19*aTP?wKW|K*t`Y+nSOmwziQy-VlZ{&SAZf&(maI6 z=5gO+qURaRK0Lzp1I&^08mH)o}u8Xee2=3`Mlf0q##s&ZjMSfMc)I0Jt|A{B#PSI9r~`2@|2K2F4<)0g=zK z0PXP+KF+h-0CiG0jkdWyu3<@*$)$=3{M$xV141Yykp9W1;j&c*cT7?kvO^!h)mZYu zLbaIcx7DJSwLZn03CAD1s_!FFN6bd z7I^^XcVf73Ef(lNUK3EK8!GD)SgNS0>y_o?+)jVg5vY0N80zFWUtWAihVG4Iw9vTK z%Y=?feU)R_)8o0ti5)}6D#;$AjiWV><95wekA8){WTxuehl+iil zuaUf>O5EPc?A#63WTTRsb9N)Pbt(79KFgeco zq$@C1n+>Hj#m}GHl@YI zs%8Yg z@W+c@`VLflx%|Ms#LLRBIXK33jh1aJDzf;w-2bgnE1uqKhb12Nyjwmk> zX={3A5f&W$e{fT8EIP82xv7>MDBO|&e{FB(5z92)Lg#rfuuygMCI|N3QoeY7?=Z*B zG(a~i2<#Bdvdopsg#y0 z!`i@%-K})yoE7W)?ftS!l7qCl?)eEF{bs7R>Eih-#PrU(!^%@TsHY@>ysrLC-P`Ht z=S%h3_>?MrJ5KBiQhsrF|FE&)eUn!n#EPE&J#%}`@YkyXb-9KMH|^6C-mY3V_YLfG zQ%_!0=={x1eZNW^92f|6;yhIIVNGD1Fp%l)n2!IrhQSY}R(U&dj+d|HlZFO{PdUyl zRjv_th6nb7ow=y0=UX# zgtdEmQJb%x+SH)zQxC4ZuFZUpsdT*;9vQ{mn-eB8gF&>Uz?$AILG0{c=3kx}cn3dL z(D+{U!Ha90uvOquC|y$Kl|lMvZmK5N(szH5n>xf@>z&E`V_YL_DMR+F4>$kVc0t0= zZ>e8=g2aj26Y0xCL2bTF*~9?Wyp^HMF5gV_^mY*V-&@t|$BmucDJY&8DjV?2^qAk7 zs8}1?^WJ(8vbZZ)w?520=AW*-SgF^%F)TY7z@4}9v#Mz`(`+^%vv_rPVz6e|Xd#fh zZhcR1e0w-!XqTaVbI)dOXSixTh;44O>M?0|cz8P~le9bKw6gbL4?w~JO&TEfU^>GN z&~_N6$qI{QhqZCVJ2O%s1u0^MDca7!kz$y${BX@H@HSaWx^w8(d~>Z}K2OK97w=#Zc3H0%2o%jjZT4d>qdGT4=yYE*T?h+ zCCYpExg!y3iAO$P0=XmPMEN|(9q}*Eej$s~B6COf6Xj7i=y_^CfQj-u``i(f{)_M& zd%b8aa-zIqpF5)P>U8}t?g%+iuFy-+96jw6qt&v{9RU;NQA_pGioN@Zax!;Brg!7G zmHa+;gq$cR*hl_Kl#A?hM^r17e{)C3iSirh0zvErFj4+$pF1)h>XX1!4{}HL6XlP! z=NK9($`>$EZmrr!=8m+B>Im#7%89joWbO#lfoJ>N5uF%Ub%W+p z`QUqs&MPu^aLI@94=WbVk(gP<-0xg%)DSLpt7jp+(F zm-syZc-{m6BDRGjFj3w=XfzWd|Kb9|Q%@TS6RyL)_|8_T$F^fOOBM1OLl@p72{%!+ zKo$W^6+jlu3=qEq621SId!mn|phc6_3UsEK*%H*Bp$pM7%qe)sQj;RRSr&HYmhhoHiT<~Kr>V!ZF{5O^ z)3QW~!|L!c*itp{3d71!{WpH6j2@@b!3D2vE^gKb4dcr`J6xH1MSXK?e!EGi2*%_5(%FpLi-S`^M zt1ioTimSO<4M?ahhc@!JoX?%k=j^Nof;4QK@?of8)gsp53w(3`*6)-jtfIYAcV12S zaJqzs&TvyVmOSf^oD4St3t2L4h&=BwbH7?eoCp*bzomybK8S&)VZQuOD!rPnm z?~*3^yFWgkRE&svBAVz97YaUVT~X}dXFX8juoW>{>gbn0Q|35#v9#Q{z{Bp6EaQ zPF}MC@AOJgepwQg)w|qZmUn`JCbsru*I|J9;WGh?heT!hPr%G|Y(nH%;BxE7Db3># zhsI)PuX>-O*1AU(rc6zFil&-k1PO$^_B?#eTkD{OuJEs(XmiZ>v2zN}0oQX%%-xVj zF8r-ql=mAJ{lAo=l_dE=kVRg11X}_3I?sDAWe%FxD z(QTyS<06XfDtjD9dj74?-##yt|ITY7Q`51BV%EBi$&W7DsBUDvAX2ugF4Gm|e2}N8 zrhJ?7$kRz}qvn#$kEI!S;BtzMDx1MNATKiYw^AfdB7MK+3tHz;TE3#NxbI+Ft|1iisdMnaQ%z@?!(Jz{eAf44v{WtjeWR#Q8T&NF^+&+{w~3fW1HW_D_V`o* zj93f19oIWu5rMN0iLL#=d!iHHe=wLawi8@dvR_T<9q@B;bikLDB(C}m(E8uX3zxXj zMf^_id+6$jZY+I#@tQGhnl+Dnrl;VE$w9w2o{so|vd5nEgS6#0Bkzxb*2AqK_I6(< z^i0L$_iI;-YWx-wmMb53Z<&DsTl4!%ReGy?X4|k}XBK#M%!yrdW5!Tt3~f!41dTaq z1FQ}F7r#@7$0vO!28->hI2RV)+N1=^5rW!X7mRRSQVFZ&wz>5ig>&^uJ?uCAU1D6i zuL$(Ea^2hxiFIYU{xzAE>E`VHI9H5HL$ZXR)mB2BScJ~EWIbW5|C_|yiQ0_@UT3h| zHA!wPH`6Y=iCO!%r?_G4nv>sOB-#(Axh1-_B==mg@!Cl{U+>qNye4b21Isdw@NF|> zy?!fzF~=PfZ6$eF;nvRaT=&FB9Vuv2Boeyxfi8WZOCRXc2fFn6e|hO+_5vLPA{Uzt zW;iYOVOr!%pK#un==zU(h9GjW&L^$7Wgn(RzVy+~uhhSC$YK^mE@DK*dyV#CT5mDx z->z+OV(sga$;d^6o(b$M8KxD}VQ8c}??6>hjClnj7ftL2cAo9Sw2T}a=02m|V~9gW z10Zsds>b5|{60);9@S8)g85-wmhLtWA{X`4)CmL6Jm%~A%JdxP1^ixmIZ=(2>&5&u z)xGJpAU;*0_iEL2fDpKVTBy`(*)%hn3uuvEs$!krH5=FoT7*5S(x;&?H$D`ysBl2I zmx0Qhz!|m}!T3r39kqp&Ncdv?vCp89e571Da*6tQtzIPk4=M2D7KKxFn9oc<%1xq| zBF@!gXjn$29PTgGU;cttVH+(Ec<__@>Q{6_t(DaMhd&jR8_>~QW98|Oenx10(-9UJ zmwK7-v)-Ul+ev7=yyEdPwMCOwnJ7`JIeA&Zwpoioj95OHx*XxsqG@z-LTWC3x!$K$ zqeyb1d?#~-I;2f~OJ-8~Q1*&KRJ*#ywaE(3Co2&TJJg;iOi7F6t<)!Xs_xyGs*o-q zQD=9l>Zngkt34wrJj1ILX-`*}6p|v|bgR%}W~3cnlIlx)ZrB*kR0I^QQrGkRE_Zkg{eWU zMZhEYMj3l%$6>olN$n!$5X=1|SL;(-y=Uf^OS=jZiE z#$jU+K4U6Uw_e}-Bh4npWk~u9sf2xu<3XIOsakF+tKhhCQKBnh1G^^?5VhW$w3cDk_%`vgWxDrFU+I*H5J@KKC$viJueHnc;ML z0u|{#{0?ke-0_1f(ar9VF7! zZFEYbE&^7EB|XKLr70RdIHiDke-0_ z1f(Y*Jpt*7|0x<7(i4!Lfb;~UCm=lm=?O?rKzahw6Hv7MA0pZg`7t3sCgjJ2{FtAS zP2z_>$3oRj|9@6DLGuY{J^{@qp!ozepMd5Q(0l@#PeAhtXg&eWCm{X=#Giop6SbBu z`sLOVoDaTQxf)32L)FrQ5-o@CjbDbUrNguTUe(gjeBvK{K7m7kMY6j9B>)2efC9V& zFtEEC+_cev%irt2sKD=mYf5mxq#PV<1^jgkxErAUy(XW_2%`k(z^yBI4AbxZ)j-^*FT{tNzs4{1U0)e`|sU6biLWQu|PO<-850s+Os>eo6+vh ztY&BJxFKK=NPR%4j|eI?5744giAq%J19^zrAmt$sc|t{sL?0@_Lq#h=B_2@WJ2Q8@ z_QnYm0;&$|JuDbnU}%A%1%?(FT3~2_PlE*zvzfyCd^t>q78qJ!Xn`#Yuz!%jEQ>;J z`qFb9NW3QiWC+C`0Y@1?%0d=}-1H@CK$71T((fvXCx+yAN4YH86@}dNrQe+-@%WI$ z$dY)WNZ#nsFMG{ND*AGm4lOXWz?~NG-|q41dbd+;ZGXS3>O0cNp3vw6W8ui&NF*{I zi9A!eV6RtP&FytdnzIr;TrqW{syR=ax_e>Suuim$HN#qRzNWc`bB-G?+ja{Le5_SZ zo5uP|bmq8ixteJij;GJpasFx3((Uz<-Lv$r*Ip?1@F~r`06pQ^;_4Hp>!5Hryb?Wl z=~7x%kIE@Eb@`}#DdXX6=JI9KKK$i{C!g(o_lH0J$xnaw@+)t>?XO%C-h(CwEO8xq ziQ;B$O_*VH#{V;hs{TGY(Kp1t{SS^$L?@@FqchP12R`%ACrVtl8En$5_M4&uWgNSq-DKamF<+x)t*|G@2Ud`lO*h+b>$)=%CF^ zzra)fgku=ixrSrvOZ9r!aL;VRXU}`1x<-4^s@u@dBQJGa)3&;&4W|qFOiQa8ttG2u zyRO~dp?_ zM7pu&=z6#5=l9CB-j3dpvZFP=UUuvb-&4M-6rSqh11K~dt!Z0!x6og0q1rQBdST`G zDSXE(oZvI)7W`Efw$v2*^B#v?!`>dXse}F0v5O7tCzrNi{TeM%1y`7p*o!Gz^hQ>K zk+<1d@kUk#Mppchm93GL{>alLDMSabq6t3V%OPbe(=jf1r=0F=<*lEIlH9L3&JzNm(f;<)uRC)zGi}-XnpRJS?;c5xNQhFWD)T zR6kgZe5mj7D<`kv5-7g4DPUKWM{o5nhnw&o2gQA@z^X9Le{lBj@eqBC%_ry$!G~}x z80~aMO4QYwT1~2RwW@whRq^Z7J%HaJ zsUEA@?YP$IvWX``|fEVY~Ixw6Y*biSl2d(j}YXS4LW`p**mc; zW$<}$2h2+e;k0+I?gi@S#mBu>KPD^{v=4SK(0c`aUk6_U-vaw4BAS0&x}Hb=Aeg@j zp$5+LPLiD}M5*>}u|J<_8*7ABNWCr+g17fLa8 zF1rv*C30#kpHs`Rd?uMJFR1xkBAW>2uZcB$Fx_7Z>kjt#3KqtPmi2mZ0GQ{&`5+>& zr8(c<^L`&MLZF`Q!)*p)1@Xb;azADe!Bl>}AN{t*3&M!ZZP4*A=*M1r27ClO2R;Q} z1-szDUaf(%kkS3W83y$;Z}2JWw}123JM-1g^Qq|9*9P)`dUR*~)i3#Z8GU%3uVF4% z!8gIT!S93r2HuZzdKk>}V1s*S>qjrV8qAAr!xZerM_4b{Z9h+59_7L1CFo15-~RI> zXv=v|_ghcB_RHTm4+UqWoJt+fE#Qn~Pn6QJbh4zz<}+$8mdv3zSI#b!=2F2K`3{c> z9y}vl#(SqgzQ-7A%FL<8To$21OV-t7Hj&YdbUl+y!F%V8l%CVmRlSzZ=Kp(9LQQXr z5(&(qTJxerkMB?Sy2aG+OlYof!uKb|4-$%wgJ|ivhV^eT?_jMQ8Ti{^;^!DghVNnh zOdJ`GVqcjCBg3*NACd2Wq*tLchyc9A$@ExL?S`plxSg`u;#)Pr?08gdt`AmQTRYclrPS z{T_CxZ)ky`1wKUInr{5qvjFDC{tN7 d0T+eb^d(9_|MPza4B!95_rG`Y=>PWp{}01|$u9r^ literal 0 HcmV?d00001 diff --git a/cmake/ModulesOverride/NSIS.template.in b/cmake/ModulesOverride/NSIS.template.in new file mode 100644 index 0000000..538e292 --- /dev/null +++ b/cmake/ModulesOverride/NSIS.template.in @@ -0,0 +1,998 @@ +; CPack install script designed for a nmake build + +;-------------------------------- +; You must define these values + + !define VERSION "@CPACK_PACKAGE_VERSION@" + !define PATCH "@CPACK_PACKAGE_VERSION_PATCH@" + !define INST_DIR "@CPACK_TEMPORARY_DIRECTORY@" + +;-------------------------------- +;Variables + + Var MUI_TEMP + Var STARTMENU_FOLDER + Var SV_ALLUSERS + Var START_MENU + Var DO_NOT_ADD_TO_PATH + Var ADD_TO_PATH_ALL_USERS + Var ADD_TO_PATH_CURRENT_USER + Var INSTALL_DESKTOP + Var IS_DEFAULT_INSTALLDIR +;-------------------------------- +;Include Modern UI + + !include "MUI.nsh" + + ;Default installation folder + InstallDir "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" + +;-------------------------------- +;General + + ;Name and file + Name "@CPACK_NSIS_PACKAGE_NAME@" + OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@" + + ;Set compression + SetCompressor @CPACK_NSIS_COMPRESSOR@ + + ;Require administrator access + RequestExecutionLevel admin + +@CPACK_NSIS_DEFINES@ +@CPACK_NSIS_MANIFEST_DPI_AWARE_CODE@ +@CPACK_NSIS_BRANDING_TEXT_CODE@ + + !include Sections.nsh + +;--- Component support macros: --- +; The code for the add/remove functionality is from: +; http://nsis.sourceforge.net/Add/Remove_Functionality +; It has been modified slightly and extended to provide +; inter-component dependencies. +Var AR_SecFlags +Var AR_RegFlags +@CPACK_NSIS_SECTION_SELECTED_VARS@ + +; Loads the "selected" flag for the section named SecName into the +; variable VarName. +!macro LoadSectionSelectedIntoVar SecName VarName + SectionGetFlags ${${SecName}} $${VarName} + IntOp $${VarName} $${VarName} & ${SF_SELECTED} ;Turn off all other bits +!macroend + +; Loads the value of a variable... can we get around this? +!macro LoadVar VarName + IntOp $R0 0 + $${VarName} +!macroend + +; Sets the value of a variable +!macro StoreVar VarName IntValue + IntOp $${VarName} 0 + ${IntValue} +!macroend + +!macro InitSection SecName + ; This macro reads component installed flag from the registry and + ;changes checked state of the section on the components page. + ;Input: section index constant name specified in Section command. + + ClearErrors + ;Reading component status from registry + SetRegView @CPACK_NSIS_REGISTRY_VIEW@ + ReadRegDWORD $AR_RegFlags HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" "Installed" + IfErrors "default_${SecName}" + ;Status will stay default if registry value not found + ;(component was never installed) + IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits + SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading default section flags + IntOp $AR_SecFlags $AR_SecFlags & 0xFFFE ;Turn lowest (enabled) bit off + IntOp $AR_SecFlags $AR_RegFlags | $AR_SecFlags ;Change lowest bit + + ; Note whether this component was installed before + !insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags + IntOp $R0 $AR_RegFlags & $AR_RegFlags + + ;Writing modified flags + SectionSetFlags ${${SecName}} $AR_SecFlags + + "default_${SecName}:" + !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected +!macroend + +!macro FinishSection SecName + ; This macro reads section flag set by user and removes the section + ;if it is not selected. + ;Then it writes component installed flag to registry + ;Input: section index constant name specified in Section command. + + SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading section flags + ;Checking lowest bit: + IntOp $AR_SecFlags $AR_SecFlags & ${SF_SELECTED} + IntCmp $AR_SecFlags 1 "leave_${SecName}" + ;Section is not selected: + ;Calling Section uninstall macro and writing zero installed flag + !insertmacro "Remove_${${SecName}}" + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \ + "Installed" 0 + Goto "exit_${SecName}" + + "leave_${SecName}:" + ;Section is selected: + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \ + "Installed" 1 + + "exit_${SecName}:" +!macroend + +!macro RemoveSection_CPack SecName + ; This macro is used to call section's Remove_... macro + ;from the uninstaller. + ;Input: section index constant name specified in Section command. + + !insertmacro "Remove_${${SecName}}" +!macroend + +; Determine whether the selection of SecName changed +!macro MaybeSelectionChanged SecName + !insertmacro LoadVar ${SecName}_selected + SectionGetFlags ${${SecName}} $R1 + IntOp $R1 $R1 & ${SF_SELECTED} ;Turn off all other bits + + ; See if the status has changed: + IntCmp $R0 $R1 "${SecName}_unchanged" + !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected + + IntCmp $R1 ${SF_SELECTED} "${SecName}_was_selected" + !insertmacro "Deselect_required_by_${SecName}" + goto "${SecName}_unchanged" + + "${SecName}_was_selected:" + !insertmacro "Select_${SecName}_depends" + + "${SecName}_unchanged:" +!macroend +;--- End of Add/Remove macros --- + +;-------------------------------- +;Interface Settings + + !define MUI_HEADERIMAGE + !define MUI_ABORTWARNING + +;---------------------------------------- +; based upon a script of "Written by KiCHiK 2003-01-18 05:57:02" +;---------------------------------------- +!verbose 3 +!include "WinMessages.NSH" +!verbose 4 +;==================================================== +; get_NT_environment +; Returns: the selected environment +; Output : head of the stack +;==================================================== +!macro select_NT_profile UN +Function ${UN}select_NT_profile + StrCmp $ADD_TO_PATH_ALL_USERS "1" 0 environment_single + DetailPrint "Selected environment for all users" + Push "all" + Return + environment_single: + DetailPrint "Selected environment for current user only." + Push "current" + Return +FunctionEnd +!macroend +!insertmacro select_NT_profile "" +!insertmacro select_NT_profile "un." +;---------------------------------------------------- +!define NT_current_env 'HKCU "Environment"' +!define NT_all_env 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' + +!ifndef WriteEnvStr_RegKey + !ifdef ALL_USERS + !define WriteEnvStr_RegKey \ + 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' + !else + !define WriteEnvStr_RegKey 'HKCU "Environment"' + !endif +!endif + +; AddToPath - Adds the given dir to the search path. +; Input - head of the stack +; Note - Win9x systems requires reboot + +Function AddToPath + Exch $0 + Push $1 + Push $2 + Push $3 + + # don't add if the path doesn't exist + IfFileExists "$0\*.*" "" AddToPath_done + + ReadEnvStr $1 PATH + ; if the path is too long for a NSIS variable NSIS will return a 0 + ; length string. If we find that, then warn and skip any path + ; modification as it will trash the existing path. + StrLen $2 $1 + IntCmp $2 0 CheckPathLength_ShowPathWarning CheckPathLength_Done CheckPathLength_Done + CheckPathLength_ShowPathWarning: + Messagebox MB_OK|MB_ICONEXCLAMATION "Warning! PATH too long installer unable to modify PATH!" + Goto AddToPath_done + CheckPathLength_Done: + Push "$1;" + Push "$0;" + Call StrStr + Pop $2 + StrCmp $2 "" "" AddToPath_done + Push "$1;" + Push "$0\;" + Call StrStr + Pop $2 + StrCmp $2 "" "" AddToPath_done + GetFullPathName /SHORT $3 $0 + Push "$1;" + Push "$3;" + Call StrStr + Pop $2 + StrCmp $2 "" "" AddToPath_done + Push "$1;" + Push "$3\;" + Call StrStr + Pop $2 + StrCmp $2 "" "" AddToPath_done + + Call IsNT + Pop $1 + StrCmp $1 1 AddToPath_NT + ; Not on NT + StrCpy $1 $WINDIR 2 + FileOpen $1 "$1\autoexec.bat" a + FileSeek $1 -1 END + FileReadByte $1 $2 + IntCmp $2 26 0 +2 +2 # DOS EOF + FileSeek $1 -1 END # write over EOF + FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n" + FileClose $1 + SetRebootFlag true + Goto AddToPath_done + + AddToPath_NT: + StrCmp $ADD_TO_PATH_ALL_USERS "1" ReadAllKey + ReadRegStr $1 ${NT_current_env} "PATH" + Goto DoTrim + ReadAllKey: + ReadRegStr $1 ${NT_all_env} "PATH" + DoTrim: + StrCmp $1 "" AddToPath_NTdoIt + Push $1 + Call Trim + Pop $1 + StrCpy $0 "$1;$0" + AddToPath_NTdoIt: + StrCmp $ADD_TO_PATH_ALL_USERS "1" WriteAllKey + WriteRegExpandStr ${NT_current_env} "PATH" $0 + Goto DoSend + WriteAllKey: + WriteRegExpandStr ${NT_all_env} "PATH" $0 + DoSend: + SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 + + AddToPath_done: + Pop $3 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + + +; RemoveFromPath - Remove a given dir from the path +; Input: head of the stack + +Function un.RemoveFromPath + Exch $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + + IntFmt $6 "%c" 26 # DOS EOF + + Call un.IsNT + Pop $1 + StrCmp $1 1 unRemoveFromPath_NT + ; Not on NT + StrCpy $1 $WINDIR 2 + FileOpen $1 "$1\autoexec.bat" r + GetTempFileName $4 + FileOpen $2 $4 w + GetFullPathName /SHORT $0 $0 + StrCpy $0 "SET PATH=%PATH%;$0" + Goto unRemoveFromPath_dosLoop + + unRemoveFromPath_dosLoop: + FileRead $1 $3 + StrCpy $5 $3 1 -1 # read last char + StrCmp $5 $6 0 +2 # if DOS EOF + StrCpy $3 $3 -1 # remove DOS EOF so we can compare + StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoopRemoveLine + StrCmp $3 "$0$\n" unRemoveFromPath_dosLoopRemoveLine + StrCmp $3 "$0" unRemoveFromPath_dosLoopRemoveLine + StrCmp $3 "" unRemoveFromPath_dosLoopEnd + FileWrite $2 $3 + Goto unRemoveFromPath_dosLoop + unRemoveFromPath_dosLoopRemoveLine: + SetRebootFlag true + Goto unRemoveFromPath_dosLoop + + unRemoveFromPath_dosLoopEnd: + FileClose $2 + FileClose $1 + StrCpy $1 $WINDIR 2 + Delete "$1\autoexec.bat" + CopyFiles /SILENT $4 "$1\autoexec.bat" + Delete $4 + Goto unRemoveFromPath_done + + unRemoveFromPath_NT: + StrCmp $ADD_TO_PATH_ALL_USERS "1" unReadAllKey + ReadRegStr $1 ${NT_current_env} "PATH" + Goto unDoTrim + unReadAllKey: + ReadRegStr $1 ${NT_all_env} "PATH" + unDoTrim: + StrCpy $5 $1 1 -1 # copy last char + StrCmp $5 ";" +2 # if last char != ; + StrCpy $1 "$1;" # append ; + Push $1 + Push "$0;" + Call un.StrStr ; Find `$0;` in $1 + Pop $2 ; pos of our dir + StrCmp $2 "" unRemoveFromPath_done + ; else, it is in path + # $0 - path to add + # $1 - path var + StrLen $3 "$0;" + StrLen $4 $2 + StrCpy $5 $1 -$4 # $5 is now the part before the path to remove + StrCpy $6 $2 "" $3 # $6 is now the part after the path to remove + StrCpy $3 $5$6 + + StrCpy $5 $3 1 -1 # copy last char + StrCmp $5 ";" 0 +2 # if last char == ; + StrCpy $3 $3 -1 # remove last char + + StrCmp $ADD_TO_PATH_ALL_USERS "1" unWriteAllKey + WriteRegExpandStr ${NT_current_env} "PATH" $3 + Goto unDoSend + unWriteAllKey: + WriteRegExpandStr ${NT_all_env} "PATH" $3 + unDoSend: + SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 + + unRemoveFromPath_done: + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Uninstall sutff +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +########################################### +# Utility Functions # +########################################### + +;==================================================== +; IsNT - Returns 1 if the current system is NT, 0 +; otherwise. +; Output: head of the stack +;==================================================== +; IsNT +; no input +; output, top of the stack = 1 if NT or 0 if not +; +; Usage: +; Call IsNT +; Pop $R0 +; ($R0 at this point is 1 or 0) + +!macro IsNT un +Function ${un}IsNT + Push $0 + ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion + StrCmp $0 "" 0 IsNT_yes + ; we are not NT. + Pop $0 + Push 0 + Return + + IsNT_yes: + ; NT!!! + Pop $0 + Push 1 +FunctionEnd +!macroend +!insertmacro IsNT "" +!insertmacro IsNT "un." + +; StrStr +; input, top of stack = string to search for +; top of stack-1 = string to search in +; output, top of stack (replaces with the portion of the string remaining) +; modifies no other variables. +; +; Usage: +; Push "this is a long ass string" +; Push "ass" +; Call StrStr +; Pop $R0 +; ($R0 at this point is "ass string") + +!macro StrStr un +Function ${un}StrStr +Exch $R1 ; st=haystack,old$R1, $R1=needle + Exch ; st=old$R1,haystack + Exch $R2 ; st=old$R1,old$R2, $R2=haystack + Push $R3 + Push $R4 + Push $R5 + StrLen $R3 $R1 + StrCpy $R4 0 + ; $R1=needle + ; $R2=haystack + ; $R3=len(needle) + ; $R4=cnt + ; $R5=tmp + loop: + StrCpy $R5 $R2 $R3 $R4 + StrCmp $R5 $R1 done + StrCmp $R5 "" done + IntOp $R4 $R4 + 1 + Goto loop +done: + StrCpy $R1 $R2 "" $R4 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Exch $R1 +FunctionEnd +!macroend +!insertmacro StrStr "" +!insertmacro StrStr "un." + +Function Trim ; Added by Pelaca + Exch $R1 + Push $R2 +Loop: + StrCpy $R2 "$R1" 1 -1 + StrCmp "$R2" " " RTrim + StrCmp "$R2" "$\n" RTrim + StrCmp "$R2" "$\r" RTrim + StrCmp "$R2" ";" RTrim + GoTo Done +RTrim: + StrCpy $R1 "$R1" -1 + Goto Loop +Done: + Pop $R2 + Exch $R1 +FunctionEnd + +Function ConditionalAddToRegisty + Pop $0 + Pop $1 + SetRegView @CPACK_NSIS_REGISTRY_VIEW@ + StrCmp "$0" "" ConditionalAddToRegisty_EmptyString + WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \ + "$1" "$0" + ;MessageBox MB_OK "Set Registry: '$1' to '$0'" + DetailPrint "Set install registry entry: '$1' to '$0'" + ConditionalAddToRegisty_EmptyString: +FunctionEnd + +;-------------------------------- + +!ifdef CPACK_USES_DOWNLOAD +Function DownloadFile + IfFileExists $INSTDIR\* +2 + CreateDirectory $INSTDIR + Pop $0 + + ; Skip if already downloaded + IfFileExists $INSTDIR\$0 0 +2 + Return + + StrCpy $1 "@CPACK_DOWNLOAD_SITE@" + + try_again: + NSISdl::download "$1/$0" "$INSTDIR\$0" + + Pop $1 + StrCmp $1 "success" success + StrCmp $1 "Cancelled" cancel + MessageBox MB_OK "Download failed: $1" + cancel: + Return + success: +FunctionEnd +!endif + +;-------------------------------- +; Define some macro setting for the gui +@CPACK_NSIS_INSTALLER_MUI_ICON_CODE@ +@CPACK_NSIS_INSTALLER_ICON_CODE@ +@CPACK_NSIS_INSTALLER_MUI_WELCOMEFINISH_CODE@ +@CPACK_NSIS_INSTALLER_MUI_UNWELCOMEFINISH_CODE@ +@CPACK_NSIS_INSTALLER_MUI_COMPONENTS_DESC@ +@CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE@ + +;-------------------------------- +;Pages + @CPACK_NSIS_INSTALLER_WELCOME_TITLE_CODE@ + @CPACK_NSIS_INSTALLER_WELCOME_TITLE_3LINES_CODE@ + !insertmacro MUI_PAGE_WELCOME + + !insertmacro MUI_PAGE_LICENSE "@CPACK_RESOURCE_FILE_LICENSE@" + Page custom InstallOptionsPage + !insertmacro MUI_PAGE_DIRECTORY + + ;Start Menu Folder Page Configuration + !define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX" + !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" + !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" + !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER + + @CPACK_NSIS_PAGE_COMPONENTS@ + + !insertmacro MUI_PAGE_INSTFILES + @CPACK_NSIS_INSTALLER_FINISH_TITLE_CODE@ + @CPACK_NSIS_INSTALLER_FINISH_TITLE_3LINES_CODE@ + !insertmacro MUI_PAGE_FINISH + + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + +;-------------------------------- +;Languages + + !insertmacro MUI_LANGUAGE "English" ;first language is the default language + !insertmacro MUI_LANGUAGE "Albanian" + !insertmacro MUI_LANGUAGE "Arabic" + !insertmacro MUI_LANGUAGE "Basque" + !insertmacro MUI_LANGUAGE "Belarusian" + !insertmacro MUI_LANGUAGE "Bosnian" + !insertmacro MUI_LANGUAGE "Breton" + !insertmacro MUI_LANGUAGE "Bulgarian" + !insertmacro MUI_LANGUAGE "Croatian" + !insertmacro MUI_LANGUAGE "Czech" + !insertmacro MUI_LANGUAGE "Danish" + !insertmacro MUI_LANGUAGE "Dutch" + !insertmacro MUI_LANGUAGE "Estonian" + !insertmacro MUI_LANGUAGE "Farsi" + !insertmacro MUI_LANGUAGE "Finnish" + !insertmacro MUI_LANGUAGE "French" + !insertmacro MUI_LANGUAGE "German" + !insertmacro MUI_LANGUAGE "Greek" + !insertmacro MUI_LANGUAGE "Hebrew" + !insertmacro MUI_LANGUAGE "Hungarian" + !insertmacro MUI_LANGUAGE "Icelandic" + !insertmacro MUI_LANGUAGE "Indonesian" + !insertmacro MUI_LANGUAGE "Irish" + !insertmacro MUI_LANGUAGE "Italian" + !insertmacro MUI_LANGUAGE "Japanese" + !insertmacro MUI_LANGUAGE "Korean" + !insertmacro MUI_LANGUAGE "Kurdish" + !insertmacro MUI_LANGUAGE "Latvian" + !insertmacro MUI_LANGUAGE "Lithuanian" + !insertmacro MUI_LANGUAGE "Luxembourgish" + !insertmacro MUI_LANGUAGE "Macedonian" + !insertmacro MUI_LANGUAGE "Malay" + !insertmacro MUI_LANGUAGE "Mongolian" + !insertmacro MUI_LANGUAGE "Norwegian" + !insertmacro MUI_LANGUAGE "Polish" + !insertmacro MUI_LANGUAGE "Portuguese" + !insertmacro MUI_LANGUAGE "PortugueseBR" + !insertmacro MUI_LANGUAGE "Romanian" + !insertmacro MUI_LANGUAGE "Russian" + !insertmacro MUI_LANGUAGE "Serbian" + !insertmacro MUI_LANGUAGE "SerbianLatin" + !insertmacro MUI_LANGUAGE "SimpChinese" + !insertmacro MUI_LANGUAGE "Slovak" + !insertmacro MUI_LANGUAGE "Slovenian" + !insertmacro MUI_LANGUAGE "Spanish" + !insertmacro MUI_LANGUAGE "Swedish" + !insertmacro MUI_LANGUAGE "Thai" + !insertmacro MUI_LANGUAGE "TradChinese" + !insertmacro MUI_LANGUAGE "Turkish" + !insertmacro MUI_LANGUAGE "Ukrainian" + !insertmacro MUI_LANGUAGE "Welsh" + +;-------------------------------- +;Reserve Files + + ;These files should be inserted before other files in the data block + ;Keep these lines before any File command + ;Only for solid compression (by default, solid compression is enabled for BZIP2 and LZMA) + + ReserveFile "NSIS.InstallOptions.ini" + !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS + + ; for UserInfo::GetName and UserInfo::GetAccountType + ReserveFile /plugin 'UserInfo.dll' + +;-------------------------------- +; Installation types +@CPACK_NSIS_INSTALLATION_TYPES@ + +;-------------------------------- +; Component sections +@CPACK_NSIS_COMPONENT_SECTIONS@ + +;-------------------------------- +;Installer Sections + +Section "-Core installation" + ;Use the entire tree produced by the INSTALL target. Keep the + ;list of directories here in sync with the RMDir commands below. + SetOutPath "$INSTDIR" + @CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS@ + @CPACK_NSIS_FULL_INSTALL@ + + ;Store installation folder + SetRegView @CPACK_NSIS_REGISTRY_VIEW@ + WriteRegStr SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "" $INSTDIR + + ;Create uninstaller + WriteUninstaller "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe" + Push "DisplayName" + Push "@CPACK_NSIS_DISPLAY_NAME@" + Call ConditionalAddToRegisty + Push "DisplayVersion" + Push "@CPACK_PACKAGE_VERSION@" + Call ConditionalAddToRegisty + Push "Publisher" + Push "@CPACK_PACKAGE_VENDOR@" + Call ConditionalAddToRegisty + Push "UninstallString" + Push "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe" + Call ConditionalAddToRegisty + Push "NoRepair" + Push "1" + Call ConditionalAddToRegisty + + !ifdef CPACK_NSIS_ADD_REMOVE + ;Create add/remove functionality + Push "ModifyPath" + Push "$INSTDIR\AddRemove.exe" + Call ConditionalAddToRegisty + !else + Push "NoModify" + Push "1" + Call ConditionalAddToRegisty + !endif + + ; Optional registration + Push "DisplayIcon" + Push "$INSTDIR\@CPACK_NSIS_INSTALLED_ICON_NAME@" + Call ConditionalAddToRegisty + Push "HelpLink" + Push "@CPACK_NSIS_HELP_LINK@" + Call ConditionalAddToRegisty + Push "URLInfoAbout" + Push "@CPACK_NSIS_URL_INFO_ABOUT@" + Call ConditionalAddToRegisty + Push "Contact" + Push "@CPACK_NSIS_CONTACT@" + Call ConditionalAddToRegisty + !insertmacro MUI_INSTALLOPTIONS_READ $INSTALL_DESKTOP "NSIS.InstallOptions.ini" "Field 5" "State" + !insertmacro MUI_STARTMENU_WRITE_BEGIN Application + + ;Create shortcuts + CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" +@CPACK_NSIS_CREATE_ICONS@ +@CPACK_NSIS_CREATE_ICONS_EXTRA@ + CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe" + + ;Read a value from an InstallOptions INI file + !insertmacro MUI_INSTALLOPTIONS_READ $DO_NOT_ADD_TO_PATH "NSIS.InstallOptions.ini" "Field 2" "State" + !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_ALL_USERS "NSIS.InstallOptions.ini" "Field 3" "State" + !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_CURRENT_USER "NSIS.InstallOptions.ini" "Field 4" "State" + + ; Write special uninstall registry entries + Push "StartMenu" + Push "$STARTMENU_FOLDER" + Call ConditionalAddToRegisty + Push "DoNotAddToPath" + Push "$DO_NOT_ADD_TO_PATH" + Call ConditionalAddToRegisty + Push "AddToPathAllUsers" + Push "$ADD_TO_PATH_ALL_USERS" + Call ConditionalAddToRegisty + Push "AddToPathCurrentUser" + Push "$ADD_TO_PATH_CURRENT_USER" + Call ConditionalAddToRegisty + Push "InstallToDesktop" + Push "$INSTALL_DESKTOP" + Call ConditionalAddToRegisty + + !insertmacro MUI_STARTMENU_WRITE_END + +@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@ + +SectionEnd + +Section "-Add to path" + Push $INSTDIR\bin + StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 doNotAddToPath + StrCmp $DO_NOT_ADD_TO_PATH "1" doNotAddToPath 0 + Call AddToPath + doNotAddToPath: +SectionEnd + +;-------------------------------- +; Create custom pages +Function InstallOptionsPage + !insertmacro MUI_HEADER_TEXT "Install Options" "Choose options for installing @CPACK_NSIS_PACKAGE_NAME@" + !insertmacro MUI_INSTALLOPTIONS_DISPLAY "NSIS.InstallOptions.ini" + +FunctionEnd + +;-------------------------------- +; determine admin versus local install +Function un.onInit + + ClearErrors + UserInfo::GetName + IfErrors noLM + Pop $0 + UserInfo::GetAccountType + Pop $1 + StrCmp $1 "Admin" 0 +3 + SetShellVarContext all + ;MessageBox MB_OK 'User "$0" is in the Admin group' + Goto done + StrCmp $1 "Power" 0 +3 + SetShellVarContext all + ;MessageBox MB_OK 'User "$0" is in the Power Users group' + Goto done + + noLM: + ;Get installation folder from registry if available + + done: + +FunctionEnd + +;--- Add/Remove callback functions: --- +!macro SectionList MacroName + ;This macro used to perform operation on multiple sections. + ;List all of your components in following manner here. +@CPACK_NSIS_COMPONENT_SECTION_LIST@ +!macroend + +Section -FinishComponents + ;Removes unselected components and writes component status to registry + !insertmacro SectionList "FinishSection" + +!ifdef CPACK_NSIS_ADD_REMOVE + ; Get the name of the installer executable + System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1' + StrCpy $R3 $R0 + + ; Strip off the last 13 characters, to see if we have AddRemove.exe + StrLen $R1 $R0 + IntOp $R1 $R0 - 13 + StrCpy $R2 $R0 13 $R1 + StrCmp $R2 "AddRemove.exe" addremove_installed + + ; We're not running AddRemove.exe, so install it + CopyFiles $R3 $INSTDIR\AddRemove.exe + + addremove_installed: +!endif +SectionEnd +;--- End of Add/Remove callback functions --- + +;-------------------------------- +; Component dependencies +Function .onSelChange + !insertmacro SectionList MaybeSelectionChanged +FunctionEnd + +;-------------------------------- +;Uninstaller Section + +Section "Uninstall" + SetRegView @CPACK_NSIS_REGISTRY_VIEW@ + ReadRegStr $START_MENU SHCTX \ + "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "StartMenu" + ;MessageBox MB_OK "Start menu is in: $START_MENU" + ReadRegStr $DO_NOT_ADD_TO_PATH SHCTX \ + "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "DoNotAddToPath" + ReadRegStr $ADD_TO_PATH_ALL_USERS SHCTX \ + "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathAllUsers" + ReadRegStr $ADD_TO_PATH_CURRENT_USER SHCTX \ + "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathCurrentUser" + ;MessageBox MB_OK "Add to path: $DO_NOT_ADD_TO_PATH all users: $ADD_TO_PATH_ALL_USERS" + ReadRegStr $INSTALL_DESKTOP SHCTX \ + "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "InstallToDesktop" + ;MessageBox MB_OK "Install to desktop: $INSTALL_DESKTOP " + +@CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@ + + ;Remove files we installed. + ;Keep the list of directories here in sync with the File commands above. +@CPACK_NSIS_DELETE_FILES@ +@CPACK_NSIS_DELETE_DIRECTORIES@ + +!ifdef CPACK_NSIS_ADD_REMOVE + ;Remove the add/remove program + Delete "$INSTDIR\AddRemove.exe" +!endif + + ;Remove the uninstaller itself. + Delete "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe" + DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" + + ;Remove the installation directory if it is empty. + RMDir "$INSTDIR" + + ; Remove the registry entries. + DeleteRegKey SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" + + ; Removes all optional components + !insertmacro SectionList "RemoveSection_CPack" + + !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP + + Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk" +@CPACK_NSIS_DELETE_ICONS@ +@CPACK_NSIS_DELETE_ICONS_EXTRA@ + + ;Delete empty start menu parent directories + StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP" + + startMenuDeleteLoop: + ClearErrors + RMDir $MUI_TEMP + GetFullPathName $MUI_TEMP "$MUI_TEMP\.." + + IfErrors startMenuDeleteLoopDone + + StrCmp "$MUI_TEMP" "$SMPROGRAMS" startMenuDeleteLoopDone startMenuDeleteLoop + startMenuDeleteLoopDone: + + ; If the user changed the shortcut, then untinstall may not work. This should + ; try to fix it. + StrCpy $MUI_TEMP "$START_MENU" + Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk" +@CPACK_NSIS_DELETE_ICONS_EXTRA@ + + ;Delete empty start menu parent directories + StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP" + + secondStartMenuDeleteLoop: + ClearErrors + RMDir $MUI_TEMP + GetFullPathName $MUI_TEMP "$MUI_TEMP\.." + + IfErrors secondStartMenuDeleteLoopDone + + StrCmp "$MUI_TEMP" "$SMPROGRAMS" secondStartMenuDeleteLoopDone secondStartMenuDeleteLoop + secondStartMenuDeleteLoopDone: + + DeleteRegKey /ifempty SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" + + Push $INSTDIR\bin + StrCmp $DO_NOT_ADD_TO_PATH_ "1" doNotRemoveFromPath 0 + Call un.RemoveFromPath + doNotRemoveFromPath: +SectionEnd + +;-------------------------------- +; determine admin versus local install +; Is install for "AllUsers" or "JustMe"? +; Default to "JustMe" - set to "AllUsers" if admin or on Win9x +; This function is used for the very first "custom page" of the installer. +; This custom page does not show up visibly, but it executes prior to the +; first visible page and sets up $INSTDIR properly... +; Choose different default installation folder based on SV_ALLUSERS... +; "Program Files" for AllUsers, "My Documents" for JustMe... + +Function .onInit +; If we need to check for uninstaller, check the native key first. If that +; isn't present, optionally also check the 32bit key, due to a bug where previous +; versions of the NSIS script installed into the 32bit registry view on 64bit +; machines. + StrCmp "@CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL@" "ON" 0 inst + + SetRegView @CPACK_NSIS_REGISTRY_VIEW@ + ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "UninstallString" + StrCmp $0 "" inst ask_uninstaller + +check_32bit_uninstaller: + StrCmp "@CPACK_NSIS_ENABLE_UNINSTALL_DONT_CHECK_32BIT@" "ON" 0 inst + SetRegView 32 + ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "UninstallString" + SetRegView @CPACK_NSIS_REGISTRY_VIEW@ + StrCmp $0 "" inst ask_uninstaller + +;Uninstaller was found. Ask the user to run it. +ask_uninstaller: + MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \ + "@CPACK_NSIS_PACKAGE_NAME@ is already installed. $\n$\nDo you want to uninstall the old version before installing the new one?" \ + /SD IDYES IDYES uninst IDNO inst + Abort + +;Run the uninstaller +uninst: + ClearErrors + StrLen $2 "\Uninstall.exe" + StrCpy $3 $0 -$2 # remove "\Uninstall.exe" from UninstallString to get path + ExecWait '"$0" /S _?=$3' ;Do not copy the uninstaller to a temp file + + IfErrors uninst_failed inst +uninst_failed: + MessageBox MB_OK|MB_ICONSTOP "Uninstall failed." + Abort + + +inst: + ; Reads components status for registry + !insertmacro SectionList "InitSection" + + ; check to see if /D has been used to change + ; the install directory by comparing it to the + ; install directory that is expected to be the + ; default + StrCpy $IS_DEFAULT_INSTALLDIR 0 + StrCmp "$INSTDIR" "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" 0 +2 + StrCpy $IS_DEFAULT_INSTALLDIR 1 + + StrCpy $SV_ALLUSERS "JustMe" + ; if default install dir then change the default + ; if it is installed for JustMe + StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2 + StrCpy $INSTDIR "$DOCUMENTS\@CPACK_PACKAGE_INSTALL_DIRECTORY@" + + ClearErrors + UserInfo::GetName + IfErrors noLM + Pop $0 + UserInfo::GetAccountType + Pop $1 + StrCmp $1 "Admin" 0 +4 + SetShellVarContext all + ;MessageBox MB_OK 'User "$0" is in the Admin group' + StrCpy $SV_ALLUSERS "AllUsers" + Goto done + StrCmp $1 "Power" 0 +4 + SetShellVarContext all + ;MessageBox MB_OK 'User "$0" is in the Power Users group' + StrCpy $SV_ALLUSERS "AllUsers" + Goto done + + noLM: + StrCpy $SV_ALLUSERS "AllUsers" + ;Get installation folder from registry if available + + done: + StrCmp $SV_ALLUSERS "AllUsers" 0 +3 + StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2 + StrCpy $INSTDIR "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" + + StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 noOptionsPage + !insertmacro MUI_INSTALLOPTIONS_EXTRACT "NSIS.InstallOptions.ini" + + noOptionsPage: +FunctionEnd diff --git a/cmake/deploy-osx.cmake.in b/cmake/deploy-osx.cmake.in new file mode 100644 index 0000000..ba82229 --- /dev/null +++ b/cmake/deploy-osx.cmake.in @@ -0,0 +1,15 @@ +message("Running OSX deploy script.") +set(MACDEPLOYQT "@MACDEPLOYQT@") + +# Remove when done debugging +get_cmake_property(_variableNames VARIABLES) +list (SORT _variableNames) +foreach (_variableName ${_variableNames}) + message(STATUS "${_variableName}=${${_variableName}}") +endforeach() +#message("Prefix is: ${CMAKE_INSTALL_PREFIX}") +#execute_process(COMMAND ls ${CMAKE_INSTALL_PREFIX}) + +execute_process(COMMAND find "${CPACK_TEMPORARY_INSTALL_DIRECTORY}") +execute_process(COMMAND ${MACDEPLOYQT} "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/@PROJECT_NAME@.app") +execute_process(COMMAND find "${CPACK_TEMPORARY_INSTALL_DIRECTORY}") diff --git a/cmake/deploy-windows.cmake.in b/cmake/deploy-windows.cmake.in new file mode 100644 index 0000000..326e345 --- /dev/null +++ b/cmake/deploy-windows.cmake.in @@ -0,0 +1,52 @@ +message("Running Windows deploy script.") +set(WINDEPLOYQT "@WINDEPLOYQT@") +set(CYGCHECK "@CYGCHECK@") +message("Found windeployqt: ${WINDEPLOYQT}") +set(MERKAARTOR_BINARY "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/bin/merkaartor.exe") +message("Working on binary: ${MERKAARTOR_BINARY}") + +# Copy whole packages of gdal and proj, as they need other files than dlls to work! +# Also copy openssl directly, as it appears to be preinstalled by github actions in system paths and ignored by the toling below +execute_process(COMMAND pacman -Qlq mingw-w64-x86_64-openssl mingw-w64-x86_64-gdal mingw-w64-x86_64-proj OUTPUT_VARIABLE DEP_PKGS_FILES OUTPUT_STRIP_TRAILING_WHITESPACE) +string(REPLACE "\n" ";" DEP_PKGS_FILES_LIST ${DEP_PKGS_FILES}) +foreach(DEP_PKGS_FILE IN LISTS DEP_PKGS_FILES_LIST) + if (${DEP_PKGS_FILE} MATCHES "/include/|/man/|/doc/|/$|.a$|.pc$|.cmake$") + message("skipping file '${DEP_PKGS_FILE}'") + else() + string(REGEX REPLACE "^/mingw64/" "" DEP_PKGS_FILE_DEST "${DEP_PKGS_FILE}") + string(REGEX REPLACE "/[^/]*$" "" DEP_PKGS_FILE_DEST "${DEP_PKGS_FILE_DEST}") + execute_process(COMMAND cygpath -w "${DEP_PKGS_FILE}" OUTPUT_VARIABLE DEP_PKGS_FILE_W OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REGEX REPLACE "\\\\" "/" DEP_PKGS_FILE_W "${DEP_PKGS_FILE_W}") + message("installing file '${DEP_PKGS_FILE}' (${DEP_PKGS_FILE_W}) into ${DEP_PKGS_FILE_DEST}") + file(COPY ${DEP_PKGS_FILE_W} DESTINATION ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/${DEP_PKGS_FILE_DEST}) + endif() +endforeach() + +# Run Windeployqt to handle Qt libraries, including plugins +execute_process(COMMAND ${WINDEPLOYQT} --compiler-runtime ${MERKAARTOR_BINARY}) + +# Copy all required dlls into the package, skipping those residing in Windows installation +execute_process(COMMAND ${CYGCHECK} ${MERKAARTOR_BINARY} OUTPUT_VARIABLE MERKAARTOR_DLL_DEPS OUTPUT_STRIP_TRAILING_WHITESPACE) +string(REPLACE "\n" ";" MERKAARTOR_DLL_DEPS_LIST ${MERKAARTOR_DLL_DEPS}) +message("Dependencies: ${MERKAARTOR_DLL_DEPS_LIST}") +foreach(DLL_FILE IN LISTS MERKAARTOR_DLL_DEPS_LIST) + string(TOUPPER "${DLL_FILE}" DLL_FILE_UPPER) + if (${DLL_FILE_UPPER} MATCHES "WINDOWS") + message("skipping file '${DLL_FILE}'") + else() + set(DLL_FILE_DEST "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/bin/") + string(STRIP ${DLL_FILE} DLL_FILE) + string(REPLACE "\\\\" "/" DLL_FILE ${DLL_FILE}) + message("copying new dependency '${DLL_FILE}' into ${DLL_FILE_DEST}") + file( COPY ${DLL_FILE} DESTINATION ${DLL_FILE_DEST} ) + endif() +endforeach() + +# Remove when done debugging +get_cmake_property(_variableNames VARIABLES) +list (SORT _variableNames) +foreach (_variableName ${_variableNames}) + message(STATUS "${_variableName}=${${_variableName}}") +endforeach() +#message("Prefix is: ${CMAKE_INSTALL_PREFIX}") +#execute_process(COMMAND ls ${CMAKE_INSTALL_PREFIX}) diff --git a/cmake/upload-artifacts.sh.in b/cmake/upload-artifacts.sh.in new file mode 100755 index 0000000..d9c097b --- /dev/null +++ b/cmake/upload-artifacts.sh.in @@ -0,0 +1,12 @@ +#!/bin/bash + +EXIT_CODE=0 +for file in build/merkaartor-*.{dmg,zip,exe}; do + # The glob may expand to non-existing file if one of the suffixes don't exist. Ignore those and only upload existing artifacts. + if [ -e "$file" ]; then + cloudsmith push raw --version "@VCS_DESCRIBE@" merkaartor/merkaartor-nightly "$file" + [ $? -ne 0 ] && EXIT_CODE=1 + fi +done + +exit ${EXIT_CODE} diff --git a/cmake/vcs-snapshot.cmake b/cmake/vcs-snapshot.cmake new file mode 100644 index 0000000..8f0272c --- /dev/null +++ b/cmake/vcs-snapshot.cmake @@ -0,0 +1,35 @@ +# Minimum required version is 3.12.0 for the list(TRANSFORM), and 3.6.0 for list(FILTER) +cmake_minimum_required(VERSION 3.12.0) + +# This file is processed by git archive and the template is filled in. It is +# always safe to include. The variable VCS_SNAPSHOT is set to 1 when the +# template was filled in, to 0 otherwise. + +# If this file is exported with git, we set the snapshot to 1 and define some values to the variables. +if ("YES" STREQUAL "YES") + set(VCS_SNAPSHOT 1) + set(VCS_BRANCH "SNAPSHOT") + set(VCS_DIRTY 0) + string(SUBSTRING "6d14ea62eb06a9edbe293a1a7f30cdc067f0a252" 0 12 VCS_COMMIT) + if (DEFINED VCS_FALLBACK_VERSION) + set(VCS_DESCRIBE "${VCS_FALLBACK_VERSION}-SNAPSHOT-99999-g6d14ea62e") + else() + message(FATAL_ERROR "Snapshot VCS information in use, but VCS_FALLBACK_VERSION not defined by root CMakeLists.txt.") + endif() + + # Here, we do some magic to extract tags on this commit. The %D will result in a string in form: + # HEAD -> master, tag: mytag1, mytag2 + # To process it, we split it by ", ", filter only elements starting with "tag:" and replace the "tag: " out. + # The remaining variable VCS_TAGS is a CMAKE list of exactly the tags, and can be conveniently test if some tags are found on the current commit. + # Note: this does not help us in generating something like git describe --tags, as I see no way of extracting the last ancestor tag. + set(VCS_REFS "HEAD -> master, tag: 0.19.0") + string(REPLACE ", " ";" VCS_TAGS ${VCS_REFS}) + list(FILTER VCS_TAGS INCLUDE REGEX "^tag: ") + list(TRANSFORM VCS_TAGS REPLACE "^tag: " "") + if (VCS_TAGS) + # Pop first tag into VCS_DESCRIBE if any tags are present. + list(POP_FRONT VCS_TAGS VCS_DESCRIBE) + endif() +else() + set(VCS_SNAPSHOT 0) +endif() diff --git a/cmake/vcs.cmake b/cmake/vcs.cmake new file mode 100644 index 0000000..062ab97 --- /dev/null +++ b/cmake/vcs.cmake @@ -0,0 +1,80 @@ + +if (EXISTS "${CMAKE_SOURCE_DIR}/.git") + # If git directory is present, we require git executable and gather our info from git commands. + find_package(Git) + if (NOT ${GIT_FOUND}) + message(FATAL_ERROR "Git not found. Cannot proceed with version info.") + endif() + + # Set dependencies on git index to reconfigure on changed index/branch (like switching branches, commiting, etc.). + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/.git/index") + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/.git/HEAD") + + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE VCS_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --short=12 HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE VCS_COMMIT + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + execute_process( + COMMAND ${GIT_EXECUTABLE} describe --tags --dirty + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE VCS_DESCRIBE + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + execute_process( + COMMAND ${GIT_EXECUTABLE} diff-index --quiet HEAD -- + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + RESULT_VARIABLE VCS_DIRTY + ) + + # Workaround to update dirty flag when anything changes, as CMake can not + # depend on a command that would check it the git way. This check is only used + # in not dirty state to avoid unnecessary reconfigures during development. + # There are a few drawbacks: + # - reconfigure is not triggered by any other change than in cpp/h file (or + # CMakeLists files, that is the default) + # - When changes are manually reverted from dirty to non-dirty state (without + # touching index/HEAD, for example editor undo), the flag is not updated + # properly + # This workaround shall be replaced if a better way is found. + if (NOT ${VCS_DIRTY}) + file(GLOB_RECURSE DEP_FILES CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/*.cpp" "${CMAKE_SOURCE_DIR}/*.h") + endif() + +else() + # Git was not found, we will try to use snapshot info. + include(${CMAKE_SOURCE_DIR}/cmake/vcs-snapshot.cmake) + if (NOT ${VCS_SNAPSHOT}) + message(FATAL_ERROR "VCS directory does not contain a .git subdirectory, but the snapshot info is not present. Cannot build.") + endif() +endif() + + +# Describe has format 0.18.4-137-gXXX, or 0.18.4 if exactly on tag. We normalize that to: +# 0.18.4 -> 0.18.4 +# 0.18.4-137-gXXX -> 0.18.4.137 +# 0.18.4-rcX-137-gXXX -> 0.18.4.137 +# And use it as version that can be parsed by the cmake VERSION + +# Strip the -rcX and -SHAPSHOT version specifies +string(REGEX REPLACE "(-rc[0-9]+|-SNAPSHOT)" "" VCS_VERSION ${VCS_DESCRIBE}) + +# Replace the -N-gXXX-dirty with .N for the patchlevel +string(REGEX REPLACE "-([0-9]*)-g[0-9a-z]*" ".\\1" VCS_VERSION ${VCS_VERSION}) +string(REGEX REPLACE "-dirty" "" VCS_VERSION ${VCS_VERSION}) + +if (NOT VCS_VERSION MATCHES "^[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?$") + message("VCS_DESCRIBE ${VCS_DESCRIBE}") + message("VCS_VERSION ${VCS_VERSION}") + message(FATAL_ERROR "Unable to parse version description into a version in major.minor.patch.tweak format. Is the latest tag ill-formed?") +endif() diff --git a/include/RTree.h b/include/RTree.h new file mode 100644 index 0000000..37ffdc3 --- /dev/null +++ b/include/RTree.h @@ -0,0 +1,1600 @@ +#ifndef RTREE_H +#define RTREE_H + +// NOTE This file compiles under MSVC 6 SP5 and MSVC .Net 2003 it may not work on other compilers without modification. + +// NOTE These next few lines may be win32 specific, you may need to modify them to compile on other platform +#include +#include +#include +#include + +#define ASSERT assert // RTree uses ASSERT( condition ) +#ifndef Min + #define Min qMin +#endif //Min +#ifndef Max + #define Max qMax +#endif //Max + +// +// RTree.h +// + +#define RTREE_TEMPLATE template +#define RTREE_QUAL RTree + +#define RTREE_DONT_USE_MEMPOOLS // This version does not contain a fixed memory allocator, fill in lines with EXAMPLE to implement one. +#define RTREE_USE_SPHERICAL_VOLUME // Better split classification, may be slower on some systems + +// Fwd decl +class RTFileStream; // File I/O helper class, look below for implementation and notes. + + +/// \class RTree +/// Implementation of RTree, a multidimensional bounding rectangle tree. +/// Example usage: For a 3-dimensional tree use RTree myTree; +/// +/// This modified, templated C++ version by Greg Douglas at Auran (http://www.auran.com) +/// +/// DATATYPE Referenced data, should be int, void*, obj* etc. no larger than sizeof and simple type +/// ELEMTYPE Type of element such as int or float +/// NUMDIMS Number of dimensions such as 2 or 3 +/// ELEMTYPEREAL Type of element that allows fractional and large values such as float or double, for use in volume calcs +/// +/// NOTES: Inserting and removing data requires the knowledge of its constant Minimal Bounding Rectangle. +/// This version uses new/delete for nodes, I recommend using a fixed size allocator for efficiency. +/// Instead of using a callback function for returned results, I recommend and efficient pre-sized, grow-only memory +/// array similar to MFC CArray or STL Vector for returning search query result. +/// +template +class RTree +{ +protected: + + struct Node; // Fwd decl. Used by other internal structs and iterator + +public: + + // These constant must be declared after Branch and before Node struct + // Stuck up here for MSVC 6 compiler. NSVC .NET 2003 is much happier. + enum + { + MAXNODES = TMAXNODES, ///< Max elements in node + MINNODES = TMINNODES, ///< Min elements in node + }; + + +public: + + RTree(); + virtual ~RTree(); + + /// Insert entry + /// \param a_min Min of bounding rect + /// \param a_max Max of bounding rect + /// \param a_dataId Positive Id of data. Maybe zero, but negative numbers not allowed. + void Insert(const ELEMTYPE a_min[NUMDIMS], const ELEMTYPE a_max[NUMDIMS], const DATATYPE& a_dataId); + + /// Remove entry + /// \param a_min Min of bounding rect + /// \param a_max Max of bounding rect + /// \param a_dataId Positive Id of data. Maybe zero, but negative numbers not allowed. + void Remove(const ELEMTYPE a_min[NUMDIMS], const ELEMTYPE a_max[NUMDIMS], const DATATYPE& a_dataId); + + /// Find all within search rectangle + /// \param a_min Min of search bounding rect + /// \param a_max Max of search bounding rect + /// \param a_searchResult Search result array. Caller should set grow size. Function will reset, not append to array. + /// \param a_resultCallback Callback function to return result. Callback should return 'true' to continue searching + /// \param a_context User context to pass as parameter to a_resultCallback + /// \return Returns the number of entries found + int Search(const ELEMTYPE a_min[NUMDIMS], const ELEMTYPE a_max[NUMDIMS], bool a_resultCallback(DATATYPE a_data, void* a_context), void* a_context); + + /// Remove all entries from tree + void RemoveAll(); + + /// Count the data elements in this container. This is slow as no internal counter is maintained. + int Count(); + + /// Load tree contents from file + bool Load(const char* a_fileName); + /// Load tree contents from stream + bool Load(RTFileStream& a_stream); + + + /// Save tree contents to file + bool Save(const char* a_fileName); + /// Save tree contents to stream + bool Save(RTFileStream& a_stream); + + /// Iterator is not remove safe. + class Iterator + { + private: + + enum { MAX_STACK = 32 }; // Max stack size. Allows almost n^32 where n is number of branches in node + + struct StackElement + { + Node* m_node; + int m_branchIndex; + }; + + public: + + Iterator() { Init(); } + + ~Iterator() { } + + /// Is iterator invalid + bool IsNull() { return (m_tos <= 0); } + + /// Is iterator pointing to valid data + bool IsNotNull() { return (m_tos > 0); } + + /// Access the current data element. Caller must be sure iterator is not NULL first. + DATATYPE& operator*() + { + ASSERT(IsNotNull()); + StackElement& curTos = m_stack[m_tos - 1]; + return curTos.m_node->m_branch[curTos.m_branchIndex].m_data; + } + + /// Access the current data element. Caller must be sure iterator is not NULL first. + const DATATYPE& operator*() const + { + ASSERT(IsNotNull()); + StackElement& curTos = m_stack[m_tos - 1]; + return curTos.m_node->m_branch[curTos.m_branchIndex].m_data; + } + + /// Find the next data element + bool operator++() { return FindNextData(); } + + /// Get the bounds for this node + void GetBounds(ELEMTYPE a_min[NUMDIMS], ELEMTYPE a_max[NUMDIMS]) + { + ASSERT(IsNotNull()); + StackElement& curTos = m_stack[m_tos - 1]; + Branch& curBranch = curTos.m_node->m_branch[curTos.m_branchIndex]; + + for(int index = 0; index < NUMDIMS; ++index) + { + a_min[index] = curBranch.m_rect.m_min[index]; + a_max[index] = curBranch.m_rect.m_max[index]; + } + } + + private: + + /// Reset iterator + void Init() { m_tos = 0; } + + /// Find the next data element in the tree (For internal use only) + bool FindNextData() + { + for(;;) + { + if(m_tos <= 0) + { + return false; + } + StackElement curTos = Pop(); // Copy stack top cause it may change as we use it + + if(curTos.m_node->IsLeaf()) + { + // Keep walking through data while we can + if(curTos.m_branchIndex+1 < curTos.m_node->m_count) + { + // There is more data, just point to the next one + Push(curTos.m_node, curTos.m_branchIndex + 1); + return true; + } + // No more data, so it will fall back to previous level + } + else + { + if(curTos.m_branchIndex+1 < curTos.m_node->m_count) + { + // Push sibling on for future tree walk + // This is the 'fall back' node when we finish with the current level + Push(curTos.m_node, curTos.m_branchIndex + 1); + } + // Since cur node is not a leaf, push first of next level to get deeper into the tree + Node* nextLevelnode = curTos.m_node->m_branch[curTos.m_branchIndex].m_child; + Push(nextLevelnode, 0); + + // If we pushed on a new leaf, exit as the data is ready at TOS + if(nextLevelnode->IsLeaf()) + { + return true; + } + } + } + } + + /// Push node and branch onto iteration stack (For internal use only) + void Push(Node* a_node, int a_branchIndex) + { + m_stack[m_tos].m_node = a_node; + m_stack[m_tos].m_branchIndex = a_branchIndex; + ++m_tos; + ASSERT(m_tos <= MAX_STACK); + } + + /// Pop element off iteration stack (For internal use only) + StackElement& Pop() + { + ASSERT(m_tos > 0); + --m_tos; + return m_stack[m_tos]; + } + + StackElement m_stack[MAX_STACK]; ///< Stack as we are doing iteration instead of recursion + int m_tos; ///< Top Of Stack index + + friend class RTree; // Allow hiding of non-public functions while allowing manipulation by logical owner + }; + + /// Get 'first' for iteration + void GetFirst(Iterator& a_it) + { + a_it.Init(); + Node* first = m_root; + while(first) + { + if(first->IsInternalNode() && first->m_count > 1) + { + a_it.Push(first, 1); // Descend sibling branch later + } + else if(first->IsLeaf()) + { + if(first->m_count) + { + a_it.Push(first, 0); + } + break; + } + first = first->m_branch[0].m_child; + } + } + + /// Get Next for iteration + void GetNext(Iterator& a_it) { ++a_it; } + + /// Is iterator NULL, or at end? + bool IsNull(Iterator& a_it) { return a_it.IsNull(); } + + /// Get object at iterator position + DATATYPE& GetAt(Iterator& a_it) { return *a_it; } + +protected: + + /// Minimal bounding rectangle (n-dimensional) + struct Rect + { + ELEMTYPE m_min[NUMDIMS]; ///< Min dimensions of bounding box + ELEMTYPE m_max[NUMDIMS]; ///< Max dimensions of bounding box + }; + + /// May be data or may be another subtree + /// The parents level determines this. + /// If the parents level is 0, then this is data + struct Branch + { + Rect m_rect; ///< Bounds + union + { + Node* m_child; ///< Child node + DATATYPE m_data; ///< Data Id or Ptr + }; + }; + + /// Node for each branch level + struct Node + { + bool IsInternalNode() { return (m_level > 0); } // Not a leaf, but a internal node + bool IsLeaf() { return (m_level == 0); } // A leaf, contains data + + int m_count; ///< Count + int m_level; ///< Leaf is zero, others positive + Branch m_branch[MAXNODES]; ///< Branch + }; + + /// A link list of nodes for reinsertion after a delete operation + struct ListNode + { + ListNode* m_next; ///< Next in list + Node* m_node; ///< Node + }; + + /// Variables for finding a split partition + struct PartitionVars + { + int m_partition[MAXNODES+1]; + int m_total; + int m_minFill; + int m_taken[MAXNODES+1]; + int m_count[2]; + Rect m_cover[2]; + ELEMTYPEREAL m_area[2]; + + Branch m_branchBuf[MAXNODES+1]; + int m_branchCount; + Rect m_coverSplit; + ELEMTYPEREAL m_coverSplitArea; + }; + + Node* AllocNode(); + void FreeNode(Node* a_node); + void InitNode(Node* a_node); + void InitRect(Rect* a_rect); + bool InsertRectRec(Rect* a_rect, const DATATYPE& a_id, Node* a_node, Node** a_newNode, int a_level); + bool InsertRect(Rect* a_rect, const DATATYPE& a_id, Node** a_root, int a_level); + Rect NodeCover(Node* a_node); + bool AddBranch(Branch* a_branch, Node* a_node, Node** a_newNode); + void DisconnectBranch(Node* a_node, int a_index); + int PickBranch(Rect* a_rect, Node* a_node); + Rect CombineRect(Rect* a_rectA, Rect* a_rectB); + void SplitNode(Node* a_node, Branch* a_branch, Node** a_newNode); + ELEMTYPEREAL RectSphericalVolume(Rect* a_rect); + ELEMTYPEREAL RectVolume(Rect* a_rect); + ELEMTYPEREAL CalcRectVolume(Rect* a_rect); + void GetBranches(Node* a_node, Branch* a_branch, PartitionVars* a_parVars); + void ChoosePartition(PartitionVars* a_parVars, int a_minFill); + void LoadNodes(Node* a_nodeA, Node* a_nodeB, PartitionVars* a_parVars); + void InitParVars(PartitionVars* a_parVars, int a_maxRects, int a_minFill); + void PickSeeds(PartitionVars* a_parVars); + void Classify(int a_index, int a_group, PartitionVars* a_parVars); + bool RemoveRect(Rect* a_rect, const DATATYPE& a_id, Node** a_root); + bool RemoveRectRec(Rect* a_rect, const DATATYPE& a_id, Node* a_node, ListNode** a_listNode); + ListNode* AllocListNode(); + void FreeListNode(ListNode* a_listNode); + bool Overlap(Rect* a_rectA, Rect* a_rectB); + void ReInsert(Node* a_node, ListNode** a_listNode); + bool Search(Node* a_node, Rect* a_rect, int& a_foundCount, bool a_resultCallback(DATATYPE a_data, void* a_context), void* a_context); + void RemoveAllRec(Node* a_node); + void Reset(); + void CountRec(Node* a_node, int& a_count); + + bool SaveRec(Node* a_node, RTFileStream& a_stream); + bool LoadRec(Node* a_node, RTFileStream& a_stream); + + Node* m_root; ///< Root of tree + ELEMTYPEREAL m_unitSphereVolume; ///< Unit sphere constant for required number of dimensions +}; + + +// Because there is not stream support, this is a quick and dirty file I/O helper. +// Users will likely replace its usage with a Stream implementation from their favorite API. +class RTFileStream +{ + FILE* m_file; + +public: + + + RTFileStream() + { + m_file = NULL; + } + + ~RTFileStream() + { + Close(); + } + + bool OpenRead(const char* a_fileName) + { + m_file = fopen(a_fileName, "rb"); + if(!m_file) + { + return false; + } + return true; + } + + bool OpenWrite(const char* a_fileName) + { + m_file = fopen(a_fileName, "wb"); + if(!m_file) + { + return false; + } + return true; + } + + void Close() + { + if(m_file) + { + fclose(m_file); + m_file = NULL; + } + } + + template< typename TYPE > + size_t Write(const TYPE& a_value) + { + ASSERT(m_file); + return fwrite((void*)&a_value, sizeof(a_value), 1, m_file); + } + + template< typename TYPE > + size_t WriteArray(const TYPE* a_array, int a_count) + { + ASSERT(m_file); + return fwrite((void*)a_array, sizeof(TYPE) * a_count, 1, m_file); + } + + template< typename TYPE > + size_t Read(TYPE& a_value) + { + ASSERT(m_file); + return fread((void*)&a_value, sizeof(a_value), 1, m_file); + } + + template< typename TYPE > + size_t ReadArray(TYPE* a_array, int a_count) + { + ASSERT(m_file); + return fread((void*)a_array, sizeof(TYPE) * a_count, 1, m_file); + } +}; + + +RTREE_TEMPLATE +RTREE_QUAL::RTree() +{ + ASSERT(MAXNODES > MINNODES); + ASSERT(MINNODES > 0); + + + // We only support machine word size simple data type eg. integer index or object pointer. + // Since we are storing as union with non data branch + ASSERT(sizeof(DATATYPE) == sizeof(void*) || sizeof(DATATYPE) == sizeof(int)); + + // Precomputed volumes of the unit spheres for the first few dimensions + const float UNIT_SPHERE_VOLUMES[] = { + 0.000000f, 2.000000f, 3.141593f, // Dimension 0,1,2 + 4.188790f, 4.934802f, 5.263789f, // Dimension 3,4,5 + 5.167713f, 4.724766f, 4.058712f, // Dimension 6,7,8 + 3.298509f, 2.550164f, 1.884104f, // Dimension 9,10,11 + 1.335263f, 0.910629f, 0.599265f, // Dimension 12,13,14 + 0.381443f, 0.235331f, 0.140981f, // Dimension 15,16,17 + 0.082146f, 0.046622f, 0.025807f, // Dimension 18,19,20 + }; + + m_root = AllocNode(); + m_root->m_level = 0; + m_unitSphereVolume = (ELEMTYPEREAL)UNIT_SPHERE_VOLUMES[NUMDIMS]; +} + + +RTREE_TEMPLATE +RTREE_QUAL::~RTree() +{ + Reset(); // Free, or reset node memory +} + + +RTREE_TEMPLATE +void RTREE_QUAL::Insert(const ELEMTYPE a_min[NUMDIMS], const ELEMTYPE a_max[NUMDIMS], const DATATYPE& a_dataId) +{ +#ifdef _DEBUG + for(int index=0; indexIsInternalNode()) // not a leaf node + { + for(int index = 0; index < a_node->m_count; ++index) + { + CountRec(a_node->m_branch[index].m_child, a_count); + } + } + else // A leaf node + { + a_count += a_node->m_count; + } +} + + +RTREE_TEMPLATE +bool RTREE_QUAL::Load(const char* a_fileName) +{ + RemoveAll(); // Clear existing tree + + RTFileStream stream; + if(!stream.OpenRead(a_fileName)) + { + return false; + } + + bool result = Load(stream); + + stream.Close(); + + return result; +}; + + + +RTREE_TEMPLATE +bool RTREE_QUAL::Load(RTFileStream& a_stream) +{ + // Write some kind of header + int _dataFileId = ('R'<<0)|('T'<<8)|('R'<<16)|('E'<<24); + int _dataSize = sizeof(DATATYPE); + int _dataNumDims = NUMDIMS; + int _dataElemSize = sizeof(ELEMTYPE); + int _dataElemRealSize = sizeof(ELEMTYPEREAL); + int _dataMaxNodes = TMAXNODES; + int _dataMinNodes = TMINNODES; + + int dataFileId = 0; + int dataSize = 0; + int dataNumDims = 0; + int dataElemSize = 0; + int dataElemRealSize = 0; + int dataMaxNodes = 0; + int dataMinNodes = 0; + + a_stream.Read(dataFileId); + a_stream.Read(dataSize); + a_stream.Read(dataNumDims); + a_stream.Read(dataElemSize); + a_stream.Read(dataElemRealSize); + a_stream.Read(dataMaxNodes); + a_stream.Read(dataMinNodes); + + bool result = false; + + // Test if header was valid and compatible + if( (dataFileId == _dataFileId) + && (dataSize == _dataSize) + && (dataNumDims == _dataNumDims) + && (dataElemSize == _dataElemSize) + && (dataElemRealSize == _dataElemRealSize) + && (dataMaxNodes == _dataMaxNodes) + && (dataMinNodes == _dataMinNodes) + ) + { + // Recursively load tree + result = LoadRec(m_root, a_stream); + } + + return result; +} + + +RTREE_TEMPLATE +bool RTREE_QUAL::LoadRec(Node* a_node, RTFileStream& a_stream) +{ + a_stream.Read(a_node->m_level); + a_stream.Read(a_node->m_count); + + if(a_node->IsInternalNode()) // not a leaf node + { + for(int index = 0; index < a_node->m_count; ++index) + { + Branch* curBranch = &a_node->m_branch[index]; + + a_stream.ReadArray(curBranch->m_rect.m_min, NUMDIMS); + a_stream.ReadArray(curBranch->m_rect.m_max, NUMDIMS); + + curBranch->m_child = AllocNode(); + LoadRec(curBranch->m_child, a_stream); + } + } + else // A leaf node + { + for(int index = 0; index < a_node->m_count; ++index) + { + Branch* curBranch = &a_node->m_branch[index]; + + a_stream.ReadArray(curBranch->m_rect.m_min, NUMDIMS); + a_stream.ReadArray(curBranch->m_rect.m_max, NUMDIMS); + + a_stream.Read(curBranch->m_data); + } + } + + return true; // Should do more error checking on I/O operations +} + + +RTREE_TEMPLATE +bool RTREE_QUAL::Save(const char* a_fileName) +{ + RTFileStream stream; + if(!stream.OpenWrite(a_fileName)) + { + return false; + } + + bool result = Save(stream); + + stream.Close(); + + return result; +} + + +RTREE_TEMPLATE +bool RTREE_QUAL::Save(RTFileStream& a_stream) +{ + // Write some kind of header + int dataFileId = ('R'<<0)|('T'<<8)|('R'<<16)|('E'<<24); + int dataSize = sizeof(DATATYPE); + int dataNumDims = NUMDIMS; + int dataElemSize = sizeof(ELEMTYPE); + int dataElemRealSize = sizeof(ELEMTYPEREAL); + int dataMaxNodes = TMAXNODES; + int dataMinNodes = TMINNODES; + + a_stream.Write(dataFileId); + a_stream.Write(dataSize); + a_stream.Write(dataNumDims); + a_stream.Write(dataElemSize); + a_stream.Write(dataElemRealSize); + a_stream.Write(dataMaxNodes); + a_stream.Write(dataMinNodes); + + // Recursively save tree + bool result = SaveRec(m_root, a_stream); + + return result; +} + + +RTREE_TEMPLATE +bool RTREE_QUAL::SaveRec(Node* a_node, RTFileStream& a_stream) +{ + a_stream.Write(a_node->m_level); + a_stream.Write(a_node->m_count); + + if(a_node->IsInternalNode()) // not a leaf node + { + for(int index = 0; index < a_node->m_count; ++index) + { + Branch* curBranch = &a_node->m_branch[index]; + + a_stream.WriteArray(curBranch->m_rect.m_min, NUMDIMS); + a_stream.WriteArray(curBranch->m_rect.m_max, NUMDIMS); + + SaveRec(curBranch->m_child, a_stream); + } + } + else // A leaf node + { + for(int index = 0; index < a_node->m_count; ++index) + { + Branch* curBranch = &a_node->m_branch[index]; + + a_stream.WriteArray(curBranch->m_rect.m_min, NUMDIMS); + a_stream.WriteArray(curBranch->m_rect.m_max, NUMDIMS); + + a_stream.Write(curBranch->m_data); + } + } + + return true; // Should do more error checking on I/O operations +} + + +RTREE_TEMPLATE +void RTREE_QUAL::RemoveAll() +{ + // Delete all existing nodes + Reset(); + + m_root = AllocNode(); + m_root->m_level = 0; +} + + +RTREE_TEMPLATE +void RTREE_QUAL::Reset() +{ +#ifdef RTREE_DONT_USE_MEMPOOLS + // Delete all existing nodes + RemoveAllRec(m_root); +#else // RTREE_DONT_USE_MEMPOOLS + // Just reset memory pools. We are not using complex types + // EXAMPLE +#endif // RTREE_DONT_USE_MEMPOOLS +} + + +RTREE_TEMPLATE +void RTREE_QUAL::RemoveAllRec(Node* a_node) +{ + ASSERT(a_node); + ASSERT(a_node->m_level >= 0); + + if(a_node->IsInternalNode()) // This is an internal node in the tree + { + for(int index=0; index < a_node->m_count; ++index) + { + RemoveAllRec(a_node->m_branch[index].m_child); + } + } + FreeNode(a_node); +} + + +RTREE_TEMPLATE +typename RTREE_QUAL::Node* RTREE_QUAL::AllocNode() +{ + Node* newNode; +#ifdef RTREE_DONT_USE_MEMPOOLS + newNode = new Node; +#else // RTREE_DONT_USE_MEMPOOLS + // EXAMPLE +#endif // RTREE_DONT_USE_MEMPOOLS + InitNode(newNode); + return newNode; +} + + +RTREE_TEMPLATE +void RTREE_QUAL::FreeNode(Node* a_node) +{ + ASSERT(a_node); + +#ifdef RTREE_DONT_USE_MEMPOOLS + delete a_node; +#else // RTREE_DONT_USE_MEMPOOLS + // EXAMPLE +#endif // RTREE_DONT_USE_MEMPOOLS +} + + +// Allocate space for a node in the list used in DeletRect to +// store Nodes that are too empty. +RTREE_TEMPLATE +typename RTREE_QUAL::ListNode* RTREE_QUAL::AllocListNode() +{ +#ifdef RTREE_DONT_USE_MEMPOOLS + return new ListNode; +#else // RTREE_DONT_USE_MEMPOOLS + // EXAMPLE +#endif // RTREE_DONT_USE_MEMPOOLS +} + + +RTREE_TEMPLATE +void RTREE_QUAL::FreeListNode(ListNode* a_listNode) +{ +#ifdef RTREE_DONT_USE_MEMPOOLS + delete a_listNode; +#else // RTREE_DONT_USE_MEMPOOLS + // EXAMPLE +#endif // RTREE_DONT_USE_MEMPOOLS +} + + +RTREE_TEMPLATE +void RTREE_QUAL::InitNode(Node* a_node) +{ + a_node->m_count = 0; + a_node->m_level = -1; +} + + +RTREE_TEMPLATE +void RTREE_QUAL::InitRect(Rect* a_rect) +{ + for(int index = 0; index < NUMDIMS; ++index) + { + a_rect->m_min[index] = (ELEMTYPE)0; + a_rect->m_max[index] = (ELEMTYPE)0; + } +} + + +// Inserts a new data rectangle into the index structure. +// Recursively descends tree, propagates splits back up. +// Returns 0 if node was not split. Old node updated. +// If node was split, returns 1 and sets the pointer pointed to by +// new_node to point to the new node. Old node updated to become one of two. +// The level argument specifies the number of steps up from the leaf +// level to insert; e.g. a data rectangle goes in at level = 0. +RTREE_TEMPLATE +bool RTREE_QUAL::InsertRectRec(Rect* a_rect, const DATATYPE& a_id, Node* a_node, Node** a_newNode, int a_level) +{ + ASSERT(a_rect && a_node && a_newNode); + ASSERT(a_level >= 0 && a_level <= a_node->m_level); + + int index; + Branch branch; + Node* otherNode; + + // Still above level for insertion, go down tree recursively + if(a_node->m_level > a_level) + { + index = PickBranch(a_rect, a_node); + if (!InsertRectRec(a_rect, a_id, a_node->m_branch[index].m_child, &otherNode, a_level)) + { + // Child was not split + a_node->m_branch[index].m_rect = CombineRect(a_rect, &(a_node->m_branch[index].m_rect)); + return false; + } + else // Child was split + { + a_node->m_branch[index].m_rect = NodeCover(a_node->m_branch[index].m_child); + branch.m_child = otherNode; + branch.m_rect = NodeCover(otherNode); + return AddBranch(&branch, a_node, a_newNode); + } + } + else if(a_node->m_level == a_level) // Have reached level for insertion. Add rect, split if necessary + { + branch.m_rect = *a_rect; + branch.m_child = (Node*) a_id; + // Child field of leaves contains id of data record + return AddBranch(&branch, a_node, a_newNode); + } + else + { + // Should never occur + ASSERT(0); + return false; + } +} + + +// Insert a data rectangle into an index structure. +// InsertRect provides for splitting the root; +// returns 1 if root was split, 0 if it was not. +// The level argument specifies the number of steps up from the leaf +// level to insert; e.g. a data rectangle goes in at level = 0. +// InsertRect2 does the recursion. +// +RTREE_TEMPLATE +bool RTREE_QUAL::InsertRect(Rect* a_rect, const DATATYPE& a_id, Node** a_root, int a_level) +{ + ASSERT(a_rect && a_root); + ASSERT(a_level >= 0 && a_level <= (*a_root)->m_level); +#ifdef _DEBUG + for(int index=0; index < NUMDIMS; ++index) + { + ASSERT(a_rect->m_min[index] <= a_rect->m_max[index]); + } +#endif //_DEBUG + + Node* newRoot; + Node* newNode; + Branch branch; + + if(InsertRectRec(a_rect, a_id, *a_root, &newNode, a_level)) // Root split + { + newRoot = AllocNode(); // Grow tree taller and new root + newRoot->m_level = (*a_root)->m_level + 1; + branch.m_rect = NodeCover(*a_root); + branch.m_child = *a_root; + AddBranch(&branch, newRoot, NULL); + branch.m_rect = NodeCover(newNode); + branch.m_child = newNode; + AddBranch(&branch, newRoot, NULL); + *a_root = newRoot; + return true; + } + + return false; +} + + +// Find the smallest rectangle that includes all rectangles in branches of a node. +RTREE_TEMPLATE +typename RTREE_QUAL::Rect RTREE_QUAL::NodeCover(Node* a_node) +{ + ASSERT(a_node); + + int firstTime = true; + Rect rect; + InitRect(&rect); + + for(int index = 0; index < a_node->m_count; ++index) + { + if(firstTime) + { + rect = a_node->m_branch[index].m_rect; + firstTime = false; + } + else + { + rect = CombineRect(&rect, &(a_node->m_branch[index].m_rect)); + } + } + + return rect; +} + + +// Add a branch to a node. Split the node if necessary. +// Returns 0 if node not split. Old node updated. +// Returns 1 if node split, sets *new_node to address of new node. +// Old node updated, becomes one of two. +RTREE_TEMPLATE +bool RTREE_QUAL::AddBranch(Branch* a_branch, Node* a_node, Node** a_newNode) +{ + ASSERT(a_branch); + ASSERT(a_node); + + if(a_node->m_count < MAXNODES) // Split won't be necessary + { + a_node->m_branch[a_node->m_count] = *a_branch; + ++a_node->m_count; + + return false; + } + else + { + ASSERT(a_newNode); + + SplitNode(a_node, a_branch, a_newNode); + return true; + } +} + + +// Disconnect a dependent node. +// Caller must return (or stop using iteration index) after this as count has changed +RTREE_TEMPLATE +void RTREE_QUAL::DisconnectBranch(Node* a_node, int a_index) +{ + ASSERT(a_node && (a_index >= 0) && (a_index < MAXNODES)); + ASSERT(a_node->m_count > 0); + + // Remove element by swapping with the last element to prevent gaps in array + a_node->m_branch[a_index] = a_node->m_branch[a_node->m_count - 1]; + + --a_node->m_count; +} + + +// Pick a branch. Pick the one that will need the smallest increase +// in area to accomodate the new rectangle. This will result in the +// least total area for the covering rectangles in the current node. +// In case of a tie, pick the one which was smaller before, to get +// the best resolution when searching. +RTREE_TEMPLATE +int RTREE_QUAL::PickBranch(Rect* a_rect, Node* a_node) +{ + ASSERT(a_rect && a_node); + + bool firstTime = true; + ELEMTYPEREAL increase; + ELEMTYPEREAL bestIncr = (ELEMTYPEREAL)-1; + ELEMTYPEREAL area; + ELEMTYPEREAL bestArea; + int best = -1; + Rect tempRect; + + for(int index=0; index < a_node->m_count; ++index) + { + Rect* curRect = &a_node->m_branch[index].m_rect; + area = CalcRectVolume(curRect); + tempRect = CombineRect(a_rect, curRect); + increase = CalcRectVolume(&tempRect) - area; + if((increase < bestIncr) || firstTime) + { + best = index; + bestArea = area; + bestIncr = increase; + firstTime = false; + } + else if((increase == bestIncr) && (area < bestArea)) + { + best = index; + bestArea = area; + bestIncr = increase; + } + } + ASSERT(best >= 0); + return best; +} + + +// Combine two rectangles into larger one containing both +RTREE_TEMPLATE +typename RTREE_QUAL::Rect RTREE_QUAL::CombineRect(Rect* a_rectA, Rect* a_rectB) +{ + ASSERT(a_rectA && a_rectB); + + Rect newRect; + + for(int index = 0; index < NUMDIMS; ++index) + { + newRect.m_min[index] = Min(a_rectA->m_min[index], a_rectB->m_min[index]); + newRect.m_max[index] = Max(a_rectA->m_max[index], a_rectB->m_max[index]); + } + + return newRect; +} + + + +// Split a node. +// Divides the nodes branches and the extra one between two nodes. +// Old node is one of the new ones, and one really new one is created. +// Tries more than one method for choosing a partition, uses best result. +RTREE_TEMPLATE +void RTREE_QUAL::SplitNode(Node* a_node, Branch* a_branch, Node** a_newNode) +{ + ASSERT(a_node); + ASSERT(a_branch); + + // Could just use local here, but member or external is faster since it is reused + PartitionVars localVars; + PartitionVars* parVars = &localVars; + int level; + + // Load all the branches into a buffer, initialize old node + level = a_node->m_level; + GetBranches(a_node, a_branch, parVars); + + // Find partition + ChoosePartition(parVars, MINNODES); + + // Put branches from buffer into 2 nodes according to chosen partition + *a_newNode = AllocNode(); + (*a_newNode)->m_level = a_node->m_level = level; + LoadNodes(a_node, *a_newNode, parVars); + + ASSERT((a_node->m_count + (*a_newNode)->m_count) == parVars->m_total); +} + + +// Calculate the n-dimensional volume of a rectangle +RTREE_TEMPLATE +ELEMTYPEREAL RTREE_QUAL::RectVolume(Rect* a_rect) +{ + ASSERT(a_rect); + + ELEMTYPEREAL volume = (ELEMTYPEREAL)1; + + for(int index=0; indexm_max[index] - a_rect->m_min[index]; + } + + ASSERT(volume >= (ELEMTYPEREAL)0); + + return volume; +} + + +// The exact volume of the bounding sphere for the given Rect +RTREE_TEMPLATE +ELEMTYPEREAL RTREE_QUAL::RectSphericalVolume(Rect* a_rect) +{ + ASSERT(a_rect); + + ELEMTYPEREAL sumOfSquares = (ELEMTYPEREAL)0; + ELEMTYPEREAL radius; + + for(int index=0; index < NUMDIMS; ++index) + { + ELEMTYPEREAL halfExtent = ((ELEMTYPEREAL)a_rect->m_max[index] - (ELEMTYPEREAL)a_rect->m_min[index]) * 0.5f; + sumOfSquares += halfExtent * halfExtent; + } + + radius = (ELEMTYPEREAL)sqrt(sumOfSquares); + + // Pow maybe slow, so test for common dims like 2,3 and just use x*x, x*x*x. + if(NUMDIMS == 3) + { + return (radius * radius * radius * m_unitSphereVolume); + } + else if(NUMDIMS == 2) + { + return (radius * radius * m_unitSphereVolume); + } + else + { + return (ELEMTYPEREAL)(pow(radius, NUMDIMS) * m_unitSphereVolume); + } +} + + +// Use one of the methods to calculate retangle volume +RTREE_TEMPLATE +ELEMTYPEREAL RTREE_QUAL::CalcRectVolume(Rect* a_rect) +{ +#ifdef RTREE_USE_SPHERICAL_VOLUME + return RectSphericalVolume(a_rect); // Slower but helps certain merge cases +#else // RTREE_USE_SPHERICAL_VOLUME + return RectVolume(a_rect); // Faster but can cause poor merges +#endif // RTREE_USE_SPHERICAL_VOLUME +} + + +// Load branch buffer with branches from full node plus the extra branch. +RTREE_TEMPLATE +void RTREE_QUAL::GetBranches(Node* a_node, Branch* a_branch, PartitionVars* a_parVars) +{ + ASSERT(a_node); + ASSERT(a_branch); + + ASSERT(a_node->m_count == MAXNODES); + + // Load the branch buffer + for(int index=0; index < MAXNODES; ++index) + { + a_parVars->m_branchBuf[index] = a_node->m_branch[index]; + } + a_parVars->m_branchBuf[MAXNODES] = *a_branch; + a_parVars->m_branchCount = MAXNODES + 1; + + // Calculate rect containing all in the set + a_parVars->m_coverSplit = a_parVars->m_branchBuf[0].m_rect; + for(int index=1; index < MAXNODES+1; ++index) + { + a_parVars->m_coverSplit = CombineRect(&a_parVars->m_coverSplit, &a_parVars->m_branchBuf[index].m_rect); + } + a_parVars->m_coverSplitArea = CalcRectVolume(&a_parVars->m_coverSplit); + + InitNode(a_node); +} + + +// Method #0 for choosing a partition: +// As the seeds for the two groups, pick the two rects that would waste the +// most area if covered by a single rectangle, i.e. evidently the worst pair +// to have in the same group. +// Of the remaining, one at a time is chosen to be put in one of the two groups. +// The one chosen is the one with the greatest difference in area expansion +// depending on which group - the rect most strongly attracted to one group +// and repelled from the other. +// If one group gets too full (more would force other group to violate min +// fill requirement) then other group gets the rest. +// These last are the ones that can go in either group most easily. +RTREE_TEMPLATE +void RTREE_QUAL::ChoosePartition(PartitionVars* a_parVars, int a_minFill) +{ + ASSERT(a_parVars); + + ELEMTYPEREAL biggestDiff; + /* group,bettergroup,chosen \in {0,1} */ + int group = -1, chosen = -1, betterGroup = -1; + + InitParVars(a_parVars, a_parVars->m_branchCount, a_minFill); + PickSeeds(a_parVars); + + while (((a_parVars->m_count[0] + a_parVars->m_count[1]) < a_parVars->m_total) + && (a_parVars->m_count[0] < (a_parVars->m_total - a_parVars->m_minFill)) + && (a_parVars->m_count[1] < (a_parVars->m_total - a_parVars->m_minFill))) + { + biggestDiff = (ELEMTYPEREAL) -1; + for(int index=0; indexm_total; ++index) + { + if(!a_parVars->m_taken[index]) + { + Rect* curRect = &a_parVars->m_branchBuf[index].m_rect; + Rect rect0 = CombineRect(curRect, &a_parVars->m_cover[0]); + Rect rect1 = CombineRect(curRect, &a_parVars->m_cover[1]); + ELEMTYPEREAL growth0 = CalcRectVolume(&rect0) - a_parVars->m_area[0]; + ELEMTYPEREAL growth1 = CalcRectVolume(&rect1) - a_parVars->m_area[1]; + ELEMTYPEREAL diff = growth1 - growth0; + if(diff >= 0) + { + group = 0; + } + else + { + group = 1; + diff = -diff; + } + + if(diff > biggestDiff) + { + biggestDiff = diff; + chosen = index; + betterGroup = group; + } + else if((diff == biggestDiff) && (a_parVars->m_count[group] < a_parVars->m_count[betterGroup])) + { + chosen = index; + betterGroup = group; + } + } + } + Classify(chosen, betterGroup, a_parVars); + } + + /* Check if they were assigned. */ + ASSERT(group > -1); + ASSERT(chosen > -1); + ASSERT(betterGroup > -1); + + // If one group too full, put remaining rects in the other + if((a_parVars->m_count[0] + a_parVars->m_count[1]) < a_parVars->m_total) + { + if(a_parVars->m_count[0] >= a_parVars->m_total - a_parVars->m_minFill) + { + group = 1; + } + else + { + group = 0; + } + for(int index=0; indexm_total; ++index) + { + if(!a_parVars->m_taken[index]) + { + Classify(index, group, a_parVars); + } + } + } + + ASSERT((a_parVars->m_count[0] + a_parVars->m_count[1]) == a_parVars->m_total); + ASSERT((a_parVars->m_count[0] >= a_parVars->m_minFill) && + (a_parVars->m_count[1] >= a_parVars->m_minFill)); +} + + +// Copy branches from the buffer into two nodes according to the partition. +RTREE_TEMPLATE +void RTREE_QUAL::LoadNodes(Node* a_nodeA, Node* a_nodeB, PartitionVars* a_parVars) +{ + ASSERT(a_nodeA); + ASSERT(a_nodeB); + ASSERT(a_parVars); + + for(int index=0; index < a_parVars->m_total; ++index) + { + ASSERT(a_parVars->m_partition[index] == 0 || a_parVars->m_partition[index] == 1); + + if(a_parVars->m_partition[index] == 0) + { + AddBranch(&a_parVars->m_branchBuf[index], a_nodeA, NULL); + } + else if(a_parVars->m_partition[index] == 1) + { + AddBranch(&a_parVars->m_branchBuf[index], a_nodeB, NULL); + } + } +} + + +// Initialize a PartitionVars structure. +RTREE_TEMPLATE +void RTREE_QUAL::InitParVars(PartitionVars* a_parVars, int a_maxRects, int a_minFill) +{ + ASSERT(a_parVars); + + a_parVars->m_count[0] = a_parVars->m_count[1] = 0; + a_parVars->m_area[0] = a_parVars->m_area[1] = (ELEMTYPEREAL)0; + a_parVars->m_total = a_maxRects; + a_parVars->m_minFill = a_minFill; + for(int index=0; index < a_maxRects; ++index) + { + a_parVars->m_taken[index] = false; + a_parVars->m_partition[index] = -1; + } +} + + +RTREE_TEMPLATE +void RTREE_QUAL::PickSeeds(PartitionVars* a_parVars) +{ + int seed0 = 0, seed1 = 1; + ELEMTYPEREAL worst, waste; + ELEMTYPEREAL area[MAXNODES+1]; + + for(int index=0; indexm_total; ++index) + { + area[index] = CalcRectVolume(&a_parVars->m_branchBuf[index].m_rect); + } + + worst = -a_parVars->m_coverSplitArea - 1; + for(int indexA=0; indexA < a_parVars->m_total-1; ++indexA) + { + for(int indexB = indexA+1; indexB < a_parVars->m_total; ++indexB) + { + Rect oneRect = CombineRect(&a_parVars->m_branchBuf[indexA].m_rect, &a_parVars->m_branchBuf[indexB].m_rect); + waste = CalcRectVolume(&oneRect) - area[indexA] - area[indexB]; + if(waste > worst) + { + worst = waste; + seed0 = indexA; + seed1 = indexB; + } + } + } + Classify(seed0, 0, a_parVars); + Classify(seed1, 1, a_parVars); +} + + +// Put a branch in one of the groups. +RTREE_TEMPLATE +void RTREE_QUAL::Classify(int a_index, int a_group, PartitionVars* a_parVars) +{ + ASSERT(a_parVars); + ASSERT(!a_parVars->m_taken[a_index]); + + a_parVars->m_partition[a_index] = a_group; + a_parVars->m_taken[a_index] = true; + + if (a_parVars->m_count[a_group] == 0) + { + a_parVars->m_cover[a_group] = a_parVars->m_branchBuf[a_index].m_rect; + } + else + { + a_parVars->m_cover[a_group] = CombineRect(&a_parVars->m_branchBuf[a_index].m_rect, &a_parVars->m_cover[a_group]); + } + a_parVars->m_area[a_group] = CalcRectVolume(&a_parVars->m_cover[a_group]); + ++a_parVars->m_count[a_group]; +} + + +// Delete a data rectangle from an index structure. +// Pass in a pointer to a Rect, the tid of the record, ptr to ptr to root node. +// Returns 1 if record not found, 0 if success. +// RemoveRect provides for eliminating the root. +RTREE_TEMPLATE +bool RTREE_QUAL::RemoveRect(Rect* a_rect, const DATATYPE& a_id, Node** a_root) +{ + ASSERT(a_rect && a_root); + ASSERT(*a_root); + + Node* tempNode; + ListNode* reInsertList = NULL; + + if(!RemoveRectRec(a_rect, a_id, *a_root, &reInsertList)) + { + // Found and deleted a data item + // Reinsert any branches from eliminated nodes + while(reInsertList) + { + tempNode = reInsertList->m_node; + + for(int index = 0; index < tempNode->m_count; ++index) + { + InsertRect(&(tempNode->m_branch[index].m_rect), + tempNode->m_branch[index].m_data, + a_root, + tempNode->m_level); + } + + ListNode* remLNode = reInsertList; + reInsertList = reInsertList->m_next; + + FreeNode(remLNode->m_node); + FreeListNode(remLNode); + } + + // Check for redundant root (not leaf, 1 child) and eliminate + if((*a_root)->m_count == 1 && (*a_root)->IsInternalNode()) + { + tempNode = (*a_root)->m_branch[0].m_child; + + ASSERT(tempNode); + FreeNode(*a_root); + *a_root = tempNode; + } + return false; + } + else + { + return true; + } +} + + +// Delete a rectangle from non-root part of an index structure. +// Called by RemoveRect. Descends tree recursively, +// merges branches on the way back up. +// Returns 1 if record not found, 0 if success. +RTREE_TEMPLATE +bool RTREE_QUAL::RemoveRectRec(Rect* a_rect, const DATATYPE& a_id, Node* a_node, ListNode** a_listNode) +{ + ASSERT(a_rect && a_node && a_listNode); + ASSERT(a_node->m_level >= 0); + + if(a_node->IsInternalNode()) // not a leaf node + { + for(int index = 0; index < a_node->m_count; ++index) + { + if(Overlap(a_rect, &(a_node->m_branch[index].m_rect))) + { + if(!RemoveRectRec(a_rect, a_id, a_node->m_branch[index].m_child, a_listNode)) + { + if(a_node->m_branch[index].m_child->m_count >= MINNODES) + { + // child removed, just resize parent rect + a_node->m_branch[index].m_rect = NodeCover(a_node->m_branch[index].m_child); + } + else + { + // child removed, not enough entries in node, eliminate node + ReInsert(a_node->m_branch[index].m_child, a_listNode); + DisconnectBranch(a_node, index); // Must return after this call as count has changed + } + return false; + } + } + } + return true; + } + else // A leaf node + { + for(int index = 0; index < a_node->m_count; ++index) + { + if(a_node->m_branch[index].m_child == (Node*)a_id) + { + DisconnectBranch(a_node, index); // Must return after this call as count has changed + return false; + } + } + return true; + } +} + + +// Decide whether two rectangles overlap. +RTREE_TEMPLATE +bool RTREE_QUAL::Overlap(Rect* a_rectA, Rect* a_rectB) +{ + ASSERT(a_rectA && a_rectB); + + for(int index=0; index < NUMDIMS; ++index) + { + if (a_rectA->m_min[index] > a_rectB->m_max[index] || + a_rectB->m_min[index] > a_rectA->m_max[index]) + { + return false; + } + } + return true; +} + + +// Add a node to the reinsertion list. All its branches will later +// be reinserted into the index structure. +RTREE_TEMPLATE +void RTREE_QUAL::ReInsert(Node* a_node, ListNode** a_listNode) +{ + ListNode* newListNode; + + newListNode = AllocListNode(); + newListNode->m_node = a_node; + newListNode->m_next = *a_listNode; + *a_listNode = newListNode; +} + + +// Search in an index tree or subtree for all data retangles that overlap the argument rectangle. +RTREE_TEMPLATE +bool RTREE_QUAL::Search(Node* a_node, Rect* a_rect, int& a_foundCount, bool a_resultCallback(DATATYPE a_data, void* a_context), void* a_context) +{ + ASSERT(a_node); + ASSERT(a_node->m_level >= 0); + ASSERT(a_rect); + + if(a_node->IsInternalNode()) // This is an internal node in the tree + { + for(int index=0; index < a_node->m_count; ++index) + { + if(Overlap(a_rect, &a_node->m_branch[index].m_rect)) + { + if(!Search(a_node->m_branch[index].m_child, a_rect, a_foundCount, a_resultCallback, a_context)) + { + return false; // Don't continue searching + } + } + } + } + else // This is a leaf node + { + for(int index=0; index < a_node->m_count; ++index) + { + if(Overlap(a_rect, &a_node->m_branch[index].m_rect)) + { + DATATYPE& id = a_node->m_branch[index].m_data; + + // NOTE: There are different ways to return results. Here's where to modify + if(a_resultCallback) + { + ++a_foundCount; + if(!a_resultCallback(id, a_context)) + { + return false; // Don't continue searching + } + } + } + } + } + + return true; // Continue searching +} + + +#undef RTREE_TEMPLATE +#undef RTREE_QUAL + +#endif //RTREE_H diff --git a/interfaces/IBackend.h b/interfaces/IBackend.h new file mode 100644 index 0000000..e7548c2 --- /dev/null +++ b/interfaces/IBackend.h @@ -0,0 +1,34 @@ +#ifndef IBACKEND_H +#define IBACKEND_H + +#include +#include +#include + +class Feature; +class Node; +class Way; +class Relation; +class TrackSegment; +class IBackend +{ +public: + virtual Node* allocNode(const Node& other) = 0; + virtual Node* allocNode(const QPointF& aCoord) = 0; + + virtual Way* allocWay() = 0; + virtual Way* allocWay(const Way& other) = 0; + + virtual Relation* allocRelation() = 0; + virtual Relation* allocRelation(const Relation& other) = 0; + + virtual TrackSegment* allocSegment() = 0; + + virtual void deallocFeature(Feature*) = 0; + + virtual void sync(Feature* f) = 0; + + virtual void get(const QRectF& hz, QList& theFeatures) = 0; +}; + +#endif // IBACKEND_H diff --git a/interfaces/IDocument.h b/interfaces/IDocument.h new file mode 100644 index 0000000..580315e --- /dev/null +++ b/interfaces/IDocument.h @@ -0,0 +1,20 @@ +#ifndef IDOCUMENT_H +#define IDOCUMENT_H + +#include "Coord.h" + +class Layer; + +class IDocument +{ +public: + virtual int layerSize() const = 0; + virtual Layer* getLayer(int i) = 0; + virtual const Layer* getLayer(int i) const = 0; + + virtual const QList getDownloadBoxes() const = 0; + virtual const QList getDownloadBoxes(Layer* l) const = 0; + +}; + +#endif // IDOCUMENT_H diff --git a/interfaces/IFeature.h b/interfaces/IFeature.h new file mode 100644 index 0000000..2d8d84d --- /dev/null +++ b/interfaces/IFeature.h @@ -0,0 +1,124 @@ +#ifndef IFEATURE_H +#define IFEATURE_H + +#include +#include +#include +#include + +#define TECHNICAL_TAGS "created_by#source" +class QPainterPath; + +class IFeature +{ +public: + typedef enum { + Uninitialized = 0x00, + Point = 0x01, + LineString = 0x02, + Polygon = 0x04, + OsmRelation = 0x08, + GpxSegment = 0x10, + Conflict = 0x20, + Import = 0x40, + Special = 0x80, + All = 0xff + } FeatureType; + + class FId { + public: + FId() : type(IFeature::Uninitialized), numId(0) {} + FId(char a, qint64 b) : type(a), numId(b) {} + + bool operator==(const FId& R) const + { + return ((type == R.type) && (numId == R.numId)); + } + unsigned char type; + qint64 numId; + }; + +public: + virtual char getType() const = 0; + + virtual QString xmlId() const = 0; +#ifndef FRISIUS_BUILD + virtual const QDateTime time() const = 0; + virtual int versionNumber() const = 0; + virtual const QString& user() const = 0; +#endif + + virtual int sizeParents() const = 0; + virtual IFeature* getParent(int i) = 0; + virtual const IFeature* getParent(int i) const = 0; + + virtual bool hasPainter(qreal PixelPerM) const = 0; + + /** Give the id of the feature. + * If the feature has no id, a random id is generated + * @return the id of the current feature + */ + virtual const IFeature::FId& id() const = 0; + + /** check if the feature is logically deleted + * @return true if logically deleted + */ + virtual bool isDeleted() const = 0; + + /** @return the number of tags for the current object + */ + virtual int tagSize() const = 0; + + /** if a tag with the key "k" exists, return its index. + * if the key doesn't exist, return the number of tags + * @return index of tag + */ + virtual int findKey(const QString& k) const = 0; + + /** return the value of the tag at the position "i". + * position start at 0. + * Be carefull: no verification is made on i. + * @return the value + */ + virtual QString tagValue(int i) const = 0; + + /** return the value of the tag with the key "k". + * if such a tag doesn't exists, return Default. + * @return value or Default + */ + virtual QString tagValue(const QString& k, const QString& Default) const = 0; + + /** return the value of the tag at the position "i". + * position start at 0. + * Be carefull: no verification is made on i. + * @return the value + */ + virtual QString tagKey(int i) const = 0; + + + /** check if the feature has been uploaded + * @return true if uploaded + */ + virtual bool isUploaded() const = 0; + + /** check if the dirty status of the feature + * @return true if the feature is dirty + */ + virtual bool isDirty() const = 0; + + /** check if the feature is visible + * @return true if visible + */ + virtual bool isVisible() = 0; + + /** check if the feature is read-only + * @return true if is read-only + */ + virtual bool isReadonly() = 0; + + virtual const QPainterPath& getPath() const = 0; +}; + +Q_DECLARE_METATYPE(IFeature::FId) + +#endif // IFEATURE_H diff --git a/interfaces/IImageManager.cpp b/interfaces/IImageManager.cpp new file mode 100644 index 0000000..6a3a996 --- /dev/null +++ b/interfaces/IImageManager.cpp @@ -0,0 +1,86 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "IImageManager.h" +#include "MerkaartorPreferences.h" + +#include + +IImageManager::IImageManager() + : cacheSize(0), cacheMaxSize(0), cachePermanent(false) + +{ + m_networkManager = new QNetworkAccessManager(); +} + +IImageManager::~IImageManager() +{ + delete m_networkManager; +} + +QNetworkAccessManager* IImageManager::getNetworkManager() const +{ + return m_networkManager; +} + +bool IImageManager::useDiskCache(QString filename) +{ + // qDebug() << cacheDir.absolutePath() << filename; + + if (!cacheMaxSize && !cachePermanent) + return false; + + if (!cacheDir.exists(filename)) + return false; + + if (M_PREFS->getOfflineMode()) + return true; + + if (cachePermanent) + return true; + + int random = qrand() % 100; + QFileInfo info(cacheDir.absolutePath() + "/" + filename); + int days = info.lastModified().daysTo(QDateTime::currentDateTime()); + + return random < (10 * days) ? false : true; +} + +void IImageManager::adaptCache() +{ + if (cachePermanent) + return; + + QFileInfo info; + while (cacheSize > cacheMaxSize) { + info = cacheInfo.takeFirst(); + cacheDir.remove(info.fileName()); + cacheSize -= info.size(); + } +} + +void IImageManager::setCachePermanent(bool val) +{ + cachePermanent = val; +} + +bool IImageManager::isCachePermanant() const +{ + return cachePermanent; +} diff --git a/interfaces/IImageManager.h b/interfaces/IImageManager.h new file mode 100644 index 0000000..1453e3b --- /dev/null +++ b/interfaces/IImageManager.h @@ -0,0 +1,107 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 IIMAGEMANAGER_H +#define IIMAGEMANAGER_H + +#include +#include +#include +#include + +class IMapAdapter; +class LoadingRequest +{ + public: + LoadingRequest(QString h, QString H, QString U) : hash(h), host(H), url(U) {}; + bool operator==(const LoadingRequest& LR) const { + if (hash != LR.hash) + return false; + if (host != LR.host) + return false; + if (url != LR.url) + return false; + return true; + } + QString hash; + QString host; + QString url; +}; + +/** + @author Kai Winter +*/ +class IImageManager +{ + public: + IImageManager(); + virtual ~IImageManager(); + + virtual QNetworkAccessManager* getNetworkManager() const; + + //! returns a QPixmap of the asked image + /*! + * If this component doesn´t have the image a network query gets started to load it. + * @param host the host of the image + * @param path the path to the image + * @return the pixmap of the asked image + */ + virtual QImage getImage(IMapAdapter* anAdapter, const QString &url) = 0; + virtual QByteArray getData(IMapAdapter* anAdapter, const QString &url) = 0; + + //QPixmap prefetchImage(const QString& host, const QString& path); + virtual QImage prefetchImage(IMapAdapter* anAdapter, int x, int y, int z) = 0; + + virtual void receivedData(const QByteArray& ba, const QHash& headers, const QString& url) = 0; + + /*! + * This method is called by MapNetwork, after all images in its queue were loaded. + * The ImageManager emits a signal, which is used in MapControl to remove the zoom image. + * The zoom image should be removed on Tile Images with transparency. + * Else the zoom image stay visible behind the newly loaded tiles. + */ + virtual void loadingQueueEmpty() = 0; + + /*! + * Aborts all current loading threads. + * This is useful when changing the zoom-factor, though newly needed images loads faster + */ + virtual void abortLoading() = 0; + + virtual void setCacheDir(const QDir& path) = 0; + virtual QDir getCacheDir() = 0; + virtual void setCacheMaxSize(int max) = 0; + + virtual void setCachePermanent(bool val); + virtual bool isCachePermanant() const; + + protected: + QNetworkAccessManager* m_networkManager; + + QDir cacheDir; + QFileInfoList cacheInfo; + int cacheSize; + int cacheMaxSize; + bool cachePermanent; + + bool useDiskCache(QString filename); + void adaptCache(); +}; + +#endif diff --git a/interfaces/ILayer.h b/interfaces/ILayer.h new file mode 100644 index 0000000..46412bc --- /dev/null +++ b/interfaces/ILayer.h @@ -0,0 +1,9 @@ +#ifndef ILAYER_H +#define ILAYER_H + +class ILayer +{ +public: +}; + +#endif // ILAYER_H diff --git a/interfaces/IMapAdapter.h b/interfaces/IMapAdapter.h new file mode 100644 index 0000000..e0c3278 --- /dev/null +++ b/interfaces/IMapAdapter.h @@ -0,0 +1,139 @@ +#ifndef IMAPADAPTER_H +#define IMAPADAPTER_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class IFeature; +class IProjection; +class IImageManager; + +class IMapAdapter : public QObject +{ + Q_OBJECT + +public: + enum Type + { + NetworkBackground, + NetworkDataBackground, + BrowserBackground, + DirectBackground, + VectorBackground + }; + + virtual ~IMapAdapter() {} + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const = 0; + + //! returns the name of this MapAdapter + /*! + * @return the name of this MapAdapter + */ + virtual QString getName () const = 0; + + //! returns the type of this MapAdapter + /*! + * @return the type of this MapAdapter + */ + virtual IMapAdapter::Type getType () const = 0; + + //! returns the host of this MapAdapter + /*! + * @return the host of this MapAdapter + */ + virtual QString getHost () const = 0; + + //! returns the size of the tiles + /*! + * @return the size of the tiles + */ + virtual int getTileSizeW () const = 0; + virtual int getTileSizeH () const = 0; + + //! returns the min zoom value + /*! + * @return the min zoom value + */ + virtual int getMinZoom (const QRectF &) const = 0; + + //! returns the max zoom value + /*! + * @return the max zoom value + */ + virtual int getMaxZoom (const QRectF &) const = 0; + + //! returns the current zoom + /*! + * @return the current zoom + */ + virtual int getZoom () const = 0; + + //! returns the source tag to be applied when drawing over this map + /*! + * @return the source tag + */ + virtual QString getSourceTag () const = 0; + virtual void setSourceTag (const QString& value) = 0; + + //! returns the Url of the usage license + /*! + * @return the Url of the usage license + */ + virtual QString getLicenseUrl() const = 0; + + virtual int getAdaptedZoom() const = 0; + virtual int getAdaptedMinZoom (const QRectF &) const = 0; + virtual int getAdaptedMaxZoom (const QRectF &) const = 0; + + virtual void zoom_in() = 0; + virtual void zoom_out() = 0; + + virtual bool isValid(int x, int y, int z) const = 0; + virtual QString getQuery(int x, int y, int z) const = 0; + virtual QString getQuery(const QRectF& wgs84Bbox, const QRectF& projBbox, const QRect& size) const = 0; + virtual QPixmap getPixmap(const QRectF& wgs84Bbox, const QRectF& projBbox, const QRect& size) const = 0; + virtual const QList* getPaths(const QRectF& /*wgs84Bbox*/, const IProjection* /*projection*/) const { return NULL; } + + virtual QString projection() const = 0; + virtual QRectF getBoundingbox() const = 0; + + virtual bool isTiled() const = 0; + virtual int getTilesWE(int zoom) const = 0; + virtual int getTilesNS(int zoom) const = 0; + + virtual QMenu* getMenu() const = 0; + + virtual IImageManager* getImageManager() = 0; + virtual void setImageManager(IImageManager* anImageManager) = 0; + + virtual void cleanup() = 0; + + virtual bool toXML(QXmlStreamWriter& ) = 0; + virtual void fromXML(QXmlStreamReader&) = 0; + virtual QString toPropertiesHtml() = 0; + + virtual void setSettings(QSettings* aSet) = 0; + +signals: + void forceRefresh(); + void forceZoom(); + void forceProjection(); + +}; + +Q_DECLARE_INTERFACE ( IMapAdapter, + "com.cbsoft.Merkaartor.IMapAdapter/1.12" ) + +#endif diff --git a/interfaces/IMapAdapterFactory.h b/interfaces/IMapAdapterFactory.h new file mode 100644 index 0000000..05cfd40 --- /dev/null +++ b/interfaces/IMapAdapterFactory.h @@ -0,0 +1,32 @@ +#ifndef IMAPADAPTERFACTORY_H +#define IMAPADAPTERFACTORY_H + +#include "IMapAdapter.h" + +class IMapAdapterFactory +{ +public: + //! Creates an instance of the actual plugin + /*! + * @return a pointer to the MapAdapter + */ + virtual IMapAdapter* CreateInstance() = 0; + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const = 0; + + //! returns the name of this MapAdapter + /*! + * @return the name of this MapAdapter + */ + virtual QString getName () const = 0; +}; + + +Q_DECLARE_INTERFACE ( IMapAdapterFactory, + "com.cbsoft.Merkaartor.IMapAdapterFactory/1.0" ) + +#endif // IMAPADAPTERFACTORY_H diff --git a/interfaces/IMapWatermark.h b/interfaces/IMapWatermark.h new file mode 100644 index 0000000..c0a1740 --- /dev/null +++ b/interfaces/IMapWatermark.h @@ -0,0 +1,18 @@ +#ifndef IMAPWATERMARK_H +#define IMAPWATERMARK_H + +#include +#include +#include + +class IMapWatermark +{ +public: + virtual QString getLogoHtml() = 0; + virtual QString getAttributionsHtml(const QRectF& bbox, const QRect& screen) = 0; +}; + +Q_DECLARE_INTERFACE ( IMapWatermark, + "com.cbsoft.Merkaartor.IMapWatermark/1.0" ) + +#endif diff --git a/interfaces/IMerkMainWindow.h b/interfaces/IMerkMainWindow.h new file mode 100644 index 0000000..ffbc66d --- /dev/null +++ b/interfaces/IMerkMainWindow.h @@ -0,0 +1,25 @@ +#ifndef IMERKMAINWINDOW_H +#define IMERKMAINWINDOW_H + +class MapView; +class Document; +class QGPS; +class PropertiesDock; +class InfoDock; +class FeaturesDock; + +class IMerkMainWindow +{ +public: + virtual MapView* view() = 0; + virtual void invalidateView(bool UpdateDock = true) = 0; + + virtual Document* document() = 0; + virtual QGPS* gps() = 0; + virtual PropertiesDock* properties() = 0; + virtual InfoDock* info() = 0; + virtual FeaturesDock* features() = 0; + +}; + +#endif // IMERKMAINWINDOW_H diff --git a/interfaces/IProgressWindow.h b/interfaces/IProgressWindow.h new file mode 100644 index 0000000..9dbec92 --- /dev/null +++ b/interfaces/IProgressWindow.h @@ -0,0 +1,21 @@ +#ifndef MERKATOR_IPROGRESSWINDOW_H_ +#define MERKATOR_IPROGRESSWINDOW_H_ + +class QProgressDialog; +class QProgressBar; +class QLabel; + +class IProgressWindow +{ + protected: + QProgressDialog* theProgressDialog; + QProgressBar* theProgressBar; + QLabel* theProgressLabel; + + public: + QProgressDialog* getProgressDialog() { return theProgressDialog; } + QProgressBar* getProgressBar() { return theProgressBar; } + QLabel* getProgressLabel() { return theProgressLabel; } +}; + +#endif diff --git a/interfaces/IProjection.h b/interfaces/IProjection.h new file mode 100644 index 0000000..57fc226 --- /dev/null +++ b/interfaces/IProjection.h @@ -0,0 +1,21 @@ +#ifndef MERKATOR_IPROJECTION_H_ +#define MERKATOR_IPROJECTION_H_ + +class QString; +class QPointF; + +class IProjection +{ +public: + virtual ~IProjection(void) {}; + + virtual QPointF project(const QPointF& pt) const = 0; + virtual QPointF inverse(const QPointF& pt) const = 0; + + virtual QString getProjectionType() const = 0; +}; + + +#endif + + diff --git a/interfaces/IRenderer.h b/interfaces/IRenderer.h new file mode 100644 index 0000000..96b64e1 --- /dev/null +++ b/interfaces/IRenderer.h @@ -0,0 +1,48 @@ +#ifndef IRENDERER_H +#define IRENDERER_H + +#include + +class RendererOptions +{ +public: + enum RenderOption + { + None = 0x0, + BackgroundVisible = 0x1, + ForegroundVisible = 0x2, + TouchupVisible = 0x4, + NamesVisible = 0x8, + PhotosVisible = 0x10, + VirtualNodesVisible = 0x20, + NodesVisible = 0x40, + TrackSegmentVisible = 0x80, + RelationsVisible = 0x100, + MapBackgroundVisible = 0x200, + DownloadedVisible = 0x400, + DirtyVisible = 0x800, + ScaleVisible = 0x1000, + LatLonGridVisible = 0x2000, + UnstyledHidden = 0x4000, + Interacting = 0x8000, + LockZoom = 0x10000, + ForPrinting = 0x20000, + PrintAllLabels = 0x40000 + }; + Q_DECLARE_FLAGS(RenderOptions, RenderOption) + + enum DirectionalArrowsShowOption { + ArrowsNever = 0x0, + ArrowsOneway = 0x1, + ArrowsAlways = 0x2 + }; + Q_DECLARE_FLAGS(DirectionalArrowsShowOptions, DirectionalArrowsShowOption) + + RenderOptions options; + DirectionalArrowsShowOptions arrowOptions; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(RendererOptions::RenderOptions) +Q_DECLARE_OPERATORS_FOR_FLAGS(RendererOptions::DirectionalArrowsShowOptions) + +#endif // IRENDERER_H diff --git a/interfaces/Interfaces.pri b/interfaces/Interfaces.pri new file mode 100644 index 0000000..037b308 --- /dev/null +++ b/interfaces/Interfaces.pri @@ -0,0 +1,13 @@ +HEADERS += \ + IFeature.h \ + IProjection.h \ + IImageManager.h \ + IMapAdapter.h \ + IRenderer.h \ + IMapAdapterFactory.h \ + IMapWatermark.h \ + IBackend.h \ + ILayer.h \ + IProgressWindow.h \ + IMerkMainWindow.h \ + ../../../interfaces/IDocument.h diff --git a/plugins/background/MCadastreFranceBackground/CadastreFrance.cpp b/plugins/background/MCadastreFranceBackground/CadastreFrance.cpp new file mode 100644 index 0000000..80462f9 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/CadastreFrance.cpp @@ -0,0 +1,406 @@ +/*************************************************************************** + * Copyright (C) 2010 by Chris Browet * + * cbro@semperpax.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. * + ***************************************************************************/ +#include +#include +#include +#include +#include +#include + +#include "CadastreFrance.h" + +#include "cadastrewrapper.h" +#include "searchdialog.h" + +#include "IImageManager.h" + +static const QUuid theUid ( 0x14a9ff26, 0x634e, 0x4406, 0x94, 0xa5, 0x4c, 0x6d, 0x9c, 0xf0, 0xb1, 0x1d); +static const QString theName("Cadastre (France)"); + +QUuid CadastreFranceAdapterFactory::getId() const +{ + return theUid; +} + +QString CadastreFranceAdapterFactory::getName() const +{ + return theName; +} + +/**************/ + +CadastreFranceAdapter::CadastreFranceAdapter() + : theImageManager(0), theMenu(0), theSettings(0) + , current_zoom(0), min_zoom(0), max_zoom(6) +{ + loc = QLocale(QLocale::English); + loc.setNumberOptions(QLocale::OmitGroupSeparator); + + Resolutions << 16 << 8. << 4. << 2 << 1.0 << 0.5 << 0.2; + + m_isTiled = true; +} + +CadastreFranceAdapter::~CadastreFranceAdapter() +{ +} + +QUuid CadastreFranceAdapter::getId() const +{ + return theUid; +} + +QString CadastreFranceAdapter::getName() const +{ + return theName; +} + +void CadastreFranceAdapter::setSettings(QSettings* aSet) +{ + theSettings = aSet; + if (theSettings) + CadastreWrapper::instance()->setRootCacheDir(QDir(theSettings->value("backgroundImage/CacheDir").toString())); + else + CadastreWrapper::instance()->setRootCacheDir(QDir(QDir::homePath() + "/.merkaartor/BackgroundCache")); + updateMenu(); +} + +QString CadastreFranceAdapter::getHost() const +{ + return "www.cadastre.gouv.fr"; +} + +IMapAdapter::Type CadastreFranceAdapter::getType() const +{ + return IMapAdapter::NetworkBackground; +} + +QString CadastreFranceAdapter::projection() const +{ + return m_city.projection(); +} + +QRectF CadastreFranceAdapter::getBoundingbox() const +{ + double L = qMax(m_city.geometry().width(), m_city.geometry().height()); + QRectF bb(m_city.geometry()); + QRectF R = QRectF(QPointF(bb.center().x()-L/2, bb.center().y()-L/2), + QPointF(bb.center().x()+L/2, bb.center().y()+L/2)); + return R; +// return QRectF(R.bottomLeft(), R.topRight()); +} + +QMenu* CadastreFranceAdapter::getMenu() const +{ + return theMenu; +} + +IImageManager* CadastreFranceAdapter::getImageManager() +{ + return theImageManager; +} + +void CadastreFranceAdapter::setImageManager(IImageManager* anImageManager) +{ + theImageManager = anImageManager; + CadastreWrapper::instance()->setNetworkManager(theImageManager->getNetworkManager()); + theImageManager->setCachePermanent(true); +} + +void CadastreFranceAdapter::updateMenu() +{ + delete theMenu; + theMenu = new QMenu(0); + + QAction* grabCity = new QAction(tr("Grab City..."), this); + connect(grabCity, SIGNAL(triggered()), SLOT(onGrabCity())); + theMenu->addAction(grabCity); + QAction* tiledToggle = new QAction(tr("Tiled"), this); + tiledToggle->setCheckable(true); + tiledToggle->setChecked(m_isTiled); + connect(tiledToggle, SIGNAL(triggered()), SLOT(toggleTiled())); + theMenu->addAction(tiledToggle); + + theMenu->addSeparator(); + + QDir cache = CadastreWrapper::instance()->getCacheDir(); + QFileInfoList fl = cache.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs); + foreach (QFileInfo fi, fl) { + QSettings sets(fi.absoluteFilePath()+"/cache.ini", QSettings::IniFormat); + QAction* cityAct = new QAction(sets.value("name").toString(), this); + cityAct->setData(fi.fileName()); + theMenu->addAction(cityAct); + } + connect(theMenu, SIGNAL(triggered(QAction*)), SLOT(cityTriggered(QAction*))); +} + +void CadastreFranceAdapter::toggleTiled() +{ + m_isTiled = !m_isTiled; + updateMenu(); + emit(forceRefresh()); +} + +void CadastreFranceAdapter::onGrabCity() +{ + if (!theImageManager) + return; + m_city = City(); + + SearchDialog *dial = new SearchDialog(); + dial->cadastre->setRootCacheDir(QDir(theSettings->value("backgroundImage/CacheDir").toString())); + dial->setModal(true); + if (dial->exec()) { + m_code = dial->cityCode(); + QString name = dial->cityName(); + if (!name.isEmpty()) + initializeCity(name); + } + delete dial; +} + +void CadastreFranceAdapter::cityTriggered(QAction *act) +{ + QString name = act->text(); + if (act->data().toString().isEmpty()) + return; + m_code = act->data().toString(); + if (!theImageManager) + return; + m_city = City(); + initializeCity(name); +} + +void CadastreFranceAdapter::initializeCity(QString name) +{ + qDebug() << "Initializing " << name; + connect(CadastreWrapper::instance(), SIGNAL(resultsAvailable(QMap)), this, SLOT(resultsAvailable(QMap))); + QString ville = name.left(name.lastIndexOf('(')-1); + m_department = QString("%1").arg(name.mid(name.lastIndexOf('(')+1, name.lastIndexOf(')')-name.lastIndexOf('(')-1).toInt(), 3, 10, QChar('0')); + CadastreWrapper::instance()->searchVille(ville, m_department); +} + +void CadastreFranceAdapter::resultsAvailable(QMap results) +{ + if (results.size() > 1) { + CadastreWrapper::instance()->searchCode(m_code, m_department); + return; + } + + disconnect(CadastreWrapper::instance(), SIGNAL(resultsAvailable(QMap)), this, SLOT(resultsAvailable(QMap))); + + if (!results.size()) { + QMessageBox::critical(0, tr("The city cannot be loaded"), tr("Only vectorized cities can be handled by this plugin and the selected one is still in \"Image\" format.")); + return; + } + + m_city = CadastreWrapper::instance()->requestCity(m_code); + updateMenu(); +// if (!CadastreWrapper::instance()->downloadTiles(m_city)) +// return; + + QDir dir = CadastreWrapper::instance()->getCacheDir(); + Q_ASSERT(dir.cd(m_city.code())); + if (theImageManager) + theImageManager->setCacheDir(dir); + + emit(forceZoom()); + emit(forceProjection()); + emit(forceRefresh()); +} + +bool CadastreFranceAdapter::isValid(int x, int y, int z) const +{ + // Origin is bottom-left + y = getTilesNS(current_zoom)-1 - y; + + if (m_city.code().isEmpty()) + return false; + + if ((x<0) || (x>=getTilesWE(z)) || + (y<0) || (y>=getTilesNS(z))) + { + return false; + } + return true; + +} + +QString CadastreFranceAdapter::getQuery(int i, int j, int /* z */) const +{ + qreal tileWidth = getBoundingbox().width() / getTilesWE(current_zoom); + qreal tileHeight = getBoundingbox().height() / getTilesNS(current_zoom); + + QPointF ul = QPointF(i*tileWidth+getBoundingbox().topLeft().x(), getBoundingbox().bottomLeft().y()-j*tileHeight); + QPointF br = QPointF((i+1)*tileWidth+getBoundingbox().topLeft().x(), getBoundingbox().bottomLeft().y()- (j+1)*tileHeight); + + QUrl theUrl("http://www.cadastre.gouv.fr/scpc/wms?version=1.1&request=GetMap&layers=CDIF:LS3,CDIF:LS2,CDIF:LS1,CDIF:PARCELLE,CDIF:NUMERO,CDIF:PT3,CDIF:PT2,CDIF:PT1,CDIF:LIEUDIT,CDIF:COMMUNE&format=image/png&exception=application/vnd.ogc.se_inimage&styles=LS3_90,LS2_90,LS1_90,PARCELLE_90,NUMERO_90,PT3_90,PT2_90,PT1_90,LIEUDIT_90,COMMUNE_90"); + theUrl.addQueryItem("WIDTH", QString::number(getTileSizeW())); + theUrl.addQueryItem("HEIGHT", QString::number(getTileSizeH())); + theUrl.addQueryItem("BBOX", QString() + .append(loc.toString(ul.x(),'f',6)).append(",") + .append(loc.toString(br.y(),'f',6)).append(",") + .append(loc.toString(br.x(),'f',6)).append(",") + .append(loc.toString(ul.y(),'f',6)) + ); + + return theUrl.toString(QUrl::RemoveScheme | QUrl::RemoveAuthority); +} + +QString CadastreFranceAdapter::getQuery(const QRectF& , const QRectF& projBbox, const QRect& size) const +{ + if (m_city.code().isEmpty()) + return QString(); + + QUrl theUrl("http://www.cadastre.gouv.fr/scpc/wms?version=1.1&request=GetMap&layers=CDIF:LS3,CDIF:LS2,CDIF:LS1,CDIF:PARCELLE,CDIF:NUMERO,CDIF:PT3,CDIF:PT2,CDIF:PT1,CDIF:LIEUDIT,CDIF:COMMUNE&format=image/png&exception=application/vnd.ogc.se_inimage&styles=LS3_90,LS2_90,LS1_90,PARCELLE_90,NUMERO_90,PT3_90,PT2_90,PT1_90,LIEUDIT_90,COMMUNE_90"); + theUrl.addQueryItem("WIDTH", QString::number(size.width())); + theUrl.addQueryItem("HEIGHT", QString::number(size.height())); + theUrl.addQueryItem("BBOX", QString() + .append(loc.toString(projBbox.bottomLeft().x(),'f',6)).append(",") + .append(loc.toString(projBbox.bottomLeft().y(),'f',6)).append(",") + .append(loc.toString(projBbox.topRight().x(),'f',6)).append(",") + .append(loc.toString(projBbox.topRight().y(),'f',6)) + ); + + return theUrl.toString(QUrl::RemoveScheme | QUrl::RemoveAuthority); +} + +QPixmap CadastreFranceAdapter::getPixmap(const QRectF& /*wgs84Bbox*/, const QRectF& projBbox, const QRect& src) const +{ + QPixmap pix(src.size()); + pix.fill(Qt::transparent); + QPainter p(&pix); + p.scale(src.width()/projBbox.width(), src.height()/projBbox.height()); + p.translate(-projBbox.left(), -projBbox.bottom()); + + if (!m_city.code().isEmpty()) { + QDir dir = CadastreWrapper::instance()->getCacheDir(); + Q_ASSERT(dir.cd(m_city.code())); + + for (int r=0; r min_zoom ? current_zoom-1 : min_zoom; +} + +int CadastreFranceAdapter::getMinZoom(const QRectF &) const +{ + return min_zoom; +} + +int CadastreFranceAdapter::getMaxZoom(const QRectF &) const +{ + return max_zoom; +} + +int CadastreFranceAdapter::getAdaptedMinZoom(const QRectF &) const +{ + return 0; +} + +int CadastreFranceAdapter::getAdaptedMaxZoom(const QRectF &) const +{ + return max_zoom > min_zoom ? max_zoom - min_zoom : min_zoom - max_zoom; +} + +int CadastreFranceAdapter::getZoom() const +{ + return current_zoom; +} + +int CadastreFranceAdapter::getAdaptedZoom() const +{ + return max_zoom < min_zoom ? min_zoom - current_zoom : current_zoom - min_zoom; +} + +QString CadastreFranceAdapter::getSourceTag () const +{ + return "cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2010"; +} + +Q_EXPORT_PLUGIN2(MCadastreFranceBackgroundPlugin, CadastreFranceAdapterFactory) diff --git a/plugins/background/MCadastreFranceBackground/CadastreFrance.h b/plugins/background/MCadastreFranceBackground/CadastreFrance.h new file mode 100644 index 0000000..94587a5 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/CadastreFrance.h @@ -0,0 +1,192 @@ +/*************************************************************************** + * Copyright (C) 2010 by Chris Browet * + * cbro@semperpax.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. * + ***************************************************************************/ +#ifndef CADASTREFRANCEADAPTER_H +#define CADASTREFRANCEADAPTER_H + +#include "IMapAdapterFactory.h" +#include "IMapAdapter.h" + +#include + +#include "city.h" + +class CadastreFranceAdapter : public IMapAdapter +{ + Q_OBJECT + Q_INTERFACES(IMapAdapter) + +public: + CadastreFranceAdapter(); + virtual ~CadastreFranceAdapter(); + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const; + + //! returns the name of this MapAdapter + /*! + * @return the name of this MapAdapter + */ + virtual QString getName () const; + + //! returns the type of this MapAdapter + /*! + * @return the type of this MapAdapter + */ + virtual IMapAdapter::Type getType () const; + + //! returns the host of this MapAdapter + /*! + * @return the host of this MapAdapter + */ + virtual QString getHost () const; + + //! returns the size of the tiles + /*! + * @return the size of the tiles + */ + virtual int getTileSizeW () const; + virtual int getTileSizeH () const; + + //! returns the min zoom value + /*! + * @return the min zoom value + */ + virtual int getMinZoom (const QRectF &) const; + + //! returns the max zoom value + /*! + * @return the max zoom value + */ + virtual int getMaxZoom (const QRectF &) const; + + //! returns the current zoom + /*! + * @return the current zoom + */ + virtual int getZoom () const ; + + //! returns the source tag to be applied when drawing over this map + /*! + * @return the source tag + */ + virtual QString getSourceTag () const; + virtual void setSourceTag (const QString& ) {}; + + //! returns the Url of the usage license + /*! + * @return the Url of the usage license + */ + virtual QString getLicenseUrl() const {return QString();} + + virtual int getAdaptedZoom() const; + virtual int getAdaptedMinZoom(const QRectF &) const; + virtual int getAdaptedMaxZoom(const QRectF &) const; + + virtual void zoom_in(); + virtual void zoom_out(); + + virtual bool isValid(int, int, int) const; + virtual QString getQuery(int, int, int) const; + virtual QString getQuery(const QRectF& , const QRectF& , const QRect& ) const; + virtual QPixmap getPixmap(const QRectF& wgs84Bbox, const QRectF& projBbox, const QRect& size) const ; + + virtual QString projection() const; + virtual QRectF getBoundingbox() const; + + virtual bool isTiled() const; + virtual int getTilesWE(int) const; + virtual int getTilesNS(int) const; + + virtual QMenu* getMenu() const; + + virtual IImageManager* getImageManager(); + virtual void setImageManager(IImageManager* anImageManager); + + virtual void cleanup(); + + virtual bool toXML(QXmlStreamWriter& stream); + virtual void fromXML(QXmlStreamReader& stream); + virtual QString toPropertiesHtml(); + + virtual void setSettings(QSettings* aSet); + +public slots: + void onGrabCity(); + void cityTriggered(QAction* act); + void toggleTiled(); + +private slots: + void resultsAvailable(QMap results); + +private: + QLocale loc; + IImageManager* theImageManager; + + QMenu* theMenu; + QSettings* theSettings; + QRectF theCoordBbox; + + int current_zoom; + int min_zoom; + int max_zoom; + QList Resolutions; + + QString m_code; + QString m_department; + City m_city; + + bool m_isTiled; + +private: + void initializeCity(QString name); + +protected: + void updateMenu(); +}; + +class CadastreFranceAdapterFactory : public QObject, public IMapAdapterFactory +{ + Q_OBJECT + Q_INTERFACES(IMapAdapterFactory) + +public: + //! Creates an instance of the actual plugin + /*! + * @return a pointer to the MapAdapter + */ + IMapAdapter* CreateInstance() {return new CadastreFranceAdapter(); } + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const; + + //! returns the name of this MapAdapter + /*! + * @return the name of this MapAdapter + */ + virtual QString getName () const; +}; + +#endif diff --git a/plugins/background/MCadastreFranceBackground/MCadastreFranceBackground.pro b/plugins/background/MCadastreFranceBackground/MCadastreFranceBackground.pro new file mode 100644 index 0000000..69d489e --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/MCadastreFranceBackground.pro @@ -0,0 +1,17 @@ +include(../../common.pri) +include(../common.pri) +include(qadastre.pri) + +QT += webkit +TARGET = $$qtLibraryTarget(MCadastreFranceBackgroundPlugin) + +DEPENDPATH += $${MERKAARTOR_SRC_DIR}/interfaces +INCLUDEPATH += $${MERKAARTOR_SRC_DIR}/interfaces +include ($${MERKAARTOR_SRC_DIR}/interfaces/Interfaces.pri) + +HEADERS += \ + CadastreFrance.h + +SOURCES += \ + CadastreFrance.cpp + diff --git a/plugins/background/MCadastreFranceBackground/qadastre.pri b/plugins/background/MCadastreFranceBackground/qadastre.pri new file mode 100644 index 0000000..af54c62 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre.pri @@ -0,0 +1,14 @@ +DEPENDPATH += $$PWD/qadastre +INCLUDEPATH += $$PWD/qadastre + +QT += network webkit +SOURCES += \ + city.cpp \ + searchdialog.cpp \ + cadastrewrapper.cpp +HEADERS += \ + city.h \ + searchdialog.h \ + cadastrewrapper.h +FORMS += \ + searchdialog.ui diff --git a/plugins/background/MCadastreFranceBackground/qadastre/COPYING.txt b/plugins/background/MCadastreFranceBackground/qadastre/COPYING.txt new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/COPYING.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + 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 +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.cpp b/plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.cpp new file mode 100644 index 0000000..3c222af --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.cpp @@ -0,0 +1,87 @@ +/* + This file is part of Qadastre. + + Qadastre is free software: you can 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. + + Qadastre is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Qadastre. If not, see . +*/ + +#include "cadastrebrowser.h" +#include "ui_cadastrebrowser.h" + +#include "cadastrewrapper.h" +#include "searchdialog.h" +#include +#include +#include +#include "tile.h" + +CadastreBrowser::CadastreBrowser(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::CadastreBrowser), + m_scene(this), m_currentZoom(1.0) +{ + ui->setupUi(this); + ui->graphicsView->setScene(&m_scene); +} + +CadastreBrowser::~CadastreBrowser() +{ + delete ui; +} + +void CadastreBrowser::changeEvent(QEvent *e) +{ + QMainWindow::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + +void CadastreBrowser::on_actionLoad_triggered() +{ + SearchDialog *dial = new SearchDialog(this); + dial->setModal(true); + if (dial->exec()) { + QString code = dial->cityCode(); + qDebug() << code; + City my_city = CadastreWrapper::instance()->requestCity(code); + qDebug() << my_city.code(); + qDebug() << my_city.name(); + qDebug() << my_city.geometry(); + CadastreWrapper::instance()->downloadTiles(my_city); + for (int r = 0 ; r < my_city.tileRows() ; ++r) { + for (int c = 0 ; c < my_city.tileColumns() ; ++c) { + QString tileFile = CadastreWrapper::instance()->tileFile(my_city.code(), r, c); + qDebug() << tileFile; + Tile *tile = new Tile(tileFile); + tile->setX(600 * c); + tile->setY(600 * r); + m_scene.addItem(tile); + } + } + } +} + +void CadastreBrowser::on_zoomSlider_valueChanged(int value) +{ + qreal requestedScale = value/100.; + qDebug() << requestedScale << m_currentZoom << requestedScale / m_currentZoom; + + ui->graphicsView->scale(requestedScale / m_currentZoom, requestedScale / m_currentZoom); + + m_currentZoom = requestedScale; +} diff --git a/plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.h b/plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.h new file mode 100644 index 0000000..411ce82 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.h @@ -0,0 +1,47 @@ +/* + This file is part of Qadastre. + + Qadastre is free software: you can 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. + + Qadastre is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Qadastre. If not, see . +*/ + +#ifndef CADASTREBROWSER_H +#define CADASTREBROWSER_H + +#include +#include + +namespace Ui { + class CadastreBrowser; +} + +class CadastreBrowser : public QMainWindow { + Q_OBJECT +public: + CadastreBrowser(QWidget *parent = 0); + ~CadastreBrowser(); + +protected: + void changeEvent(QEvent *e); + +private: + Ui::CadastreBrowser *ui; + QGraphicsScene m_scene; + qreal m_currentZoom; + +private slots: + void on_zoomSlider_valueChanged(int value); + void on_actionLoad_triggered(); +}; + +#endif // CADASTREBROWSER_H diff --git a/plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui b/plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui new file mode 100644 index 0000000..ad18dd3 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui @@ -0,0 +1,118 @@ + + + CadastreBrowser + + + + 0 + 0 + 596 + 396 + + + + CadastreBrowser + + + + + + + 0 + + + + + + + + 1 + + + 200 + + + 100 + + + Qt::Vertical + + + + + + + + + + + 0 + 0 + 596 + 20 + + + + + File + + + + + + + + + TopToolBarArea + + + false + + + + + + + + Quit + + + Quit + + + Ctrl+Q + + + + + Load + + + Load a city from the cadastre + + + Ctrl+O + + + + + + + + actionQuit + activated() + CadastreBrowser + close() + + + -1 + -1 + + + 299 + 199 + + + + + diff --git a/plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp b/plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp new file mode 100644 index 0000000..f3e7560 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp @@ -0,0 +1,348 @@ +/* + This file is part of Qadastre. + Copyright (C) 2010 Pierre Ducroquet + + Qadastre is free software: you can 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. + + Qadastre is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Qadastre. If not, see . +*/ + +#include "cadastrewrapper.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +CadastreWrapper *CadastreWrapper::m_instance = 0; + +CadastreWrapper *CadastreWrapper::instance() +{ + if (!CadastreWrapper::m_instance) + CadastreWrapper::m_instance = new CadastreWrapper; + return CadastreWrapper::m_instance; +} + +CadastreWrapper::CadastreWrapper(QObject *parent) : + QObject(parent) + , m_networkManager(0) + , m_gotCookie(false) +{ + setRootCacheDir(QDesktopServices::storageLocation(QDesktopServices::DataLocation)); +} + +void CadastreWrapper::setNetworkManager(QNetworkAccessManager *aManager) +{ + if (m_networkManager) + disconnect(m_networkManager, 0, this, 0); + m_networkManager = aManager; + connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkFinished(QNetworkReply*))); + m_networkManager->get(QNetworkRequest(QUrl("http://www.cadastre.gouv.fr/scpc/accueil.do"))); +} + +void CadastreWrapper::searchVille(const QString &city, const QString &department) +{ + // {"numerovoie": "", "indiceRepetition": "", "nomvoie": "", "lieuDit": "", "ville": city.upper(), "codePostal": "", "codeDepartement": dept, "nbResultatParPage": 20, "x": 0, "y" : 0} + QString data = QString("numerovoie=&indiceRepetition=&nomvoie=&lieuDit=&ville=%1&codePostal=&codeDepartement=%2&nbResultatParPage=20&x=0&y=0") + .arg(QString::fromLatin1(QUrl::toPercentEncoding(city.toUpper()))) + .arg(department); + qDebug() << data; + qDebug() << data.toLatin1(); + qDebug() << m_networkManager; + m_networkManager->post(QNetworkRequest(QUrl("http://www.cadastre.gouv.fr/scpc/rechercherPlan.do")), data.toLatin1()); +} + +void CadastreWrapper::searchCode(const QString &code, const QString &department) +{ + // {"numerovoie": "", "indiceRepetition": "", "nomvoie": "", "lieuDit": "", "ville": city.upper(), "codePostal": "", "codeDepartement": dept, "nbResultatParPage": 20, "x": 0, "y" : 0} + QString data = QString("numerovoie=&indiceRepetition=&nomvoie=&lieuDit=&codeCommune=%1&codeDepartement=%2&nbResultatParPage=20&x=0&y=0") + .arg(QString::fromLatin1(QUrl::toPercentEncoding(code.toUpper()))) + .arg(department); + qDebug() << data; + qDebug() << data.toLatin1(); + qDebug() << m_networkManager; + m_networkManager->post(QNetworkRequest(QUrl("http://www.cadastre.gouv.fr/scpc/rechercherPlan.do")), data.toLatin1()); +} + +City CadastreWrapper::requestCity(const QString &code) +{ + qDebug() << "Request city: " << code; + QDir cache = m_cacheDir; + QNetworkReply *reply = m_networkManager->get(QNetworkRequest(QUrl("http://www.cadastre.gouv.fr/scpc/afficherCarteCommune.do?c=" + code))); + while (!reply->isFinished()) + qApp->processEvents(); + cache.cd(code); + QSettings raw_city(cache.absoluteFilePath("cache.ini"), QSettings::IniFormat); + City result(code); + result.setName(raw_city.value("name").toString()); + result.setDepartement(raw_city.value("department").toString()); + result.setGeometry(raw_city.value("geometry").toRect()); + result.setProjection(raw_city.value("projection").toString()); + return result; +} + +QString CadastreWrapper::tileFile(const QString &code, int row, int column) +{ + QDir cache = m_cacheDir; + cache.cd(code); + QString fileName = QString("%1-%2.png").arg(row).arg(column); + return cache.absoluteFilePath(fileName); +} + +bool CadastreWrapper::downloadTiles(City city) +{ + m_progress = new QProgressDialog(); + m_progress->setWindowTitle(QApplication::tr("Downloading tiles...")); + m_progress->setMaximum(city.tileRows() * city.tileColumns()); + m_progress->setMinimum(0); + m_progress->setValue(0); + m_progress->show(); + + QDir cache = m_cacheDir; + cache.cd(city.code()); + + for (int r = 0 ; r < city.tileRows() ; ++r) { + for (int c = 0 ; c < city.tileColumns() ; ++c) { + QString fileName = QString("%1-%2.png").arg(r).arg(c); + qDebug() << fileName; + if (cache.exists(fileName) && QFileInfo(cache, fileName).size()) { + // the file already exists, cool ! + } else { + QRect rect = city.tileGeometry(r, c); + QString bbox = QString("%1.0,%2.0,%3.0,%4.0").arg(rect.left()).arg(rect.bottom()).arg(rect.right()).arg(rect.top()); + fileName = cache.absoluteFilePath(fileName); + m_waitingTiles[fileName] = city.tileGeometry(r, c); + } + } + } + m_progress->setMaximum(m_waitingTiles.count()); + m_startTime = QDateTime::currentDateTime(); + while (m_waitingTiles.count() > 0 && !m_progress->wasCanceled()) { + QString fileName = m_waitingTiles.begin().key(); + QRect rect = m_waitingTiles.begin().value(); + m_waitingTiles.take(fileName); + QString bbox = QString("%1.0,%2.0,%3.0,%4.0").arg(rect.left()).arg(rect.top()).arg(rect.right()).arg(rect.bottom()); + QString url = QString("http://www.cadastre.gouv.fr/scpc/wms?version=1.1&request=GetMap&layers=CDIF:LS3,CDIF:LS2,CDIF:LS1,CDIF:PARCELLE,CDIF:NUMERO,CDIF:PT3,CDIF:PT2,CDIF:PT1,CDIF:LIEUDIT,CDIF:COMMUNE&format=image/png&bbox=%1&width=600&height=600&exception=application/vnd.ogc.se_inimage&styles=LS3_90,LS2_90,LS1_90,PARCELLE_90,NUMERO_90,PT3_90,PT2_90,PT1_90,LIEUDIT_90,COMMUNE_90").arg(bbox); + qDebug() << url; + m_pendingTiles[m_networkManager->get(QNetworkRequest(QUrl(url)))] = fileName; + while (m_pendingTiles.count() > 0 && !m_progress->wasCanceled()) { + qApp->processEvents(); + } + } + + bool ret = true; + if (m_progress->wasCanceled()) + ret = false; + else { + QSettings settings(cache.absoluteFilePath("cache.ini"), QSettings::IniFormat); + settings.setValue("complete", true); + settings.sync(); + } + + m_progress->hide(); + m_progress->deleteLater(); + m_progress = NULL; + + return ret; +} + +void CadastreWrapper::networkFinished(QNetworkReply *reply) +{ + if (m_pendingTiles.contains(reply)) { + QFile target(m_pendingTiles[reply]); + QByteArray ba = reply->readAll(); + + // white -> transparent + QImage img; + img.loadFromData(ba); + QImage img2 = img.convertToFormat(QImage::Format_ARGB32); + Q_ASSERT(img2.hasAlphaChannel()); + int w=0; + for (int y=0; yreadAll()); + img2.save(&target, "PNG"); + target.close(); + m_pendingTiles.remove(reply); + if (m_progress) { + m_progress->setValue(m_progress->value()+1); + if (m_progress->value() > 10) { + double ms = m_startTime.secsTo(QDateTime::currentDateTime()); + double us = ms/m_progress->value(); + int tot = us*(m_progress->maximum() - m_progress->value()); + + if (tot<3600) + m_progress->setLabelText(tr("Downloaded: %1/%2\nRemaining time: %3:%4").arg(m_progress->value()).arg(m_progress->maximum()).arg(int(tot/60)).arg(int(tot%60), 2, 10, QChar('0'))); + else + m_progress->setLabelText(tr("Downloaded: %1/%2\nRemaining time: %3:%4:%5").arg(m_progress->value()).arg(m_progress->maximum()).arg(int(tot/3600)).arg(int((tot%3600)/60), 2, 10, QChar('0')).arg(int(tot%60), 2, 10, QChar('0'))); + + } else + m_progress->setLabelText(tr("Downloaded: %1/%2").arg(m_progress->value()).arg(m_progress->maximum())); + } + } else if (reply->url() == QUrl("http://www.cadastre.gouv.fr/scpc/accueil.do")) { + qDebug() << "Ok, I've got a cookie... I LOVE COOKIES."; + reply->readAll(); + m_gotCookie = true; + } else if (reply->url() == QUrl("http://www.cadastre.gouv.fr/scpc/rechercherPlan.do")) { + QString pageData = reply->readAll(); + qDebug() << pageData; + QWebPage parsedPage(this); + QWebFrame *frame = parsedPage.mainFrame(); + frame->setHtml(pageData); + QWebElement codeCommune = frame->findFirstElement("#codeCommune"); + QMap results; + if (!codeCommune.isNull()) { + // If there is a codeCommune object in the DOM, it means that the search was not successfull. + if (codeCommune.tagName().toLower() != "select") { + qDebug() << "Invalid page ???"; + return; + } + QWebElementCollection options = codeCommune.findAll("option"); + foreach (QWebElement option, options) { + if (!option.attribute("value").isEmpty()) + results[option.attribute("value")] = option.toPlainText(); + } + } else { + // We may have been successfull, who knows ? + QString name = frame->findFirstElement("#ville").attribute("value"); + QWebElementCollection links = frame->findAllElements(".resultat > .parcelles a"); + QRegExp linkRE("c=(\\w+)"); + foreach (QWebElement link, links) { + QString js = link.attribute("onclick"); + int pos = linkRE.indexIn(js); + if (pos > -1) { + results[linkRE.cap(1)] = name; + } + } + } + qDebug() << results; + emit(resultsAvailable(results)); + } else if (reply->url().toString().startsWith("http://www.cadastre.gouv.fr/scpc/afficherCarteCommune.do?c=")) { + qDebug() << "Got a result !"; + QString pageData = reply->readAll(); + if (pageData.isEmpty()) + return; +// qDebug() << pageData; + QString name, code, projection; + code = reply->url().queryItemValue("c"); + qDebug() << code; + bool inGeoBox = false; + QList raw_geometry; + foreach (QString line, pageData.split('\n')) { + line = line.trimmed(); + if (name.isEmpty()) { + if (line.contains("")) + if (line.split(" : ").count() > 1) + name = line.split(" : ")[1].split(" - ")[0]; + } + if (projection.isEmpty()) { + if (line.contains("projectionName")) { + QRegExp reg("<span id=\"projectionName\">(.+)</span>"); + reg.setMinimal(true); + if (reg.indexIn(line) > -1) { + projection = reg.cap(1); + qDebug() << projection; + if (projection.compare("RGF93CC42", Qt::CaseInsensitive) == 0) + projection = "+title=Projection conique conforme Zone 1 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=42.000000000 +lon_0=3.000000000 +lat_1=41.250000000 +lat_2=42.750000000 +x_0=1700000.000 +y_0=1200000.000 +units=m +no_defs"; + else if (projection.compare("RGF93CC43", Qt::CaseInsensitive) == 0) + projection = "+title=Projection conique conforme Zone 2 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=43.000000000 +lon_0=3.000000000 +lat_1=42.250000000 +lat_2=43.750000000 +x_0=1700000.000 +y_0=2200000.000 +units=m +no_defs"; + else if (projection.compare("RGF93CC44", Qt::CaseInsensitive) == 0) + projection = "+title=Projection conique conforme Zone 3 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=44.000000000 +lon_0=3.000000000 +lat_1=43.250000000 +lat_2=44.750000000 +x_0=1700000.000 +y_0=3200000.000 +units=m +no_defs"; + else if (projection.compare("RGF93CC45", Qt::CaseInsensitive) == 0) + projection = "+title=Projection conique conforme Zone 4 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=45.000000000 +lon_0=3.000000000 +lat_1=44.250000000 +lat_2=45.750000000 +x_0=1700000.000 +y_0=4200000.000 +units=m +no_defs"; + else if (projection.compare("RGF93CC46", Qt::CaseInsensitive) == 0) + projection = "+title=Projection conique conforme Zone 5 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=46.000000000 +lon_0=3.000000000 +lat_1=45.250000000 +lat_2=46.750000000 +x_0=1700000.000 +y_0=5200000.000 +units=m +no_defs"; + else if (projection.compare("RGF93CC47", Qt::CaseInsensitive) == 0) + projection = "+title=Projection conique conforme Zone 6 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=47.000000000 +lon_0=3.000000000 +lat_1=46.250000000 +lat_2=47.750000000 +x_0=1700000.000 +y_0=6200000.000 +units=m +no_defs"; + else if (projection.compare("RGF93CC48", Qt::CaseInsensitive) == 0) + projection = "+title=Projection conique conforme Zone 7 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=48.000000000 +lon_0=3.000000000 +lat_1=47.250000000 +lat_2=48.750000000 +x_0=1700000.000 +y_0=7200000.000 +units=m +no_defs"; + else if (projection.compare("RGF93CC49", Qt::CaseInsensitive) == 0) + projection = "+title=Projection conique conforme Zone 8 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=49.000000000 +lon_0=3.000000000 +lat_1=48.250000000 +lat_2=49.750000000 +x_0=1700000.000 +y_0=8200000.000 +units=m +no_defs"; + else if (projection.compare("RGF93CC50", Qt::CaseInsensitive) == 0) + projection = "+title=Projection conique conforme Zone 9 +proj=lcc +towgs84=0.0000,0.0000,0.0000 +a=6378137.0000 +rf=298.2572221010000 +lat_0=50.000000000 +lon_0=3.000000000 +lat_1=49.250000000 +lat_2=50.750000000 +x_0=1700000.000 +y_0=9200000.000 +units=m +no_defs"; + else if (projection.compare("LAMB1", Qt::CaseInsensitive) == 0) + projection = "+title=Lambert I +proj=lcc +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=49.500000000 +lon_0=0.000000000 +k_0=0.99987734 +lat_1=49.500000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs"; + else if (projection.compare("LAMB2", Qt::CaseInsensitive) == 0) + projection = "+title=Lambert II +proj=lcc +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=46.800000000 +lon_0=0.000000000 +k_0=0.99987742 +lat_1=46.800000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs"; + else if (projection.compare("LAMB3", Qt::CaseInsensitive) == 0) + projection = "+title=Lambert III +proj=lcc +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=44.100000000 +lon_0=0.000000000 +k_0=0.99987750 +lat_1=44.100000000 +x_0=600000.000 +y_0=200000.000 +units=m +no_defs"; + else if (projection.compare("LAMB4", Qt::CaseInsensitive) == 0) + projection = "+title=Lambert IV +proj=lcc +nadgrids=ntf_r93.gsb,null +towgs84=-168.0000,-60.0000,320.0000 +a=6378249.2000 +rf=293.4660210000000 +pm=2.337229167 +lat_0=42.165000000 +lon_0=0.000000000 +k_0=0.99994471 +lat_1=42.165000000 +x_0=234.358 +y_0=185861.369 +units=m +no_defs"; + } + } + } + if (inGeoBox) { + raw_geometry.append(line.split(".")[0].split(")")[0].toInt()); + if (line.contains(')')) + inGeoBox = false; + } + if (line == "new GeoBox(") + inGeoBox = true; + } + if (!raw_geometry.size()) + return; + qDebug() << raw_geometry; + QRect geometry(raw_geometry[0], raw_geometry[1], raw_geometry[2]-raw_geometry[0], raw_geometry[3]-raw_geometry[1]); + qDebug() << geometry; + QDir cache = m_cacheDir; + if (!cache.exists(code)) + cache.mkdir(code); + cache.cd(code); + qDebug() << cache.absoluteFilePath("cache.ini"); + QSettings settings(cache.absoluteFilePath("cache.ini"), QSettings::IniFormat); + settings.setValue("name", name); + settings.setValue("geometry", geometry); + settings.setValue("department", name.mid(name.lastIndexOf('(')+1, name.lastIndexOf(')')-name.lastIndexOf('(')-1)); + settings.setValue("projection", projection); + settings.sync(); + } + reply->close(); +} + +void CadastreWrapper::setRootCacheDir(QDir dir) +{ + m_cacheDir = dir; + if (!m_cacheDir.cd("qadastre")) { + m_cacheDir.mkdir("qadastre"); + m_cacheDir.cd("qadastre"); + } +} + +QDir CadastreWrapper::getCacheDir() +{ + return m_cacheDir; +} diff --git a/plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.h b/plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.h new file mode 100644 index 0000000..3fc3c92 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.h @@ -0,0 +1,72 @@ +/* + This file is part of Qadastre. + Copyright (C) 2010 Pierre Ducroquet <pinaraf@pinaraf.info> + + Qadastre is free software: you can 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. + + Qadastre is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Qadastre. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef CADASTREWRAPPER_H +#define CADASTREWRAPPER_H + +#include <QObject> +#include <QNetworkAccessManager> +#include <QMap> +#include <QProgressDialog> +#include <QDir> +#include <QDateTime> + +#include "city.h" + +class CadastreWrapper : public QObject +{ +Q_OBJECT +public: + explicit CadastreWrapper(QObject *parent = 0); + static CadastreWrapper *instance(); + + void searchVille (const QString &city, const QString &department); + void searchCode (const QString &code, const QString &department); + bool ready() { return m_gotCookie; } + City requestCity (const QString &code); + bool downloadTiles(City city); + QString tileFile (const QString &code, int row, int column); + + void setRootCacheDir(QDir dir); + QDir getCacheDir(); + + void setNetworkManager(QNetworkAccessManager* aManager); + +signals: + void resultsAvailable(QMap<QString, QString> results); + +private slots: + void networkFinished(QNetworkReply *reply); + +private: + static CadastreWrapper *m_instance; + + QNetworkAccessManager *m_networkManager; + bool m_gotCookie; + // fileName ==> rect + QMap<QString, QRect> m_waitingTiles; + // reply ==> filename + QMap<QNetworkReply*, QString> m_pendingTiles; + QProgressDialog *m_progress; + + QDir m_cacheDir; + + QDateTime m_startTime; +}; + +#endif // CADASTREWRAPPER_H diff --git a/plugins/background/MCadastreFranceBackground/qadastre/city.cpp b/plugins/background/MCadastreFranceBackground/qadastre/city.cpp new file mode 100644 index 0000000..e7a71ba --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/city.cpp @@ -0,0 +1,95 @@ +/* + This file is part of Qadastre. + Copyright (C) 2010 Pierre Ducroquet <pinaraf@pinaraf.info> + + Qadastre is free software: you can 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. + + Qadastre is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Qadastre. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "city.h" +#include <QDebug> + +City::City() +{ +} + +City::City(const QString &code) : + m_code(code) +{ +} + +QString City::name() const +{ + return m_name; +} + +QString City::department() const +{ + return m_department; +} + +QString City::projection() const +{ + return m_projection; +} + +QString City::code() const +{ + return m_code; +} + +QRect City::geometry() const +{ + return m_geometry; +} + +void City::setName(const QString &name) +{ + m_name = name; +} + +void City::setDepartement(const QString &department) +{ + m_department = department; +} + +void City::setProjection(const QString &projection) +{ + m_projection = projection; +} + +void City::setGeometry(const QRect &geom) +{ + m_geometry = geom; +} + +// TODO: don't hardcode 100 meters here. +int City::tileRows() const +{ + return m_geometry.height()/100 + 1; +} + +int City::tileColumns() const +{ + return m_geometry.width()/100 + 1; +} + +QRect City::tileGeometry(int row, int column) const +{ + int left = m_geometry.left() / 100; + left = left * 100; + int top = m_geometry.top() / 100; + top = top * 100; + //top = top + 100; + return QRect(left + column * 100, top - row * 100, 101, 101); +} diff --git a/plugins/background/MCadastreFranceBackground/qadastre/city.h b/plugins/background/MCadastreFranceBackground/qadastre/city.h new file mode 100644 index 0000000..6450817 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/city.h @@ -0,0 +1,57 @@ +/* + This file is part of Qadastre. + Copyright (C) 2010 Pierre Ducroquet <pinaraf@pinaraf.info> + + Qadastre is free software: you can 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. + + Qadastre is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Qadastre. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef CITY_H +#define CITY_H + +#include <QString> +#include <QRect> + +class City +{ +public: + City(); + City(const QString & code); + + void setName(const QString &name); + QString name() const; + + void setDepartement(const QString &department); + QString department() const; + + void setProjection(const QString &projection); + QString projection() const; + + QString code() const; + + void setGeometry(const QRect &geom); + QRect geometry() const; + + int tileRows() const; + int tileColumns() const; + QRect tileGeometry(int row, int column) const; + +private: + QString m_name; + QString m_department; + QString m_code; + QRect m_geometry; + QString m_projection; +}; + +#endif // CITY_H diff --git a/plugins/background/MCadastreFranceBackground/qadastre/main.cpp b/plugins/background/MCadastreFranceBackground/qadastre/main.cpp new file mode 100644 index 0000000..090eb29 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/main.cpp @@ -0,0 +1,37 @@ +/* + This file is part of Qadastre. + + Qadastre is free software: you can 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. + + Qadastre is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Qadastre. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <QtWidgets/QApplication> +#include <QDesktopServices> +#include <QDebug> +#include <QDir> +#include "cadastrebrowser.h" +#include "searchdialog.h" + +int main(int argc, char *argv[]) +{ + QApplication::setGraphicsSystem("raster"); + QApplication a(argc, argv); + a.setApplicationName("Qadastre"); + a.setApplicationVersion("0.1"); + if (!QDir(QDesktopServices::storageLocation (QDesktopServices::DataLocation)).exists()) { + QDir().mkpath(QDesktopServices::storageLocation (QDesktopServices::DataLocation)); + } + CadastreBrowser w; + w.show(); + return a.exec(); +} diff --git a/plugins/background/MCadastreFranceBackground/qadastre/qadastre.pro b/plugins/background/MCadastreFranceBackground/qadastre/qadastre.pro new file mode 100644 index 0000000..942a989 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/qadastre.pro @@ -0,0 +1,20 @@ +# ------------------------------------------------- +# Project created by QtCreator 2010-03-22T20:27:26 +# ------------------------------------------------- +QT += network webkit +TARGET = qadastre +TEMPLATE = app +SOURCES += main.cpp \ + cadastrebrowser.cpp \ + city.cpp \ + tile.cpp \ + searchdialog.cpp \ + cadastrewrapper.cpp +HEADERS += cadastrebrowser.h \ + city.h \ + tile.h \ + searchdialog.h \ + cadastrewrapper.h +FORMS += cadastrebrowser.ui \ + searchdialog.ui +OTHER_FILES += COPYING.txt diff --git a/plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp b/plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp new file mode 100644 index 0000000..930d298 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp @@ -0,0 +1,105 @@ +/* + This file is part of Qadastre. + Copyright (C) 2010 Pierre Ducroquet <pinaraf@pinaraf.info> + + Qadastre is free software: you can 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. + + Qadastre is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Qadastre. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "searchdialog.h" +#include "ui_searchdialog.h" +#include "cadastrewrapper.h" + +#include <QMessageBox> +#include <QDebug> + +SearchDialog::SearchDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::SearchDialog) +{ + ui->setupUi(this); + for (quint16 i = 1 ; i < 96 ; i++) { + ui->department->addItem(QString("%1").arg(i, 2, 10, QChar('0'))); + } + for (quint16 i = 971 ; i < 975 ; i++) { + ui->department->addItem(QString("%1").arg(i, 2, 10, QChar('0'))); + } + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + cadastre = CadastreWrapper::instance(); + connect(cadastre, SIGNAL(resultsAvailable(QMap<QString,QString>)), this, SLOT(resultsAvailable(QMap<QString,QString>))); +} + +SearchDialog::~SearchDialog() +{ + delete ui; +} + +void SearchDialog::changeEvent(QEvent *e) +{ + QDialog::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + +void SearchDialog::on_searchButton_clicked() +{ + if (ui->department->currentIndex() == -1) + return; + if (ui->name->text().isEmpty()) + return; + QString department = QString("%1").arg(ui->department->currentText().toInt(), 3, 10, QChar('0')); + cadastre->searchVille(ui->name->text(), department); + ui->results->clear(); + m_results.clear(); + ui->results->setEnabled(false); + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); +} + +void SearchDialog::on_results_activated(int index) +{ + Q_UNUSED(index) + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); +} + +void SearchDialog::resultsAvailable(QMap<QString, QString> results) +{ + qDebug() << "SearchDialog::resultsAvailable: " << results; + m_results = results; + if (results.count() == 0) { + QMessageBox::warning(this, tr("No result"), tr("Your search gave no result.")); + } else { + ui->results->setEnabled(true); + QMap<QString, QString>::iterator i = results.begin(); + while (i != results.end()) { + ui->results->addItem(i.value(), i.key()); + ++i; + } + ui->results->setCurrentIndex(0); + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); + } +} + +QString SearchDialog::cityCode() +{ + return ui->results->itemData(ui->results->currentIndex()).toString(); +} + +QString SearchDialog::cityName() +{ + return QString("%1 (%2)").arg(ui->results->currentText()).arg(ui->department->currentText()); +} diff --git a/plugins/background/MCadastreFranceBackground/qadastre/searchdialog.h b/plugins/background/MCadastreFranceBackground/qadastre/searchdialog.h new file mode 100644 index 0000000..1afe103 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/searchdialog.h @@ -0,0 +1,56 @@ +/* + This file is part of Qadastre. + Copyright (C) 2010 Pierre Ducroquet <pinaraf@pinaraf.info> + + Qadastre is free software: you can 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. + + Qadastre is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Qadastre. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef SEARCHDIALOG_H +#define SEARCHDIALOG_H + +#include <QDialog> +#include <QMap> + +class CadastreWrapper; + +namespace Ui { + class SearchDialog; +} + +class SearchDialog : public QDialog { + Q_OBJECT +public: + SearchDialog(QWidget *parent = 0); + ~SearchDialog(); + + QString cityCode(); + QString cityName(); + +public: + CadastreWrapper *cadastre; + +protected: + void changeEvent(QEvent *e); + +private: + Ui::SearchDialog *ui; + QMap<QString,QString> m_results; + +private slots: + void on_results_activated(int index); + void on_searchButton_clicked(); + void resultsAvailable(QMap<QString,QString> results); +}; + +#endif // SEARCHDIALOG_H diff --git a/plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui b/plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui new file mode 100644 index 0000000..f7a6ff1 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui @@ -0,0 +1,173 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>SearchDialog</class> + <widget class="QDialog" name="SearchDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>363</width> + <height>191</height> + </rect> + </property> + <property name="windowTitle"> + <string>Search city</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Department</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QComboBox" name="department"> + <property name="editable"> + <bool>true</bool> + </property> + <property name="insertPolicy"> + <enum>QComboBox::NoInsert</enum> + </property> + </widget> + </item> + </layout> + </item> + <item row="1" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Name</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="name"/> + </item> + </layout> + </item> + <item row="2" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="searchButton"> + <property name="text"> + <string>Search</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="3" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QLabel" name="label_3"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Results</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="results"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </item> + <item row="4" column="0"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="5" column="0"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + <property name="centerButtons"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>SearchDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>SearchDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/plugins/background/MCadastreFranceBackground/qadastre/tile.cpp b/plugins/background/MCadastreFranceBackground/qadastre/tile.cpp new file mode 100644 index 0000000..9f73225 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/tile.cpp @@ -0,0 +1,112 @@ +/* + This file is part of Qadastre. + Copyright (C) 2010 Pierre Ducroquet <pinaraf@pinaraf.info> + + Qadastre is free software: you can 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. + + Qadastre is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Qadastre. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "tile.h" +#include <QGraphicsSceneMouseEvent> +#include <QDebug> +#include <QPainter> +#include <QFile> +#include <QProcess> + +Tile::Tile(const QString &fileName, QGraphicsItem * parent) : + QGraphicsItem(parent), m_filename(fileName), m_blank(false) +{ + qDebug() << QFile(fileName).size(); +// if (QFile(fileName).size() == 2365) + if (QFile(fileName).size() == 2808) + m_blank = true; +} + +void appendNeighbour(QPoint point, QImage *image, QList<QPoint> *visited) { + if (!visited->contains(point)) { + visited->append(point); + for (int x = qMax(0, point.x() - 1) ; x <= qMin(599, point.x() + 1) ; x++) { + for (int y = qMax(0, point.y() - 1) ; y <= qMin(599, point.y() + 1) ; y++) { + QPoint pt(x, y); + if (visited->contains(pt)) + continue; + if (image->pixel(pt) == image->pixel(point)) { + appendNeighbour(pt, image, visited); + } + } + } + } +} + +QPixmap Tile::pixmap() { + if (m_blank) + return QPixmap(); + if (m_pixCache.isNull()) + m_pixCache = QPixmap(m_filename); + return m_pixCache; +} + +QPoint getNeightbour(const QPoint &point, const QPoint &previous, const QList<QPoint> points) { + QList<QPoint> neightbours; + foreach (QPoint pt, points) { + if ((abs(pt.x() - point.x()) < 2) && (abs(pt.y() - point.y()) < 2)) + neightbours.append(pt); + } + int maxDistance = 0; + QPoint bestPoint(-1, -1); + foreach (QPoint pt, neightbours) { + if ((previous - pt).manhattanLength() > maxDistance) { + maxDistance = (previous - pt).manhattanLength(); + bestPoint = pt; + } + } + return bestPoint; +} + +void Tile::mousePressEvent(QGraphicsSceneMouseEvent *event) { + QList<QPoint> points; + QImage image = this->pixmap().toImage(); + + QPoint position = event->pos().toPoint(); + + // 248, 198, 50 ==> normal buildings + // 255, 229, 153 ==> uncovered part of buildings + qDebug() << image.pixel(position); + appendNeighbour(position, &image, &points); + + qDebug() << points.count(); + + QImage bitmap(image.size(), QImage::Format_Mono); + bitmap.fill(1); + foreach(QPoint pt, points) { + bitmap.setPixel(pt, 0); + image.setPixel(pt, QColor(Qt::blue).rgb()); + } + bitmap.save("/tmp/test.ppm"); + QProcess::execute("potrace", QStringList() << "-n" << "-u" << "1" << "-W" << "600" << "-H" << "600" << "-s" << "/tmp/test.ppm"); + + m_pixCache = QPixmap::fromImage(image); + this->update(); +} + +void Tile::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { + if (m_blank) { + painter->fillRect(0, 0, 600, 600, Qt::white); + } else { + painter->drawPixmap(0, 0, pixmap()); + } +} + +QRectF Tile::boundingRect() const { + return QRectF(0, 0, 600, 600); +} diff --git a/plugins/background/MCadastreFranceBackground/qadastre/tile.h b/plugins/background/MCadastreFranceBackground/qadastre/tile.h new file mode 100644 index 0000000..dab6c41 --- /dev/null +++ b/plugins/background/MCadastreFranceBackground/qadastre/tile.h @@ -0,0 +1,42 @@ +/* + This file is part of Qadastre. + Copyright (C) 2010 Pierre Ducroquet <pinaraf@pinaraf.info> + + Qadastre is free software: you can 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. + + Qadastre is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Qadastre. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef TILE_H +#define TILE_H + +#include <QGraphicsPixmapItem> + +class Tile : public QGraphicsItem +{ +public: + Tile(const QString &fileName, QGraphicsItem * parent = 0 ); + + QPixmap pixmap(); + + virtual QRectF boundingRect () const; + virtual void mousePressEvent ( QGraphicsSceneMouseEvent * event ); + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); + +private: + QString m_filename; + QPixmap m_pixCache; + bool m_blank; + +}; + +#endif // TILE_H diff --git a/plugins/background/MGdalBackground/GdalAdapter.cpp b/plugins/background/MGdalBackground/GdalAdapter.cpp new file mode 100644 index 0000000..7e0ca28 --- /dev/null +++ b/plugins/background/MGdalBackground/GdalAdapter.cpp @@ -0,0 +1,667 @@ +//*************************************************************** +// CLass: %CLASS% +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com> (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +//****************************************************************** + +#include "GdalAdapter.h" + +#include <QCoreApplication> +#include <QtPlugin> +#include <QAction> +#include <QFileDialog> +#include <QPainter> +#include <QMessageBox> +#include <QInputDialog> + +#include <QDebug> + +#include "gdal_priv.h" +#include "ogrsf_frmts.h" + +#include "ProjectionChooser.h" + +#define IN_MEMORY_LIMIT 100000000 + +static const QUuid theUid ("{5c9479df-0b1a-4c49-9559-83d5ffa93911}"); +static const QString theName("GDAL Raster"); + +QUuid GdalAdapterFactory::getId() const +{ + return theUid; +} + +QString GdalAdapterFactory::getName() const +{ + return theName; +} + +/**************/ + +inline double radToAng(double a) +{ + return a*180/M_PI; +} + +inline double angToRad(double a) +{ + return a*M_PI/180.; +} + +#define FILTER_OPEN_SUPPORTED \ + tr("All Files (*)") + +GdalAdapter::GdalAdapter() + : poDataset(0), isLatLon(false) +{ + GDALAllRegister(); + + QAction* loadImage = new QAction(tr("Load file(s)..."), this); + loadImage->setData(theUid.toString()); + connect(loadImage, SIGNAL(triggered()), SLOT(onLoadImage())); + QAction* setSource = new QAction(tr("Specify \"source\" tag..."), this); + setSource->setData(theUid.toString()); + connect(setSource, SIGNAL(triggered()), SLOT(onSetSourceTag())); + + theMenu = new QMenu(); + theMenu->addAction(loadImage); + theMenu->addAction(setSource); +} + + +GdalAdapter::~GdalAdapter() +{ + cleanup(); +} + +QUuid GdalAdapter::getId() const +{ + return theUid; +} + +QString GdalAdapter::getName() const +{ + return theName; +} + +bool GdalAdapter::alreadyLoaded(QString fn) const +{ + for (int j=0; j<theImages.size(); ++j) + if (theImages[j].theFilename == fn) + return true; + return false; +} + +bool GdalAdapter::loadImage(const QString& fn) +{ + if (alreadyLoaded(fn)) + return true; + + QFileInfo fi(fn); + GdalImage img; + QRectF bbox; + + poDataset = (GDALDataset *) GDALOpen( QDir::toNativeSeparators(fi.absoluteFilePath()).toUtf8().constData(), GA_ReadOnly ); + if( poDataset == NULL ) + { + qDebug() << "GDAL Open failed: " << fn; + return false; + } + + bool hasGeo = false; + QDir dir(fi.absoluteDir()); + QString f = fi.baseName(); + QStringList wldFilter; + wldFilter << f+".tfw" << f+".tifw" << f+".tiffw" << f+".wld"; + QFileInfoList fil = dir.entryInfoList(wldFilter); + if (fil.count()) { + QFile wld(fil[0].absoluteFilePath()); + if (wld.open(QIODevice::ReadOnly)) { + int i; + for (i=0; i<6; ++i) { + if (wld.atEnd()) + break; + QString l = wld.readLine(); + bool ok; + double d = l.toDouble(&ok); + if (!ok) + break; + switch (i) { + case 0: + img.adfGeoTransform[1] = d; + break; + case 1: + img.adfGeoTransform[4] = d; + break; + case 2: + img.adfGeoTransform[2] = d; + break; + case 3: + img.adfGeoTransform[5] = d; + break; + case 4: + img.adfGeoTransform[0] = d; + break; + case 5: + img.adfGeoTransform[3] = d; + break; + } + + } + if (i == 6) + hasGeo = true; + } + } + if(!hasGeo) + if ( poDataset->GetGeoTransform( img.adfGeoTransform ) != CE_None ) { + GDALClose((GDALDatasetH)poDataset); + return false; + } + + qDebug( "Origin = (%.6f,%.6f)\n", + img.adfGeoTransform[0], img.adfGeoTransform[3] ); + + qDebug( "Pixel Size = (%.6f,%.6f)\n", + img.adfGeoTransform[1], img.adfGeoTransform[5] ); + + bbox.setTopLeft(QPointF(img.adfGeoTransform[0], img.adfGeoTransform[3])); + bbox.setWidth(img.adfGeoTransform[1]*poDataset->GetRasterXSize()); + bbox.setHeight(img.adfGeoTransform[5]*poDataset->GetRasterYSize()); + + isLatLon = false; + if( strlen(poDataset->GetProjectionRef()) != 0 ) { + qDebug( "Projection is `%s'\n", poDataset->GetProjectionRef() ); + OGRSpatialReference* theSrs = new OGRSpatialReference(poDataset->GetProjectionRef()); + if (theSrs && theSrs->Validate() == OGRERR_NONE) { + theSrs->morphFromESRI(); + char* theProj4; + if (theSrs->exportToProj4(&theProj4) == OGRERR_NONE) { + qDebug() << "GDAL: to proj4 : " << theProj4; + } else { + qDebug() << "GDAL: to proj4 error: " << CPLGetLastErrorMsg(); + GDALClose((GDALDatasetH)poDataset); + return false; + } + QString srsProj = QString(theProj4); + if (!srsProj.isEmpty() && theProjection != srsProj) { + cleanup(); + theProjection = srsProj; + } + isLatLon = (theSrs->IsGeographic() == TRUE); + } + } + if (theProjection.isEmpty()) { + theProjection = ProjectionChooser::getProjection(QCoreApplication::translate("ImportExportGdal", "Unable to set projection; please specify one")); + if (theProjection.isEmpty()) { + GDALClose((GDALDatasetH)poDataset); + return false; + } + } + + qDebug( "Driver: %s/%s\n", + poDataset->GetDriver()->GetDescription(), + poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) ); + + qDebug( "Size is %dx%dx%d\n", + poDataset->GetRasterXSize(), poDataset->GetRasterYSize(), + poDataset->GetRasterCount() ); + + GdalAdapter::ImgType theType = GdalAdapter::Unknown; + int bandCount = poDataset->GetRasterCount(); + int ixA = -1; + int ixR, ixG, ixB; + int ixH, ixS, ixL; + int ixC, ixM, ixY, ixK; + int ixYuvY, ixYuvU, ixYuvV; + double adfMinMax[2]; + double UnknownUnit; + GDALColorTable* colTable = NULL; + for (int i=0; i<bandCount; ++i) { + GDALRasterBand *poBand = poDataset->GetRasterBand( i+1 ); + GDALColorInterp bandtype = poBand->GetColorInterpretation(); + qDebug() << "Band " << i+1 << " Color: " << GDALGetColorInterpretationName(poBand->GetColorInterpretation()); + + switch (bandtype) + { + case GCI_Undefined: + theType = GdalAdapter::Unknown; + int bGotMin, bGotMax; + adfMinMax[0] = poBand->GetMinimum( &bGotMin ); + adfMinMax[1] = poBand->GetMaximum( &bGotMax ); + if( ! (bGotMin && bGotMax) ) + GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax); + UnknownUnit = (adfMinMax[1] - adfMinMax[0]) / 256; + break; + case GCI_GrayIndex: + theType = GdalAdapter::GrayScale; + break; + case GCI_RedBand: + theType = GdalAdapter::Rgb; + ixR = i; + break; + case GCI_GreenBand: + theType = GdalAdapter::Rgb; + ixG = i; + break; + case GCI_BlueBand : + theType = GdalAdapter::Rgb; + ixB = i; + break; + case GCI_HueBand: + theType = GdalAdapter::Hsl; + ixH = i; + break; + case GCI_SaturationBand: + theType = GdalAdapter::Hsl; + ixS = i; + break; + case GCI_LightnessBand: + theType = GdalAdapter::Hsl; + ixL = i; + break; + case GCI_CyanBand: + theType = GdalAdapter::Cmyk; + ixC = i; + break; + case GCI_MagentaBand: + theType = GdalAdapter::Cmyk; + ixM = i; + break; + case GCI_YellowBand: + theType = GdalAdapter::Cmyk; + ixY = i; + break; + case GCI_BlackBand: + theType = GdalAdapter::Cmyk; + ixK = i; + break; + case GCI_YCbCr_YBand: + theType = GdalAdapter::YUV; + ixYuvY = i; + break; + case GCI_YCbCr_CbBand: + theType = GdalAdapter::YUV; + ixYuvU = i; + break; + case GCI_YCbCr_CrBand: + theType = GdalAdapter::YUV; + ixYuvV = i; + break; + case GCI_AlphaBand: + ixA = i; + break; + case GCI_PaletteIndex: + colTable = poBand->GetColorTable(); + switch (colTable->GetPaletteInterpretation()) + { + case GPI_Gray : + theType = GdalAdapter::Palette_Gray; + break; + case GPI_RGB : + theType = GdalAdapter::Palette_RGBA; + break; + case GPI_CMYK : + theType = GdalAdapter::Palette_CMYK; + break; + case GPI_HLS : + theType = GdalAdapter::Palette_HLS; + break; + } + break; + } + } + + QSize theImgSize(poDataset->GetRasterXSize(), poDataset->GetRasterYSize()); + QImage theImg = QImage(theImgSize, QImage::Format_ARGB32); + + // Make sure that lineBuf holds one whole line of data. + float *lineBuf; + lineBuf = (float *) CPLMalloc(theImgSize.width() * bandCount * sizeof(float)); + + int px, py; + //every row loop + for (int row = 0; row < theImgSize.height(); row++) { + py = row; + CPLErr err = poDataset->RasterIO( GF_Read, 0, row, theImgSize.width(), + 1, lineBuf, theImgSize.width(), 1, GDT_Float32, bandCount, + NULL, sizeof(float) * bandCount, 0, sizeof(float) ); + /* FIXME: Perhaps break, or check if more work needs to be done + * (filling with an error pattern? */ + if (err != CE_None) { + qDebug() << "RasterIO failed to read row. Skipping."; + continue; + } + + // every pixel in row. + for (int col = 0; col < theImgSize.width(); col++){ + px = col; + switch (theType) + { + case GdalAdapter::Unknown: + { + float* v = lineBuf + (col*bandCount); + float val = (*v - adfMinMax[0]) / UnknownUnit; + theImg.setPixel(px, py, qRgb(val, val, val)); + break; + } + case GdalAdapter::GrayScale: + { + float* v = lineBuf + (col*bandCount); + theImg.setPixel(px, py, qRgb(*v, *v, *v)); + break; + } + case GdalAdapter::Rgb: + { + float* r = lineBuf + (col*bandCount) + ixR; + float* g = lineBuf + (col*bandCount) + ixG; + float* b = lineBuf + (col*bandCount) + ixB; + int a = 255; + if (ixA != -1) { + float* fa = lineBuf + (col*bandCount) + ixA; + a = *fa; + } + theImg.setPixel(px, py, qRgba(*r, *g, *b, a)); + break; + } +#if QT_VERSION >= 0x040600 + case GdalAdapter::Hsl: + { + float* h = lineBuf + (col*bandCount) + ixH; + float* s = lineBuf + (col*bandCount) + ixS; + float* l = lineBuf + (col*bandCount) + ixL; + int a = 255; + if (ixA != -1) { + float* fa = lineBuf + (col*bandCount) + ixA; + a = *fa; + } + QColor C = QColor::fromHsl(*h, *s, *l, a); + theImg.setPixel(px, py, C.rgba()); + break; + } +#endif + case GdalAdapter::Cmyk: + { + float* c = lineBuf + (col*bandCount) + ixC; + float* m = lineBuf + (col*bandCount) + ixM; + float* y = lineBuf + (col*bandCount) + ixY; + float* k = lineBuf + (col*bandCount) + ixK; + int a = 255; + if (ixA != -1) { + float* fa = lineBuf + (col*bandCount) + ixA; + a = *fa; + } + QColor C = QColor::fromCmyk(*c, *m, *y, *k, a); + theImg.setPixel(px, py, C.rgba()); + break; + } + case GdalAdapter::YUV: + { + // From http://www.fourcc.org/fccyvrgb.php + float* y = lineBuf + (col*bandCount) + ixYuvY; + float* u = lineBuf + (col*bandCount) + ixYuvU; + float* v = lineBuf + (col*bandCount) + ixYuvV; + int a = 255; + if (ixA != -1) { + float* fa = lineBuf + (col*bandCount) + ixA; + a = *fa; + } + float R = 1.164*(*y - 16) + 1.596*(*v - 128); + float G = 1.164*(*y - 16) - 0.813*(*v - 128) - 0.391*(*u - 128); + float B = 1.164*(*y - 16) + 2.018*(*u - 128); + + theImg.setPixel(px, py, qRgba(R, G, B, a)); + break; + } + case GdalAdapter::Palette_Gray: + { + float* ix = (lineBuf + (col*bandCount)); + const GDALColorEntry* color = colTable->GetColorEntry(*ix); + theImg.setPixel(px, py, qRgb(color->c1, color->c1, color->c1)); + break; + } + case GdalAdapter::Palette_RGBA: + { + float* ix = (lineBuf + (col*bandCount)); + const GDALColorEntry* color = colTable->GetColorEntry(*ix); + theImg.setPixel(px, py, qRgba(color->c1, color->c2, color->c3, color->c4)); + break; + } +#if QT_VERSION >= 0x040600 + case GdalAdapter::Palette_HLS: + { + float* ix = (lineBuf + (col*bandCount)); + const GDALColorEntry* color = colTable->GetColorEntry(*ix); + QColor C = QColor::fromHsl(color->c1, color->c2, color->c3, color->c4); + theImg.setPixel(px, py, C.rgba()); + break; + } +#endif + case GdalAdapter::Palette_CMYK: + { + float* ix = (lineBuf + (col*bandCount)); + const GDALColorEntry* color = colTable->GetColorEntry(*ix); + QColor C = QColor::fromCmyk(color->c1, color->c2, color->c3, color->c4); + theImg.setPixel(px, py, C.rgba()); + break; + } + } + } + QCoreApplication::processEvents(); + } + + img.theFilename = fn; + img.theImg = QPixmap::fromImage(theImg); + theImages.push_back(img); + theBbox = theBbox.united(bbox); + + GDALClose((GDALDatasetH)poDataset); + return true; +} + +void GdalAdapter::onLoadImage() +{ + int fileOk = 0; + + QStringList fileNames = QFileDialog::getOpenFileNames( + NULL, + tr("Open GDAL files"), + "", FILTER_OPEN_SUPPORTED); + if (fileNames.isEmpty()) + return; + +// theBbox = QRectF(); +// theImages.clear(); + + for (int i=0; i<fileNames.size(); i++) { + if (loadImage(fileNames[i])) + ++fileOk; + } + + if (!fileOk) { + QMessageBox::critical(0,QCoreApplication::translate("GdalBackground","No valid file"),QCoreApplication::translate("GdalBackground","No valid GDAL file could be found.")); + } else { + emit forceZoom(); + emit forceRefresh(); + } + + return; +} + +void GdalAdapter::onSetSourceTag() +{ + bool ok; + QString text = QInputDialog::getText(0, tr("Please specify automatic \"source\" tag value"), + tr("Value:"), QLineEdit::Normal, theSourceTag, &ok); + if (ok) + theSourceTag = text; +} + +QString GdalAdapter::getSourceTag() const +{ + return theSourceTag; +} + +QString GdalAdapter::getHost() const +{ + return QString(); +} + +IMapAdapter::Type GdalAdapter::getType() const +{ + return IMapAdapter::DirectBackground; +} + +QMenu* GdalAdapter::getMenu() const +{ + return theMenu; +} + +QRectF GdalAdapter::getBoundingbox() const +{ + QRectF projBbox = theBbox; + if (isLatLon) + projBbox = QRectF(angToRad(theBbox.left()), angToRad(theBbox.top()), angToRad(theBbox.width()), angToRad(theBbox.height())); + return projBbox; +} + +QString GdalAdapter::projection() const +{ + return theProjection; +} + +QPixmap GdalAdapter::getPixmap(const QRectF& /*wgs84Bbox*/, const QRectF& theProjBbox, const QRect& src) const +{ + QPixmap pix(src.size()); + pix.fill(Qt::transparent); + QPainter p(&pix); + + QRectF projBbox = theProjBbox; + if (isLatLon) + projBbox = QRectF(radToAng(theProjBbox.left()), radToAng(theProjBbox.top()), radToAng(theProjBbox.width()), radToAng(theProjBbox.height())); + + for (int i=0; i<theImages.size(); ++i) { + QPixmap theImg = theImages[i].theImg; + + QSizeF sz(projBbox.width() / theImages[i].adfGeoTransform[1], projBbox.height() / theImages[i].adfGeoTransform[5]); + if (sz.isNull()) + return QPixmap(); + + QPointF s((projBbox.left() - theImages[i].adfGeoTransform[0]) / theImages[i].adfGeoTransform[1], + (projBbox.top() - theImages[i].adfGeoTransform[3]) / theImages[i].adfGeoTransform[5]); + + qDebug() << "Pixmap Origin: " << s.x() << "," << s.y(); + qDebug() << "Pixmap size: " << sz.width() << "," << sz.height(); + + double rtx = src.width() / (double)sz.width(); + double rty = src.height() / (double)sz.height(); + + QRect mRect = QRect(s.toPoint(), sz.toSize()); + QRect iRect = theImg.rect().intersected(mRect); + QRect sRect = QRect(iRect.topLeft() - mRect.topLeft(), iRect.size()); + QRect fRect = QRect(sRect.x() * rtx, sRect.y() * rty, sRect.width() * rtx, sRect.height() * rty); + + qDebug() << "mrect: " << mRect; + qDebug() << "iRect: " << iRect; + qDebug() << "sRect: " << sRect; + + // QImage img2 = theImg.copy(iRect).scaled(fRect.size()); + // p.drawImage(fRect.topLeft(), img2); + QPixmap img2 = theImg.copy(iRect).scaled(fRect.size()); + p.drawPixmap(fRect.topLeft(), img2); + } + + p.end(); + return pix; +} + +IImageManager* GdalAdapter::getImageManager() +{ + return NULL; +} + +void GdalAdapter::setImageManager(IImageManager* /*anImageManager*/) +{ +} + +void GdalAdapter::cleanup() +{ + theImages.clear(); + theBbox = QRectF(); + theProjection = QString(); +} + +bool GdalAdapter::toXML(QXmlStreamWriter& stream) +{ + bool OK = true; + + stream.writeStartElement("Images"); + + stream.writeAttribute("projection", theProjection); + if (!theSourceTag.isEmpty()) + stream.writeAttribute("source", theSourceTag); + for (int i=0; i<theImages.size(); ++i) { + stream.writeStartElement("Image"); + stream.writeAttribute("filename", theImages[i].theFilename); + stream.writeEndElement(); + } + + stream.writeEndElement(); + + return OK; +} + +void GdalAdapter::fromXML(QXmlStreamReader& stream) +{ + theBbox = QRectF(); + theImages.clear(); + + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Images") { + if (stream.attributes().hasAttribute("projection")) + theProjection = stream.attributes().value("projection").toString(); + if (stream.attributes().hasAttribute("source")) + theSourceTag = stream.attributes().value("source").toString(); + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Image") { + QString fn = stream.attributes().value("filename").toString(); + if (!fn.isEmpty()) + loadImage(fn); + stream.readNext(); + } else if (!stream.isWhitespace()) { + qDebug() << "gdalimage: logic error: " << stream.name() << " : " << stream.tokenType() << " (" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + stream.readNext(); + } + } else if (!stream.isWhitespace()) { + qDebug() << "gdalmain: logic error: " << stream.name() << " : " << stream.tokenType() << " (" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + + stream.readNext(); + } +} + +QString GdalAdapter::toPropertiesHtml() +{ + QString h; + + QStringList fn; + for (int i=0; i<theImages.size(); ++i) { + fn << QDir::toNativeSeparators(theImages[i].theFilename); + } + h += "<i>" + tr("Filename(s)") + ": </i>" + fn.join("; "); + + return h; +} + +#if !(QT_VERSION >= QT_VERSION_CHECK(5,0,0)) +Q_EXPORT_PLUGIN2(MGdalBackgroundPlugin, GdalAdapterFactory) +#endif diff --git a/plugins/background/MGdalBackground/GdalAdapter.h b/plugins/background/MGdalBackground/GdalAdapter.h new file mode 100644 index 0000000..5abbe46 --- /dev/null +++ b/plugins/background/MGdalBackground/GdalAdapter.h @@ -0,0 +1,204 @@ +//*************************************************************** +// CLass: %CLASS% +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com> (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +//****************************************************************** + +#ifndef GDALADAPTER_H +#define GDALADAPTER_H + +#include "IMapAdapterFactory.h" +#include "IMapAdapter.h" + +#include <QLocale> + +class GDALDataset; +class GDALColorTable; + +class GdalImage +{ +public: + QString theFilename; + QPixmap theImg; + double adfGeoTransform[6]; +}; + +class GdalAdapter : public IMapAdapter +{ + Q_OBJECT + Q_INTERFACES(IMapAdapter) + +public: + enum ImgType + { + Unknown, + GrayScale, + Rgb, + Hsl, + Cmyk, + YUV, + Palette_Gray, + Palette_RGBA, + Palette_CMYK, + Palette_HLS + }; + + GdalAdapter(); + virtual ~GdalAdapter(); + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const; + + //! returns the name of this MapAdapter + /*! + * @return the name of this MapAdapter + */ + virtual QString getName () const; + + //! returns the type of this MapAdapter + /*! + * @return the type of this MapAdapter + */ + virtual IMapAdapter::Type getType () const; + + //! returns the host of this MapAdapter + /*! + * @return the host of this MapAdapter + */ + virtual QString getHost () const; + + //! returns the size of the tiles + /*! + * @return the size of the tiles + */ + virtual int getTileSizeW () const { return -1; } + virtual int getTileSizeH () const { return -1; } + + //! returns the min zoom value + /*! + * @return the min zoom value + */ + virtual int getMinZoom (const QRectF &) const { return -1; } + + //! returns the max zoom value + /*! + * @return the max zoom value + */ + virtual int getMaxZoom (const QRectF &) const { return -1; } + + //! returns the current zoom + /*! + * @return the current zoom + */ + virtual int getZoom () const { return -1; } + + //! returns the source tag to be applied when drawing over this map + /*! + * @return the source tag + */ + virtual QString getSourceTag () const; + virtual void setSourceTag (const QString& ) {}; + + //! returns the Url of the usage license + /*! + * @return the Url of the usage license + */ + virtual QString getLicenseUrl() const {return QString();} + + virtual int getAdaptedZoom() const { return -1; } + virtual int getAdaptedMinZoom(const QRectF &) const { return -1; } + virtual int getAdaptedMaxZoom(const QRectF &) const { return -1; } + + virtual void zoom_in() {} + virtual void zoom_out() {} + + virtual bool isValid(int, int, int) const { return true; } + virtual QString getQuery(int, int, int) const { return QString(); } + virtual QString getQuery(const QRectF& , const QRectF& , const QRect& ) const { return QString(); } + virtual QPixmap getPixmap(const QRectF& wgs84Bbox, const QRectF& projBbox, const QRect& size) const ; + + virtual QString projection() const; + virtual QRectF getBoundingbox() const; + + virtual bool isTiled() const { return false; } + virtual int getTilesWE(int) const { return -1; } + virtual int getTilesNS(int) const { return -1; } + + virtual QMenu* getMenu() const; + + virtual IImageManager* getImageManager(); + virtual void setImageManager(IImageManager* anImageManager); + + virtual void cleanup(); + + virtual bool toXML(QXmlStreamWriter& stream); + virtual void fromXML(QXmlStreamReader& stream); + virtual QString toPropertiesHtml(); + + virtual void setSettings(QSettings* /*aSet*/) {} + +public slots: + void onLoadImage(); + void onSetSourceTag(); + +protected: + bool alreadyLoaded(QString fn) const; + bool loadImage(const QString& fn); + +private: + QMenu* theMenu; + + GDALDataset *poDataset; + QString imageFilename; + QString theProjection; + QRect thePicRect; + QRectF theBbox; + bool isLatLon; + + QList<GdalImage> theImages; + QString theSourceTag; + +// TiffType theType; +// int bandCount; +// int ixR, ixG, ixB, ixA; +// GDALColorTable * colTable; +}; + +class GdalAdapterFactory : public QObject, public IMapAdapterFactory +{ + Q_OBJECT + Q_INTERFACES(IMapAdapterFactory) +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + Q_PLUGIN_METADATA(IID "be.merkaartor.gdaladapter" FILE "GdalAdapter.json") +#endif + +public: + //! Creates an instance of the actual plugin + /*! + * @return a pointer to the MapAdapter + */ + IMapAdapter* CreateInstance() {return new GdalAdapter(); } + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const; + + //! returns the name of this MapAdapter + /*! + * @return the name of this MapAdapter + */ + virtual QString getName () const; +}; + +#endif // GDALADAPTER_H diff --git a/plugins/background/MGdalBackground/GdalAdapter.json b/plugins/background/MGdalBackground/GdalAdapter.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/plugins/background/MGdalBackground/GdalAdapter.json @@ -0,0 +1 @@ +{} diff --git a/plugins/background/MGdalBackground/MGdalBackground.pro b/plugins/background/MGdalBackground/MGdalBackground.pro new file mode 100644 index 0000000..73f42a6 --- /dev/null +++ b/plugins/background/MGdalBackground/MGdalBackground.pro @@ -0,0 +1,38 @@ +include(../../common.pri) +include(../common.pri) + +TARGET = $$qtLibraryTarget(MGdalBackgroundPlugin) +DEPENDPATH += $${MERKAARTOR_SRC_DIR}/interfaces +INCLUDEPATH += $${MERKAARTOR_SRC_DIR}/interfaces +include ($${MERKAARTOR_SRC_DIR}/interfaces/Interfaces.pri) + +DEPENDPATH += $${MERKAARTOR_SRC_DIR}/src/Utils +INCLUDEPATH += $${MERKAARTOR_SRC_DIR}/src/Utils + +DEFINES += NO_PREFS + + +HEADERS += \ + ProjectionChooser.h \ + GdalAdapter.h + +SOURCES += \ + ProjectionChooser.cpp \ + GdalAdapter.cpp + +FORMS += \ + ProjectionChooser.ui + +COMMON_DIR=$${MERKAARTOR_SRC_DIR}/binaries + +win32 { + INCLUDEPATH += $$COMMON_DIR/include + LIBS += -L$$COMMON_DIR/lib + win32-msvc*:LIBS += -lgdal_i + win32-g++:LIBS += -lgdal +} +unix { + LIBS += $$system(gdal-config --libs) + QMAKE_CXXFLAGS += $$system(gdal-config --cflags) + QMAKE_CFLAGS += $$system(gdal-config --cflags) +} diff --git a/plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp b/plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp new file mode 100644 index 0000000..8cee64a --- /dev/null +++ b/plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp @@ -0,0 +1,429 @@ +//*************************************************************** +// CLass: GeoTiffAdapter +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com> (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +//****************************************************************** + +#include "GeoTiffAdapter.h" + +#include <QCoreApplication> +#include <QtPlugin> +#include <QAction> +#include <QFileDialog> +#include <QPainter> +#include <QMessageBox> +#include <QInputDialog> + +#include <QDebug> + +#include "gdal_priv.h" +#include "ogrsf_frmts.h" + +#include "ProjectionChooser.h" + +#define IN_MEMORY_LIMIT 100000000 + +static const QUuid theUid ("{867e78e9-3156-45f8-a9a7-e5cfa52f8507}"); +static const QString theName("GeoTIFF"); + +QUuid GeoTiffAdapterFactory::getId() const +{ + return theUid; +} + +QString GeoTiffAdapterFactory::getName() const +{ + return theName; +} + +/**************/ + +inline double radToAng(double a) +{ + return a*180/M_PI; +} + +inline double angToRad(double a) +{ + return a*M_PI/180.; +} + +#define FILTER_OPEN_SUPPORTED \ + tr("Supported formats")+" (*.tif *.tiff)\n" \ + +tr("GeoTIFF files (*.tif *.tiff)\n") \ + +tr("All Files (*)") + +GeoTiffAdapter::GeoTiffAdapter() + : poDataset(0), isLatLon(false) +{ + GDALAllRegister(); + + QAction* loadImage = new QAction(tr("Load image(s)..."), this); + loadImage->setData(theUid.toString()); + connect(loadImage, SIGNAL(triggered()), SLOT(onLoadImage())); + QAction* setSource = new QAction(tr("Specify \"source\" tag..."), this); + setSource->setData(theUid.toString()); + connect(setSource, SIGNAL(triggered()), SLOT(onSetSourceTag())); + + theMenu = new QMenu(); + theMenu->addAction(loadImage); + theMenu->addAction(setSource); +} + + +GeoTiffAdapter::~GeoTiffAdapter() +{ + cleanup(); +} + +QUuid GeoTiffAdapter::getId() const +{ + return theUid; +} + +QString GeoTiffAdapter::getName() const +{ + return theName; +} + +bool GeoTiffAdapter::alreadyLoaded(QString fn) const +{ + for (int j=0; j<theImages.size(); ++j) + if (theImages[j].theFilename == fn) + return true; + return false; +} + +bool GeoTiffAdapter::loadImage(const QString& fn) +{ + if (alreadyLoaded(fn)) + return true; + + QFileInfo fi(fn); + GdalImage img; + QRectF bbox; + + poDataset = (GDALDataset *) GDALOpen( QDir::toNativeSeparators(fi.absoluteFilePath()).toUtf8().constData(), GA_ReadOnly ); + if( poDataset == NULL ) + { + qDebug() << "GDAL Open failed: " << fn; + return false; + } + + bool hasGeo = false; + QDir dir(fi.absoluteDir()); + QString f = fi.baseName(); + QStringList wldFilter; + wldFilter << f+".tfw" << f+".tifw" << f+".tiffw" << f+".wld"; + QFileInfoList fil = dir.entryInfoList(wldFilter); + if (fil.count()) { + QFile wld(fil[0].absoluteFilePath()); + if (wld.open(QIODevice::ReadOnly)) { + int i; + for (i=0; i<6; ++i) { + if (wld.atEnd()) + break; + QString l = wld.readLine(); + bool ok; + double d = l.toDouble(&ok); + if (!ok) + break; + switch (i) { + case 0: + img.adfGeoTransform[1] = d; + break; + case 1: + img.adfGeoTransform[4] = d; + break; + case 2: + img.adfGeoTransform[2] = d; + break; + case 3: + img.adfGeoTransform[5] = d; + break; + case 4: + img.adfGeoTransform[0] = d; + break; + case 5: + img.adfGeoTransform[3] = d; + break; + } + + } + if (i == 6) + hasGeo = true; + } + } + if(!hasGeo) + if ( poDataset->GetGeoTransform( img.adfGeoTransform ) != CE_None ) { + GDALClose((GDALDatasetH)poDataset); + return false; + } + + qDebug( "Origin = (%.6f,%.6f)\n", + img.adfGeoTransform[0], img.adfGeoTransform[3] ); + + qDebug( "Pixel Size = (%.6f,%.6f)\n", + img.adfGeoTransform[1], img.adfGeoTransform[5] ); + + bbox.setTopLeft(QPointF(img.adfGeoTransform[0], img.adfGeoTransform[3])); + bbox.setWidth(img.adfGeoTransform[1]*poDataset->GetRasterXSize()); + bbox.setHeight(img.adfGeoTransform[5]*poDataset->GetRasterYSize()); + + isLatLon = false; + if( strlen(poDataset->GetProjectionRef()) != 0 ) { + qDebug( "Projection is `%s'\n", poDataset->GetProjectionRef() ); + OGRSpatialReference* theSrs = new OGRSpatialReference(poDataset->GetProjectionRef()); + if (theSrs && theSrs->Validate() == OGRERR_NONE) { + theSrs->morphFromESRI(); + char* theProj4; + if (theSrs->exportToProj4(&theProj4) == OGRERR_NONE) { + qDebug() << "GDAL: to proj4 : " << theProj4; + } else { + qDebug() << "GDAL: to proj4 error: " << CPLGetLastErrorMsg(); + GDALClose((GDALDatasetH)poDataset); + return false; + } + QString srsProj = QString(theProj4); + if (!srsProj.isEmpty() && theProjection != srsProj) { + cleanup(); + theProjection = srsProj; + } + isLatLon = (theSrs->IsGeographic() == TRUE); + } + } + if (theProjection.isEmpty()) { + theProjection = ProjectionChooser::getProjection(QCoreApplication::translate("ImportExportGdal", "Unable to set projection; please specify one")); + if (theProjection.isEmpty()) { + GDALClose((GDALDatasetH)poDataset); + return false; + } + } + + qDebug( "Driver: %s/%s\n", + poDataset->GetDriver()->GetDescription(), + poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) ); + + qDebug( "Size is %dx%dx%d\n", + poDataset->GetRasterXSize(), poDataset->GetRasterYSize(), + poDataset->GetRasterCount() ); + + img.theFilename = fn; + img.theImg.load(fn); + theImages.push_back(img); + theBbox = theBbox.united(bbox); + + GDALClose((GDALDatasetH)poDataset); + return true; +} + +void GeoTiffAdapter::onLoadImage() +{ + int fileOk = 0; + + QStringList fileNames = QFileDialog::getOpenFileNames( + NULL, + tr("Open GeoTIFF files"), + "", FILTER_OPEN_SUPPORTED); + if (fileNames.isEmpty()) + return; + +// theBbox = QRectF(); +// theImages.clear(); + + for (int i=0; i<fileNames.size(); i++) { + if (loadImage(fileNames[i])) + ++fileOk; + } + + if (!fileOk) { + QMessageBox::critical(0,QCoreApplication::translate("GeoTiffBackground","No valid file"),QCoreApplication::translate("GeoTiffBackground","No valid GeoTIFF file could be found.")); + } else { + emit(forceProjection()); + emit forceZoom(); + emit forceRefresh(); + } + + return; +} + +void GeoTiffAdapter::onSetSourceTag() +{ + bool ok; + QString text = QInputDialog::getText(0, tr("Please specify automatic \"source\" tag value"), + tr("Value:"), QLineEdit::Normal, theSourceTag, &ok); + if (ok) + theSourceTag = text; +} + +QString GeoTiffAdapter::getSourceTag() const +{ + return theSourceTag; +} + +QString GeoTiffAdapter::getHost() const +{ + return QString(); +} + +IMapAdapter::Type GeoTiffAdapter::getType() const +{ + return IMapAdapter::DirectBackground; +} + +QMenu* GeoTiffAdapter::getMenu() const +{ + return theMenu; +} + +QRectF GeoTiffAdapter::getBoundingbox() const +{ + QRectF projBbox = theBbox; + if (isLatLon) + projBbox = QRectF(angToRad(theBbox.left()), angToRad(theBbox.top()), angToRad(theBbox.width()), angToRad(theBbox.height())); + return projBbox; +} + +QString GeoTiffAdapter::projection() const +{ + return theProjection; +} + +QPixmap GeoTiffAdapter::getPixmap(const QRectF& /*wgs84Bbox*/, const QRectF& theProjBbox, const QRect& src) const +{ + QPixmap pix(src.size()); + pix.fill(Qt::transparent); + QPainter p(&pix); + + QRectF projBbox = theProjBbox; + if (isLatLon) + projBbox = QRectF(radToAng(theProjBbox.left()), radToAng(theProjBbox.top()), radToAng(theProjBbox.width()), radToAng(theProjBbox.height())); + + + for (int i=0; i<theImages.size(); ++i) { + QPixmap theImg = theImages[i].theImg; + + QSizeF sz(projBbox.width() / theImages[i].adfGeoTransform[1], projBbox.height() / theImages[i].adfGeoTransform[5]); + if (sz.isNull()) + return QPixmap(); + + QPointF s((projBbox.left() - theImages[i].adfGeoTransform[0]) / theImages[i].adfGeoTransform[1], + (projBbox.top() - theImages[i].adfGeoTransform[3]) / theImages[i].adfGeoTransform[5]); + + qDebug() << "Pixmap Origin: " << s.x() << "," << s.y(); + qDebug() << "Pixmap size: " << sz.width() << "," << sz.height(); + + double rtx = src.width() / (double)sz.width(); + double rty = src.height() / (double)sz.height(); + + QRect mRect = QRect(s.toPoint(), sz.toSize()); + QRect iRect = theImg.rect().intersected(mRect); + QRect sRect = QRect(iRect.topLeft() - mRect.topLeft(), iRect.size()); + QRect fRect = QRect(sRect.x() * rtx, sRect.y() * rty, sRect.width() * rtx, sRect.height() * rty); + + qDebug() << "mrect: " << mRect; + qDebug() << "iRect: " << iRect; + qDebug() << "sRect: " << sRect; + + // QImage img2 = theImg.copy(iRect).scaled(fRect.size()); + // p.drawImage(fRect.topLeft(), img2); + QPixmap img2 = theImg.copy(iRect).scaled(fRect.size()); + p.drawPixmap(fRect.topLeft(), img2); + } + + p.end(); + return pix; +} + +IImageManager* GeoTiffAdapter::getImageManager() +{ + return NULL; +} + +void GeoTiffAdapter::setImageManager(IImageManager* /*anImageManager*/) +{ +} + +void GeoTiffAdapter::cleanup() +{ + theImages.clear(); + theBbox = QRectF(); + theProjection = QString(); +} + +bool GeoTiffAdapter::toXML(QXmlStreamWriter& stream) +{ + bool OK = true; + + stream.writeStartElement("Images"); + + stream.writeAttribute("projection", theProjection); + if (!theSourceTag.isEmpty()) + stream.writeAttribute("source", theSourceTag); + for (int i=0; i<theImages.size(); ++i) { + stream.writeStartElement("Image"); + stream.writeAttribute("filename", theImages[i].theFilename); + stream.writeEndElement(); + } + + stream.writeEndElement(); + + return OK; +} + +void GeoTiffAdapter::fromXML(QXmlStreamReader& stream) +{ + theBbox = QRectF(); + theImages.clear(); + + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Images") { + if (stream.attributes().hasAttribute("projection")) + theProjection = stream.attributes().value("projection").toString(); + if (stream.attributes().hasAttribute("source")) + theSourceTag = stream.attributes().value("source").toString(); + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Image") { + QString fn = stream.attributes().value("filename").toString(); + if (!fn.isEmpty()) + loadImage(fn); + stream.readNext(); + } else if (!stream.isWhitespace()) { + qDebug() << "gdalimage: logic error: " << stream.name() << " : " << stream.tokenType() << " (" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + stream.readNext(); + } + } else if (!stream.isWhitespace()) { + qDebug() << "gdalmain: logic error: " << stream.name() << " : " << stream.tokenType() << " (" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + + stream.readNext(); + } +} + +QString GeoTiffAdapter::toPropertiesHtml() +{ + QString h; + + QStringList fn; + for (int i=0; i<theImages.size(); ++i) { + fn << QDir::toNativeSeparators(theImages[i].theFilename); + } + h += "<i>" + tr("Filename(s)") + ": </i>" + fn.join("; "); + + return h; +} + +#if !(QT_VERSION >= QT_VERSION_CHECK(5,0,0)) +Q_EXPORT_PLUGIN2(MGeoTiffBackgroundPlugin, GeoTiffAdapterFactory) +#endif + diff --git a/plugins/background/MGeoTiffBackground/GeoTiffAdapter.h b/plugins/background/MGeoTiffBackground/GeoTiffAdapter.h new file mode 100644 index 0000000..bf09d48 --- /dev/null +++ b/plugins/background/MGeoTiffBackground/GeoTiffAdapter.h @@ -0,0 +1,201 @@ +//*************************************************************** +// CLass: GeoTiffAdapter +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com> (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +//****************************************************************** + +#ifndef GEOTIFFADAPTER_H +#define GEOTIFFADAPTER_H + +#include "IMapAdapterFactory.h" +#include "IMapAdapter.h" + +#include <QLocale> + +class GDALDataset; +class GDALColorTable; + +class GdalImage +{ +public: + QString theFilename; + QPixmap theImg; + double adfGeoTransform[6]; +}; + +class GeoTiffAdapter : public IMapAdapter +{ + Q_OBJECT + Q_INTERFACES(IMapAdapter) + +public: + enum TiffType + { + Unknown, + Rgb, + Rgba, + Palette_Gray, + Palette_RGBA, + Palette_CMYK, + Palette_HLS + }; + + GeoTiffAdapter(); + virtual ~GeoTiffAdapter(); + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const; + + //! returns the name of this MapAdapter + /*! + * @return the name of this MapAdapter + */ + virtual QString getName () const; + + //! returns the type of this MapAdapter + /*! + * @return the type of this MapAdapter + */ + virtual IMapAdapter::Type getType () const; + + //! returns the host of this MapAdapter + /*! + * @return the host of this MapAdapter + */ + virtual QString getHost () const; + + //! returns the size of the tiles + /*! + * @return the size of the tiles + */ + virtual int getTileSizeW () const { return -1; } + virtual int getTileSizeH () const { return -1; } + + //! returns the min zoom value + /*! + * @return the min zoom value + */ + virtual int getMinZoom (const QRectF &) const { return -1; } + + //! returns the max zoom value + /*! + * @return the max zoom value + */ + virtual int getMaxZoom (const QRectF &) const { return -1; } + + //! returns the current zoom + /*! + * @return the current zoom + */ + virtual int getZoom () const { return -1; } + + //! returns the source tag to be applied when drawing over this map + /*! + * @return the source tag + */ + virtual QString getSourceTag () const; + virtual void setSourceTag (const QString& ) {}; + + //! returns the Url of the usage license + /*! + * @return the Url of the usage license + */ + virtual QString getLicenseUrl() const {return QString();} + + virtual int getAdaptedZoom() const { return -1; } + virtual int getAdaptedMinZoom(const QRectF &) const { return -1; } + virtual int getAdaptedMaxZoom(const QRectF &) const { return -1; } + + virtual void zoom_in() {} + virtual void zoom_out() {} + + virtual bool isValid(int, int, int) const { return true; } + virtual QString getQuery(int, int, int) const { return QString(); } + virtual QString getQuery(const QRectF& , const QRectF& , const QRect& ) const { return QString(); } + virtual QPixmap getPixmap(const QRectF& wgs84Bbox, const QRectF& projBbox, const QRect& size) const ; + + virtual QString projection() const; + virtual QRectF getBoundingbox() const; + + virtual bool isTiled() const { return false; } + virtual int getTilesWE(int) const { return -1; } + virtual int getTilesNS(int) const { return -1; } + + virtual QMenu* getMenu() const; + + virtual IImageManager* getImageManager(); + virtual void setImageManager(IImageManager* anImageManager); + + virtual void cleanup(); + + virtual bool toXML(QXmlStreamWriter& stream); + virtual void fromXML(QXmlStreamReader& stream); + virtual QString toPropertiesHtml(); + + virtual void setSettings(QSettings* /*aSet*/) {} + +public slots: + void onLoadImage(); + void onSetSourceTag(); + +protected: + bool alreadyLoaded(QString fn) const; + bool loadImage(const QString& fn); + +private: + QMenu* theMenu; + + GDALDataset *poDataset; + QString imageFilename; + QString theProjection; + QRect thePicRect; + QRectF theBbox; + bool isLatLon; + + QList<GdalImage> theImages; + QString theSourceTag; + +// TiffType theType; +// int bandCount; +// int ixR, ixG, ixB, ixA; +// GDALColorTable * colTable; +}; + +class GeoTiffAdapterFactory : public QObject, public IMapAdapterFactory +{ + Q_OBJECT + Q_INTERFACES(IMapAdapterFactory) +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + Q_PLUGIN_METADATA(IID "be.merkaartor.geotiffadapter" FILE "GeoTiffAdapter.json") +#endif + +public: + //! Creates an instance of the actual plugin + /*! + * @return a pointer to the MapAdapter + */ + IMapAdapter* CreateInstance() {return new GeoTiffAdapter(); } + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const; + + //! returns the name of this MapAdapter + /*! + * @return the name of this MapAdapter + */ + virtual QString getName () const; +}; + +#endif // GeoTiffAdapter_H diff --git a/plugins/background/MGeoTiffBackground/GeoTiffAdapter.json b/plugins/background/MGeoTiffBackground/GeoTiffAdapter.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/plugins/background/MGeoTiffBackground/GeoTiffAdapter.json @@ -0,0 +1 @@ +{} diff --git a/plugins/background/MGeoTiffBackground/MGeoTiffBackground.pro b/plugins/background/MGeoTiffBackground/MGeoTiffBackground.pro new file mode 100644 index 0000000..021a1a2 --- /dev/null +++ b/plugins/background/MGeoTiffBackground/MGeoTiffBackground.pro @@ -0,0 +1,37 @@ +include(../../common.pri) +include(../common.pri) + +TARGET = $$qtLibraryTarget(MGeoTiffBackgroundPlugin) +DEPENDPATH += $${MERKAARTOR_SRC_DIR}/interfaces +INCLUDEPATH += $${MERKAARTOR_SRC_DIR}/interfaces +include ($${MERKAARTOR_SRC_DIR}/interfaces/Interfaces.pri) + +DEPENDPATH += $${MERKAARTOR_SRC_DIR}/src/Utils +INCLUDEPATH += $${MERKAARTOR_SRC_DIR}/src/Utils + +DEFINES += NO_PREFS + +HEADERS += \ + ProjectionChooser.h \ + GeoTiffAdapter.h + +SOURCES += \ + ProjectionChooser.cpp \ + GeoTiffAdapter.cpp + +FORMS += \ + ProjectionChooser.ui + +COMMON_DIR=$${MERKAARTOR_SRC_DIR}/binaries + +win32 { + INCLUDEPATH += $$COMMON_DIR/include + LIBS += -L$$COMMON_DIR/lib + win32-msvc*:LIBS += -lgdal_i + win32-g++:LIBS += -lgdal +} +unix { + LIBS += $$system(gdal-config --libs) + QMAKE_CXXFLAGS += $$system(gdal-config --cflags) + QMAKE_CFLAGS += $$system(gdal-config --cflags) +} diff --git a/plugins/background/MMsBingMapBackground/MMsBingMapBackground.pro b/plugins/background/MMsBingMapBackground/MMsBingMapBackground.pro new file mode 100644 index 0000000..3018e5e --- /dev/null +++ b/plugins/background/MMsBingMapBackground/MMsBingMapBackground.pro @@ -0,0 +1,20 @@ +include(../../common.pri) +include(../common.pri) + +TARGET = $$qtLibraryTarget(MMsBingMapBackgroundPlugin) +DEPENDPATH += $${MERKAARTOR_SRC_DIR}/interfaces +INCLUDEPATH += $${MERKAARTOR_SRC_DIR}/interfaces +include ($${MERKAARTOR_SRC_DIR}/interfaces/Interfaces.pri) + +QT += widgets + +HEADERS += \ + mapadapter.h \ + msbingmapadapter.h + +SOURCES += \ + mapadapter.cpp \ + msbingmapadapter.cpp + +RESOURCES += \ + Resources.qrc diff --git a/plugins/background/MMsBingMapBackground/Resources.qrc b/plugins/background/MMsBingMapBackground/Resources.qrc new file mode 100644 index 0000000..18a1123 --- /dev/null +++ b/plugins/background/MMsBingMapBackground/Resources.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/images"> + <file alias="bing_logo.png">images/logo_powered_by.png</file> + </qresource> +</RCC> diff --git a/plugins/background/MMsBingMapBackground/images/logo_powered_by.png b/plugins/background/MMsBingMapBackground/images/logo_powered_by.png new file mode 100644 index 0000000000000000000000000000000000000000..ae4367e87700710a625651348ea2f214d31b1788 GIT binary patch literal 4295 zcmV;&5IFCNP)<h;3K|Lk000e1NJLTq003P80012b1^@s6$SGj200004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU?SxH1eRCwCd zS_yPi)ft|d%$8-cLm;xZ1frl2tQbL-B7ukyz<^Z?<rE}<fZ8Z3Di}aO7D1ALMk@%Y zC}P!!2(lRj5e^nb^k71$4J0VpCo`FS`h73=#>W%{0<ov}oR^oGci(^S{r>-c|8hsG z(P*@qhNg>(iVE_2y;`Hu7{o7vf`a@mm&?n0d3m`PU-`w=*d|Y&tO;y+d3ltnjg5^B z!uvWsn&0nN#?flEez)80#aF(nsw&F#2|0ev|Da*6*Hj+XdC5Lnap}Ut!-<VPBqYQH zV1ft|E-wIb<Fgye@Th>lq+BRa4`mT-quFdW@qa$>csvm0bwR8X&)jO@FV(I@F+%ap z(fro}bXvF`z#1YVBEmvLL&E@42tMlojHAB3-d0mnW3yVV4x7#9{uO}aXo`j7Zh#zf zaB#2%iVP163k!uzt;6A{hpZYa1>%35PUli7Q+p)~mP)t?z}ic!TN;P%QXp}sWB2>9 z9Di|fv3j@rn*zGDK3cjN;8;eajZC_|Z@(d!meyKp{dwuq#qR*@a~M>i9nuYeY+MkO z;s<bk(gr67%k?{*&LH&Bn@pzQn3$N@@hP2B1|`(p$Nnd)!VW*T>Bl@w&WC;;Tm)Q$ z#cN4z++jYSPpcjSeS9kUK1p*bYEXk1bRjvMrvOFy%(d`2=H3W8$KYD{zrkQo`tdX5 z`FMvBdSFmKVC4h&zNT&!g095?oTw3ZOP|~NrVbrCcmf|*SJ%|6T)F%+4Cuy!IXO3g z^wMIb0DSg|iFtANMMg$?xfnDv<c0O`8GqvgiJvdf`|Fj(CB$gDS<_M~=C7|=hyG43 z6pQeS#p^H*!O*G4fE<qD17IG2>Y?HRnpY@5!OLQ?1aTcOAd1inITWLe3xm>Nihe<x ziUE;E(X?Py_TfWi4eSS5jUe$m^d&F4F;_Qss9Px7-(=9aNHhX(_ITVz)mG8rSrjfC zCT74y-2@mHErjoJ5&VOHeO@fsN$wYxX~6g9_{gBvfrGj|UIWKMpI`z7+1$eT*Ff%9 z{0Z-37y1Mc(igb!$i)T)csZ5;(17oauxumlCcHz+)Jf1eSFTm;0y=jCsMG{yus@&C zf7!9C>*#k>fD>FAnhST}?ck2{b?VfKRMRBj^<qMt3@wAe>wh6oMP4u_7Kg<|!<w|P zY@L{hRE!^!R6wxX?RB-awRPlaE)EkkuH9C6tj=-s%8@rYhq3?hpF+M}`Cd^07H7ah z!XVF&#T&`_YyiWIi-5~*uP7Aa-SjUQ!&--iKJ@_HMV^JS^cd5Kc|uH>1!63aYo;P4 z^^j`;st<B#A$lmv{O}{0!)~}fv769~|73CT!P!qf{_3Gahq5KzKz6Ib!osy3J9Zq} zt5>g4`0T;^9;{7!HT0s$7aSNw`ck_sY^Si{!$;gOYV_#T)~#B_M@B}32MVdHv)KW5 z)rk`)j%H;&yAInPzPHA~tqzcaywORX_e+Czl$Dm&cJF>;D~IDnJ;n-Qqy#z&fyG8H zSg<Igefze*kB*LRfndj|mQQQ1sHmzub?Vf2n>KBF_u#<;MHr)!N}x|*bOeJ4hn$#4 zADxxnt5?zh`jS974u{iquDra$>2NyRw7D)m@Ofcj(Gl*Lq@<(=3JMCI8ZcnMbKACU zo6?~}hg71$T_X(isv;x3+M`P+qvBHiTW@We9~~WK2>`hsK#<ooFi;w42(S3~*4HH` zZy#K+@AKVH&3<BIWo2bOBcb%W(?=vGcInFgl~q;Nyu6q8;rm#CWPbVOS03u#{e~Wb zR~tdb7<E!UpT)(sh{e_K=9`oH78Mnr$j)Asw`b4pALtig7@?0m^5~tTMy1`WHi|$w z1i5XS>snt7j1?=EeGChBar0tF{ERzg$K~heFG@*C83WM0!qL*HUK7y&t63~z!D=fx za^$PS?`(eiy>Gt$x`a+eI3nZt@e>BzG5C(VU_6TTqzoQ3G%@l0o9-DqW)2tbSBG!- zz)+F|{?6ui=cz#`Ien&V*Unw}>({T_Oa2z&nlUwXSdV+}yZ6tOPX%=CnvnSX^Up8L z%*<SH`0%0AQ>ISqKW^N86Qts36#EZ+vG4iC3*P`Z^}>LHr%s!mmO6AuDiqMTt|LeO z`EBv3Qzzl2959k9fNsN_Z371mTta$DPELN9K+l~!_aJ#4md@10M_Owt=mbMgOMwvV z?CAFM=P!IPJ$+QVy3^^?rDgZufA8Gt>gqB~sv29`PF~}7!(xo!&oIb{&CHy2&&ZL( zN6N*Ql$<G>Fk$?{?Cjhb*I(Z?L9z78Dr<WB-Lsc1TRt%<sb>#qk!#nj-|$M_OFKZ< zKSRD%f=-9WD2VdY(nclEm^nSe64qc0RMMo0e_isy2Olh<9{C*zzkb$Zvz|L}VE=K* zs+6EZdBNcND6BDV^SfIX#<gq_BgdXO^P#MQg3pe@&z#2C<rv$JalJBvA^3DG_>Pf_ zhp&~EmijJ~vs`wZF8fn>V27W6K36ezZ2B|j&Yde^yp9RcyE~-U#yd=8?O32|!Gf%} z`5lxtn)kMCuWOw#b=n<)v;`#@J9qBfMSec`<>7;?bF+8C(n_(YO31fzVM0E`8Vqf7 zy!F-_`x6op+NGzDR^+#C6&E*YQpO+&I9v9roV>kz_Y@-cssw;lz{)P<m?4|djv?#W ztW~R5=VS?`>eA9i_5oELqLniq;5&5Q3>_hxw5uqGr3(Tr0B^FT>(qc>2=os>$o~)- zV<j9V7g0@1#{_CIsT$t#xfTws8lb?pRaGoszGN%6w|qaTXV0F2xgq0dHFcGhm7Rr* z8p?-dawk!C4aTSj2pqGD&j@68_KTl3S_}Y#ob&w6jvb$zfGh{zqa%0H_b|HR&f#Z# z?>u(w>$4)(R$803ZQ3C^BVQ|}2~sB`Tg;PGqJ*gc-;EHF7Jk7R)D?5O%qVdoMbn<Q zW!`*q!(lAA9snp4cQ!Pa*jmi^SP;|87#h#qB_$>QPE72oSaLMH<yo}zG_49b1;<gA z17p-f4i#1pB}-5Mtc7tS<9=lx>UZ0<Ya6froRTuM%Z3fFR{&r$`kR<d3S%-sNhbP} zJMX+JQN26LO3$7okE1`Gs2j@l;JTPKUv*(lC#{^>7#C!<)>f!H3?4irfpj2}4W{-c z@GFa0MudAzEQ~TSQL-D8$<PX+rF`FJv)eAKLZ(%e?dGDfYh)3O7b}t;Mik5n89}Ju z`|kVie;|*`&*1#Y0|pLEK)N1_c}9W9qY;|ML_|cyB8-f~+@hyU$(X1P5VEr7Y#@Je zS1=I^uw;M0rMV`cGp!a@Y=7<VukPYRWQXzN$KL~Ejl#qukx=krIWioehhu^fEFItq z$Ks%a$Y?mzVF<e|zwq^!hc7)<#qhl<iaT$S@_Q;qfTDI>9)z`<$+=3z1t+`Wg%!`_ z=C1i0;_HsMI<#-!z9X(q%U@WTv32XmE9Ct6&W4Q}Hy}W$Mm|AG^04guYXz-q(e#32 znaa~MGubQOzyH9eg9Z&$GRQV<;#;p-^YX(pW<0n836Fu?O9e4{p@Ren238W$Vkb|Y zlFI0%(Fy-_u42vVoE<qitGoQF=5<P;$tSEmaIvzW=95>zX7|ES3gGC=r%j#u00Cv# z+NV!)pIy6l^{K9|sb#moq>fS4mM!o7BR4mDFR08$9vAhUX0PiLbUz05B9x-TA(xgv z{q*eB!NDuSZ@cZ*+ZAV+)T75oA8pOqvuE!oIXSEH*^hK2<7jYX&*3A6r-8=1O2JiC z)z&$4=e$4*(gZkYC@g?l6u^~YQ=lcQD}baIJog4Z!<_9KH>^MKQT~TVGBT$1>)*d$ zN(<ytOxP}zL9>O2TSD8lYZo8X&~!4w3XHUx&C-d3r=itjVbzSkGczAq`1ljE#|`M; z?=DW97BqVF$T1^E+;z9i@?;#XPByq@3yV(vfcSY)MMZ^;j!Uc61cL58Kl9bQAcs!O ztD+Z;y0nYk#GOTJbOb~~Zbmt*(X$w}bm`)fmtM+!pT37Vged5-h-QX=x^d#9iQ^cf zGx8ZSWbhqGr-P?YpSB3pVq!@eckR_w5HH)(g|&EC(4rT|0tk%f*}2cGfdkr{nfcfl zbv+}{dID=B`}glF1Wnd4EMsC*TVp+gZO+V7iyctG!WizgqI&B`gjdQ+rU=slE#1%f zSR`W%0jq0jYOAG1+U$0|YsL3<EQ&$424h#UdMP3$7V;Pb1g~57TKU$k`N!XWd-FWf zCZG52{fFc}eQ)pl>5lDZK`{&jbnvOoYU$d*V><xP2{Jkf#$toX*R0&}^oNHM47<kv zWkMe~%_yx#>)*Y5_u->Qzba!{R8|4e?2Ic#tvncg!+Ai$vjg}H)}>kP;>i+~YiI0_ zR*pEIalcc9i;b3sK!m6pF}JXmEnCLGX~#f0p#a%OYJsn@yBeYa?go~axnrm(pG@EY zekd-UV8sm?GPK+3)wx+x{(&#PESNSm<0<USA4R^w-Q;bGwO>g_Dtr0>7z_0*=#X+; z;>fNRV3)IeN;+A*Xkjt8Cu`L7_*^h85sRiJI+fxCD1@Lxo{gZw^31H;vzE<)0F)B3 z06f;QnaDVJ7K`Y}Co0A=a?v6=<7o{`s`Yf30ELdvh%P*=FtIcYg_t-Wjt$`InH>2V z8V@IE@lMQve#?FA*f&aYBx7~t60s~N%L9(ziqqA=`-P=>c}jx25=t^k;Z|k5&eIlo z%;jsS0MWrI6u?V-mY@aUeVz!})r;bBm^`2m?|6ACCC*C&n-3Q1g`%9SiLmfQu*Gp; z$a4!9PZY_Jrl_#6@b%Z%9$@hbyN*7}Ee=J@tf6CvnN#l^c3yIH=1gfZ6T6G~l;#9I zFjVsbd|I7HoIBEjb>uvG1}UQo?refg?gdQ*W^!)OgYu5L4vqgC4}Ezt1H|Q5Te&<W zp|#8On`e})q4V&ArDuSszqNPou@MoL$cAL+k4X33D>iR_=OE_Kl7ds5iH5M?)w_3c z*O@bBWT?*q=FOYC7Q3U?({R@3Yi>)|Ucqziue@{3l8KAO$?7vx>I&fVv?(kOZP1{> zx6GdX<cp!9A)(T-7Zsg6k)NOc;r8vH92ez*Zo`KUAJMt<?-FDclu2MtPVSP88`p0G zZJlAwhgC_HPiYoT*Iq*fX)Y(RP=nW$L`1x=1@##i?t#lAakcC}U|`Sb4^E%ep+mb) zmm>$1Qo3x}vc-G%?l}tD`UzCTVw(-L<ZP-FZ4S_zJjgZOngVqGwuTW6qbyJdBdjPW zqQxz}dw02K?4R!L*s<gFCX>;~6C*(*bxx<tb@uGpf9>40bK84c-X;Aoe60kv)Uc#W z{{<)Qxtco5Zvy&-epc7qP5x|8{z!_|M1-~>;CTy=2YEovSeMRU9C9naEMp{tsD+_z z9l&PooM)_d_!ox&To&5=&1r=Hm!PYGr^N$AMpXQXi1PCb`Ew42r{ecI8d2i)$r7|U pnR4M>m-r2h`saPk3i^Kp7yyil{7ndrnOpz>002ovPDHLkV1h13YE%FK literal 0 HcmV?d00001 diff --git a/plugins/background/MMsBingMapBackground/mapadapter.cpp b/plugins/background/MMsBingMapBackground/mapadapter.cpp new file mode 100644 index 0000000..0e7f26c --- /dev/null +++ b/plugins/background/MMsBingMapBackground/mapadapter.cpp @@ -0,0 +1,46 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "mapadapter.h" + +MapAdapter::MapAdapter(const QString& host, const QString& serverPath, const QString& theProjection, int minZoom, int maxZoom) + :host(host), serverPath(serverPath), Projection(theProjection), min_zoom(minZoom), max_zoom(maxZoom) +{ + current_zoom = min_zoom; + loc = QLocale(QLocale::English); +} + +MapAdapter::~MapAdapter() +{ +} + +QString MapAdapter::getName() const +{ + return name; +} + +QString MapAdapter::getHost() const +{ + return host; +} + +QString MapAdapter::projection() const +{ + return Projection; +} diff --git a/plugins/background/MMsBingMapBackground/mapadapter.h b/plugins/background/MMsBingMapBackground/mapadapter.h new file mode 100644 index 0000000..2c26093 --- /dev/null +++ b/plugins/background/MMsBingMapBackground/mapadapter.h @@ -0,0 +1,97 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 MAPADAPTER_H +#define MAPADAPTER_H + +#include <QObject> +#include <QSize> +#include <QPoint> +#include <QPointF> +#include <QLocale> +#include <QDebug> +#include <cmath> + +#include "IImageManager.h" +#include "IMapAdapter.h" + +//! Used to fit map servers into QMapControl +/*! + * MapAdapters are needed to convert between world- and display coordinates. + * This calculations depend on the used map projection. + * There are two ready-made MapAdapters: + * - TileMapAdapter, which is ready to use for OpenStreetMap or Google (Mercator projection) + * - WMSMapAdapter, which could be used for the most WMS-Server (some servers show errors, because of image ratio) + * + * MapAdapters are also needed to form the HTTP-Queries to load the map tiles. + * The maps from WMS Servers are also divided into tiles, because those can be better cached. + * + * @see TileMapAdapter, @see WMSMapAdapter + * + * @author Kai Winter <kaiwinter@gmx.de> +*/ +class MapAdapter : public IMapAdapter +{ + //friend class ImageManager; + //friend class BrowserImageManager; + //friend class Layer; + +public: + virtual ~MapAdapter(); + + //! returns the host of this MapAdapter + /*! + * @return the host of this MapAdapter + */ + virtual QString getName () const; + + //! returns the host of this MapAdapter + /*! + * @return the host of this MapAdapter + */ + virtual QString getHost () const; + + //! returns the projection of this MapAdapter + /*! + * @return the projection of this MapAdapter + */ + virtual QString projection() const; + + virtual QMenu* getMenu() const { return NULL; } + +protected: + QString name; + MapAdapter(const QString& host, const QString& serverPath, const QString& projection, int minZoom = 0, int maxZoom = 0); + virtual void zoom_in() = 0; + virtual void zoom_out() = 0; + virtual bool isValid(int x, int y, int z) const = 0; + virtual QString getQuery(int x, int y, int z) const = 0; + + QSize size; + QString host; + QString serverPath; + QString Projection; + int min_zoom; + int max_zoom; + int current_zoom; + + QLocale loc; +}; + +#endif diff --git a/plugins/background/MMsBingMapBackground/msbingmapadapter.cpp b/plugins/background/MMsBingMapBackground/msbingmapadapter.cpp new file mode 100644 index 0000000..7fb5ac9 --- /dev/null +++ b/plugins/background/MMsBingMapBackground/msbingmapadapter.cpp @@ -0,0 +1,331 @@ +#include <QtPlugin> +#include <QEventLoop> +#include <QNetworkAccessManager> +#include <QNetworkRequest> +#include <QNetworkReply> +#include <QTimer> + +#include "msbingmapadapter.h" + +#include <math.h> +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +static const QUuid theUid ( "{2a888701-1a93-4040-9b34-1e5339f67f43}"); +static const QString theName("Bing Maps"); + +QUuid MsBingMapAdapterFactory::getId() const +{ + return theUid; +} + +QString MsBingMapAdapterFactory::getName() const +{ + return theName; +} + +/**************/ + +MsBingMapAdapter::MsBingMapAdapter() + : MapAdapter(QString("ecn.t3.tiles.virtualearth.net"), QString("/tiles/a%1.jpeg?g=587&mkt=en-gb&n=z"), QString("EPSG:3857"), 0, 20) + , theImageManager(0) + , theSource("Bing") + , isLoaded(false) +{ +} + +MsBingMapAdapter::~MsBingMapAdapter() +{ +} + +QUuid MsBingMapAdapter::getId() const +{ + return QUuid(theUid); +} + +QString MsBingMapAdapter::getName() const +{ + return theName; +} + + +IMapAdapter::Type MsBingMapAdapter::getType() const +{ + return IMapAdapter::NetworkBackground; +} + +QString MsBingMapAdapter::getHost() const +{ + return host; +} + +QPoint MsBingMapAdapter::coordinateToDisplay(const QPointF& coordinate) const +{ + double x = (coordinate.x()+180.) * (getTilesWE(current_zoom)*getTileSizeW())/360.; // coord to pixel! + double y = (getMercatorYCoord(coordinate.y())-M_PI) * -1 * (getTilesNS(current_zoom)*getTileSizeH())/(2*M_PI); // coord to pixel! + return QPoint(int(x), int(y)); +} + +QPointF MsBingMapAdapter::displayToCoordinate(const QPoint& point) const +{ + double lon = (point.x()*(360./(getTilesWE(current_zoom)*getTileSizeW())))-180.; + double lat = getMercatorLatitude(point.y()*-1*(2*M_PI/(getTilesWE(current_zoom)*getTileSizeW())) + M_PI); + lat = lat *180./M_PI; + return QPointF(lon, lat); +} + +double MsBingMapAdapter::getMercatorLatitude(double YCoord) const +{ + // http://welcome.warnercnr.colostate.edu/class_info/nr502/lg4/projection_mathematics/converting.html + if (YCoord > M_PI) return 9999.; + if (YCoord < -M_PI) return -9999.; + + double t = atan(exp(YCoord)); + double res = (2.*(t))-(M_PI/2.); + return res; +} + +double MsBingMapAdapter::getMercatorYCoord(double lati) const +{ + double lat = lati; + + // conversion degre=>radians + double phi = M_PI * lat / 180; + + double res; + //double temp = Math.Tan(Math.PI / 4 - phi / 2); + //res = Math.Log(temp); + res = 0.5 * log((1 + sin(phi)) / (1 - sin(phi))); + + return res; +} + +void MsBingMapAdapter::zoom_in() +{ + if (min_zoom > max_zoom) + current_zoom = current_zoom > max_zoom ? current_zoom-1 : max_zoom; + else if (min_zoom < max_zoom) + current_zoom = current_zoom < max_zoom ? current_zoom+1 : max_zoom; +} + +void MsBingMapAdapter::zoom_out() +{ + if (min_zoom > max_zoom) + current_zoom = current_zoom < min_zoom ? current_zoom+1 : min_zoom; + else if (min_zoom < max_zoom) + current_zoom = current_zoom > min_zoom ? current_zoom-1 : min_zoom; +} + +bool MsBingMapAdapter::isValid(int x, int y, int z) const +{ + if ((x>=0 && x < getTilesWE(current_zoom)) && (y>=0 && y < getTilesNS(current_zoom)) && z>=0) + { + return true; + } + return false; +} + +QRectF MsBingMapAdapter::getBoundingbox() const +{ + return QRectF(QPointF(-20037508.34, -20037508.34), QPointF(20037508.34, 20037508.34)); +} + +int MsBingMapAdapter::getTilesWE(int zoomlevel) const +{ + return int(pow(2, zoomlevel+1.0)); +} + +int MsBingMapAdapter::getTilesNS(int zoomlevel) const +{ + return int(pow(2, zoomlevel+1.0)); +} + +QString MsBingMapAdapter::getQuery(int i, int j, int z) const +{ + return getQ(-180+i*(360./getTilesWE(current_zoom)), + 90-(j+1)*(180./getTilesNS(current_zoom)), z+1); +} + +QString MsBingMapAdapter::getQ(double longitude, double latitude, int zoom) const +{ + double xmin=-180; + double xmax=180; + double ymin=-90; + double ymax=90; + + double xmoy=0; + double ymoy=0; + QString location=""; + + for (int i = 0; i < zoom; i++) + { + xmoy = (xmax + xmin) / 2; + ymoy = (ymax + ymin) / 2; + if (latitude >= ymoy) //upper part (q or r) + { + ymin = ymoy; + if (longitude < xmoy) + { /*q*/ + location+= "0"; + xmax = xmoy; + } + else + {/*r*/ + location+= "1"; + xmin = xmoy; + } + } + else //lower part (t or s) + { + ymax = ymoy; + if (longitude < xmoy) + { /*t*/ + + location+= "2"; + xmax = xmoy; + } + else + {/*s*/ + location+= "3"; + xmin = xmoy; + } + } + } + return serverPath.arg(location); +} + +int MsBingMapAdapter::getTileSizeW() const +{ + return 256; +} + +int MsBingMapAdapter::getTileSizeH() const +{ + return 256; +} + +QString MsBingMapAdapter::getSourceTag() const +{ + return theSource; +} + +void MsBingMapAdapter::setSourceTag (const QString& value) +{ + theSource = value; +} + +QString MsBingMapAdapter::getLicenseUrl() const +{ + return QString(); +} + +#if !(QT_VERSION >= QT_VERSION_CHECK(5,0,0)) +Q_EXPORT_PLUGIN2(MMsBingMapBackgroundPlugin, MsBingMapAdapterFactory) +#endif + +QString MsBingMapAdapter::getAttributionsHtml(const QRectF &bbox , const QRect &/* screen */) +{ + QStringList providers; + int zoom = qRound(log(360. / bbox.width()) / log(2)); // log2 not available on FreeBSD + qDebug() << "Bing Zoom: " << zoom; + foreach (BingProvider prov, theProviders) { + if (prov.bbox.intersects(bbox)) + if (zoom >= prov.zoomMin && zoom <= prov.zoomMax) + providers << prov.name; + } + + return QString("<div style=\"color:silver; font-size:9px\">%1</div>").arg(providers.join(" ")); +} + +QString MsBingMapAdapter::getLogoHtml() +{ + return QString("<center><a href=\"http://www.bing.com/maps/\"><img src=\":/images/bing_logo.png\"/></a><br/><a href=\"http://opengeodata.org/microsoft-imagery-details\" style=\"color:silver; font-size:9px\">%1</a></center>").arg(tr("Terms of Use")); +} + +int MsBingMapAdapter::getMinZoom(const QRectF &/* bbox */) const +{ + return min_zoom; +} + +int MsBingMapAdapter::getMaxZoom(const QRectF &/* bbox */) const +{ + return max_zoom; +} + +int MsBingMapAdapter::getAdaptedMinZoom(const QRectF &/* bbox */) const +{ + return 0; +} + +int MsBingMapAdapter::getAdaptedMaxZoom(const QRectF &/* bbox */) const +{ + return max_zoom > min_zoom ? max_zoom - min_zoom : min_zoom - max_zoom; +} + +int MsBingMapAdapter::getZoom() const +{ + return current_zoom; +} + +int MsBingMapAdapter::getAdaptedZoom() const +{ + return max_zoom < min_zoom ? min_zoom - current_zoom : current_zoom - min_zoom; +} + +IImageManager* MsBingMapAdapter::getImageManager() +{ + return theImageManager; +} + +void MsBingMapAdapter::setImageManager(IImageManager* anImageManager) +{ + theImageManager = anImageManager; + + QNetworkAccessManager* manager = theImageManager->getNetworkManager(); + connect(manager, SIGNAL(finished(QNetworkReply*)), SLOT(on_adapterDataFinished(QNetworkReply*))); + + manager->get(QNetworkRequest(QUrl("http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/0,0?zl=1&mapVersion=v1&key=AlRQe0E4ha3yKkz2MuNI-G1AIk-CIym4zTeqaTgKVWz_LBsnQuPksHrHCOT0381M&include=ImageryProviders&output=xml"))); +} + +void MsBingMapAdapter::on_adapterDataFinished(QNetworkReply* reply) +{ +// int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + if (reply->error() != QNetworkReply::NoError) + if (reply->error() != QNetworkReply::OperationCanceledError) + return; + + QDomDocument theDoc; + theDoc.setContent(reply->readAll()); + + QDomNodeList hostEl = theDoc.elementsByTagName("ImageUrl"); + if (hostEl.size()) { + QUrl u(hostEl.at(0).toElement().text()); + host = u.host(); + } + + QString curProvider; + QDomNodeList providers = theDoc.elementsByTagName("ImageryProvider"); + for (int i=0; i<providers.size(); ++i) { + QDomNode nd = providers.at(i); + QDomElement provider = nd.firstChildElement("Attribution"); + if (!provider.isNull()) + curProvider = provider.text(); + QDomNodeList coverages = nd.toElement().elementsByTagName("CoverageArea"); + for (int j=0; j<coverages.size(); ++j) { + QDomNode cover = coverages.at(j); + BingProvider prov; + prov.name = curProvider; + prov.zoomMin = cover.firstChildElement("ZoomMin").text().toInt(); + prov.zoomMax = cover.firstChildElement("ZoomMax").text().toInt(); + QDomElement bbox = cover.firstChildElement("BoundingBox"); + prov.bbox.setBottom(bbox.firstChildElement("SouthLatitude").text().toDouble()); + prov.bbox.setLeft(bbox.firstChildElement("WestLongitude").text().toDouble()); + prov.bbox.setTop(bbox.firstChildElement("NorthLatitude").text().toDouble()); + prov.bbox.setRight(bbox.firstChildElement("EastLongitude").text().toDouble()); + + theProviders << prov; + } + } + isLoaded = true; +} diff --git a/plugins/background/MMsBingMapBackground/msbingmapadapter.h b/plugins/background/MMsBingMapBackground/msbingmapadapter.h new file mode 100644 index 0000000..1010141 --- /dev/null +++ b/plugins/background/MMsBingMapBackground/msbingmapadapter.h @@ -0,0 +1,178 @@ +#ifndef MSLIVEMAP_H +#define MSLIVEMAP_H + +#include "mapadapter.h" +#include "IMapAdapterFactory.h" +#include "IMapWatermark.h" + +struct BingProvider +{ + QString name; + int zoomMin; + int zoomMax; + QRectF bbox; +}; + +//! MapAdapter for Ms Bing Maps +/*! + * This is a conveniece class, which extends and configures a TileMapAdapter + * @author Kai Winter <kaiwinter@gmx.de> +*/ +class MsBingMapAdapter : public MapAdapter, public IMapWatermark +{ + Q_OBJECT + Q_INTERFACES(IMapAdapter IMapWatermark) + +public: + //! constructor + /*! + * This construct a Google Adapter + */ + MsBingMapAdapter(); + virtual ~MsBingMapAdapter(); + + virtual QPoint coordinateToDisplay(const QPointF&) const; + virtual QPointF displayToCoordinate(const QPoint&) const; + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const; + + //! returns the name of this MapAdapter + /*! + * @return the name of this MapAdapter + */ + virtual QString getName () const; + + //! returns the type of this MapAdapter + /*! + * @return the type of this MapAdapter + */ + virtual IMapAdapter::Type getType () const; + + //! returns the host of this MapAdapter + /*! + * @return the host of this MapAdapter + */ + QString getHost () const; + + //! returns the size of the tiles + /*! + * @return the size of the tiles + */ + virtual int getTileSizeW () const; + virtual int getTileSizeH () const; + + //! returns the min zoom value + /*! + * @return the min zoom value + */ + virtual int getMinZoom (const QRectF &bbox) const; + + //! returns the max zoom value + /*! + * @return the max zoom value + */ + virtual int getMaxZoom (const QRectF &bbox) const; + + //! returns the current zoom + /*! + * @return the current zoom + */ + virtual int getZoom () const; + + //! returns the source tag to be applied when drawing over this map + /*! + * @return the source tag + */ + virtual QString getSourceTag() const; + virtual void setSourceTag (const QString& value); + + //! returns the Url of the usage license + /*! + * @return the Url of the usage license + */ + virtual QString getLicenseUrl() const; + + virtual int getAdaptedZoom() const; + virtual int getAdaptedMinZoom(const QRectF &bbox) const; + virtual int getAdaptedMaxZoom(const QRectF &bbox) const; + + virtual QString getQuery(const QRectF& , const QRectF& , const QRect&) const { return QString(); } + virtual bool isTiled() const { return true; } + + virtual QRectF getBoundingbox() const; + virtual int getTilesWE(int zoom) const; + virtual int getTilesNS(int zoom) const; + + virtual void cleanup() {} + + virtual bool toXML(QXmlStreamWriter& /*stream*/) { return true; } + virtual void fromXML(QXmlStreamReader& /*xParent*/) {} + virtual QString toPropertiesHtml() {return QString();} + + virtual void setSettings(QSettings* aSet) {theSets = aSet;} + + virtual IImageManager* getImageManager(); + virtual void setImageManager(IImageManager* anImageManager); + + //IMapWatermark + virtual QString getAttributionsHtml(const QRectF& bbox, const QRect& screen); + virtual QString getLogoHtml(); + +protected: + virtual void zoom_in(); + virtual void zoom_out(); + virtual QString getQuery(int x, int y, int z) const; + virtual bool isValid(int x, int y, int z) const; + virtual QPixmap getPixmap(const QRectF& /*wgs84Bbox*/, const QRectF& /*projBbox*/, const QRect& /*size*/) const { return QPixmap(); } + virtual QMenu* getMenu() const { return NULL; } + +private: + virtual QString getQ(double longitude, double latitude, int zoom) const; + double getMercatorLatitude(double YCoord) const; + double getMercatorYCoord(double lati) const; + + IImageManager* theImageManager; + int srvNum; + QString theSource; + bool isLoaded; + QList<BingProvider> theProviders; + QSettings* theSets; + +private slots: + void on_adapterDataFinished(QNetworkReply* rply); +}; + +class MsBingMapAdapterFactory : public QObject, public IMapAdapterFactory +{ + Q_OBJECT + Q_INTERFACES(IMapAdapterFactory) +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + Q_PLUGIN_METADATA(IID "be.merkaartor.msbingmapadapter" FILE "msbingmapadapter.json") +#endif + +public: + //! Creates an instance of the actual plugin + /*! + * @return a pointer to the MapAdapter + */ + IMapAdapter* CreateInstance() {return new MsBingMapAdapter(); } + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const; + + //! returns the name of this MapAdapter + /*! + * @return the name of this MapAdapter + */ + virtual QString getName () const; +}; + + +#endif diff --git a/plugins/background/MMsBingMapBackground/msbingmapadapter.json b/plugins/background/MMsBingMapBackground/msbingmapadapter.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/plugins/background/MMsBingMapBackground/msbingmapadapter.json @@ -0,0 +1 @@ +{} diff --git a/plugins/background/MWalkingPapersBackground/MWalkingPapersBackground.pro b/plugins/background/MWalkingPapersBackground/MWalkingPapersBackground.pro new file mode 100644 index 0000000..86b9c6e --- /dev/null +++ b/plugins/background/MWalkingPapersBackground/MWalkingPapersBackground.pro @@ -0,0 +1,26 @@ +include(../../common.pri) +include(../common.pri) + +QT += network +TARGET = $$qtLibraryTarget(MWalkingPapersBackgroundPlugin) +DEPENDPATH += $${MERKAARTOR_SRC_DIR}/interfaces +INCLUDEPATH += $${MERKAARTOR_SRC_DIR}/interfaces +include ($${MERKAARTOR_SRC_DIR}/interfaces/Interfaces.pri) + +HEADERS += \ + WalkingPapersAdapter.h + +SOURCES += \ + WalkingPapersAdapter.cpp + +COMMON_DIR=$${MERKAARTOR_SRC_DIR}/binaries + +win32 { + INCLUDEPATH += $$COMMON_DIR/include + LIBS += -L$$COMMON_DIR/lib +} + +contains(ZBAR, 1) { + DEFINES += USE_ZBAR + LIBS += -lzbar +} diff --git a/plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp b/plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp new file mode 100644 index 0000000..b23e47f --- /dev/null +++ b/plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp @@ -0,0 +1,446 @@ +//*************************************************************** +// CLass: %CLASS% +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com> (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +//****************************************************************** + +#include "WalkingPapersAdapter.h" + +#include <QCoreApplication> +#include <QtPlugin> +#include <QAction> +#include <QFileDialog> +#include <QPainter> +#include <QMessageBox> +#include <QInputDialog> +#include <QTimer> +#include <QImage> + +#include <QNetworkAccessManager> +#include <QNetworkRequest> +#include <QNetworkReply> + +#include <QDebug> + +#include <math.h> + +#ifdef USE_ZBAR +#include <zbar.h> +#include <zbar/QZBarImage.h> +#endif + +// from wikipedia +#define EQUATORIALRADIUS 6378137.0 +#define POLARRADIUS 6356752.0 +#define EQUATORIALMETERCIRCUMFERENCE 40075016.68 +#define EQUATORIALMETERHALFCIRCUMFERENCE 20037508.34 +#define EQUATORIALMETERPERDEGREE 222638.981555556 + +static const QUuid theUid ("{c580b2bc-dd14-40b2-8bb6-241da2a1fdb3}"); +static const QString theName("Walking Papers"); + +QUuid WalkingPapersAdapterFactory::getId() const +{ + return theUid; +} + +QString WalkingPapersAdapterFactory::getName() const +{ + return theName; +} + +/**************/ + + +#define FILTER_OPEN_SUPPORTED \ + tr("Supported formats")+" (*.jpg *.png *.bmp)\n" \ + +tr("All Files (*)") + +double angToRad(double a) +{ + return a*M_PI/180.; +} + +QPointF mercatorProject(const QPointF& c) +{ + double x = angToRad(c.x()) / M_PI * EQUATORIALMETERHALFCIRCUMFERENCE; + double y = log(tan(angToRad(c.y())) + 1/cos(angToRad(c.y()))) / M_PI * (EQUATORIALMETERHALFCIRCUMFERENCE); + + return QPointF(x, y); +} + +WalkingPapersAdapter::WalkingPapersAdapter() + : theImageManager(0) +{ + QAction* loadImage = new QAction(tr("Load image..."), this); + loadImage->setData(theUid.toString()); + connect(loadImage, SIGNAL(triggered()), SLOT(onLoadImage())); + theMenu = new QMenu(); + theMenu->addAction(loadImage); +} + + +WalkingPapersAdapter::~WalkingPapersAdapter() +{ +} + +QUuid WalkingPapersAdapter::getId() const +{ + return theUid; +} + +QString WalkingPapersAdapter::getName() const +{ + return theName; +} + +bool WalkingPapersAdapter::alreadyLoaded(QString fn) const +{ + for (int j=0; j<theImages.size(); ++j) + if (theImages[j].theFilename == fn) + return true; + return false; +} + +void make_grayscale(QImage& in) +{ + if(in.format()!=QImage::Format_Indexed8) + throw "format error"; + QVector<int> transform_table(in.colorCount()); + for(int i=0;i<in.colorCount();i++) + { + QRgb c1=in.color(i); + int avg=qGray(c1); + transform_table[i] = avg; + } + in.setColorCount(256); + for(int i=0;i<256;i++) + in.setColor(i,qRgb(i,i,i)); + for(int i=0;i<in.byteCount();i++) + { + in.bits()[i]=transform_table[in.bits()[i]]; + } +} + +bool WalkingPapersAdapter::getWalkingPapersDetails(const QUrl& reqUrl, QRectF& bbox) const +{ + QNetworkAccessManager* manager = theImageManager->getNetworkManager(); + QEventLoop q; + QTimer tT; + + if (!reqUrl.host().contains("walking-papers.org")) + return false; + + tT.setSingleShot(true); + connect(&tT, SIGNAL(timeout()), &q, SLOT(quit())); + connect(manager, SIGNAL(finished(QNetworkReply*)), + &q, SLOT(quit())); + QNetworkReply *reply = manager->get(QNetworkRequest(reqUrl)); + + tT.start(theSets->value("Network/NetworkTimeout", 5000).toInt()); + q.exec(); + if(tT.isActive()) { + // download complete + tT.stop(); + } else { + QMessageBox::warning(0, tr("Network timeout"), tr("Cannot read the photo's details from the Walking Papers server."), QMessageBox::Ok); + return false; + } + + QString center = QString::fromLatin1(reply->rawHeader("X-Print-Bounds")); + QStringList sl = center.split(" "); + if (sl.size() != 4) + return false; + + QPointF tl(sl[1].toDouble(), sl[0].toDouble()); + QPointF br(sl[3].toDouble(), sl[2].toDouble()); + + qDebug() << tl << "; " << br; + + bbox = QRectF(tl, br); + + return true; +} + +bool WalkingPapersAdapter::askAndgetWalkingPapersDetails(QRectF& bbox) const +{ + bool ok; + QString text = QInputDialog::getText(0, tr("Please specify Walking Papers URL"), + tr("URL:"), QLineEdit::Normal, "", &ok); + if (ok && !text.isEmpty()) { + QUrl url(text); + return getWalkingPapersDetails(url, bbox); + } else + return false; +} + +bool WalkingPapersAdapter::loadImage(const QString& fn, QRectF theBbox, int theRotation) +{ + if (alreadyLoaded(fn)) + return true; + + QImage img(fn); + WalkingPapersImage wimg; + if (theBbox.isNull()) { +#ifdef USE_ZBAR + zbar::QZBarImage image(img); + + // create a reader + zbar::ImageScanner scanner; + + // configure the reader + scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1); + + // scan the image for barcodes + scanner.recycle_image(image); + zbar::Image tmp = image.convert(*(long*)"Y800"); + int n = scanner.scan(tmp); + image.set_symbols(tmp.get_symbols()); + + if (n <= 0) { + qDebug() << "WP scan error: " << n; + if (!askAndgetWalkingPapersDetails(theBbox)) + return false; + } else { + QUrl url; + // extract results + for(zbar::Image::SymbolIterator symbol = image.symbol_begin(); symbol != image.symbol_end(); ++symbol) { + // do something useful with results + qDebug() << "decoded " << QString::fromStdString(symbol->get_type_name()) + << " symbol \"" << QString::fromStdString(symbol->get_data()) << '"'; + qDebug() << "x;y: " << symbol->get_location_x(0) << ", " << symbol->get_location_y(0); + + url = QUrl(QString::fromStdString(symbol->get_data())); + getWalkingPapersDetails(url, theBbox); + + int x = symbol->get_location_x(0); + int y = symbol->get_location_y(0); + QPoint mid = QPoint(img.width()/2, img.height()/2); + if (x < mid.x() || y < mid.y()) { + if (x < mid.x() && y < mid.y()) + theRotation = 180; + else if (x > mid.x() && y < mid.y()) + theRotation = 90; + else if (x < mid.x() && y > mid.y()) + theRotation = -90; + } + } + } + + // clean up + image.set_data(NULL, 0); +#else + if (!askAndgetWalkingPapersDetails(theBbox)) + return false; +#endif + } + if (theRotation) { + QMatrix mat; + mat.rotate(theRotation); + img = img.transformed(mat); + } + wimg.theFilename = fn; + wimg.theImg = QPixmap::fromImage(img); + wimg.theBBox = theBbox; + wimg.rotation = theRotation; + theImages.push_back(wimg); + + theCoordBbox |= theBbox; + + return true; +} + +void WalkingPapersAdapter::onLoadImage() +{ + int fileOk = 0; + + QStringList fileNames = QFileDialog::getOpenFileNames( + NULL, + tr("Open Walking Papers scan"), + "", FILTER_OPEN_SUPPORTED); + if (fileNames.isEmpty()) + return; + + QRectF theBbox = QRectF(); + for (int i=0; i<fileNames.size(); i++) { + if (loadImage(fileNames[i], theBbox)) + ++fileOk; + } + + if (!fileOk) { + QMessageBox::critical(0,QCoreApplication::translate("WalkingPapersBackground","No valid file"),QCoreApplication::translate("WalkingPapersBackground","Cannot load file.")); + } else { + emit forceProjection(); + emit forceZoom(); + emit forceRefresh(); + } + + return; +} + +QString WalkingPapersAdapter::getHost() const +{ + return QString(); +} + +IMapAdapter::Type WalkingPapersAdapter::getType() const +{ + return IMapAdapter::DirectBackground; +} + +QMenu* WalkingPapersAdapter::getMenu() const +{ + return theMenu; +} + +QRectF WalkingPapersAdapter::getBoundingbox() const +{ + QRectF projBBox; + projBBox = QRectF(mercatorProject(theCoordBbox.topLeft()), mercatorProject(theCoordBbox.bottomRight())); + return projBBox; +} + +QString WalkingPapersAdapter::projection() const +{ + return "EPSG:900913"; +} + +QPixmap WalkingPapersAdapter::getPixmap(const QRectF& wgs84Bbox, const QRectF& /*projBbox*/, const QRect& src) const +{ + QPixmap pix(src.size()); + pix.fill(Qt::transparent); + QPainter p(&pix); + + for (int i=0; i<theImages.size(); ++i) { + QPixmap theImg = theImages[i].theImg; + + double rx = wgs84Bbox.width() / src.width(); + double ry = wgs84Bbox.height() / src.height(); + qDebug() << "rx: " << rx << "; ry: " << ry; + + QSize sz(theImages[i].theBBox.width() / rx, theImages[i].theBBox.height() / ry); + if (sz.isNull()) + return QPixmap(); + + QPoint s((theImages[i].theBBox.bottomLeft().x() - wgs84Bbox.bottomLeft().x()) / rx, (wgs84Bbox.bottomLeft().y() - theImages[i].theBBox.bottomLeft().y()) / ry); + + qDebug() << "Viewport: " << wgs84Bbox; + qDebug() << "Pixmap Origin: " << s.x() << "," << s.y(); + qDebug() << "Pixmap size: " << sz.width() << "," << sz.height(); + + double rtx = theImg.width() / (double)sz.width(); + double rty = theImg.height() / (double)sz.height(); + + QRect mRect = QRect(s, sz); + QRect iRect = theImg.rect().intersected(mRect); + QRect sRect = QRect(iRect.topLeft() - mRect.topLeft(), iRect.size()); + QRect fRect = QRect(sRect.x() * rtx, sRect.y() * rty, sRect.width() * rtx, sRect.height() * rty); + + qDebug() << "mrect: " << mRect; + qDebug() << "iRect: " << iRect; + qDebug() << "sRect: " << sRect; + qDebug() << "fRect: " << fRect; + + QPixmap img2 = theImg.copy(fRect).scaled(sRect.size()); + p.drawPixmap(iRect.topLeft(), img2); + } + + p.end(); + return pix; +} + +IImageManager* WalkingPapersAdapter::getImageManager() +{ + return theImageManager; +} + +void WalkingPapersAdapter::setImageManager(IImageManager* anImageManager) +{ + theImageManager = anImageManager; +} + +void WalkingPapersAdapter::cleanup() +{ + theImages.clear(); + theCoordBbox = QRectF(); +} + +bool WalkingPapersAdapter::toXML(QXmlStreamWriter& stream) +{ + bool OK = true; + + stream.writeStartElement("Images"); + for (int i=0; i<theImages.size(); ++i) { + stream.writeStartElement("Image"); + stream.writeAttribute("filename", theImages[i].theFilename); + stream.writeAttribute("top", QString::number(theImages[i].theBBox.top())); + stream.writeAttribute("left", QString::number(theImages[i].theBBox.left())); + stream.writeAttribute("width", QString::number(theImages[i].theBBox.width())); + stream.writeAttribute("height", QString::number(theImages[i].theBBox.height())); + stream.writeAttribute("rotation", QString::number(theImages[i].rotation)); + stream.writeEndElement(); + } + stream.writeEndElement(); + + return OK; +} + +void WalkingPapersAdapter::fromXML(QXmlStreamReader& stream) +{ + theCoordBbox = QRectF(); + theImages.clear(); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Images") { + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Image") { + QString fn = stream.attributes().value("filename").toString(); + if (!fn.isEmpty()) { + double x = stream.attributes().value("left").toString().toDouble(); + double y = stream.attributes().value("top").toString().toDouble(); + double w = stream.attributes().value("width").toString().toDouble(); + double h = stream.attributes().value("height").toString().toDouble(); + int r = stream.attributes().value("rotation").toString().toInt(); + QRectF bbox(x, y, w, h); + loadImage(fn, bbox, r); + } + stream.readNext(); + } else if (!stream.isWhitespace()) { + qDebug() << "wp: logic error: " << stream.name() << " : " << stream.tokenType() << " (" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + stream.readNext(); + } + } else if (!stream.isWhitespace()) { + qDebug() << "wp: logic error: " << stream.name() << " : " << stream.tokenType() << " (" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + stream.readNext(); + } +} + +QString WalkingPapersAdapter::toPropertiesHtml() +{ + QString h; + + QStringList fn; + for (int i=0; i<theImages.size(); ++i) { + fn << QDir::toNativeSeparators(theImages[i].theFilename); + } + h += "<i>" + tr("Filename(s)") + ": </i>" + fn.join("; "); + + return h; +} + + +#if !(QT_VERSION >= QT_VERSION_CHECK(5,0,0)) +Q_EXPORT_PLUGIN2(MWalkingPapersBackgroundPlugin, WalkingPapersAdapterFactory) +#endif diff --git a/plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.h b/plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.h new file mode 100644 index 0000000..6ff198b --- /dev/null +++ b/plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.h @@ -0,0 +1,182 @@ +//*************************************************************** +// CLass: %CLASS% +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com> (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +//****************************************************************** + +#ifndef WALKINGPAPERSADAPTER_H +#define WALKINGPAPERSADAPTER_H + +#include "IMapAdapterFactory.h" +#include "IMapAdapter.h" +#include "IImageManager.h" + +#include <QLocale> + +class WalkingPapersImage +{ +public: + QString theFilename; + QPixmap theImg; + QRectF theBBox; + int rotation; +}; + + +class WalkingPapersAdapter : public IMapAdapter +{ + Q_OBJECT + Q_INTERFACES(IMapAdapter) + +public: + WalkingPapersAdapter(); + virtual ~WalkingPapersAdapter(); + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const; + + //! returns the type of this MapAdapter + /*! + * @return the type of this MapAdapter + */ + virtual IMapAdapter::Type getType () const; + + //! returns the name of this MapAdapter + /*! + * @return the name of this MapAdapter + */ + virtual QString getName () const; + + //! returns the host of this MapAdapter + /*! + * @return the host of this MapAdapter + */ + virtual QString getHost () const; + + //! returns the size of the tiles + /*! + * @return the size of the tiles + */ + virtual int getTileSizeW () const { return -1; } + virtual int getTileSizeH () const { return -1; } + + //! returns the min zoom value + /*! + * @return the min zoom value + */ + virtual int getMinZoom (const QRectF &) const { return -1; } + + //! returns the max zoom value + /*! + * @return the max zoom value + */ + virtual int getMaxZoom (const QRectF &) const { return -1; } + + //! returns the current zoom + /*! + * @return the current zoom + */ + virtual int getZoom () const { return -1; } + + //! returns the source tag to be applied when drawing over this map + /*! + * @return the source tag + */ + virtual QString getSourceTag () const { return QString(); } + virtual void setSourceTag (const QString& ) {}; + + //! returns the Url of the usage license + /*! + * @return the Url of the usage license + */ + virtual QString getLicenseUrl() const {return QString();} + + virtual int getAdaptedZoom() const { return -1; } + virtual int getAdaptedMinZoom(const QRectF &) const { return -1; } + virtual int getAdaptedMaxZoom(const QRectF &) const { return -1; } + + virtual void zoom_in() {} + virtual void zoom_out() {} + + virtual bool isValid(int, int, int) const { return true; } + virtual QString getQuery(int, int, int) const { return QString(); } + virtual QString getQuery(const QRectF& , const QRectF& , const QRect& ) const { return QString(); } + virtual QPixmap getPixmap(const QRectF& wgs84Bbox, const QRectF& projBbox, const QRect& size) const ; + + virtual QString projection() const; + virtual QRectF getBoundingbox() const; + + virtual bool isTiled() const { return false; } + virtual int getTilesWE(int) const { return -1; } + virtual int getTilesNS(int) const { return -1; } + + virtual QMenu* getMenu() const; + + virtual IImageManager* getImageManager(); + virtual void setImageManager(IImageManager* anImageManager); + + virtual void cleanup(); + + virtual bool toXML(QXmlStreamWriter& stream); + virtual void fromXML(QXmlStreamReader& stream); + virtual QString toPropertiesHtml(); + + virtual void setSettings(QSettings* aSet) {theSets = aSet;} + +public slots: + void onLoadImage(); + bool loadImage(const QString& fn, QRectF theBbox, int theRotation=0); + +protected: + bool alreadyLoaded(QString fn) const; + bool getWalkingPapersDetails(const QUrl& reqUrl, QRectF& bbox) const; + bool askAndgetWalkingPapersDetails(QRectF& bbox) const; + +private: + QMenu* theMenu; + + IImageManager* theImageManager; + QRectF theCoordBbox; + QList<WalkingPapersImage> theImages; + QSettings* theSets; +}; + + +class WalkingPapersAdapterFactory : public QObject, public IMapAdapterFactory +{ + Q_OBJECT + Q_INTERFACES(IMapAdapterFactory) +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + Q_PLUGIN_METADATA(IID "be.merkaartor.walkingpapersadapter" FILE "WalkingPapersAdapter.json") +#endif + +public: + //! Creates an instance of the actual plugin + /*! + * @return a pointer to the MapAdapter + */ + IMapAdapter* CreateInstance() {return new WalkingPapersAdapter(); } + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const; + + //! returns the name of this MapAdapter + /*! + * @return the name of this MapAdapter + */ + virtual QString getName () const; +}; + +#endif // WALKINGPAPERSADAPTER_H diff --git a/plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.json b/plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.json new file mode 100644 index 0000000..e69de29 diff --git a/plugins/background/background.pro b/plugins/background/background.pro new file mode 100644 index 0000000..b39d24c --- /dev/null +++ b/plugins/background/background.pro @@ -0,0 +1,19 @@ +TEMPLATE = subdirs + +CONFIG += debug_and_release + +#Qt Version +QT_VERSION = $$[QT_VERSION] +QT_VERSION = $$split(QT_VERSION, ".") +QT_VER_MAJ = $$member(QT_VERSION, 0) +QT_VER_MIN = $$member(QT_VERSION, 1) + +!symbian { + SUBDIRS += \ +# MCadastreFranceBackground \ + MMsBingMapBackground \ + MWalkingPapersBackground \ + MGeoTiffBackground \ + MGdalBackground + +} diff --git a/plugins/background/common.pri b/plugins/background/common.pri new file mode 100644 index 0000000..684bbe1 --- /dev/null +++ b/plugins/background/common.pri @@ -0,0 +1,9 @@ +OUTPUT_DIR = $$OUT_PWD/../../../binaries +DESTDIR = $$OUTPUT_DIR/bin/plugins/background + +macx { + target.path = $${PREFIX}/merkaartor.app/Contents/plugins/background +} +unix:!macx { + target.path = $${LIBDIR}/merkaartor/plugins/background +} diff --git a/plugins/common.pri b/plugins/common.pri new file mode 100644 index 0000000..800dbc0 --- /dev/null +++ b/plugins/common.pri @@ -0,0 +1,68 @@ +# PREFIX - base prefix for installation (default: /usr/local) +# LIBDIR - base directory for plugins (default: $$PREFIX/lib) +# NODEBUG - no debug target + +#Qt Version +QT_VERSION = $$[QT_VERSION] +QT_VERSION = $$split(QT_VERSION, ".") +QT_VER_MAJ = $$member(QT_VERSION, 0) +QT_VER_MIN = $$member(QT_VERSION, 1) + +MERKAARTOR_SRC_DIR = $$PWD/.. + +CONFIG += debug_and_release +# avoid deprecation warnings which 5.15 introduced. +DEFINES += QT_NO_DEPRECATED_WARNINGS + +#Static config +include ($$MERKAARTOR_SRC_DIR/src/Config.pri) + +DEFINES += VERSION=\"\\\"$$VERSION\\\"\" +#DEFINES += REVISION=\"\\\"$$REVISION\\\"\" + +# Drop the version for now. If it contains anything else than numbers split by +# dots, the qt stuff generates invalid *.rc files for plugins. +VERSION="" + +win32-msvc* { + DEFINES += _USE_MATH_DEFINES +} + +TEMPLATE = lib +CONFIG += plugin + +QT += core xml network widgets + +OUTPUT_DIR = $$OUT_PWD/../binaries +UI_DIR += tmp +MOC_DIR += tmp +RCC_DIR += tmp +DESTDIR = $$OUTPUT_DIR/bin/plugins + +DEPENDPATH += $${MERKAARTOR_SRC_DIR}/interfaces $${MERKAARTOR_SRC_DIR}/src/Utils +INCLUDEPATH += $${MERKAARTOR_SRC_DIR}/interfaces $${MERKAARTOR_SRC_DIR}/src/Utils +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/include +LIBS += -L$$OUTPUT_DIR + +VPATH=$$INCLUDEPATH + +macx { + # Prefix: base instalation directory + PREFIX = /Applications + LIBDIR = $${PREFIX}/lib${LIB_SUFFIX} + target.path = $${PREFIX}/merkaartor.app/Contents/plugins + INSTALLS += target +} + +unix:!macx { + # Prefix: base instalation directory + isEmpty( PREFIX ) { + PREFIX = /usr/local + } + isEmpty( LIBDIR ) { + LIBDIR = $${PREFIX}/lib${LIB_SUFFIX} + } + + target.path = $${LIBDIR}/merkaartor/plugins + INSTALLS += target +} diff --git a/plugins/plugins.cmake b/plugins/plugins.cmake new file mode 100644 index 0000000..18d2d97 --- /dev/null +++ b/plugins/plugins.cmake @@ -0,0 +1,69 @@ + +if (APPLE) +set(PLUGINS_INSTALL_POSTFIX "merkaartor.app/Contents/plugins") +else() +set(PLUGINS_INSTALL_POSTFIX "lib/merkaartor/plugins") +endif() + +function(MerkaartorAddPlugin) + # Parse the arguments using CMake built-in function + cmake_parse_arguments(PARSE_ARGV 0 PLUGIN "" "NAME;DESTINATION" "SOURCES") + + # Note: Adding IMapAdapter hints AUTOMOC to run the moc on there and include the qt metaclass in the library. + # This appears to be only necessary on windows, due to linker differences. + add_library(${PLUGIN_NAME} SHARED ${PLUGIN_SOURCES} ${PROJECT_SOURCE_DIR}/interfaces/IMapAdapter.h) + target_compile_options(${PLUGIN_NAME} PRIVATE ${COMPILE_OPTIONS}) + target_compile_definitions(${PLUGIN_NAME} PRIVATE NO_PREFS) + target_include_directories(${PLUGIN_NAME} PRIVATE + ${PKGCONFIG_DEPS_INCLUDE_DIRS} + ${PROJECT_SOURCE_DIR}/interfaces + # TODO: The rest of includes are necessary for ProjectionChooser.cpp + # used in MGdalBackground and MGeoTiffBackground. This probably needs + # to be fixed, probably by giving ProjectionChooser an interface? + ${PROJECT_SOURCE_DIR}/src/Utils + ${PROJECT_SOURCE_DIR}/src/Preferences + ${PROJECT_SOURCE_DIR}/src/common + ) + target_link_libraries(${PLUGIN_NAME} Qt5::Svg Qt5::Network Qt5::Xml Qt5::Core Qt5::Gui Qt5::Concurrent Qt5::PrintSupport Qt5::Widgets ${PKGCONFIG_DEPS_LIBRARIES} ) + install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION ${PLUGINS_INSTALL_POSTFIX}/${PLUGIN_DESTINATION}) +endfunction() + +add_definitions("-DPLUGINS_DIR=${CMAKE_INSTALL_PREFIX}/${PLUGINS_INSTALL_POSTFIX}") + +MerkaartorAddPlugin(NAME MGdalBackgroundPlugin DESTINATION background SOURCES + ${PROJECT_SOURCE_DIR}/plugins/background/MGdalBackground/GdalAdapter.cpp + ${PROJECT_SOURCE_DIR}/src/Utils/ProjectionChooser.cpp + #${PROJECT_SOURCE_DIR}/plugins/background/MGdalBackground/GdalAdapter.json +) + +MerkaartorAddPlugin(NAME MGeoTiffBackgroundPlugin DESTINATION background SOURCES + ${PROJECT_SOURCE_DIR}/plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp + ${PROJECT_SOURCE_DIR}/src/Utils/ProjectionChooser.cpp + #${PROJECT_SOURCE_DIR}/plugins/background/MGeoTiffBackground/GeoTiffAdapter.json +) + +MerkaartorAddPlugin(NAME MMsBingMapBackgroundPlugin DESTINATION background SOURCES + ${PROJECT_SOURCE_DIR}/plugins/background/MMsBingMapBackground/Resources.qrc + ${PROJECT_SOURCE_DIR}/plugins/background/MMsBingMapBackground/msbingmapadapter.cpp + ${PROJECT_SOURCE_DIR}/plugins/background/MMsBingMapBackground/mapadapter.cpp +) + +# Plugin not maintained for a long time. +# MerkaartorAddPlugin(NAME MCadastreFranceBackgroundPlugin DESTINATION background SOURCES +# ${PROJECT_SOURCE_DIR}/plugins/background/MCadastreFranceBackground/qadastre +# ${PROJECT_SOURCE_DIR}/plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp +# ${PROJECT_SOURCE_DIR}/plugins/background/MCadastreFranceBackground/qadastre/COPYING.txt +# ${PROJECT_SOURCE_DIR}/plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui +# ${PROJECT_SOURCE_DIR}/plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp +# ${PROJECT_SOURCE_DIR}/plugins/background/MCadastreFranceBackground/qadastre/tile.cpp +# ${PROJECT_SOURCE_DIR}/plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui +# ${PROJECT_SOURCE_DIR}/plugins/background/MCadastreFranceBackground/qadastre/city.cpp +# ${PROJECT_SOURCE_DIR}/plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.cpp +# ${PROJECT_SOURCE_DIR}/plugins/background/MCadastreFranceBackground/qadastre/main.cpp +# ${PROJECT_SOURCE_DIR}/plugins/background/MCadastreFranceBackground/CadastreFrance.cpp +# ) + +MerkaartorAddPlugin(NAME MWalkingPapersBackgroundPlugin DESTINATION background SOURCES + #${PROJECT_SOURCE_DIR}/plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.json + ${PROJECT_SOURCE_DIR}/plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp +) diff --git a/plugins/plugins.pro b/plugins/plugins.pro new file mode 100644 index 0000000..43184e4 --- /dev/null +++ b/plugins/plugins.pro @@ -0,0 +1,6 @@ +TEMPLATE = subdirs + +CONFIG += debug_and_release + +SUBDIRS += background +# qtstyle diff --git a/share/BookmarksList.xml b/share/BookmarksList.xml new file mode 100644 index 0000000..444826d --- /dev/null +++ b/share/BookmarksList.xml @@ -0,0 +1,5 @@ +<?xml version="1.0"?> +<MerkaartorList > + <Bookmarks version="1.0" creator="SVN" > + </Bookmarks> +</MerkaartorList> diff --git a/share/Projections.xml b/share/Projections.xml new file mode 100644 index 0000000..648d21c --- /dev/null +++ b/share/Projections.xml @@ -0,0 +1,11 @@ +<?xml version="1.0"?> +<MerkaartorList> + <Projections creator="Merkaartor 0.18.2" > + <Projection name="Mercator (EPSG:3785)" >+proj=merc +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +ellps=WGS84 +datum=WGS84 +no_defs</Projection> + <Projection name="Mercator (epsg:3785)" deleted="true" >+proj=merc +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +ellps=WGS84 +datum=WGS84 +no_defs</Projection> + <Projection name="EPSG:4326" deleted="true" >+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +to_meter=0.017453292519943295769236907684886</Projection> + <Projection name="Latitude/Longitude (EPSG:4326)" >+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +to_meter=0.017453292519943295769236907684886</Projection> + <Projection name="OSGB36 (EPSG:27700)">+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.999601 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +no_defs</Projection> + <Projection name="S-JTSK CZ">+proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813972222222 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +pm=greenwich +units=m +no_defs +towgs84=570.8,85.7,462.8,4.998,1.587,5.261,3.56</Projection> + </Projections> +</MerkaartorList> diff --git a/share/TmsServersList.xml b/share/TmsServersList.xml new file mode 100644 index 0000000..1a0c00e --- /dev/null +++ b/share/TmsServersList.xml @@ -0,0 +1,6 @@ +<?xml version="1.0"?> +<MerkaartorList> + <TmsServers creator="Merkaartor v0.18.2.64"> + <TmsServer minzoom="0" maxzoom="17" path="/%1/%2/%3.png" projection="EPSG:900913" address="http://tile.openstreetmap.org" name="OSM.org Mapnik" tilesize="256"/> + </TmsServers> +</MerkaartorList> diff --git a/share/WmsServersList.xml b/share/WmsServersList.xml new file mode 100644 index 0000000..04dfed8 --- /dev/null +++ b/share/WmsServersList.xml @@ -0,0 +1,7 @@ +<?xml version="1.0"?> +<MerkaartorList> + <WmsServers creator="Merkaartor v0.18.2.64"> + <WmsServer styles=",,,,,,,,,,,,,,,,,,," layers="Bathymetry,Countries,Topography,Hillshading,Builtup areas,Coastlines,Waterbodies,Inundated,Rivers,Streams,Railroads,Highways,Roads,Trails,Borders,Cities,Settlements,Spot elevations,Airports,Ocean features" projections="EPSG:4326" format="image/png" path="/wms/wms.asp?wms=WorldMap&&VERSION=1.1.1&SERVICE=WMS&LAYERS=Bathymetry,Countries,Topography,Hillshading,Builtup areas,Coastlines,Waterbodies,Inundated,Rivers,Streams,Railroads,Highways,Roads,Trails,Borders,Cities,Settlements,Spot elevations,Airports,Ocean features&SRS=EPSG:4326&STYLES=,,,,,,,,,,,,,,,,,,,&FORMAT=image/png" address="www2.demis.nl" name="[World] Demis"/> + <WmsServer styles=",," layers="spot,landsat,irs" projections="EPSG:3785" format="image/jpeg" path="/?layers=landsat& &VERSION=1.1.1&SERVICE=WMS&LAYERS=spot,landsat,irs&SRS=EPSG:3785&STYLES=,,&FORMAT=image/jpeg" address="irs.gis-lab.info" name="[World] GIS-LAB.info tWMS service"/> + </WmsServers> +</MerkaartorList> diff --git a/share/share.qrc b/share/share.qrc new file mode 100644 index 0000000..d949b8b --- /dev/null +++ b/share/share.qrc @@ -0,0 +1,9 @@ +<RCC> + <qresource prefix="/"> + <file alias="Projections.xml">Projections.xml</file> + <file alias="WmsServersList.xml">WmsServersList.xml</file> + <file alias="TmsServersList.xml">TmsServersList.xml</file> + <file alias="BookmarksList.xml">BookmarksList.xml</file> + </qresource> +</RCC> + diff --git a/src/Backend/Backend.pri b/src/Backend/Backend.pri new file mode 100644 index 0000000..f8bce4e --- /dev/null +++ b/src/Backend/Backend.pri @@ -0,0 +1,8 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/Backend +DEPENDPATH += $$MERKAARTOR_SRC_DIR/Backend + +HEADERS += \ + MemoryBackend.h + +SOURCES += \ + MemoryBackend.cpp diff --git a/src/Backend/MemoryBackend.cpp b/src/Backend/MemoryBackend.cpp new file mode 100644 index 0000000..107e637 --- /dev/null +++ b/src/Backend/MemoryBackend.cpp @@ -0,0 +1,395 @@ +#include "MemoryBackend.h" +#include "RTree.h" + +#include <QReadWriteLock> + +RenderPriority NodePri(RenderPriority::IsSingular,0., 0); +RenderPriority SegmentPri(RenderPriority::IsLinear,0.,99); + +typedef RTree<Feature*, qreal, 2, qreal, 32> CoordTree; + +class MemoryBackendPrivate +{ +public: + + /* If locked, deletes are delayed. */ + QReadWriteLock delayedDeletesLock; + + /* Protects the toBeDeleted */ + QMutex toBeDeletedLock; + QList<Feature*> toBeDeleted; + + QHash<Feature*, CoordBox> AllocFeatures; + QHash<ILayer*, CoordTree*> theRTree; + QList<Feature*> findResult; +}; + +bool indexFindCallbackList(Feature* F, void* ctxt) +{ + ((QList<Feature*>*)(ctxt))->append(F); + return true; +} + +bool indexFindCallback(Feature* F, void* ctxt) +{ + IndexFindContext* pCtxt = (IndexFindContext*)ctxt; + + if (!F->isVisible()) + return true; + + if (CHECK_WAY(F)) { + Way * R = STATIC_CAST_WAY(F); + if (pCtxt->theFeatures->value(R->renderPriority()).contains(F)) + return true; + R->buildPath(*(pCtxt->theProjection)); + if (M_PREFS->getTrackPointsVisible()) { + for (int i=0; i<R->size(); ++i) { + if (pCtxt->bbox.contains(R->getNode(i)->boundingBox())) + if (!pCtxt->theFeatures->value(NodePri).contains(R->getNode(i))) + (*(pCtxt->theFeatures))[NodePri].insert(R->getNode(i)); + } + } + (*(pCtxt->theFeatures))[R->renderPriority()].insert(F); + } else + if (CHECK_RELATION(F)) { + Relation * RR = STATIC_CAST_RELATION(F); + if (pCtxt->theFeatures->value(RR->renderPriority()).contains(F)) + return true; + RR->buildPath(*(pCtxt->theProjection)); + (*(pCtxt->theFeatures))[RR->renderPriority()].insert(F); + } else + if (CHECK_NODE(F)) { + if (pCtxt->theFeatures->value(NodePri).contains(F)) + return true; + if (!(F->isVirtual() && !M_PREFS->getVirtualNodesVisible())) { + Node * N = STATIC_CAST_NODE(F); + N->buildPath(*(pCtxt->theProjection)); + (*(pCtxt->theFeatures))[NodePri].insert(F); + } + } else { + if (pCtxt->theFeatures->value(SegmentPri).contains(F)) + return true; + (*(pCtxt->theFeatures))[SegmentPri].insert(F); + } + + return true; +} + +void MemoryBackend::indexAdd(ILayer* l, const QRectF& bb, Feature* aFeat) +{ + if (!l) + return; + if (!p->theRTree.contains(l)) + p->theRTree[l] = new CoordTree(); + + p->AllocFeatures[aFeat] = bb; + qreal min[] = {bb.bottomLeft().x(), bb.bottomLeft().y()}; + qreal max[] = {bb.topRight().x(), bb.topRight().y()}; + p->theRTree[l]->Insert(min, max, aFeat); +} + +void MemoryBackend::indexRemove(ILayer* l, const QRectF& bb, Feature* aFeat) +{ + if (!l) + return; + if (!p->theRTree.contains(l)) + return; + + qreal min[] = {bb.bottomLeft().x(), bb.bottomLeft().y()}; + qreal max[] = {bb.topRight().x(), bb.topRight().y()}; + p->theRTree[l]->Remove(min, max, aFeat); +} + +const QList<Feature*>& MemoryBackend::indexFind(ILayer* l, const QRectF& bb) +{ + p->findResult.clear(); + if (p->theRTree.contains(l)) { + qreal min[] = {bb.bottomLeft().x(), bb.bottomLeft().y()}; + qreal max[] = {bb.topRight().x(), bb.topRight().y()}; + p->theRTree[l]->Search(min, max, &indexFindCallbackList, (void*)&p->findResult); + } + + return p->findResult; +} + +void MemoryBackend::indexFind(ILayer* l, const QRectF& bb, const IndexFindContext& ctxt) +{ + if (!p->theRTree.contains(l)) + return; + qreal min[] = {bb.bottomLeft().x(), bb.bottomLeft().y()}; + qreal max[] = {bb.topRight().x(), bb.topRight().y()}; + p->theRTree[l]->Search(min, max, &indexFindCallback, (void*)&ctxt); +} + + +void MemoryBackend::get(ILayer* l, const QRectF& bb, QList<Feature*>& theFeatures) +{ + if (!p->theRTree.contains(l)) + return; + qreal min[] = {bb.bottomLeft().x(), bb.bottomLeft().y()}; + qreal max[] = {bb.topRight().x(), bb.topRight().y()}; + p->theRTree[l]->Search(min, max, &indexFindCallback, (void*)(&theFeatures)); +} + +void MemoryBackend::getFeatureSet(ILayer* l, QMap<RenderPriority, QSet <Feature*> >& theFeatures, + const QList<CoordBox>& invalidRects, Projection& theProjection) +{ + IndexFindContext ctxt; + ctxt.theFeatures = &theFeatures; + ctxt.theProjection = &theProjection; + + for (int i=0; i < invalidRects.size(); ++i) { + ctxt.bbox = invalidRects[i]; + indexFind(l, invalidRects[i], ctxt); + } +} + +void MemoryBackend::getFeatureSet(ILayer* l, QMap<RenderPriority, QSet <Feature*> >& theFeatures, + const CoordBox& invalidRect, Projection& theProjection) +{ + IndexFindContext ctxt; + ctxt.theFeatures = &theFeatures; + ctxt.theProjection = &theProjection; + + ctxt.bbox = invalidRect; + indexFind(l, invalidRect, ctxt); +} + + +/******************************/ + +MemoryBackend::MemoryBackend() +{ + p = new MemoryBackendPrivate; +} + +MemoryBackend::~MemoryBackend() +{ +// CoordTree::Iterator it; +// p->theRTree.GetFirst(it); +// while (!p->theRTree.IsNull(it)) { +// delete *it; +// p->theRTree.GetNext(it); +// } + + QHash<Feature *, CoordBox>::const_iterator i = p->AllocFeatures.constBegin(); + while (i != p->AllocFeatures.constEnd()) { + delete i.key(); + ++i; + } + + delete p; +} + +Node * MemoryBackend::allocNode(ILayer* l, const Node& other) +{ + Node* f; + f = new (std::nothrow) Node(other); + if (!f) + return NULL; + + p->AllocFeatures[f] = f->BBox; + if (!f->BBox.isNull()) { + indexAdd(l, f->BBox, f); + } + return f; +} + +Node * MemoryBackend::allocNode(ILayer* l, const QPointF& aCoord) +{ + Node* f; + f = new (std::nothrow) Node(aCoord); + if (!f) + return NULL; + + p->AllocFeatures[f] = f->BBox; + if (!f->BBox.isNull()) { + indexAdd(l, f->BBox, f); + } + return f; +} + +TrackNode * MemoryBackend::allocTrackNode(ILayer* l, const QPointF& aCoord) +{ + TrackNode* f; + f = new (std::nothrow) TrackNode(aCoord); + if (!f) + return NULL; + + p->AllocFeatures[f] = f->BBox; + if (!f->BBox.isNull()) { + indexAdd(l, f->BBox, f); + } + return f; +} + +PhotoNode * MemoryBackend::allocPhotoNode(ILayer* l, const QPointF& aCoord) +{ + PhotoNode* f; + f = new (std::nothrow) PhotoNode(aCoord); + if (!f) + return NULL; + + p->AllocFeatures[f] = f->BBox; + if (!f->BBox.isNull()) { + indexAdd(l, f->BBox, f); + } + return f; +} + +PhotoNode * MemoryBackend::allocPhotoNode(ILayer* l, const Node& other) +{ + PhotoNode* f; + f = new (std::nothrow) PhotoNode(other); + if (!f) + return NULL; + + p->AllocFeatures[f] = f->BBox; + if (!f->BBox.isNull()) { + indexAdd(l, f->BBox, f); + } + return f; +} + +PhotoNode * MemoryBackend::allocPhotoNode(ILayer* l, const TrackNode& other) +{ + PhotoNode* f; + f = new (std::nothrow) PhotoNode(other); + if (!f) + return NULL; + + p->AllocFeatures[f] = f->BBox; + if (!f->BBox.isNull()) { + indexAdd(l, f->BBox, f); + } + return f; +} + +Node * MemoryBackend::allocVirtualNode(const QPointF& aCoord) +{ + return new (std::nothrow) Node(aCoord); +} + +Way * MemoryBackend::allocWay(ILayer* /*l*/) +{ + Way* f; + f = new (std::nothrow) Way(); + if (!f) + return NULL; + + p->AllocFeatures[f] = CoordBox(); + return f; +} + +Way * MemoryBackend::allocWay(ILayer* /*l*/, const Way& other) +{ + Way* f; + f = new (std::nothrow) Way(other); + if (!f) + return NULL; + + p->AllocFeatures[f] = CoordBox(); + return f; +} + +Relation * MemoryBackend::allocRelation(ILayer* /*l*/) +{ + Relation* f; + f = new (std::nothrow) Relation(); + if (!f) + return NULL; + + p->AllocFeatures[f] = CoordBox(); + return f; +} + +Relation * MemoryBackend::allocRelation(ILayer* /*l*/, const Relation& other) +{ + Relation* f; + f = new (std::nothrow) Relation(other); + if (!f) + return NULL; + + p->AllocFeatures[f] = CoordBox(); + return f; +} + +TrackSegment * MemoryBackend::allocSegment(ILayer* /*l*/) +{ + TrackSegment* f; + f = new (std::nothrow) TrackSegment(); + if (!f) + return NULL; + + p->AllocFeatures[f] = CoordBox(); + return f; +} + +void MemoryBackend::deallocFeature(ILayer* l, Feature *f) +{ + p->delayedDeletesLock.lockForRead(); + p->toBeDeletedLock.lock(); + if (p->AllocFeatures.contains(f)) { + indexRemove(l, p->AllocFeatures[f], f); + if (!p->AllocFeatures.remove(f)) { + qWarning() << "Feature, that is not in a list is being removed."; + } else { + p->toBeDeleted.append(f); + } + } + p->toBeDeletedLock.unlock(); + p->delayedDeletesLock.unlock(); +} + +void MemoryBackend::purge() +{ + if (p->toBeDeleted.empty()) return; /* Don't bother if there is nothing to delete */ + if (!p->delayedDeletesLock.tryLockForWrite()) return; /* If locked, deletes need to be delayed */ + p->toBeDeletedLock.lock(); + QList<Feature*>::iterator it = p->toBeDeleted.begin(); + while (it != p->toBeDeleted.end()) { + delete *(it++); + } + p->toBeDeleted.clear(); + p->toBeDeletedLock.unlock(); + p->delayedDeletesLock.unlock(); +} + +void MemoryBackend::delayDeletes() { + p->delayedDeletesLock.lockForRead(); +} + +void MemoryBackend::resumeDeletes() { + p->delayedDeletesLock.unlock(); + purge(); +} + +void MemoryBackend::deallocVirtualNode(Feature *f) +{ + p->delayedDeletesLock.tryLockForRead(); + p->toBeDeletedLock.lock(); + p->toBeDeleted.append(f); + p->toBeDeletedLock.unlock(); + p->delayedDeletesLock.unlock(); +} + +void MemoryBackend::sync(Feature *f) +{ + if (p->AllocFeatures.contains(f) && !p->AllocFeatures[f].isNull()) + indexRemove(f->layer(), p->AllocFeatures[f], f); + if (CHECK_NODE(f)) { + Node* N = STATIC_CAST_NODE(f); + if (!N->tagSize()) + for (int i=0; i<N->sizeParents(); ++i) + if (CHECK_WAY(N->getParent(i))) + return; + } + if (!f->isDeleted() && f->layer()) { + CoordBox bb = f->boundingBox(); + if (!bb.isNull()) { + indexAdd(f->layer(), bb, f); + } + } +} + + diff --git a/src/Backend/MemoryBackend.h b/src/Backend/MemoryBackend.h new file mode 100644 index 0000000..dc3933d --- /dev/null +++ b/src/Backend/MemoryBackend.h @@ -0,0 +1,61 @@ +#ifndef MEMORYBACKEND_H +#define MEMORYBACKEND_H + +#include "Features.h" + +struct IndexFindContext { + QMap<RenderPriority, QSet <Feature*> >* theFeatures; + QRectF* clipRect; + Projection* theProjection; + QTransform* theTransform; + CoordBox bbox; +}; + +class MemoryBackendPrivate; +class MemoryBackend +{ +public: + MemoryBackend(); + ~MemoryBackend(); + +private: + MemoryBackendPrivate* p; + +public: + virtual Node* allocNode(ILayer* l, const Node& other); + virtual Node* allocNode(ILayer* l, const QPointF& aCoord); + virtual TrackNode* allocTrackNode(ILayer* l, const QPointF& aCoord); + virtual PhotoNode * allocPhotoNode(ILayer* l, const QPointF& aCoord); + virtual PhotoNode * allocPhotoNode(ILayer* l, const Node& other); + virtual PhotoNode * allocPhotoNode(ILayer* l, const TrackNode& other); + virtual Node* allocVirtualNode(const QPointF& aCoord); + + virtual Way* allocWay(ILayer* l); + virtual Way* allocWay(ILayer* l, const Way& other); + + virtual Relation* allocRelation(ILayer* l); + virtual Relation* allocRelation(ILayer* l, const Relation& other); + + virtual TrackSegment* allocSegment(ILayer* l); + + virtual void deallocFeature(ILayer* l, Feature* f); + virtual void deallocVirtualNode(Feature* f); + + virtual void sync(Feature* f); + virtual void purge(); + virtual void delayDeletes(); + virtual void resumeDeletes(); + + virtual const QList<Feature*>& indexFind(ILayer* l, const QRectF& vp); + virtual void indexFind(ILayer* l, const QRectF& bb, const IndexFindContext& findResult); + virtual void get(ILayer* l, const QRectF& bb, QList<Feature*>& theFeatures); + virtual void getFeatureSet(ILayer* l, QMap<RenderPriority, QSet <Feature*> >& theFeatures, + const QList<CoordBox>& invalidRects, Projection& theProjection); + virtual void getFeatureSet(ILayer* l, QMap<RenderPriority, QSet <Feature*> >& theFeatures, + const CoordBox& invalidRect, Projection& theProjection); + virtual void indexAdd(ILayer* l, const QRectF& bb, Feature* aFeat); + virtual void indexRemove(ILayer* l, const QRectF& bb, Feature* aFeat); + +}; + +#endif // MEMORYBACKEND_H diff --git a/src/Commands/Command.cpp b/src/Commands/Command.cpp new file mode 100644 index 0000000..21b0277 --- /dev/null +++ b/src/Commands/Command.cpp @@ -0,0 +1,571 @@ +#include "Command.h" +#include "Document.h" +#include "Layer.h" +#include "Feature.h" +#include "DocumentCommands.h" +#include "WayCommands.h" +#include "TrackSegmentCommands.h" +#include "RelationCommands.h" +#include "NodeCommands.h" +#include "FeatureCommands.h" + +#include <QApplication> +#include <QAction> +#include <QListWidget> +#include <QUuid> +#include <QProgressDialog> + +#include <algorithm> +#include <utility> +#include <QList> + +Command::Command(Feature* aF) + : mainFeature(aF), commandDirtyLevel(0), isUndone(false) +{ + description = QApplication::translate("Command", "No description"); +} + +Command::~Command() +{ +} + +void Command::setId(const QString& id) +{ + Id = id; +} + +const QString& Command::id() const +{ + if (Id.isEmpty()) + Id = QUuid::createUuid().toString(); + return Id; +} + +QString Command::getDescription() +{ + return description; +} + +void Command::setDescription(QString desc) +{ + description = desc; +} + +Feature* Command::getFeature() +{ + return mainFeature; +} + +void Command::setFeature(Feature* feat) +{ + mainFeature = feat; +} + +bool Command::buildUndoList(QListWidget* theListWidget) +{ + QListWidgetItem* it = new QListWidgetItem(getDescription(), theListWidget); + if (getFeature()) + it->setData(Qt::UserRole, QVariant::fromValue(getFeature()->id())); + + return true; +} + +int Command::incDirtyLevel(Layer* aLayer, Feature* F) +{ + F->incDirtyLevel(); + aLayer->incDirtyLevel(); + return ++commandDirtyLevel; +} + +int Command::decDirtyLevel(Layer* aLayer, Feature* F) +{ + F->decDirtyLevel(); + aLayer->decDirtyLevel(); + return commandDirtyLevel; +} + +int Command::getDirtyLevel() +{ + return commandDirtyLevel; +} + +void Command::undo() +{ + if (mainFeature) { + isUndone = true; + mainFeature->notifyChanges(); + } +} + +void Command::redo() +{ + if (mainFeature) { + isUndone = false; + mainFeature->notifyChanges(); + } +} + +bool Command::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + if (mainFeature) { + stream.writeStartElement("Command"); + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("feature", mainFeature->xmlId()); + stream.writeAttribute("oldCreated", oldCreated); + if (isUndone) + stream.writeAttribute("undone", "true"); +// stream.writeAttribute("description", description); + stream.writeEndElement(); + } + + return OK; +} + +void Command::fromXML(Document* d, QXmlStreamReader& stream, Command* C) +{ + Feature* F; + if (!(F = d->getFeature(IFeature::FId(IFeature::All, stream.attributes().value("feature").toString().toLongLong())))) + return; + + C->setId(stream.attributes().value("xml:id").toString()); + if (stream.attributes().hasAttribute("oldCreated")) + C->oldCreated = stream.attributes().value("oldCreated").toString(); + if (stream.attributes().hasAttribute("undone")) + C->isUndone = (stream.attributes().value("undone") == "true" ? true : false); + if (stream.attributes().hasAttribute("description")) + C->description = stream.attributes().value("description").toString(); + C->mainFeature = F; + stream.readNext(); +} + +// COMMANDLIST + +CommandList::CommandList() +: Command(0), Size(0), isReversed(false) +{ +} + +CommandList::CommandList(QString aDesc, Feature* aFeat) +: Command(0), Size(0), isReversed(false) +{ + description = aDesc; + mainFeature = aFeat; +} + +CommandList::~CommandList(void) +{ + qDeleteAll(Subs); +} + +void CommandList::setReversed(bool val) +{ + isReversed = val; +} + +void CommandList::add(Command* aCommand) +{ + Subs.push_back(aCommand); + Size++; +} + +bool CommandList::empty() const +{ + return Size == 0; +} + +int CommandList::size() +{ + return Size; +} + +void CommandList::redo() +{ + if (!isReversed) { + for (int i=0; i<Size; ++i) + Subs[i]->redo(); + } else { + for (int i=Size; i; --i) + Subs[i-1]->undo(); + } +} + +void CommandList::undo() +{ + if (!isReversed) { + for (int i=Size; i; --i) + Subs[i-1]->undo(); + } else { + for (int i=0; i<Size; ++i) + Subs[i]->redo(); + } +} + +bool CommandList::buildDirtyList(DirtyList& theList) +{ + for (int i=0; i<Size;) + { + if (Subs[i]->buildDirtyList(theList)) + { + //delete Subs[i]; + //Subs.erase(Subs.begin()+i); + std::rotate(Subs.begin()+i,Subs.begin()+i+1,Subs.end()); + --Size; + } + else + ++i; + } + + return Size == 0; +} + +bool CommandList::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement("CommandList"); + stream.writeAttribute("xml:id", id()); + if (isReversed) + stream.writeAttribute("reversed", "true"); + stream.writeAttribute("description", description); + if (mainFeature) { + stream.writeAttribute("feature",QString::number(mainFeature->id().numId)); + stream.writeAttribute("featureclass", mainFeature->getClass()); + } + + for (int i=0; i<Size; ++i) { + OK = Subs[i]->toXML(stream); + } + stream.writeEndElement(); + + return OK; +} + +CommandList* CommandList::fromXML(Document* d, QXmlStreamReader& stream) +{ + CommandList* l = new CommandList(); + l->setId(stream.attributes().value("xml:id").toString()); + l->isReversed = (stream.attributes().value("reversed") == "true"); + if (stream.attributes().hasAttribute("description")) + l->description = stream.attributes().value("description").toString(); + if (stream.attributes().hasAttribute("feature")) { + if (stream.attributes().value("featureclass") == "Node") { + l->mainFeature = (Feature*) Feature::getNodeOrCreatePlaceHolder(d, (Layer *) d->getDirtyOrOriginLayer(), IFeature::FId(IFeature::Point, stream.attributes().value("feature").toString().toLongLong())); + } else + if (stream.attributes().value("featureclass") == "Way") { + l->mainFeature = (Feature*) Feature::getWayOrCreatePlaceHolder(d, (Layer *) d->getDirtyOrOriginLayer(), IFeature::FId(IFeature::LineString, stream.attributes().value("feature").toString().toLongLong())); + } else + if (stream.attributes().value("featureclass") == "Relation") { + l->mainFeature = (Feature*) Feature::getRelationOrCreatePlaceHolder(d, (Layer *) d->getDirtyOrOriginLayer(), IFeature::FId(IFeature::OsmRelation, stream.attributes().value("feature").toString().toLongLong())); + } + } + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "AddFeatureCommand") { + AddFeatureCommand* C = AddFeatureCommand::fromXML(d, stream); + if (C) + l->add(C); + } else if (stream.name() == "MoveTrackPointCommand") { + MoveNodeCommand* C = MoveNodeCommand::fromXML(d, stream); + if (C) + l->add(C); + } else if (stream.name() == "RelationAddFeatureCommand") { + RelationAddFeatureCommand* C = RelationAddFeatureCommand::fromXML(d, stream); + if (C) + l->add(C); + } else if (stream.name() == "RelationRemoveFeatureCommand") { + RelationRemoveFeatureCommand* C = RelationRemoveFeatureCommand::fromXML(d, stream); + if (C) + l->add(C); + } else if (stream.name() == "RemoveFeatureCommand") { + RemoveFeatureCommand* C = RemoveFeatureCommand::fromXML(d, stream); + if (C) + l->add(C); + } else if (stream.name() == "RoadAddTrackPointCommand") { + WayAddNodeCommand* C = WayAddNodeCommand::fromXML(d, stream); + if (C) + l->add(C); + } else if (stream.name() == "RoadRemoveTrackPointCommand") { + WayRemoveNodeCommand* C = WayRemoveNodeCommand::fromXML(d, stream); + if (C) + l->add(C); + } else if (stream.name() == "TrackSegmentAddTrackPointCommand") { + TrackSegmentAddNodeCommand* C = TrackSegmentAddNodeCommand::fromXML(d, stream); + if (C) + l->add(C); + } else if (stream.name() == "TrackSegmentRemoveTrackPointCommand") { + TrackSegmentRemoveNodeCommand* C = TrackSegmentRemoveNodeCommand::fromXML(d, stream); + if (C) + l->add(C); + } else if (stream.name() == "ClearTagCommand") { + ClearTagCommand* C = ClearTagCommand::fromXML(d, stream); + if (C) + l->add(C); + } else if (stream.name() == "ClearTagsCommand") { + ClearTagsCommand* C = ClearTagsCommand::fromXML(d, stream); + if (C) + l->add(C); + } else if (stream.name() == "SetTagCommand") { + SetTagCommand* C = SetTagCommand::fromXML(d, stream); + if (C) + l->add(C); + } else if (stream.name() == "CommandList") { + l->add(CommandList::fromXML(d, stream)); + } else if (!stream.isWhitespace()) { + qDebug() << "CList: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + QString el = stream.readElementText(QXmlStreamReader::IncludeChildElements); + } + stream.readNext(); + } + + if (l->Size == 0) { + qDebug() << "!! Corrupted (empty) command list. Deleting..."; + delete l; + return NULL; + } + + return l; +} + + +// COMMANDHISTORY + +CommandHistory::CommandHistory() +: Index(0), Size(0), UndoAction(0), RedoAction(0), UploadAction(0) +{ +} + +CommandHistory::~CommandHistory() +{ + cleanup(); +} + +void CommandHistory::cleanup() +{ + //FIXME Is there a point to this? + //for (int i=Index; i<Subs.size(); ++i) + // Subs[i]->redo(); + qDeleteAll(Subs); + Subs.clear(); + Index = 0; + Size = 0; +} + +void CommandHistory::undo() +{ + if (Index) + { + Subs[--Index]->undo(); + updateActions(); + } +} + +void CommandHistory::redo() +{ + if (Index < Size) + { + Subs[Index++]->redo(); + updateActions(); + } +} + +void CommandHistory::add(Command* aCommand) +{ + //for (int i=Index; i<Subs.size(); ++i) + // delete Subs[i]; + //Subs.erase(Subs.begin()+Index,Subs.end()); + //Subs.push_back(aCommand); + //Index = Subs.size(); + Subs.insert(Subs.begin()+Index, aCommand); + Index++; + Size = Index; + updateActions(); +} + +void CommandHistory::setActions(QAction* anUndo, QAction* aRedo, QAction* anUploadAction) +{ + UndoAction = anUndo; + RedoAction = aRedo; + UploadAction = anUploadAction; + updateActions(); +} + +void CommandHistory::updateActions() +{ + if (UndoAction) + UndoAction->setEnabled(Index>0); + if (RedoAction) + RedoAction->setEnabled(Index<Size); + if (UploadAction && !M_PREFS->getOfflineMode()) + UploadAction->setEnabled(Subs.size()); +} + +int CommandHistory::index() const +{ + return Index; +} + +int CommandHistory::size() const +{ + return Size; +} + +int CommandHistory::buildDirtyList(DirtyList& theList) +{ + for (int i=0; i<Subs.size();) + if (Subs[i]->buildDirtyList(theList)) + { + //delete Subs[i]; + //Subs.erase(Subs.begin()+i); + std::rotate(Subs.begin()+i,Subs.begin()+i+1,Subs.end()); + --Index; + --Size; + if (!Size) + cleanup(); + } + else + ++i; + + return Index; +} + +int CommandHistory::buildUndoList(QListWidget* theList) +{ + for (int i=0; i<Index; ++i) + if (!(i < Subs.size())) + qDebug() << "!!! Error: Undo Index > list size"; + else + Subs[i]->buildUndoList(theList); + + return Index; +} + +bool CommandHistory::toXML(QXmlStreamWriter& stream, QProgressDialog * /*progress*/) const +{ + bool OK = true; + + stream.writeStartElement("CommandHistory"); + + stream.writeAttribute("index", QString::number(Index)); + + for (int i=0; i<Size; ++i) { + OK = Subs[i]->toXML(stream); + } + stream.writeEndElement(); + + return OK; +} + +CommandHistory* CommandHistory::fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress) +{ + bool OK = true; + CommandHistory* h = new CommandHistory(); + int index = stream.attributes().value("index").toString().toUInt(); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "CommandList") { + CommandList* l = CommandList::fromXML(d, stream); + if (l) + h->add(l); + else + OK = false; + } else if (stream.name() == "AddFeatureCommand") { + AddFeatureCommand* C = AddFeatureCommand::fromXML(d, stream); + if (C) + h->add(C); + else + OK = false; + } else if (stream.name() == "MoveTrackPointCommand") { + MoveNodeCommand* C = MoveNodeCommand::fromXML(d, stream); + if (C) + h->add(C); + else + OK = false; + } else if (stream.name() == "RelationAddFeatureCommand") { + RelationAddFeatureCommand* C = RelationAddFeatureCommand::fromXML(d, stream); + if (C) + h->add(C); + else + OK = false; + } else if (stream.name() == "RelationRemoveFeatureCommand") { + RelationRemoveFeatureCommand* C = RelationRemoveFeatureCommand::fromXML(d, stream); + if (C) + h->add(C); + else + OK = false; + } else if (stream.name() == "RemoveFeatureCommand") { + RemoveFeatureCommand* C = RemoveFeatureCommand::fromXML(d, stream); + if (C) + h->add(C); + else + OK = false; + } else if (stream.name() == "RoadAddTrackPointCommand") { + WayAddNodeCommand* C = WayAddNodeCommand::fromXML(d, stream); + if (C) + h->add(C); + else + OK = false; + } else if (stream.name() == "RoadRemoveTrackPointCommand") { + WayRemoveNodeCommand* C = WayRemoveNodeCommand::fromXML(d, stream); + if (C) + h->add(C); + else + OK = false; + } else if (stream.name() == "TrackSegmentAddTrackPointCommand") { + TrackSegmentAddNodeCommand* C = TrackSegmentAddNodeCommand::fromXML(d, stream); + if (C) + h->add(C); + else + OK = false; + } else if (stream.name() == "TrackSegmentRemoveTrackPointCommand") { + TrackSegmentRemoveNodeCommand* C = TrackSegmentRemoveNodeCommand::fromXML(d, stream); + if (C) + h->add(C); + else + OK = false; + } else if (stream.name() == "ClearTagCommand") { + ClearTagCommand* C = ClearTagCommand::fromXML(d, stream); + if (C) + h->add(C); + else + OK = false; + } else if (stream.name() == "ClearTagsCommand") { + ClearTagsCommand* C = ClearTagsCommand::fromXML(d, stream); + if (C) + h->add(C); + else + OK = false; + } else if (stream.name() == "SetTagCommand") { + SetTagCommand* C = SetTagCommand::fromXML(d, stream); + if (C) + h->add(C); + else + OK = false; + } else if (!stream.isWhitespace()) { + qDebug() << "CHist: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + QString el = stream.readElementText(QXmlStreamReader::IncludeChildElements); + } + + progress->setValue(stream.characterOffset()); + if (progress && progress->wasCanceled()) + break; + + stream.readNext(); + } + + if (!OK) { + qDebug() << "!! File history is corrupted. Resetting..."; + qDebug() << "-- Size:" << h->Size; + qDebug() << "-- Index:" << h->Index; + delete h; + h = new CommandHistory(); + } else + h->Index = index; + + return h; +} + + diff --git a/src/Commands/Command.h b/src/Commands/Command.h new file mode 100644 index 0000000..c8db587 --- /dev/null +++ b/src/Commands/Command.h @@ -0,0 +1,110 @@ +#ifndef MERKATOR_COMMAND_H_ +#define MERKATOR_COMMAND_H_ + +#include <QList> +#include <QtXml> + +#define KEY_UNDEF_VALUE "%%%%%" +#define TAG_UNDEF_VALUE "%%%%%" + +class Document; +class Layer; +class Feature; +class DirtyList; +class CommandList; + +class QAction; +class QListWidget; +class QProgressDialog; + +class Command +{ + public: + Command(Feature* aF); + virtual ~Command(void) = 0; + + virtual void undo(); + virtual void redo(); + virtual bool buildDirtyList(DirtyList& theList) = 0; + virtual bool buildUndoList(QListWidget* theList); + + void setId(const QString& id); + const QString& id() const; + virtual bool toXML(QXmlStreamWriter& stream) const; + static void fromXML(Document* d, QXmlStreamReader& stream, Command* C); + + virtual QString getDescription(); + virtual void setDescription(QString desc); + virtual Feature* getFeature(); + virtual void setFeature(Feature* feat); + + int incDirtyLevel(Layer* aLayer, Feature* F); + int decDirtyLevel(Layer* aLayer, Feature* F); + int getDirtyLevel(); + + protected: + mutable QString Id; + QString description; + Feature* mainFeature; + int commandDirtyLevel; + QString oldCreated; + bool isUndone; + bool wasUploaded; +}; + +class CommandList : public Command +{ + public: + CommandList(); + CommandList(QString aDesc, Feature* aFeat=NULL); + virtual ~CommandList(); + + virtual void undo(); + virtual void redo(); + bool empty() const; + int size(); + void add(Command* aCommand); + virtual bool buildDirtyList(DirtyList& theList); + void setReversed(bool val); + + virtual bool toXML(QXmlStreamWriter& stream) const; + static CommandList* fromXML(Document* d, QXmlStreamReader& stream); + + private: + QList<Command*> Subs; + int Size; + bool isReversed; +}; + +class CommandHistory +{ + public: + CommandHistory(); + virtual ~CommandHistory(); + + void cleanup(); + void undo(); + void redo(); + void add(Command* aCommand); + void setActions(QAction* anUndo, QAction* aRedo, QAction* anUploadAction); + void updateActions(); + int buildDirtyList(DirtyList& theList); + int buildUndoList(QListWidget* theList); + int index() const; + int size() const; + + virtual bool toXML(QXmlStreamWriter& stream, QProgressDialog * progress) const; + static CommandHistory* fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress); + + private: + QList<Command*> Subs; + int Index; + int Size; + QAction* UndoAction; + QAction* RedoAction; + QAction* UploadAction; +}; + +#endif + + diff --git a/src/Commands/Commands.pri b/src/Commands/Commands.pri new file mode 100644 index 0000000..2a44d75 --- /dev/null +++ b/src/Commands/Commands.pri @@ -0,0 +1,20 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/Commands +DEPENDPATH += $$MERKAARTOR_SRC_DIR/Commands + +HEADERS += \ + Command.h \ + DocumentCommands.h \ + FeatureCommands.h \ + RelationCommands.h \ + WayCommands.h \ + TrackSegmentCommands.h \ + NodeCommands.h \ + +SOURCES += \ + Command.cpp \ + DocumentCommands.cpp \ + FeatureCommands.cpp \ + NodeCommands.cpp \ + RelationCommands.cpp \ + WayCommands.cpp \ + TrackSegmentCommands.cpp \ diff --git a/src/Commands/DocumentCommands.cpp b/src/Commands/DocumentCommands.cpp new file mode 100644 index 0000000..d3edcf7 --- /dev/null +++ b/src/Commands/DocumentCommands.cpp @@ -0,0 +1,280 @@ +#include "DocumentCommands.h" +#include "Document.h" +#include "Layer.h" +#include "Features.h" +#include "DirtyList.h" + +AddFeatureCommand::AddFeatureCommand(Feature* aFeature) +: Command(aFeature), theLayer(0), theFeature(0), UserAdded(false) +{ +} + +AddFeatureCommand::AddFeatureCommand(Layer* aLayer, Feature* aFeature, bool aUserAdded) +: Command(aFeature), theLayer(aLayer), theFeature(aFeature), UserAdded(aUserAdded) +{ + redo(); +} + +AddFeatureCommand::~AddFeatureCommand() +{ + if (theLayer) + theLayer->decDirtyLevel(commandDirtyLevel); +} + +void AddFeatureCommand::undo() +{ + Command::undo(); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + theLayer->remove(theFeature); + oldLayer->add(theFeature); + } else + theFeature->setDeleted(true); + + decDirtyLevel(theLayer, theFeature); +} + +void AddFeatureCommand::redo() +{ + oldLayer = theFeature->layer(); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + oldLayer->remove(theFeature); + theLayer->add(theFeature); + } else { + if (!oldLayer) + theLayer->add(theFeature); + else { + theFeature->setDeleted(false); + oldLayer = NULL; + } + incDirtyLevel(theLayer, theFeature); + } + Command::redo(); +} + +bool AddFeatureCommand::buildDirtyList(DirtyList& theList) +{ + if (isUndone) + return false; + + if (UserAdded) + if (theFeature->isUploadable()) + return theList.add(theFeature); + return false; +} + +bool AddFeatureCommand::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement("AddFeatureCommand"); + + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("layer", theLayer->id()); + if (oldLayer) + stream.writeAttribute("oldlayer", oldLayer->id()); + stream.writeAttribute("feature", theFeature->xmlId()); + stream.writeAttribute("useradded", QString(UserAdded ? "true" : "false")); + + Command::toXML(stream); + stream.writeEndElement(); + + return OK; +} + +AddFeatureCommand * AddFeatureCommand::fromXML(Document* d, QXmlStreamReader& stream) +{ + AddFeatureCommand* a = new AddFeatureCommand(); + + a->setId(stream.attributes().value("xml:id").toString()); + a->theLayer = d->getLayer(stream.attributes().value("layer").toString()); + if (stream.attributes().hasAttribute("oldlayer")) + a->oldLayer = d->getLayer(stream.attributes().value("oldlayer").toString()); + else + a->oldLayer = NULL; + if (!a->theLayer) + return NULL; + + Feature* F; + if (!(F = d->getFeature(IFeature::FId(IFeature::All, stream.attributes().value("feature").toString().toLongLong())))) + return NULL; + + a->theFeature = F; + a->UserAdded = (stream.attributes().value("useradded") == "true" ? true : false); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Command") { + Command::fromXML(d, stream, a); + } + stream.readNext(); + } + + return a; +} + +/* REMOVEFEATURECOMMAND */ + +RemoveFeatureCommand::RemoveFeatureCommand(Feature *aFeature) +: Command(aFeature), theLayer(0), theFeature(aFeature), CascadedCleanUp(0), RemoveExecuted(false) +{ +} + +RemoveFeatureCommand::RemoveFeatureCommand(Document *theDocument, Feature *aFeature) +: Command(aFeature), theLayer(0), theFeature(aFeature), CascadedCleanUp(0), RemoveExecuted(false) +{ + theLayer = theDocument->getDirtyOrOriginLayer(aFeature->layer()); + redo(); +} + +RemoveFeatureCommand::RemoveFeatureCommand(Document *theDocument, Feature *aFeature, const QList<Feature*>& Alternatives) +: Command(aFeature), theLayer(0), theFeature(aFeature), CascadedCleanUp(0), RemoveExecuted(false), theAlternatives(Alternatives) +{ + CascadedCleanUp = new CommandList(QApplication::tr("Cascaded cleanup"), NULL); + while (aFeature->sizeParents()) { + Feature* f = CAST_FEATURE(aFeature->getParent(0)); + if (f) + f->cascadedRemoveIfUsing(theDocument, aFeature, CascadedCleanUp, Alternatives); + } + if (CascadedCleanUp->empty()) + { + SAFE_DELETE(CascadedCleanUp); + CascadedCleanUp = 0; + } else + CascadedCleanUp->undo(); + theLayer = theDocument->getDirtyOrOriginLayer(aFeature->layer()); + redo(); +} + +RemoveFeatureCommand::~RemoveFeatureCommand() +{ + if (oldLayer) + oldLayer->decDirtyLevel(commandDirtyLevel); + SAFE_DELETE(CascadedCleanUp); + if (theLayer->getDocument()->exists(theFeature) && theFeature->isDeleted()) { + theLayer->getDocument()->deleteFeature(theFeature); + } +} + +void RemoveFeatureCommand::redo() +{ + if (!theFeature) + return; + if (CascadedCleanUp) + CascadedCleanUp->redo(); + + oldLayer = theFeature->layer(); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + oldLayer->remove(theFeature); + theLayer->add(theFeature); + } + theFeature->setDeleted(true); + incDirtyLevel(oldLayer, theFeature); + Command::redo(); +} + +void RemoveFeatureCommand::undo() +{ + if (!theFeature) + return; + Command::undo(); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + theLayer->remove(theFeature); + oldLayer->add(theFeature); + } + theFeature->setDeleted(false); + decDirtyLevel(oldLayer, theFeature); + if (CascadedCleanUp) + CascadedCleanUp->undo(); +} + +bool RemoveFeatureCommand::buildDirtyList(DirtyList &theList) +{ + if (!theFeature) + return false; + if (isUndone) + return false; + if (!oldLayer->isUploadable()) + return false; + + if (theFeature->lastUpdated() == Feature::OSMServerConflict) + return false; + + //if (!theFeature->hasOSMId()) + // return false; + + bool CascadedResult = true; + if (CascadedCleanUp) + CascadedResult = CascadedCleanUp->buildDirtyList(theList); + + if (!RemoveExecuted) + RemoveExecuted = theList.erase(theFeature); + return RemoveExecuted && CascadedResult; +} + +bool RemoveFeatureCommand::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement("RemoveFeatureCommand"); + + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("layer", oldLayer->id()); + stream.writeAttribute("newlayer", theLayer->id()); + stream.writeAttribute("feature", theFeature->xmlId()); + + if (CascadedCleanUp) { + stream.writeStartElement("Cascaded"); + CascadedCleanUp->toXML(stream); + stream.writeEndElement(); + } +// if (theAlternatives.size() > 0) { +// QList<MapFeature*>::const_iterator myFeatIter; +// for(myFeatIter = theAlternatives.begin(); +// myFeatIter != theAlternatives.end(); +// myFeatIter++) +// { +// QDomElement alt = xParent.ownerDocument().createElement("Alternative"); +// e.appendChild(alt); +// +// alt.setAttribute("xml:id", id()); +// } +// } + + Command::toXML(stream); + stream.writeEndElement(); + + return OK; +} + +RemoveFeatureCommand * RemoveFeatureCommand::fromXML(Document* d, QXmlStreamReader& stream) +{ + RemoveFeatureCommand* a = new RemoveFeatureCommand(); + + a->setId(stream.attributes().value("xml:id").toString()); + a->oldLayer = d->getLayer(stream.attributes().value("layer").toString()); + if (stream.attributes().hasAttribute("newlayer")) + a->theLayer = d->getLayer(stream.attributes().value("newlayer").toString()); + else + a->theLayer = d->getDirtyOrOriginLayer(); + if (!a->theLayer) + return NULL; + + Feature* F; + if (!(F = d->getFeature(IFeature::FId(IFeature::All, stream.attributes().value("feature").toString().toLongLong())))) + return NULL; + a->theFeature = F; + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Cascaded") { + a->CascadedCleanUp = CommandList::fromXML(d, stream); + } else if (stream.name() == "Command") { + Command::fromXML(d, stream, a); + } + stream.readNext(); + } + + return a; +} + + diff --git a/src/Commands/DocumentCommands.h b/src/Commands/DocumentCommands.h new file mode 100644 index 0000000..6eaa4bc --- /dev/null +++ b/src/Commands/DocumentCommands.h @@ -0,0 +1,59 @@ +#ifndef MERKATOR_DOCUMENTCOMMANDS_H_ +#define MERKATOR_DOCUMENTCOMMANDS_H_ + +#include "Command.h" + +#include <QList> + +class Document; +class Layer; +class Feature; + +class AddFeatureCommand : public Command +{ + public: + AddFeatureCommand(Feature* aFeature = NULL); + AddFeatureCommand(Layer* aDocument, Feature* aFeature, bool aUserAdded); + virtual ~AddFeatureCommand(); + + void undo(); + void redo(); + bool buildDirtyList(DirtyList& theList); + + virtual bool toXML(QXmlStreamWriter& stream) const; + static AddFeatureCommand* fromXML(Document* d, QXmlStreamReader& stream); + + private: + Layer* theLayer; + Layer* oldLayer; + Feature* theFeature; + bool UserAdded; +}; + +class RemoveFeatureCommand : public Command +{ + public: + RemoveFeatureCommand(Feature* aFeature = NULL); + RemoveFeatureCommand(Document* theDocument, Feature* aFeature); + RemoveFeatureCommand(Document* theDocument, Feature* aFeature, const QList<Feature*>& Alternatives); + virtual ~RemoveFeatureCommand(); + + void undo(); + void redo(); + bool buildDirtyList(DirtyList& theList); + + virtual bool toXML(QXmlStreamWriter& stream) const; + static RemoveFeatureCommand* fromXML(Document* d, QXmlStreamReader& stream); + + private: + Layer* theLayer; + Layer* oldLayer; + Feature* theFeature; + CommandList* CascadedCleanUp; + bool RemoveExecuted; + QList<Feature*> theAlternatives; +}; + +#endif + + diff --git a/src/Commands/FeatureCommands.cpp b/src/Commands/FeatureCommands.cpp new file mode 100644 index 0000000..7c58a1a --- /dev/null +++ b/src/Commands/FeatureCommands.cpp @@ -0,0 +1,416 @@ +#include "FeatureCommands.h" + +#include "Document.h" +#include "Feature.h" +#include "Layer.h" +#include "DirtyList.h" + +TagCommand::TagCommand(Feature* aF, Layer* aLayer) +: Command(aF), theFeature(aF), FirstRun(true), theLayer(aLayer), oldLayer(0) +{ +} + +TagCommand::TagCommand(Feature* aF) +: Command(aF), theLayer(0), oldLayer(0) +{ +} + +TagCommand::~TagCommand(void) +{ + if (oldLayer) + oldLayer->decDirtyLevel(commandDirtyLevel); +} + +//void TagCommand::undo() +//{ +// theFeature->clearTags(); +// for (int i=0; i<Before.size(); ++i) +// theFeature->setTag(Before[i].first,Before[i].second); +//} +// +//void TagCommand::redo() +//{ +// if (FirstRun) +// for (int i=0; i<theFeature->tagSize(); ++i) +// After.push_back(qMakePair(theFeature->tagKey(i),theFeature->tagValue(i))); +// else +// { +// theFeature->clearTags(); +// for (int i=0; i<After.size(); ++i) +// theFeature->setTag(After[i].first,After[i].second); +// } +// FirstRun = false; +//} +// +bool TagCommand::buildDirtyList(DirtyList& theList) +{ + if (isUndone) + return false; + if (theFeature->lastUpdated() == Feature::NotYetDownloaded) + return theList.noop(theFeature); + if (theLayer->isUploadable()) + return theList.update(theFeature); + + return theList.noop(theFeature); +} + +SetTagCommand::SetTagCommand(Feature* aF) +: TagCommand(aF, 0), theIdx(0), theK(""), theV("") +{ + oldLayer = theFeature->layer(); +} + +SetTagCommand::SetTagCommand(Feature* aF, int idx, const QString& k, const QString& v, Layer* aLayer) +: TagCommand(aF, aLayer), theIdx(idx), theK(k), theV(v) +{ + description = QApplication::tr("Set tag '%1=%2' on %3").arg(k).arg(v).arg(aF->description()); + oldLayer = theFeature->layer(); + redo(); +} + +SetTagCommand::SetTagCommand(Feature* aF, const QString& k, const QString& v, Layer* aLayer) +: TagCommand(aF, aLayer), theIdx(-1), theK(k), theV(v) +{ + description = QApplication::tr("Set tag '%1=%2' on %3").arg(k).arg(v).arg(aF->description()); + oldLayer = theFeature->layer(); + redo(); +} + +void SetTagCommand::undo() +{ + Command::undo(); + if (theFeature->isUploaded()) { + theLayer = theLayer->getDocument()->getUploadedLayer(); + oldLayer = theLayer->getDocument()->getDirtyOrOriginLayer(); + } + if (oldV != TAG_UNDEF_VALUE && oldK != KEY_UNDEF_VALUE) + { + if(oldK!=theK) theFeature->clearTag(theK); + theFeature->setTag(theIdx,oldK,oldV); + } + else + theFeature->clearTag(theK); + + if (theLayer && oldLayer && (theLayer != oldLayer)) { + theLayer->remove(theFeature); + oldLayer->add(theFeature); + } + decDirtyLevel(oldLayer, theFeature); +} + +void SetTagCommand::redo() +{ + oldV = TAG_UNDEF_VALUE; + oldK = KEY_UNDEF_VALUE; + if (theIdx < 0) { + oldK = theK; + oldV = theFeature->tagValue(theK, TAG_UNDEF_VALUE); + theFeature->setTag(theK,theV); + } else { + oldV = theFeature->tagValue(theIdx); + oldK = theFeature->tagKey(theIdx); + if(oldK!=theK) theFeature->clearTag(oldK); + theFeature->setTag(theIdx,theK,theV); + } + + if (theLayer && oldLayer && (theLayer != oldLayer)) { + oldLayer->remove(theFeature); + theLayer->add(theFeature); + } + incDirtyLevel(oldLayer, theFeature); + Command::redo(); +} + +bool SetTagCommand::buildDirtyList(DirtyList& theList) +{ + if (isUndone) + return false; + if (theFeature->lastUpdated() == Feature::NotYetDownloaded) + return theList.noop(theFeature); + if (theK.startsWith('_') && (theK.endsWith('_'))) + return theList.noop(theFeature); + if (!theFeature->isUploadable()) + return theList.noop(theFeature); + + return theList.update(theFeature); +} + +bool SetTagCommand::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement("SetTagCommand"); + stream.writeAttribute("oldkey", oldK); + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("feature", theFeature->xmlId()); + stream.writeAttribute("idx", QString::number(theIdx)); + stream.writeAttribute("key", theK); + stream.writeAttribute("value", theV); + stream.writeAttribute("oldvalue", oldV); + if (theLayer) + stream.writeAttribute("layer", theLayer->id()); + if (oldLayer) + stream.writeAttribute("oldlayer", oldLayer->id()); + + Command::toXML(stream); + stream.writeEndElement(); + + return OK; +} + +SetTagCommand * SetTagCommand::fromXML(Document * d, QXmlStreamReader& stream) +{ + Feature* F; + if (!(F = d->getFeature(IFeature::FId(IFeature::All, stream.attributes().value("feature").toString().toLongLong())))) { + qDebug() << "SetTagCommand::fromXML: Undefined feature:" << stream.attributes().value("feature").toString(); + return NULL; + } + + SetTagCommand* a = new SetTagCommand(F); + a->setId(stream.attributes().value("xml:id").toString()); + if (stream.attributes().hasAttribute("oldkey")) + a->oldK = stream.attributes().value("oldkey").toString(); + a->theFeature = F; + a->theIdx = stream.attributes().value("idx").toString().toInt(); + a->theK = stream.attributes().value("key").toString(); + a->theV = stream.attributes().value("value").toString(); + if (stream.attributes().hasAttribute("oldvalue")) + a->oldV = stream.attributes().value("oldvalue").toString(); + if (stream.attributes().hasAttribute("layer")) + a->theLayer = d->getLayer(stream.attributes().value("layer").toString()); + else + a->theLayer = NULL; + if (stream.attributes().hasAttribute("oldlayer")) + a->oldLayer = d->getLayer(stream.attributes().value("oldlayer").toString()); + else + a->oldLayer = NULL; + + a->description = QApplication::tr("Set tag '%1=%2' on %3").arg(a->theK).arg(a->theV).arg(a->theFeature->description()); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Command") { + Command::fromXML(d, stream, a); + } + stream.readNext(); + } + + return a; +} + + +/* CLEARTAGSCOMMAND */ + +ClearTagsCommand::ClearTagsCommand(Feature* F, Layer* aLayer) +: TagCommand(F, aLayer) +{ + for (int i=0; i<theFeature->tagSize(); ++i) + Before.push_back(qMakePair(theFeature->tagKey(i),theFeature->tagValue(i))); + oldLayer = theFeature->layer(); + redo(); +} + +void ClearTagsCommand::undo() +{ + Command::undo(); + if (theFeature->isUploaded()) { + theLayer = theLayer->getDocument()->getUploadedLayer(); + oldLayer = theLayer->getDocument()->getDirtyOrOriginLayer(); + } + theFeature->clearTags(); + for (int i=0; i<Before.size(); ++i) + theFeature->setTag(Before[i].first,Before[i].second); + + if (theLayer && oldLayer && (theLayer != oldLayer)) { + theLayer->remove(theFeature); + oldLayer->add(theFeature); + } + decDirtyLevel(oldLayer, theFeature); +} + +void ClearTagsCommand::redo() +{ + theFeature->clearTags(); + + if (theLayer && oldLayer && (theLayer != oldLayer)) { + oldLayer->remove(theFeature); + theLayer->add(theFeature); + } + incDirtyLevel(oldLayer, theFeature); + Command::redo(); +} + +bool ClearTagsCommand::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement("ClearTagsCommand"); + + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("feature", theFeature->xmlId()); + if (theLayer) + stream.writeAttribute("layer", theLayer->id()); + if (oldLayer) + stream.writeAttribute("oldlayer", oldLayer->id()); + + for (int i=0; i<Before.size(); ++i) + { + stream.writeStartElement("tag"); + stream.writeAttribute("k", Before[i].first); + stream.writeAttribute("v", Before[i].second); + stream.writeEndElement(); + } + + Command::toXML(stream); + stream.writeEndElement(); + + return OK; +} + +ClearTagsCommand * ClearTagsCommand::fromXML(Document * d, QXmlStreamReader& stream) +{ + Feature* F; + if (!(F = d->getFeature(IFeature::FId(IFeature::All, stream.attributes().value("feature").toString().toLongLong())))) + return NULL; + + ClearTagsCommand* a = new ClearTagsCommand(F); + a->setId(stream.attributes().value("xml:id").toString()); + a->theFeature = F; + if (stream.attributes().hasAttribute("layer")) + a->theLayer = d->getLayer(stream.attributes().value("layer").toString()); + else + a->theLayer = NULL; + if (stream.attributes().hasAttribute("oldlayer")) + a->oldLayer = d->getLayer(stream.attributes().value("oldlayer").toString()); + else + a->oldLayer = NULL; + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "tag") { + a->Before.push_back(qMakePair(stream.attributes().value("k").toString(),stream.attributes().value("v").toString())); + } else if (stream.name() == "Command") { + Command::fromXML(d, stream, a); + } + stream.readNext(); + } + + Command::fromXML(d, stream, a); + + return a; +} + +/* CLEARTAGCOMMAND */ + +ClearTagCommand::ClearTagCommand(Feature* F) +: TagCommand(F, 0), theIdx(0), theK(""), theV("") +{ + oldLayer = theFeature->layer(); +} + +ClearTagCommand::ClearTagCommand(Feature* F, const QString& k, Layer* aLayer) +: TagCommand(F, aLayer), theIdx(F->findKey(k)), theK(k), theV(F->tagValue(k, "")) +{ + if (theIdx < 0) { + qCritical() << "ClearTagCommand required to remove a non-existent tag."; + } + description = QApplication::tr("Remove tag '%1' from %2").arg(k).arg(F->description()); + oldLayer = theFeature->layer(); + redo(); +} + +void ClearTagCommand::undo() +{ + Command::undo(); + if (theFeature->isUploaded()) { + theLayer = theLayer->getDocument()->getUploadedLayer(); + oldLayer = theLayer->getDocument()->getDirtyOrOriginLayer(); + } + theFeature->setTag(theIdx,theK,theV); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + theLayer->remove(theFeature); + oldLayer->add(theFeature); + } + decDirtyLevel(oldLayer, theFeature); +} + +void ClearTagCommand::redo() +{ + theFeature->clearTag(theK); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + oldLayer->remove(theFeature); + theLayer->add(theFeature); + } + incDirtyLevel(oldLayer, theFeature); + Command::redo(); +} + +bool ClearTagCommand::buildDirtyList(DirtyList& theList) +{ + if (isUndone) + return false; + if (theFeature->lastUpdated() == Feature::NotYetDownloaded) + return theList.noop(theFeature); + if (!theFeature->isUploadable()) + return theList.noop(theFeature); + + return theList.update(theFeature); +} + +bool ClearTagCommand::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement("ClearTagCommand"); + + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("feature", theFeature->xmlId()); + stream.writeAttribute("idx", QString::number(theIdx)); + stream.writeAttribute("key", theK); + stream.writeAttribute("value", theV); + if (theLayer) + stream.writeAttribute("layer", theLayer->id()); + if (oldLayer) + stream.writeAttribute("oldlayer", oldLayer->id()); + + Command::toXML(stream); + stream.writeEndElement(); + + return OK; +} + +ClearTagCommand * ClearTagCommand::fromXML(Document * d, QXmlStreamReader& stream) +{ + Feature* F; + if (!(F = d->getFeature(IFeature::FId(IFeature::All, stream.attributes().value("feature").toString().toLongLong())))) + return NULL; + + ClearTagCommand* a = new ClearTagCommand(F); + a->setId(stream.attributes().value("xml:id").toString()); + a->theFeature = F; + a->theIdx = stream.attributes().value("idx").toString().toInt(); + a->theK = stream.attributes().value("key").toString(); + a->theV = stream.attributes().value("value").toString(); + if (stream.attributes().hasAttribute("layer")) + a->theLayer = d->getLayer(stream.attributes().value("layer").toString()); + else + a->theLayer = NULL; + if (stream.attributes().hasAttribute("oldlayer")) + a->oldLayer = d->getLayer(stream.attributes().value("oldlayer").toString()); + else + a->oldLayer = NULL; + + a->description = QApplication::tr("Remove tag '%1' from %2").arg(a->theK).arg(a->theFeature->description()); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Command") { + Command::fromXML(d, stream, a); + } + stream.readNext(); + } + + return a; +} + + diff --git a/src/Commands/FeatureCommands.h b/src/Commands/FeatureCommands.h new file mode 100644 index 0000000..08080da --- /dev/null +++ b/src/Commands/FeatureCommands.h @@ -0,0 +1,91 @@ +#ifndef MERKAARTOR_FEATURECOMMANDS_H_ +#define MERKAARTOR_FEATURECOMMANDS_H_ + +#include "Command.h" + +#include <QtCore/QString> + +#include <utility> +#include <QList> + +class Feature; +class Document; +class Layer; + +class TagCommand : public Command +{ + public: + TagCommand(Feature* aF, Layer* aLayer); + TagCommand(Feature* aF); + ~TagCommand(void); + + virtual void undo() = 0; + virtual void redo() = 0; + virtual bool buildDirtyList(DirtyList& theList); + + protected: + Feature* theFeature; + QList<QPair<QString, QString> > Before, After; + bool FirstRun; + Layer* theLayer; + Layer* oldLayer; +}; + +class SetTagCommand : public TagCommand +{ + public: + SetTagCommand(Feature* aF); + SetTagCommand(Feature* aF, int idx, const QString& k, const QString& v, Layer* aLayer=NULL); + SetTagCommand(Feature* aF, const QString& k, const QString& v, Layer* aLayer=NULL); + + virtual void undo(); + virtual void redo(); + virtual bool buildDirtyList(DirtyList& theList); + + virtual bool toXML(QXmlStreamWriter& stream) const; + static SetTagCommand* fromXML(Document* d, QXmlStreamReader& stream); + + private: + int theIdx; + QString theK; + QString theV; + QString oldK; + QString oldV; +}; + +class ClearTagsCommand : public TagCommand +{ + public: + ClearTagsCommand(Feature* aF, Layer* aLayer=NULL); + + virtual void undo(); + virtual void redo(); + + virtual bool toXML(QXmlStreamWriter& stream) const; + static ClearTagsCommand* fromXML(Document* d, QXmlStreamReader& stream); +}; + +class ClearTagCommand : public TagCommand +{ + public: + ClearTagCommand(Feature* aF); + ClearTagCommand(Feature* aF, const QString& k, Layer* aLayer=NULL); + + virtual void undo(); + virtual void redo(); + virtual bool buildDirtyList(DirtyList& theList); + + virtual bool toXML(QXmlStreamWriter& stream) const; + static ClearTagCommand* fromXML(Document* d, QXmlStreamReader& stream); + + private: + int theIdx; + QString theK; + QString theV; + +}; + +#endif + + + diff --git a/src/Commands/NodeCommands.cpp b/src/Commands/NodeCommands.cpp new file mode 100644 index 0000000..51e521a --- /dev/null +++ b/src/Commands/NodeCommands.cpp @@ -0,0 +1,129 @@ +#include "NodeCommands.h" + +#include "Node.h" +#include "Layer.h" +#include "DirtyList.h" + +MoveNodeCommand::MoveNodeCommand() +: Command(0), theLayer(0), oldLayer(0), OldPos(Coord(0, 0)), NewPos(Coord(0, 0)) +{ +} + +MoveNodeCommand::MoveNodeCommand(Node* aPt) +: Command(aPt), theLayer(0), oldLayer(0), OldPos(Coord(0, 0)), NewPos(Coord(0, 0)) +{ + if (!theLayer) + theLayer = thePoint->layer(); + description = QApplication::tr("Move node %1").arg(aPt->description()); +} + +MoveNodeCommand::MoveNodeCommand(Node* aPt, const Coord& aPos, Layer* aLayer) +: Command(aPt), theLayer(aLayer), oldLayer(0), thePoint(aPt), OldPos(aPt->position()), NewPos(aPos) +{ + if (!theLayer) + theLayer = thePoint->layer(); + description = QApplication::tr("Move node %1").arg(aPt->description()); + redo(); +} + +MoveNodeCommand::~MoveNodeCommand(void) +{ + if (oldLayer) + oldLayer->decDirtyLevel(commandDirtyLevel); +} + +void MoveNodeCommand::undo() +{ + Command::undo(); + thePoint->setPosition(OldPos); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + theLayer->remove(thePoint); + oldLayer->add(thePoint); + } + decDirtyLevel(oldLayer, thePoint); +} + +void MoveNodeCommand::redo() +{ + oldLayer = thePoint->layer(); + thePoint->setPosition(NewPos); + thePoint->setVirtual(false); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + oldLayer->remove(thePoint); + theLayer->add(thePoint); + } + incDirtyLevel(oldLayer, thePoint); + Command::redo(); +} + +bool MoveNodeCommand::buildDirtyList(DirtyList &theList) +{ + if (isUndone) + return false; + if (thePoint->lastUpdated() == Feature::NotYetDownloaded) + return theList.noop(thePoint); + if (!thePoint->layer()) + return theList.update(thePoint); + if (thePoint->isUploadable()) + return theList.update(thePoint); + + return theList.noop(thePoint); +} + +bool MoveNodeCommand::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement("MoveTrackPointCommand"); + + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("trackpoint", thePoint->xmlId()); + if (theLayer) + stream.writeAttribute("layer", theLayer->id()); + if (oldLayer) + stream.writeAttribute("oldlayer", oldLayer->id()); + OldPos.toXML("oldpos", stream); + NewPos.toXML("newpos", stream); + + Command::toXML(stream); + stream.writeEndElement(); + + return OK; +} + +MoveNodeCommand * MoveNodeCommand::fromXML(Document * d, QXmlStreamReader& stream) +{ + MoveNodeCommand* a = new MoveNodeCommand(); + a->setId(stream.attributes().value("xml:id").toString()); + + if (stream.attributes().hasAttribute("layer")) + a->theLayer = d->getLayer(stream.attributes().value("layer").toString()); + else + a->theLayer = NULL; + if (stream.attributes().hasAttribute("oldlayer")) + a->oldLayer = d->getLayer(stream.attributes().value("oldlayer").toString()); + else + a->oldLayer = NULL; + if (!a->theLayer) + return NULL; + + a->thePoint = Feature::getNodeOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::Point, stream.attributes().value("trackpoint").toString().toLongLong())); + a->description = QApplication::tr("Move node %1").arg(a->thePoint->description()); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "oldpos") { + a->OldPos = Coord::fromXML(stream); + } else if (stream.name() == "newpos") { + a->NewPos = Coord::fromXML(stream); + } else if (stream.name() == "Command") { + Command::fromXML(d, stream, a); + } + stream.readNext(); + } + + return a; +} + + + diff --git a/src/Commands/NodeCommands.h b/src/Commands/NodeCommands.h new file mode 100644 index 0000000..b6263a8 --- /dev/null +++ b/src/Commands/NodeCommands.h @@ -0,0 +1,34 @@ +#ifndef MERKATOR_NODECOMMANDS_H_ +#define MERKATOR_NODECOMMANDS_H_ + +#include "Command.h" +#include "Coord.h" + +class Node; +class Layer; + +class MoveNodeCommand : public Command +{ + public: + MoveNodeCommand(); + MoveNodeCommand(Node* aPt); + MoveNodeCommand(Node* aPt, const Coord& aPos, Layer* aLayer=NULL); + virtual ~MoveNodeCommand(); + + void undo(); + void redo(); + bool buildDirtyList(DirtyList& theList); + + virtual bool toXML(QXmlStreamWriter& stream) const; + static MoveNodeCommand* fromXML(Document* d,QXmlStreamReader& stream); + + private: + Layer* theLayer; + Layer* oldLayer; + Node* thePoint; + Coord OldPos, NewPos; +}; + +#endif + + diff --git a/src/Commands/RelationCommands.cpp b/src/Commands/RelationCommands.cpp new file mode 100644 index 0000000..6bfa57b --- /dev/null +++ b/src/Commands/RelationCommands.cpp @@ -0,0 +1,275 @@ +#include "RelationCommands.h" + +#include "Relation.h" +#include "Feature.h" +#include "Layer.h" +#include "DirtyList.h" + +RelationAddFeatureCommand::RelationAddFeatureCommand(Relation* R) +: Command(R), theLayer(0), oldLayer(0), theRelation(R), Role(""), theMapFeature(0), Position(0) +{ +} + +RelationAddFeatureCommand::RelationAddFeatureCommand(Relation* R, const QString& aRole, Feature* W, Layer* aLayer) +: Command(R), theLayer(aLayer), oldLayer(0), theRelation(R), Role(aRole), theMapFeature(W), Position(theRelation->size()) +{ + if (!theLayer) + theLayer = theRelation->layer(); + redo(); +} + +RelationAddFeatureCommand::RelationAddFeatureCommand(Relation* R, const QString& aRole, Feature* W, int aPos, Layer* aLayer) +: Command(R), theLayer(aLayer), oldLayer(0), theRelation(R), Role(aRole), theMapFeature(W), Position(aPos) +{ + if (!theLayer) + theLayer = theRelation->layer(); + redo(); +} + +RelationAddFeatureCommand::~RelationAddFeatureCommand(void) +{ + if (oldLayer) + oldLayer->decDirtyLevel(commandDirtyLevel); +} + +void RelationAddFeatureCommand::undo() +{ + Command::undo(); + theRelation->remove(Position); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + theLayer->remove(theRelation); + oldLayer->add(theRelation); + } + decDirtyLevel(oldLayer, theRelation); +} + +void RelationAddFeatureCommand::redo() +{ + oldLayer = theRelation->layer(); + theRelation->add(Role, theMapFeature, Position); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + oldLayer->remove(theRelation); + theLayer->add(theRelation); + } + incDirtyLevel(oldLayer, theRelation); + Command::redo(); +} + +bool RelationAddFeatureCommand::buildDirtyList(DirtyList& theList) +{ + if (isUndone) + return false; + if (theRelation->lastUpdated() == Feature::NotYetDownloaded) + return theList.noop(theRelation); + if (!theRelation->layer()) + return theList.update(theRelation); + if (theRelation->isUploadable()) + return theList.update(theRelation); + + return theList.noop(theRelation); +} + +bool RelationAddFeatureCommand::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement("RelationAddFeatureCommand"); + + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("relation", theRelation->xmlId()); + stream.writeAttribute("role", Role); + stream.writeAttribute("feature", theMapFeature->xmlId()); + stream.writeAttribute("pos", QString::number(Position)); + if (theLayer) + stream.writeAttribute("layer", theLayer->id()); + if (oldLayer) + stream.writeAttribute("oldlayer", oldLayer->id()); + + Command::toXML(stream); + stream.writeEndElement(); + + return OK; +} + +RelationAddFeatureCommand * RelationAddFeatureCommand::fromXML(Document * d, QXmlStreamReader& stream) +{ + RelationAddFeatureCommand* a = new RelationAddFeatureCommand(); + a->setId(stream.attributes().value("xml:id").toString()); + if (stream.attributes().hasAttribute("layer")) + a->theLayer = d->getLayer(stream.attributes().value("layer").toString()); + else + a->theLayer = d->getDirtyOrOriginLayer(); + if (stream.attributes().hasAttribute("oldlayer")) + a->oldLayer = d->getLayer(stream.attributes().value("oldlayer").toString()); + else + a->oldLayer = NULL; + if (!a->theLayer) + return NULL; + + a->theRelation = Feature::getRelationOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::OsmRelation, stream.attributes().value("relation").toString().toLongLong())); + Feature* F; + if (stream.attributes().value("featureclass") == "TrackPoint") { + F = (Feature*) Feature::getNodeOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::Point, stream.attributes().value("trackpoint").toString().toLongLong())); + } else + if (stream.attributes().value("featureclass") == "Road") { + F = (Feature*) Feature::getWayOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::LineString, stream.attributes().value("road").toString().toLongLong())); + } else + if (stream.attributes().value("featureclass") == "Relation") { + F = (Feature*) Feature::getRelationOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::OsmRelation, stream.attributes().value("road").toString().toLongLong())); + } else { + if (!(F = d->getFeature(IFeature::FId(IFeature::All, stream.attributes().value("feature").toString().toLongLong())))) + return NULL; + } + a->Role = stream.attributes().value("role").toString(); + a->theMapFeature = F; + a->Position = stream.attributes().value("pos").toString().toUInt(); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Command") { + Command::fromXML(d, stream, a); + } + stream.readNext(); + } + + return a; +} + +/* RelationRemoveFeatureCommand */ + +RelationRemoveFeatureCommand::RelationRemoveFeatureCommand(Relation* R) +: Command(R), theLayer(0), oldLayer(0), Idx(0), theRelation(R), theMapFeature(0) +{ +} + +RelationRemoveFeatureCommand::RelationRemoveFeatureCommand(Relation* R, Feature* W, Layer* aLayer) +: Command(R), theLayer(aLayer), oldLayer(0), Idx(R->find(W)), theRelation(R), theMapFeature(W) +{ + if (!theLayer) + theLayer = theRelation->layer(); + Role = R->getRole(Idx); + redo(); +} + +RelationRemoveFeatureCommand::RelationRemoveFeatureCommand(Relation* R, int anIdx, Layer* aLayer) +: Command(R), theLayer(aLayer), oldLayer(0), Idx(anIdx), theRelation(R), Role(R->getRole(anIdx)), theMapFeature(R->get(anIdx)) +{ + if (!theLayer) + theLayer = theRelation->layer(); + redo(); +} + +RelationRemoveFeatureCommand::~RelationRemoveFeatureCommand(void) +{ + oldLayer->decDirtyLevel(commandDirtyLevel); +} + + +void RelationRemoveFeatureCommand::undo() +{ + Command::undo(); + theRelation->add(Role,theMapFeature,Idx); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + theLayer->remove(theRelation); + oldLayer->add(theRelation); + } + decDirtyLevel(oldLayer, theRelation); +} + +void RelationRemoveFeatureCommand::redo() +{ + oldLayer = theRelation->layer(); + theRelation->remove(Idx); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + oldLayer->remove(theRelation); + theLayer->add(theRelation); + } + incDirtyLevel(oldLayer, theRelation); + Command::redo(); +} + +bool RelationRemoveFeatureCommand::buildDirtyList(DirtyList& theList) +{ + if (isUndone) + return false; + if (theRelation->lastUpdated() == Feature::NotYetDownloaded) + return theList.noop(theRelation); + if (!theRelation->layer()) + return theList.update(theRelation); + if (theRelation->isUploadable()) + return theList.update(theRelation); + + return theList.noop(theRelation); +} + +bool RelationRemoveFeatureCommand::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement("RelationRemoveFeatureCommand"); + + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("relation", theRelation->xmlId()); + stream.writeAttribute("feature", theMapFeature->xmlId()); + stream.writeAttribute("featureclass", theMapFeature->getClass()); + stream.writeAttribute("index", QString::number(Idx)); + stream.writeAttribute("role", Role); + if (theLayer) + stream.writeAttribute("layer", theLayer->id()); + if (oldLayer) + stream.writeAttribute("oldlayer", oldLayer->id()); + + Command::toXML(stream); + stream.writeEndElement(); + + return OK; +} + +RelationRemoveFeatureCommand * RelationRemoveFeatureCommand::fromXML(Document * d, QXmlStreamReader& stream) +{ + RelationRemoveFeatureCommand* a = new RelationRemoveFeatureCommand(); + + a->setId(stream.attributes().value("xml:id").toString()); + if (stream.attributes().hasAttribute("layer")) + a->theLayer = d->getLayer(stream.attributes().value("layer").toString()); + else + a->theLayer = d->getDirtyOrOriginLayer(); + if (stream.attributes().hasAttribute("oldlayer")) + a->oldLayer = d->getLayer(stream.attributes().value("oldlayer").toString()); + else + a->oldLayer = NULL; + if (!a->theLayer) + return NULL; + + a->theRelation = Feature::getRelationOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::OsmRelation, stream.attributes().value("relation").toString().toLongLong())); + Feature* F = NULL; + if (stream.attributes().value("featureclass") == "Node") { + F = (Feature*) Feature::getNodeOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::Point, stream.attributes().value("feature").toString().toLongLong())); + } else + if (stream.attributes().value("featureclass") == "Way") { + F = (Feature*) Feature::getWayOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::LineString, stream.attributes().value("feature").toString().toLongLong())); + } else + if (stream.attributes().value("featureclass") == "Relation") { + F = (Feature*) Feature::getRelationOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::OsmRelation, stream.attributes().value("feature").toString().toLongLong())); + } else { + if (!(F = d->getFeature(IFeature::FId(IFeature::All, stream.attributes().value("feature").toString().toLongLong())))) + return NULL; + } + a->theMapFeature = F; + a->Idx = stream.attributes().value("index").toString().toInt(); + a->Role = stream.attributes().value("role").toString(); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Command") { + Command::fromXML(d, stream, a); + } + stream.readNext(); + } + + return a; +} + + + + diff --git a/src/Commands/RelationCommands.h b/src/Commands/RelationCommands.h new file mode 100644 index 0000000..adeed94 --- /dev/null +++ b/src/Commands/RelationCommands.h @@ -0,0 +1,64 @@ +#ifndef MERKAARTOR_RELATIONCOMMANDS_H_ +#define MERKAARTOR_RELATIONCOMMANDS_H_ + +#include "Command.h" + +#include <QString> + +class Relation; +class Feature; +class Layer; + +class RelationAddFeatureCommand : public Command +{ + public: + RelationAddFeatureCommand(Relation* R = NULL); + RelationAddFeatureCommand(Relation* R, const QString& Role, Feature* W, Layer* aLayer=NULL); + RelationAddFeatureCommand(Relation* R, const QString& Role, Feature* W, int Position, Layer* aLayer=NULL); + ~RelationAddFeatureCommand(void); + + virtual void undo(); + virtual void redo(); + virtual bool buildDirtyList(DirtyList& theList); + + virtual bool toXML(QXmlStreamWriter& stream) const; + static RelationAddFeatureCommand* fromXML(Document* d, QXmlStreamReader& stream); + + private: + Layer* theLayer; + Layer* oldLayer; + Relation* theRelation; + QString Role; + Feature* theMapFeature; + int Position; +}; + +class RelationRemoveFeatureCommand : public Command +{ + public: + RelationRemoveFeatureCommand(Relation* R = NULL); + RelationRemoveFeatureCommand(Relation* R, Feature* W, Layer* aLayer=NULL); + RelationRemoveFeatureCommand(Relation* R, int anIdx, Layer* aLayer=NULL); + ~RelationRemoveFeatureCommand(void); + + virtual void undo(); + virtual void redo(); + virtual bool buildDirtyList(DirtyList& theList); + + virtual bool toXML(QXmlStreamWriter& stream) const; + static RelationRemoveFeatureCommand* fromXML(Document* d, QXmlStreamReader& stream); + + private: + Layer* theLayer; + Layer* oldLayer; + int Idx; + Relation* theRelation; + QString Role; + Feature* theMapFeature; +}; + + + +#endif + + diff --git a/src/Commands/TrackSegmentCommands.cpp b/src/Commands/TrackSegmentCommands.cpp new file mode 100644 index 0000000..646c74b --- /dev/null +++ b/src/Commands/TrackSegmentCommands.cpp @@ -0,0 +1,196 @@ +#include "TrackSegmentCommands.h" + +#include "TrackSegment.h" +#include "Node.h" +#include "Layer.h" +#include "DirtyList.h" + +TrackSegmentAddNodeCommand::TrackSegmentAddNodeCommand(TrackSegment* R) +: Command(R), theLayer(0), oldLayer(0), theTrackSegment(R), theNode(0), Position(0) +{ +} + +TrackSegmentAddNodeCommand::TrackSegmentAddNodeCommand(TrackSegment* R, TrackNode* W, Layer* aLayer) +: Command(R), theLayer(aLayer), oldLayer(0), theTrackSegment(R), theNode(W), Position(theTrackSegment->size()) +{ + redo(); +} + +TrackSegmentAddNodeCommand::TrackSegmentAddNodeCommand(TrackSegment* R, TrackNode* W, int aPos, Layer* aLayer) +: Command(R), theLayer(aLayer), oldLayer(0), theTrackSegment(R), theNode(W), Position(aPos) +{ + redo(); +} + +TrackSegmentAddNodeCommand::~TrackSegmentAddNodeCommand(void) +{ + if (oldLayer) + oldLayer->decDirtyLevel(commandDirtyLevel); +} + +void TrackSegmentAddNodeCommand::undo() +{ + Command::undo(); + theTrackSegment->remove(Position); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + theLayer->remove(theTrackSegment); + oldLayer->add(theTrackSegment); + } + decDirtyLevel(oldLayer, theTrackSegment); +} + +void TrackSegmentAddNodeCommand::redo() +{ + theTrackSegment->add(theNode, Position); + oldLayer = theTrackSegment->layer(); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + oldLayer->remove(theTrackSegment); + theLayer->add(theTrackSegment); + } + incDirtyLevel(oldLayer, theTrackSegment); + Command::redo(); +} + +bool TrackSegmentAddNodeCommand::buildDirtyList(DirtyList& /* theList */) +{ + return false; +} + +bool TrackSegmentAddNodeCommand::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement("TrackSegmentAddTrackPointCommand"); + + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("tracksegment", theTrackSegment->xmlId()); + stream.writeAttribute("trackpoint", theNode->xmlId()); + stream.writeAttribute("pos", QString::number(Position)); + if (theLayer) + stream.writeAttribute("layer", theLayer->id()); + if (oldLayer) + stream.writeAttribute("oldlayer", oldLayer->id()); + + stream.writeEndElement(); + return OK; +} + +TrackSegmentAddNodeCommand * TrackSegmentAddNodeCommand::fromXML(Document * d, QXmlStreamReader& stream) +{ + TrackSegmentAddNodeCommand* a = new TrackSegmentAddNodeCommand(); + a->setId(stream.attributes().value("xml:id").toString()); + if (stream.attributes().hasAttribute("layer")) + a->theLayer = d->getLayer(stream.attributes().value("layer").toString()); + else + a->theLayer = NULL; + if (stream.attributes().hasAttribute("oldlayer")) + a->oldLayer = d->getLayer(stream.attributes().value("oldlayer").toString()); + else + a->oldLayer = NULL; + if (!a->theLayer) + return NULL; + + a->theTrackSegment = dynamic_cast<TrackSegment*>(d->getFeature(IFeature::FId(IFeature::GpxSegment, stream.attributes().value("tracksegment").toString().toLongLong()))); + a->theNode = Feature::getTrackNodeOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::Point, stream.attributes().value("trackpoint").toString().toLongLong())); + a->Position = stream.attributes().value("pos").toString().toUInt(); + + return a; +} + +/* TRACKSEGMENTREMOVETRACKPOINTCOMMAND */ + +TrackSegmentRemoveNodeCommand::TrackSegmentRemoveNodeCommand(TrackSegment* R) +: Command(R), theLayer(0), oldLayer(0), Idx(0), theTrackSegment(R), theTrackPoint(0) +{ +}; + +TrackSegmentRemoveNodeCommand::TrackSegmentRemoveNodeCommand(TrackSegment* R, TrackNode* W, Layer* aLayer) +: Command(R), theLayer(aLayer), oldLayer(0), Idx(R->find(W)), theTrackSegment(R), theTrackPoint(W) +{ + redo(); +} + +TrackSegmentRemoveNodeCommand::TrackSegmentRemoveNodeCommand(TrackSegment* R, int anIdx, Layer* aLayer) +: Command(R), theLayer(aLayer), oldLayer(0), Idx(anIdx), theTrackSegment(R), theTrackPoint(CAST_TRACKNODE(R->get(anIdx))) +{ + redo(); +} + +TrackSegmentRemoveNodeCommand::~TrackSegmentRemoveNodeCommand(void) +{ + if (oldLayer) + oldLayer->decDirtyLevel(commandDirtyLevel); +} + +void TrackSegmentRemoveNodeCommand::undo() +{ + Command::undo(); + theTrackSegment->add(theTrackPoint,Idx); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + theLayer->remove(theTrackSegment); + oldLayer->add(theTrackSegment); + } + decDirtyLevel(oldLayer, theTrackSegment); +} + +void TrackSegmentRemoveNodeCommand::redo() +{ + theTrackSegment->remove(Idx); + oldLayer = theTrackSegment->layer(); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + oldLayer->remove(theTrackSegment); + theLayer->add(theTrackSegment); + } + incDirtyLevel(oldLayer, theTrackSegment); + Command::redo(); +} + +bool TrackSegmentRemoveNodeCommand::buildDirtyList(DirtyList& /* theList */) +{ + return false; +} + +bool TrackSegmentRemoveNodeCommand::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement("TrackSegmentRemoveTrackPointCommand"); + + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("tracksegment", theTrackSegment->xmlId()); + stream.writeAttribute("trackpoint", theTrackPoint->xmlId()); + stream.writeAttribute("index", QString::number(Idx)); + if (theLayer) + stream.writeAttribute("layer", theLayer->id()); + if (oldLayer) + stream.writeAttribute("oldlayer", oldLayer->id()); + + stream.writeEndElement(); + return OK; +} + +TrackSegmentRemoveNodeCommand * TrackSegmentRemoveNodeCommand::fromXML(Document * d, QXmlStreamReader& stream) +{ + TrackSegmentRemoveNodeCommand* a = new TrackSegmentRemoveNodeCommand(); + a->setId(stream.attributes().value("xml:id").toString()); + if (stream.attributes().hasAttribute("layer")) + a->theLayer = d->getLayer(stream.attributes().value("layer").toString()); + else + a->theLayer = NULL; + if (stream.attributes().hasAttribute("oldlayer")) + a->oldLayer = d->getLayer(stream.attributes().value("oldlayer").toString()); + else + a->oldLayer = NULL; + if (!a->theLayer) + return NULL; + + a->theTrackSegment = dynamic_cast<TrackSegment*>(d->getFeature(IFeature::FId(IFeature::GpxSegment, stream.attributes().value("tracksegment").toString().toLongLong()))); + a->theTrackPoint = Feature::getTrackNodeOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::Point, stream.attributes().value("trackpoint").toString().toLongLong())); + a->Idx = stream.attributes().value("index").toString().toUInt(); + + return a; +} + + + + diff --git a/src/Commands/TrackSegmentCommands.h b/src/Commands/TrackSegmentCommands.h new file mode 100644 index 0000000..bb9b98a --- /dev/null +++ b/src/Commands/TrackSegmentCommands.h @@ -0,0 +1,58 @@ +#ifndef MERKAARTOR_TRACKSEGMENTCOMMANDS_H_ +#define MERKAARTOR_TRACKSEGMENTCOMMANDS_H_ + +#include "Command.h" + +class TrackSegment; +class TrackNode; +class Layer; + +class TrackSegmentAddNodeCommand : public Command +{ + public: + TrackSegmentAddNodeCommand(TrackSegment* R = NULL); + TrackSegmentAddNodeCommand(TrackSegment* R, TrackNode* W, Layer* aLayer=NULL); + TrackSegmentAddNodeCommand(TrackSegment* R, TrackNode* W, int Position, Layer* aLayer=NULL); + ~TrackSegmentAddNodeCommand(void); + + virtual void undo(); + virtual void redo(); + virtual bool buildDirtyList(DirtyList& theList); + + virtual bool toXML(QXmlStreamWriter& stream) const; + static TrackSegmentAddNodeCommand* fromXML(Document* d, QXmlStreamReader& stream); + + private: + Layer* theLayer; + Layer* oldLayer; + TrackSegment* theTrackSegment; + TrackNode* theNode; + int Position; +}; + +class TrackSegmentRemoveNodeCommand : public Command +{ + public: + TrackSegmentRemoveNodeCommand(TrackSegment* R = NULL); + TrackSegmentRemoveNodeCommand(TrackSegment* R, TrackNode* W, Layer* aLayer=NULL); + TrackSegmentRemoveNodeCommand(TrackSegment* R, int anIdx, Layer* aLayer=NULL); + ~TrackSegmentRemoveNodeCommand(void); + + virtual void undo(); + virtual void redo(); + virtual bool buildDirtyList(DirtyList& theList); + + virtual bool toXML(QXmlStreamWriter& stream) const; + static TrackSegmentRemoveNodeCommand* fromXML(Document* d, QXmlStreamReader& stream); + + private: + Layer* theLayer; + Layer* oldLayer; + int Idx; + TrackSegment* theTrackSegment; + TrackNode* theTrackPoint; +}; + +#endif + + diff --git a/src/Commands/WayCommands.cpp b/src/Commands/WayCommands.cpp new file mode 100644 index 0000000..9433106 --- /dev/null +++ b/src/Commands/WayCommands.cpp @@ -0,0 +1,255 @@ +#include "WayCommands.h" + +#include "Way.h" +#include "Node.h" +#include "Layer.h" +#include "DirtyList.h" + +WayAddNodeCommand::WayAddNodeCommand(Way* R) +: Command (R), theLayer(0), oldLayer(0), theRoad(R), theTrackPoint(0), Position(0) +{ +} + +WayAddNodeCommand::WayAddNodeCommand(Way* R, Node* W, Layer* aLayer) +: Command (R), theLayer(aLayer), oldLayer(0), theRoad(R), theTrackPoint(W), Position(theRoad->size()) +{ + if (!theLayer) + theLayer = theRoad->layer(); + redo(); +} + +WayAddNodeCommand::WayAddNodeCommand(Way* R, Node* W, int aPos, Layer* aLayer) +: Command(R), theLayer(aLayer), oldLayer(0), theRoad(R), theTrackPoint(W), Position(aPos) +{ + if (!theLayer) + theLayer = theRoad->layer(); + redo(); +} + +WayAddNodeCommand::~WayAddNodeCommand(void) +{ + if (oldLayer) + oldLayer->decDirtyLevel(commandDirtyLevel); +} + +void WayAddNodeCommand::undo() +{ + Command::undo(); + theRoad->remove(Position); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + theLayer->remove(theRoad); + oldLayer->add(theRoad); + } + decDirtyLevel(oldLayer, theRoad); +} + +void WayAddNodeCommand::redo() +{ + oldLayer = theRoad->layer(); + theRoad->add(theTrackPoint, Position); + if (theLayer && oldLayer && (theLayer != oldLayer)) { + oldLayer->remove(theRoad); + theLayer->add(theRoad); + } + incDirtyLevel(oldLayer, theRoad); + Command::redo(); +} + +bool WayAddNodeCommand::buildDirtyList(DirtyList& theList) +{ + if (isUndone) + return false; + if (theRoad->lastUpdated() == Feature::NotYetDownloaded) + return theList.noop(theRoad); + if (!theRoad->layer()) + return theList.update(theRoad); + if (theRoad->isUploadable() && theTrackPoint->isUploadable()) + return theList.update(theRoad); + + return theList.noop(theRoad); +} + +bool WayAddNodeCommand::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement("RoadAddTrackPointCommand"); + + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("road", theRoad->xmlId()); + stream.writeAttribute("trackpoint", theTrackPoint->xmlId()); + stream.writeAttribute("pos", QString::number(Position)); + if (theLayer) + stream.writeAttribute("layer", theLayer->id()); + if (oldLayer) + stream.writeAttribute("oldlayer", oldLayer->id()); + + Command::toXML(stream); + stream.writeEndElement(); + + return OK; +} + +WayAddNodeCommand * WayAddNodeCommand::fromXML(Document * d, QXmlStreamReader& stream) +{ + WayAddNodeCommand* a = new WayAddNodeCommand(); + a->setId(stream.attributes().value("xml:id").toString()); + if (stream.attributes().hasAttribute("layer")) + a->theLayer = d->getLayer(stream.attributes().value("layer").toString()); + else + a->theLayer = d->getDirtyOrOriginLayer(); + if (stream.attributes().hasAttribute("oldlayer")) + a->oldLayer = d->getLayer(stream.attributes().value("oldlayer").toString()); + else + a->oldLayer = NULL; + if (!a->theLayer) + return NULL; + + a->theRoad = Feature::getWayOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::LineString, stream.attributes().value("road").toString().toLongLong())); + a->theTrackPoint = Feature::getNodeOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::Point, stream.attributes().value("trackpoint").toString().toLongLong())); + a->Position = stream.attributes().value("pos").toString().toUInt(); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Command") { + Command::fromXML(d, stream, a); + } + stream.readNext(); + } + + return a; +} + +/* ROADREMOVETRACKPOINTCOMMAND */ + +WayRemoveNodeCommand::WayRemoveNodeCommand(Way* R) +: Command(R), theLayer(0), oldLayer(0), Idx(0), wasClosed(R ? R->isClosed() : false), theRoad(R), theNode(0) +{ +} + +WayRemoveNodeCommand::WayRemoveNodeCommand(Way* R, Node* W, Layer* aLayer) +: Command(R), theLayer(aLayer), oldLayer(0), Idx(R->find(W)), wasClosed(R ? R->isClosed() : false), theRoad(R), theNode(W) +{ + if (!theLayer) + theLayer = theRoad->layer(); + redo(); +} + +WayRemoveNodeCommand::WayRemoveNodeCommand(Way* R, int anIdx, Layer* aLayer) +: Command(R), theLayer(aLayer), oldLayer(0), Idx(anIdx), wasClosed(R ? R->isClosed() : false), theRoad(R), theNode(R->getNode(anIdx)) +{ + if (!theLayer) + theLayer = theRoad->layer(); + redo(); +} + +WayRemoveNodeCommand::~WayRemoveNodeCommand(void) +{ + if (oldLayer) + oldLayer->decDirtyLevel(commandDirtyLevel); +} + +void WayRemoveNodeCommand::undo() +{ + Command::undo(); + theRoad->add(theNode,Idx); + if (wasClosed && Idx == 0) { + theRoad->remove(theRoad->size()-1); + theRoad->add(theNode); + } + + if (theLayer && oldLayer && (theLayer != oldLayer)) { + theLayer->remove(theRoad); + oldLayer->add(theRoad); + } + decDirtyLevel(oldLayer, theRoad); +} + +void WayRemoveNodeCommand::redo() +{ + oldLayer = theRoad->layer(); + theRoad->remove(Idx); + if (wasClosed && Idx == 0) { + theRoad->remove(theRoad->size()-1); + theRoad->add(theRoad->getNode(0)); + } + + if (theLayer && oldLayer && (theLayer != oldLayer)) { + oldLayer->remove(theRoad); + theLayer->add(theRoad); + } + incDirtyLevel(oldLayer, theRoad); + Command::redo(); +} + +bool WayRemoveNodeCommand::buildDirtyList(DirtyList& theList) +{ + if (isUndone) + return false; + if (theRoad->lastUpdated() == Feature::NotYetDownloaded) + return theList.noop(theRoad); + if (!theRoad->layer()) + return theList.update(theRoad); + if (theRoad->isUploadable() && (theNode->isUploadable() || theNode->hasOSMId())) + return theList.update(theRoad); + + return theList.noop(theRoad); +} + +bool WayRemoveNodeCommand::toXML(QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement("RoadRemoveTrackPointCommand"); + + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("road", theRoad->xmlId()); + stream.writeAttribute("trackpoint", theNode->xmlId()); + stream.writeAttribute("index", QString::number(Idx)); + if (wasClosed) + stream.writeAttribute("closed", "true"); + if (theLayer) + stream.writeAttribute("layer", theLayer->id()); + if (oldLayer) + stream.writeAttribute("oldlayer", oldLayer->id()); + + Command::toXML(stream); + stream.writeEndElement(); + + return OK; +} + +WayRemoveNodeCommand * WayRemoveNodeCommand::fromXML(Document * d, QXmlStreamReader& stream) +{ + WayRemoveNodeCommand* a = new WayRemoveNodeCommand(); + a->setId(stream.attributes().value("xml:id").toString()); + if (stream.attributes().hasAttribute("layer")) + a->theLayer = d->getLayer(stream.attributes().value("layer").toString()); + else + a->theLayer = d->getDirtyOrOriginLayer(); + if (stream.attributes().hasAttribute("oldlayer")) + a->oldLayer = d->getLayer(stream.attributes().value("oldlayer").toString()); + else + a->oldLayer = NULL; + if (!a->theLayer) + return NULL; + + a->wasClosed = (stream.attributes().hasAttribute("closed") && stream.attributes().value("closed") == "true"); + a->theRoad = Feature::getWayOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::LineString, stream.attributes().value("road").toString().toLongLong())); + a->theNode = Feature::getNodeOrCreatePlaceHolder(d, a->theLayer, IFeature::FId(IFeature::Point, stream.attributes().value("trackpoint").toString().toLongLong())); + a->Idx = stream.attributes().value("index").toString().toUInt(); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Command") { + Command::fromXML(d, stream, a); + } + stream.readNext(); + } + + return a; +} + + + + diff --git a/src/Commands/WayCommands.h b/src/Commands/WayCommands.h new file mode 100644 index 0000000..1b7f308 --- /dev/null +++ b/src/Commands/WayCommands.h @@ -0,0 +1,59 @@ +#ifndef MERKAARTOR_WAYOMMANDS_H_ +#define MERKAARTOR_WAYOMMANDS_H_ + +#include "Command.h" + +class Way; +class Node; +class Layer; + +class WayAddNodeCommand : public Command +{ + public: + WayAddNodeCommand(Way* R = NULL); + WayAddNodeCommand(Way* R, Node* W, Layer* aLayer=NULL); + WayAddNodeCommand(Way* R, Node* W, int Position, Layer* aLayer=NULL); + ~WayAddNodeCommand(void); + + virtual void undo(); + virtual void redo(); + virtual bool buildDirtyList(DirtyList& theList); + + virtual bool toXML(QXmlStreamWriter& stream) const; + static WayAddNodeCommand* fromXML(Document* d, QXmlStreamReader& stream); + + private: + Layer* theLayer; + Layer* oldLayer; + Way* theRoad; + Node* theTrackPoint; + int Position; +}; + +class WayRemoveNodeCommand : public Command +{ + public: + WayRemoveNodeCommand(Way* R = NULL); + WayRemoveNodeCommand(Way* R, Node* W, Layer* aLayer=NULL); + WayRemoveNodeCommand(Way* R, int anIdx, Layer* aLayer=NULL); + ~WayRemoveNodeCommand(void); + + virtual void undo(); + virtual void redo(); + virtual bool buildDirtyList(DirtyList& theList); + + virtual bool toXML(QXmlStreamWriter& stream) const; + static WayRemoveNodeCommand* fromXML(Document* d, QXmlStreamReader& stream); + + private: + Layer* theLayer; + Layer* oldLayer; + int Idx; + bool wasClosed; + Way* theRoad; + Node* theNode; +}; + +#endif + + diff --git a/src/Config.pri b/src/Config.pri new file mode 100644 index 0000000..5a8d42b --- /dev/null +++ b/src/Config.pri @@ -0,0 +1,45 @@ +# see http://merkaartor.be/wiki/merkaartor/Compiling + +REVISION = $$system( git describe --tags ) +VERSION = $$system( git describe --tags HEAD | sed "'s/-g.*//;s/-/./g'" ) +isEmpty( REVISION ) { + REVISION = $$system(head -n 3 ../CHANGELOG | tail -n 1 | sed "'s/^v//'") + VERSION = $$REVISION +} + +ARCH="" +BITS="" +win32 { + ARCH="-$$QMAKE_HOST.arch" + win32-g++:contains(QMAKE_HOST.arch, x86_64):{ + BITS=64 + REVISION=$${REVISION}-64bit + } else { + BITS=32 + REVISION=$${REVISION}-32bit + } +} + +linux-g++:contains(QT_ARCH, x86_64):{ + REVISION=$${REVISION}-64bit +} + +linux-g++:contains(QT_ARCH, i386):{ + REVISION=$${REVISION}-32bit +} + + + +win32 { + system(echo "!define VER $${REVISION}" > ../windows/version.nch ) + system(echo "!define BITS $${BITS}" >> ../windows/version.nch ) +} + +QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder + +# Append buildflags set in the environment +QMAKE_CPPFLAGS += $$(CPPFLAGS) +QMAKE_CFLAGS += $$(CFLAGS) $$(CPPFLAGS) +QMAKE_CXXFLAGS += $$(CXXFLAGS) $$(CPPFLAGS) +QMAKE_LFLAGS += $$(LDFLAGS) + diff --git a/src/Custom.pri b/src/Custom.pri new file mode 100644 index 0000000..e69de29 diff --git a/src/Docks/DirtyDock.cpp b/src/Docks/DirtyDock.cpp new file mode 100644 index 0000000..4698182 --- /dev/null +++ b/src/Docks/DirtyDock.cpp @@ -0,0 +1,198 @@ +// +// C++ Implementation: DirtyDock +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "DirtyDock.h" +#include "PropertiesDock.h" +#include "MainWindow.h" +#include "MapView.h" +#include "MerkaartorPreferences.h" +#include "Document.h" +#include "Layer.h" +#include "Feature.h" +#include "Command.h" +#include "DirtyList.h" + +#include <QMenu> + +DirtyDock::DirtyDock(MainWindow* aParent) + : MDockAncestor(aParent), Main(aParent) +{ + setMinimumSize(220,100); + setObjectName("dirtyDock"); + + ui.setupUi(getWidget()); + + centerAction = new QAction(NULL, this); + connect(centerAction, SIGNAL(triggered()), this, SLOT(on_centerAction_triggered())); + centerZoomAction = new QAction(NULL, this); + connect(centerZoomAction, SIGNAL(triggered()), this, SLOT(on_centerZoomAction_triggered())); + + connect(ui.ChangesList, SIGNAL(itemSelectionChanged()), this, SLOT(on_ChangesList_itemSelectionChanged())); + connect(ui.ChangesList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(on_ChangesList_itemDoubleClicked(QListWidgetItem*))); + connect(ui.ChangesList, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(on_ChangesList_customContextMenuRequested(const QPoint &))); + + if (M_PREFS->getAutoHistoryCleanup()) + ui.pbCleanupHistory->setVisible(false); + else + connect(ui.pbCleanupHistory, SIGNAL(clicked()), this, SLOT(on_pbCleanupHistory_clicked())); + + retranslateUi(); +} + + +DirtyDock::~DirtyDock() +{ +} + + +void DirtyDock::updateList() +{ + ui.ChangesList->clear(); + + if (!Main->document()) + return; + + int dirtyObjects = Main->document()->getDirtySize(); + switch (dirtyObjects) + { + case 0: + ui.label->setText(tr("There is <b>no</b> dirty object")); + break; + case 1: + ui.label->setText(tr("There is <b>one</b> dirty object")); + break; + + default: + ui.label->setText(tr("There are <b>%n</b> dirty objects", "", dirtyObjects)); + break; + } + + Main->document()->history().buildUndoList(ui.ChangesList); + + if (!M_PREFS->getAutoHistoryCleanup()) { + if (!dirtyObjects) + ui.pbCleanupHistory->setEnabled(true); + else + ui.pbCleanupHistory->setEnabled(false); + } +} + +void DirtyDock::on_ChangesList_itemSelectionChanged() +{ + Feature* F; + + if (ui.ChangesList->selectedItems().count() != 0) { + + if (ui.ChangesList->selectedItems().count() == 1) { + F = Main->document()->getFeature(ui.ChangesList->selectedItems()[0]->data(Qt::UserRole).value<IFeature::FId>()); + if (F) + Main->properties()->setSelection(F); + } else { + Selection.clear(); + for (int i=0; i < ui.ChangesList->selectedItems().count(); ++i) { + F = Main->document()->getFeature(ui.ChangesList->selectedItems()[i]->data(Qt::UserRole).value<IFeature::FId>()); + if (F) + Selection.push_back(F); + } + Main->properties()->setMultiSelection(Selection); + } + + } + Main->view()->update(); +} + +void DirtyDock::on_ChangesList_itemDoubleClicked(QListWidgetItem* /* item */) +{ + on_centerAction_triggered(); +} + +void DirtyDock::on_ChangesList_customContextMenuRequested(const QPoint & pos) +{ + QListWidgetItem *it = ui.ChangesList->itemAt(pos); + if (it) { + QMenu menu(ui.ChangesList); + menu.addAction(centerAction); + menu.addAction(centerZoomAction); + menu.exec(ui.ChangesList->mapToGlobal(pos)); + } +} + +void DirtyDock::on_centerAction_triggered() +{ + Feature* F; + CoordBox cb; + + Main->setUpdatesEnabled(false); + for (int i=0; i < ui.ChangesList->selectedItems().count(); ++i) { + F = Main->document()->getFeature(ui.ChangesList->selectedItems()[i]->data(Qt::UserRole).value<IFeature::FId>()); + if (F) { + if (cb.isNull()) + cb = F->boundingBox(); + else + cb.merge(F->boundingBox()); + } + } + if (!cb.isNull()) { + Coord c = cb.center(); + Main->view()->setCenter(c, Main->view()->rect()); + Main->invalidateView(); + } + Main->setUpdatesEnabled(true); +} + +void DirtyDock::on_centerZoomAction_triggered() +{ + Feature* F; + CoordBox cb; + + Main->setUpdatesEnabled(false); + for (int i=0; i < ui.ChangesList->selectedItems().count(); ++i) { + F = Main->document()->getFeature(ui.ChangesList->selectedItems()[i]->data(Qt::UserRole).value<IFeature::FId>()); + if (F) { + if (cb.isNull()) + cb = F->boundingBox(); + else + cb.merge(F->boundingBox()); + } + } + if (!cb.isNull()) { + CoordBox mini(cb.center()-COORD_ENLARGE, cb.center()+COORD_ENLARGE); + cb.merge(mini); + cb = cb.zoomed(1.1); + Main->view()->setViewport(cb, Main->view()->rect()); + Main->invalidateView(); + } + Main->setUpdatesEnabled(true); +} + +void DirtyDock::on_pbCleanupHistory_clicked() +{ + Main->document()->history().cleanup(); + Main->document()->history().updateActions(); + updateList(); +} + +void DirtyDock::changeEvent(QEvent * event) +{ + if (event->type() == QEvent::LanguageChange) + retranslateUi(); + MDockAncestor::changeEvent(event); +} + +void DirtyDock::retranslateUi() +{ + ui.retranslateUi(getWidget()); + + setWindowTitle(tr("Undo")); + centerAction->setText(tr("Center map")); + centerZoomAction->setText(tr("Center && Zoom map")); + updateList(); +} diff --git a/src/Docks/DirtyDock.h b/src/Docks/DirtyDock.h new file mode 100644 index 0000000..49a7318 --- /dev/null +++ b/src/Docks/DirtyDock.h @@ -0,0 +1,57 @@ +// +// C++ Interface: DirtyDock +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef DIRTYDOCK_H +#define DIRTYDOCK_H + +#include "MDockAncestor.h" +#include <QTextBrowser> + +#include "ui_DirtyDock.h" + +#include <QList> + +class MainWindow; +class Feature; + +/** + @author cbro <cbro@semperpax.com> +*/ +class DirtyDock : public MDockAncestor +{ +Q_OBJECT +public: + DirtyDock(MainWindow* aParent); + + ~DirtyDock(); + +public slots: + void updateList(); + void on_ChangesList_itemSelectionChanged(); + void on_ChangesList_itemDoubleClicked(QListWidgetItem* item); + void on_ChangesList_customContextMenuRequested(const QPoint & pos); + void on_centerAction_triggered(); + void on_centerZoomAction_triggered(); + void on_pbCleanupHistory_clicked(); + +private: + MainWindow* Main; + Ui::DirtyDockWidget ui; + QAction* centerAction; + QAction* centerZoomAction; + + QList<Feature*> Selection; +public: + void changeEvent(QEvent*); + void retranslateUi(); +}; + +#endif diff --git a/src/Docks/DirtyDock.ui b/src/Docks/DirtyDock.ui new file mode 100644 index 0000000..8f62ac8 --- /dev/null +++ b/src/Docks/DirtyDock.ui @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>DirtyDockWidget</class> + <widget class="QWidget" name="DirtyDockWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>302</width> + <height>459</height> + </rect> + </property> + <property name="windowTitle"> + <string>Undo</string> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <widget class="QFrame" name="frame"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>There are <b>no</b> dirty objects.</string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="pbCleanupHistory"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Cleanup</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QListWidget" name="ChangesList"> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/Docks/Docks.pri b/src/Docks/Docks.pri new file mode 100644 index 0000000..945885e --- /dev/null +++ b/src/Docks/Docks.pri @@ -0,0 +1,23 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/Docks +DEPENDPATH += $$MERKAARTOR_SRC_DIR/Docks + +HEADERS += MDockAncestor.h \ + LayerDock.h \ + PropertiesDock.h \ + InfoDock.h \ + StyleDock.h \ + DirtyDock.h \ + FeaturesDock.h +SOURCES += MDockAncestor.cpp \ + PropertiesDock.cpp \ + InfoDock.cpp \ + LayerDock.cpp \ + DirtyDock.cpp \ + StyleDock.cpp \ + FeaturesDock.cpp +FORMS += DirtyDock.ui \ + StyleDock.ui \ + MinimumRelationProperties.ui \ + MinimumTrackPointProperties.ui \ + MinimumRoadProperties.ui \ + FeaturesDock.ui diff --git a/src/Docks/FeaturesDock.cpp b/src/Docks/FeaturesDock.cpp new file mode 100644 index 0000000..bed1553 --- /dev/null +++ b/src/Docks/FeaturesDock.cpp @@ -0,0 +1,483 @@ +// +// C++ Implementation: FeaturesDock +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "FeaturesDock.h" + +#include "MainWindow.h" +#include "MapView.h" +#include "Document.h" +#include "ImageMapLayer.h" +#include "PropertiesDock.h" +#include "Global.h" + +#include "Features.h" + +#include "SelectionDialog.h" +#include "TagSelector.h" + +#include <QAction> +#include <QTimer> +#include <QMenu> + +#define MAX_FEATS 100 + +FeaturesDock::FeaturesDock(MainWindow* aParent) + : MDockAncestor(aParent), + Main(aParent), + curFeatType(IFeature::OsmRelation), + findMode(false) +{ +// setMinimumSize(220,100); + setObjectName("FeaturesDock"); + + ui.setupUi(getWidget()); + +#ifdef Q_OS_MAC + ui.cbWithin->setMinimumWidth(30); +#endif + + ui.cbWithin->setChecked(M_PREFS->getFeaturesWithin()); + ui.FeaturesList->sortItems(); + + connect(this, SIGNAL(visibilityChanged(bool)), this, SLOT(on_Viewport_changed(bool))); + + deleteAction = new QAction(NULL, this); +// deleteAction->setShortcut(QKeySequence::Delete); + ui.FeaturesList->addAction(deleteAction); + connect(deleteAction, SIGNAL(triggered()), SLOT(on_FeaturesList_delete())); + + connect(ui.FeaturesList, SIGNAL(itemSelectionChanged()), this, SLOT(on_FeaturesList_itemSelectionChanged())); + connect(ui.FeaturesList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(on_FeaturesList_itemDoubleClicked(QListWidgetItem*))); + connect(ui.FeaturesList, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(on_FeaturesList_customContextMenuRequested(const QPoint &))); + + connect(ui.cbWithin, SIGNAL(stateChanged(int)), this, SLOT(on_rbWithin_stateChanged(int))); + connect(ui.cbSelectionFilter, SIGNAL(stateChanged(int)), this, SLOT(on_rbSelectionFilter_stateChanged(int))); + connect(ui.btFind, SIGNAL(clicked(bool)), SLOT(on_btFind_clicked(bool))); + connect(ui.btReset, SIGNAL(clicked(bool)), SLOT(on_btReset_clicked(bool))); + + connect(Main->properties(), SIGNAL(selectionChanged()), this, SLOT(updateList())); + + centerAction = new QAction(NULL, this); + connect(centerAction, SIGNAL(triggered()), this, SLOT(on_centerAction_triggered())); + centerZoomAction = new QAction(NULL, this); + connect(centerZoomAction, SIGNAL(triggered()), this, SLOT(on_centerZoomAction_triggered())); + downloadAction = new QAction(NULL, this); + connect(downloadAction, SIGNAL(triggered()), this, SLOT(on_downloadAction_triggered())); + addSelectAction = new QAction(NULL, this); + connect(addSelectAction, SIGNAL(triggered()), this, SLOT(on_addSelectAction_triggered())); + + int t; + t = ui.tabBar->addTab(NULL); + ui.tabBar->setTabData(t, IFeature::OsmRelation); + t = ui.tabBar->addTab(NULL); + ui.tabBar->setTabData(t, IFeature::LineString); + t = ui.tabBar->addTab(NULL); + ui.tabBar->setTabData(t, IFeature::Point); + t = ui.tabBar->addTab(NULL); + ui.tabBar->setTabData(t, IFeature::All); + ui.tabBar->setElideMode(Qt::ElideRight); + ui.tabBar->setUsesScrollButtons(true); + retranslateTabBar(); + + connect(ui.tabBar, SIGNAL(currentChanged (int)), this, SLOT(tabChanged(int))); + //connect(ui.tabBar, SIGNAL(customContextMenuRequested (const QPoint&)), this, SLOT(tabContextMenuRequested(const QPoint&))); + + retranslateUi(); +} + +FeaturesDock::~FeaturesDock() +{ +} + +void FeaturesDock::on_FeaturesList_itemSelectionChanged() +{ + Highlighted.clear(); + for (int i=0; i<ui.FeaturesList->selectedItems().count(); ++i) { + QListWidgetItem* item = ui.FeaturesList->selectedItems()[i]; + Feature * F = item->data(Qt::UserRole).value<Feature*>(); + Highlighted.push_back(F); + } + + Main->view()->update(); +} + +void FeaturesDock::on_FeaturesList_itemDoubleClicked(QListWidgetItem* item) +{ + Feature * F = item->data(Qt::UserRole).value<Feature*>(); + Main->properties()->setSelection(F); + Main->view()->update(); +} + +void FeaturesDock::on_FeaturesList_customContextMenuRequested(const QPoint & pos) +{ + QListWidgetItem *it = ui.FeaturesList->itemAt(pos); + if (!it) + return; + + QMenu menu(ui.FeaturesList); + menu.addAction(addSelectAction); + menu.addAction(deleteAction); + menu.addSeparator(); + menu.addAction(centerAction); + menu.addAction(centerZoomAction); + menu.addSeparator(); + + downloadAction->setEnabled(false); + Feature* F; + for (int i=0; i < ui.FeaturesList->selectedItems().count(); ++i) { + F = ui.FeaturesList->selectedItems()[i]->data(Qt::UserRole).value<Feature*>(); + if (F->notEverythingDownloaded()) { + downloadAction->setEnabled(true); + break; + } + } + menu.addAction(downloadAction); + menu.exec(ui.FeaturesList->mapToGlobal(pos)); +} + +void FeaturesDock::on_FeaturesList_delete() +{ + if (!ui.FeaturesList->selectedItems().count()) + return; + + Feature* F; + Main->view()->blockSignals(true); + + Highlighted.clear(); + Main->properties()->setSelection(0); + for (int i=0; i < ui.FeaturesList->selectedItems().count(); ++i) { + F = ui.FeaturesList->selectedItems()[i]->data(Qt::UserRole).value<Feature*>(); + if (F) { + Main->properties()->addSelection(F); + } + } + + Main->view()->blockSignals(false); +#ifndef _MOBILE + Main->on_editRemoveAction_triggered(); +#endif +} + +void FeaturesDock::on_rbWithin_stateChanged ( int state ) +{ + M_PREFS->setFeaturesWithin((state == Qt::Checked)); + + updateList(); +} + +void FeaturesDock::on_rbSelectionFilter_stateChanged ( int state ) +{ + M_PREFS->setFeaturesSelectionFilter((state == Qt::Checked)); + + updateList(); +} + +void FeaturesDock::on_centerAction_triggered() +{ + Feature* F; + CoordBox cb; + + Main->view()->blockSignals(true); + + for (int i=0; i < ui.FeaturesList->selectedItems().count(); ++i) { + F = ui.FeaturesList->selectedItems()[i]->data(Qt::UserRole).value<Feature*>(); + if (F) { + if (cb.isNull()) + cb = F->boundingBox(); + else + cb.merge(F->boundingBox()); + } + } + if (!cb.isNull()) { + Coord c = cb.center(); + Main->view()->setCenter(c, Main->view()->rect()); + Main->invalidateView(); + } + Main->view()->blockSignals(false); + + QTimer::singleShot(10, this, SLOT(on_Viewport_changed(true))); +} + +void FeaturesDock::on_centerZoomAction_triggered() +{ + Feature* F; + CoordBox cb; + + Main->view()->blockSignals(true); + + for (int i=0; i < ui.FeaturesList->selectedItems().count(); ++i) { + F = ui.FeaturesList->selectedItems()[i]->data(Qt::UserRole).value<Feature*>(); + if (F) { + if (cb.isNull()) + cb = F->boundingBox(); + else + cb.merge(F->boundingBox()); + } + } + if (!cb.isNull()) { + CoordBox mini(cb.center()-COORD_ENLARGE, cb.center()+COORD_ENLARGE); + cb.merge(mini); + cb = cb.zoomed(1.1); + Main->view()->setViewport(cb, Main->view()->rect()); + Main->invalidateView(); + } + Main->view()->blockSignals(false); + + QTimer::singleShot(10, this, SLOT(on_Viewport_changed(true))); +} + +void FeaturesDock::on_downloadAction_triggered() +{ +#ifndef _MOBILE + Feature* F; + QList<Feature*> toResolve; + for (int i=0; i < ui.FeaturesList->selectedItems().count(); ++i) { + F = ui.FeaturesList->selectedItems()[i]->data(Qt::UserRole).value<Feature*>(); + + if (F->notEverythingDownloaded()) { + toResolve.push_back(F); + } + } + Main->downloadFeatures(toResolve); +#endif +} + +void FeaturesDock::on_addSelectAction_triggered() +{ + Feature* F; + Main->view()->blockSignals(true); + + for (int i=0; i < ui.FeaturesList->selectedItems().count(); ++i) { + F = ui.FeaturesList->selectedItems()[i]->data(Qt::UserRole).value<Feature*>(); + if (F) { + Main->properties()->addSelection(F); + } + } + + Main->view()->blockSignals(false); +} + +void FeaturesDock::on_btFind_clicked(bool) +{ + SelectionDialog* dlg = new SelectionDialog(Main); + if (!dlg->exec()) + return; + + TagSelector* tsel = TagSelector::parse(dlg->edTagQuery->text()); + if (!tsel) + return; + + Found.clear(); + int added = 0; + for (VisibleFeatureIterator i(Main->document()); !i.isEnd() && (!dlg->sbMaxResult->value() || added < dlg->sbMaxResult->value()); ++i) { + if (tsel->matches(i.get(), Main->view()->pixelPerM())) { + Found << i.get(); + } + } + + findMode = true; + ui.tabBar->blockSignals(true); + ui.tabBar->setCurrentIndex(3); + ui.tabBar->blockSignals(false); + tabChanged(3); +} + +void FeaturesDock::on_btReset_clicked(bool) +{ + findMode = false; + updateList(); +} + +void FeaturesDock::changeEvent(QEvent * event) +{ + if (event->type() == QEvent::LanguageChange) + retranslateUi(); + MDockAncestor::changeEvent(event); +} + +void FeaturesDock::tabChanged(int idx) +{ + curFeatType = (IFeature::FeatureType)ui.tabBar->tabData(idx).toInt(); + ui.FeaturesList->clear(); + Highlighted.clear(); + + if (curFeatType == IFeature::OsmRelation) + ui.cbSelectionFilter->setEnabled(true); + else + ui.cbSelectionFilter->setEnabled(false); + + updateList(); +} + +void FeaturesDock::on_Viewport_changed(bool visible) +{ + // Note: This is a bit of a hack. It appers the signal visibilityChanged() + // is called AFTER parent windows are destroyed, and the Main object is no + // longer valid. This manifests itself on OSX during automated tests, where + // the MainWindow is closed rapidly and may be worth a bit more + // investigation. We avoid this problem by only updating the data when the + // dock is shown, which is good enough for normal operation. + if (visible) { + theViewport = Main->view()->viewport(); + + updateList(); + } +} + +void FeaturesDock::addItem(MapFeaturePtr F) +{ + if (ui.FeaturesList->count() > MAX_FEATS) + return; + + QListWidgetItem* newItem = NULL; + + if (curFeatType == IFeature::OsmRelation || curFeatType == Feature::All) + { + if (Relation* R = CAST_RELATION(F)) { + /* Include all relations if nothing is selected, otherwisde only the + * intersection of selected items and relations */ + bool includeThis; + if ((Main->properties()->selection().size() > 0) && (ui.cbSelectionFilter->isChecked())) { + includeThis = false; + foreach (Feature* sel, Main->properties()->selection()) { + if (R->find(sel) < R->size()) { + includeThis = true; + break; + } + } + } else includeThis = true; + + if (includeThis) { + newItem = new QListWidgetItem(R->description(), ui.FeaturesList); + } + } + } + if (curFeatType == IFeature::LineString || curFeatType == IFeature::Polygon || curFeatType == Feature::All) + { + if (Way* R = CAST_WAY(F)) + newItem = new QListWidgetItem(R->description(), ui.FeaturesList); + } + if (curFeatType == IFeature::Point || curFeatType == Feature::All) + { + if (Node* N = CAST_NODE(F)) + newItem = new QListWidgetItem(N->description(), ui.FeaturesList); + } + if (newItem) { + newItem->setData(Qt::UserRole, QVariant::fromValue(F)); + if (Highlighted.contains(F)) newItem->setSelected(true); + } +} + +void FeaturesDock::invalidate() +{ + ui.FeaturesList->clear(); + Highlighted.clear(); + Found.clear(); +} + +void FeaturesDock::clearItems() +{ + for(int i=ui.FeaturesList->count()-1; i>=0; --i) { + QListWidgetItem* item = ui.FeaturesList->item(i); + if (item->isSelected()) { + Feature * F = item->data(Qt::UserRole).value<Feature*>(); + if (F->isDeleted()) { + item->setSelected(false); + Highlighted.removeOne(F); + } + } + delete item; + } +} + +void FeaturesDock::updateList() +{ + setUpdatesEnabled(false); + ui.FeaturesList->blockSignals(true); + + clearItems(); + + if (!isVisible() || !Main->document()) + return; + + if (findMode) { + foreach (MapFeaturePtr F, Found) { + if (ui.cbWithin->isChecked()) { + if (Main->view()->viewport().contains(F->boundingBox())) + addItem(F); + } else + addItem(F); + } + } else { + for (int j=0; j<Main->document()->layerSize(); ++j) { + if (!Main->document()->getLayer(j)->size()) + continue; + QList < Feature* > ret = g_backend.indexFind(Main->document()->getLayer(j), theViewport); + foreach (Feature* F, ret) { + if (F->isHidden()) + continue; + + if (ui.cbWithin->isChecked()) { + if (Main->view()->viewport().contains(F->boundingBox())) + addItem(F); + } else + addItem(F); + } + } + } + ui.FeaturesList->sortItems(); + + ui.FeaturesList->blockSignals(false); + setUpdatesEnabled(true); +} + +int FeaturesDock::highlightedSize() const +{ + if (!isVisible()) + return 0; + return Highlighted.size(); +} + +Feature* FeaturesDock::highlighted(int idx) +{ + if (idx < Highlighted.size()) + return Highlighted[idx]; + return 0; +} + +QList<Feature*> FeaturesDock::highlighted() +{ + return Highlighted; +} + +void FeaturesDock::retranslateUi() +{ + ui.retranslateUi(getWidget()); + + setWindowTitle(tr("Features")); + centerAction->setText(tr("Center map")); + centerZoomAction->setText(tr("Center && Zoom map")); + downloadAction->setText(tr("Download missing children")); + addSelectAction->setText(tr("Add to selection")); + deleteAction->setText(tr("Delete")); + + retranslateTabBar(); +} + +void FeaturesDock::retranslateTabBar() +{ + ui.tabBar->setTabText(0, tr("Relations")); + ui.tabBar->setTabText(1, tr("Ways")); + ui.tabBar->setTabText(2, tr("Nodes")); + ui.tabBar->setTabText(3, tr("All")); +} + + diff --git a/src/Docks/FeaturesDock.h b/src/Docks/FeaturesDock.h new file mode 100644 index 0000000..3690e08 --- /dev/null +++ b/src/Docks/FeaturesDock.h @@ -0,0 +1,89 @@ +// +// C++ Interface: FeaturesDock +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef FEATURESDOCK_H +#define FEATURESDOCK_H + +#include "MDockAncestor.h" +#include "Coord.h" +#include "Feature.h" +#include "MapTypedef.h" + +#include "ui_FeaturesDock.h" + +class MainWindow; +class QAction; + +class FeaturesDock : public MDockAncestor +{ +Q_OBJECT +public: + FeaturesDock(MainWindow* aParent); + + ~FeaturesDock(); + + + Feature* highlighted(int idx); + QList<Feature*> highlighted(); + int highlightedSize() const; + +public slots: + void updateList(); + + void on_FeaturesList_itemSelectionChanged(); + void on_FeaturesList_itemDoubleClicked(QListWidgetItem* item); + void on_FeaturesList_customContextMenuRequested(const QPoint & pos); + void on_FeaturesList_delete(); + + void on_rbWithin_stateChanged ( int state ); + void on_rbSelectionFilter_stateChanged ( int state ); + + void on_centerAction_triggered(); + void on_centerZoomAction_triggered(); + void on_downloadAction_triggered(); + void on_addSelectAction_triggered(); + + void on_btFind_clicked(bool); + void on_btReset_clicked(bool); + + void on_Viewport_changed(bool visible); + + void tabChanged(int idx); + + void invalidate(); + +private: + QList<Feature*> Highlighted; + QList<Feature*> Found; + + MainWindow* Main; + Ui::FeaturesDockWidget ui; + QAction* centerAction; + QAction* centerZoomAction; + QAction* downloadAction; + QAction* addSelectAction; + QAction* deleteAction; + + CoordBox theViewport; + IFeature::FeatureType curFeatType; + + void clearItems(); + void addItem(MapFeaturePtr F); + + bool findMode; + +public: + void changeEvent(QEvent*); + void retranslateUi(); + void retranslateTabBar(); +}; + +#endif // FEATURESDOCK_H diff --git a/src/Docks/FeaturesDock.ui b/src/Docks/FeaturesDock.ui new file mode 100644 index 0000000..745fc87 --- /dev/null +++ b/src/Docks/FeaturesDock.ui @@ -0,0 +1,172 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>FeaturesDockWidget</class> + <widget class="QWidget" name="FeaturesDockWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>292</width> + <height>481</height> + </rect> + </property> + <property name="windowTitle"> + <string>Features</string> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>2</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <widget class="QFrame" name="frame"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>2</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <widget class="QTabBar" name="tabBar" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>1</width> + <height>0</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QListWidget" name="FeaturesList"> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QCheckBox" name="cbWithin"/> + </item> + <item> + <widget class="QLabel" name="lblOnlyViewport"> + <property name="toolTip"> + <string>Only features fully within the viewport</string> + </property> + <property name="text"> + <string>Filter by viewport</string> + </property> + <property name="wordWrap"> + <bool>false</bool> + </property> + <property name="buddy"> + <cstring>cbWithin</cstring> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Expanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QToolButton" name="btFind"> + <property name="text"> + <string>Find...</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QCheckBox" name="cbSelectionFilter"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label"> + <property name="toolTip"> + <string>Only show features intersecting current selection.</string> + </property> + <property name="text"> + <string>Filter by selection</string> + </property> + <property name="wordWrap"> + <bool>false</bool> + </property> + <property name="buddy"> + <cstring>cbSelectionFilter</cstring> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QToolButton" name="btReset"> + <property name="text"> + <string>Reset</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>QTabBar</class> + <extends>QWidget</extends> + <header location="global">qtabbar.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> diff --git a/src/Docks/GeoImage.pri b/src/Docks/GeoImage.pri new file mode 100644 index 0000000..745d47c --- /dev/null +++ b/src/Docks/GeoImage.pri @@ -0,0 +1,15 @@ +DEFINES += GEOIMAGE + +# Header files +HEADERS += GeoImageDock.h + +# Source files +SOURCES += GeoImageDock.cpp +LIBS += -lexiv2 +FORMS += PhotoLoadErrorDialog.ui + +contains(ZBAR, 1) { + DEFINES += USE_ZBAR + LIBS += -lzbar +} + diff --git a/src/Docks/GeoImageDock.cpp b/src/Docks/GeoImageDock.cpp new file mode 100644 index 0000000..df83517 --- /dev/null +++ b/src/Docks/GeoImageDock.cpp @@ -0,0 +1,1153 @@ +#include "GeoImageDock.h" + +#include "Node.h" +#include "Layer.h" +#include "DocumentCommands.h" +#include "LayerWidget.h" +#include "PropertiesDock.h" +#include "Global.h" + +#ifdef USE_ZBAR +#include <zbar.h> +#include <zbar/QZBarImage.h> +#endif + +#include <QInputDialog> +#include <QMessageBox> +#include <QProgressDialog> +#include <QClipboard> +#include <QRadioButton> +#include <QTimeEdit> +#include <QDialogButtonBox> +#include <QFileDialog> + +#include <QNetworkAccessManager> +#include <QNetworkRequest> +#include <QNetworkReply> + +#include "ui_PhotoLoadErrorDialog.h" + +#define WARNING(title, message) { \ + if (QMessageBox::warning(this, title, message.arg(file), \ + QMessageBox::Ignore | QMessageBox::Cancel, QMessageBox::Ignore) == QMessageBox::Ignore) \ + continue; \ + else { \ + theView->invalidate(true, true, false); \ + return; \ + } \ +} + +#define QUESTION(title, message, always) { \ + if (always == 0) { \ + int replyButton = QMessageBox::question(this, title, message, \ + QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Abort, QMessageBox::Yes ); \ + if (replyButton == QMessageBox::No) \ + continue; \ + else if (replyButton == QMessageBox::Abort) { \ + theView->invalidate(true, true, false); \ + return; \ + } \ + else if (replyButton != QMessageBox::Yes) \ + always = replyButton; \ + } \ + if (always == QMessageBox::NoToAll) \ + continue; \ +} + +bool GeoImageDock::getWalkingPapersDetails(const QUrl& reqUrl, double &lat, double &lon, bool& positionValid) const +{ + QNetworkAccessManager manager; + QEventLoop q; + QTimer tT; + + if (!reqUrl.host().contains("walking-papers.org")) + return false; + + tT.setSingleShot(true); + connect(&tT, SIGNAL(timeout()), &q, SLOT(quit())); + connect(&manager, SIGNAL(finished(QNetworkReply*)), + &q, SLOT(quit())); + QNetworkReply *reply = manager.get(QNetworkRequest(reqUrl)); + + tT.start(M_PREFS->getNetworkTimeout()); + q.exec(); + if(tT.isActive()) { + // download complete + tT.stop(); + } else { + QMessageBox::warning(0, tr("Network timeout"), tr("Cannot read the photo's details from the Walking Papers server."), QMessageBox::Ok); + return false; + } + + QString center = QString::fromLatin1(reply->rawHeader("X-Print-Center")); + QStringList sl = center.split(" "); + if (sl.size() != 3) + return false; + + //int z = sl[2].toInt(); + lat = sl[0].toDouble(); + lon = sl[1].toDouble(); + positionValid = true; + + return true; +} + +bool GeoImageDock::askAndgetWalkingPapersDetails(double &lat, double &lon, bool& positionValid) const +{ + bool ok; + QString text = QInputDialog::getText(0, tr("Please specify Walking Papers URL"), + tr("URL:"), QLineEdit::Normal, "", &ok); + if (ok && !text.isEmpty()) { + QUrl url(text); + return getWalkingPapersDetails(url, lat, lon, positionValid); + } else + return false; +} + +GeoImageDock::GeoImageDock(MainWindow *aMain) + : MDockAncestor(aMain), Main(aMain) + , photoLayer(0) +{ + curImage = lastImage = -1; + updateByMe = false; + setWindowTitle(tr("Geo Images")); + Image = new ImageView(this); + setWidget(Image); + setObjectName("geoImageDock"); + + setFocusPolicy(Qt::StrongFocus); + setContextMenuPolicy(Qt::ActionsContextMenu); + + centerAction = new QAction(tr("Center map"), this); + centerAction->setShortcut(tr("c")); + remImagesAction = new QAction(tr("Remove Images"), this); + toClipboardAction = new QAction(tr("Copy filename to clipboard"), this); + nextImageAction = new QAction(tr("Select next image"), this); + nextImageAction->setShortcut(tr("PgDown")); + nextImageAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); + previousImageAction = new QAction(tr("Select previous image"), this); + previousImageAction->setShortcut(tr("PgUp")); + previousImageAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); + saveImageAction = new QAction(tr("Save geotagged image..."), this); + + QAction* sep = new QAction(this); + sep->setSeparator(true); + + addAction(centerAction); + addAction(nextImageAction); + addAction(previousImageAction); + addAction(toClipboardAction); + addAction(saveImageAction); + addAction(sep); + addAction(remImagesAction); + + connect(centerAction, SIGNAL(triggered()), this, SLOT(centerMap())); + connect(remImagesAction, SIGNAL(triggered()), this, SLOT(removeImages())); + connect(toClipboardAction, SIGNAL(triggered()), this, SLOT(toClipboard())); + connect(nextImageAction, SIGNAL(triggered()), this, SLOT(selectNext())); + connect(previousImageAction, SIGNAL(triggered()), this, SLOT(selectPrevious())); + connect(saveImageAction, SIGNAL(triggered()), this, SLOT(saveImage())); +} + +GeoImageDock::~GeoImageDock(void) +{ + delete widget(); +} + +void GeoImageDock::clear() +{ + usedTrackPoints.clear(); + curImage = lastImage = -1; + Image->setImage(""); +} + +void GeoImageDock::setImage(Node *Pt) +{ + if (curImage != -1) // save last imageId to start iteration there again + lastImage = curImage; + if (updateByMe) + return; + if (!Pt) { + Image->setImage(""); + curImage = -1; + return; + } + + int ImageId; + for (ImageId = 0; ImageId < usedTrackPoints.size(); ImageId++) // search for an entry in our list + if (usedTrackPoints.at(ImageId).node == Pt) + break; + + if (ImageId == curImage) + return; + + if (ImageId == usedTrackPoints.size()) { // haven't found it + Image->setImage(""); + curImage = -1; + return; + } + + Image->setImage(usedTrackPoints.at(ImageId).filename, (Pt ? true : false)); + curImage = ImageId; +} + +void GeoImageDock::setImage(int ImageId) +{ + if (curImage != -1) // save last imageid to start iteration there again + lastImage = curImage; + if (ImageId < 0 || ImageId >= usedTrackPoints.size()) { // invalid ImageId + Image->setImage(""); + curImage = -1; + return; + } + + int lookImage = ImageId; + + if (usedTrackPoints.at(lookImage).node) { + bool ok = false; + Feature* theFeature; + while (!ok) { + FeatureIterator it(Main->document()); + for (; !it.isEnd(); ++it) // find TrackPoint + if (usedTrackPoints.at(lookImage).node == it.get()) { + break; + } + if (it.isEnd()) + usedTrackPoints.removeAt(ImageId); + if (it.isEnd() || !it.get()->isVisible()) { + if (usedTrackPoints.size()) { + if (++lookImage >= usedTrackPoints.size()) + lookImage = 0; + if (lookImage == ImageId) { + Image->setImage(""); + curImage = -1; + return; + } + } else + break; + } else { + theFeature = it.get(); + ok = true; + } + } + +// if (!ok) { // haven't found one +// Image->setImage(""); +// curImage = -1; +// return; +// } + + updateByMe = true; + if (!Main->properties()->isSelected(theFeature)) { + Main->properties()->setSelection(theFeature); + Main->view()->invalidate(true, true, false); + } + updateByMe = false; + } + + Image->setImage(usedTrackPoints.at(lookImage).filename, (usedTrackPoints.at(lookImage).node ? true : false)); + curImage = lookImage; +} + +void GeoImageDock::removeImages(void) +{ + int i; + + for (i = 0; i < usedTrackPoints.size(); i++) { + Node *Pt = usedTrackPoints.at(i).node; + if (!Pt) { + continue; + } + if (usedTrackPoints.at(i).inserted) { + Pt->layer()->remove(Pt); + g_backend.deallocFeature(Pt->layer(), Pt); + } + else + Pt->clearTag("Picture"); + } + + usedTrackPoints.clear(); + curImage = -1; + Image->setImage(""); + + Main->view()->invalidate(true, true, false); +} + +void GeoImageDock::toClipboard(void) +{ + if (curImage != -1) { + QClipboard *clipboard = QApplication::clipboard(); + + clipboard->setText(usedTrackPoints.at(curImage).filename); + } +} + +void GeoImageDock::selectNext(void) +{ + if (curImage == -1) // restart iteration at last selected image + curImage = lastImage; + if (++curImage >= usedTrackPoints.size()) + curImage = 0; + + setImage(curImage); +} +void GeoImageDock::selectPrevious(void) +{ + if (curImage == -1) // restart iteration at last selected image + curImage = lastImage; + if (--curImage < 0) + curImage = usedTrackPoints.size() - 1; + + setImage(curImage); +} + +void GeoImageDock::centerMap(void) +{ + int index = curImage; + if (index == -1) + index = lastImage; + if (index < 0 || index >= usedTrackPoints.size()) { // invalid ImageId + return; + } + Feature* f = usedTrackPoints.at(index).node; + if (f && !f->isNull()) { + Coord c = f->boundingBox().center(); + Main->view()->setCenter(c, Main->view()->rect()); + Main->invalidateView(); + } +} + +void GeoImageDock::addUsedTrackpoint(NodeData data) +{ + for(int i=0; i<usedTrackPoints.size(); ++i) { + if (usedTrackPoints[i].filename == data.filename) { + usedTrackPoints[i] = data; + return; + } + } + + usedTrackPoints << data; +} + +void GeoImageDock::loadImage(QString file, Coord pos) +{ + Document *theDocument = Main->document(); + //MapView *theView = Main->view(); + + Layer *theLayer; + if (photoLayer == NULL) { + photoLayer = new TrackLayer(tr("Photo layer")); + photoLayer->setReadonly(false); + theDocument->add(photoLayer); + } + + { // retrieve the target layer from the user + QStringList layers; + QList<int> layerId; + int i; + Layer *layer; + Layer *singleLayer = NULL; + Layer *singleTrackLayer = NULL; + int trackLayersCount = 0; + for (i=0;i<theDocument->layerSize();i++) { + layer = theDocument->getLayer(i); + if (!layer->isEnabled()) + continue; + if (layer->classType() == Layer::TrackLayerType) { + trackLayersCount++; + if (!singleTrackLayer) + singleTrackLayer = layer; + } + if (layer->classType() == Layer::TrackLayerType || layer->classType() == Layer::DrawingLayerType) { + if (!singleLayer) + singleLayer = layer; + layers.append(theDocument->getLayer(i)->name()); + layerId.append(i); + } + } + + // Select single layer if there is only one + if (layers.size() == 1) + { + theLayer = singleLayer; + } + // Select single track layer if there is only one + else if (trackLayersCount == 1) + { + theLayer = singleTrackLayer; + } + // Now ask the user what layer to add the photos to + else + { + bool ok; + QString name = QInputDialog::getItem(NULL, tr("Load geotagged Images"), + tr("Select the layer to which the images belong:"), layers, 0, false, &ok); + if (ok && !name.isEmpty()) + theLayer = theDocument->getLayer(layerId.at(layers.indexOf(name))); + else + return; + } + if (theLayer != photoLayer && !photoLayer->size()) { + theDocument->remove(photoLayer); + SAFE_DELETE(photoLayer); + } + } + + if (theLayer->isReadonly()) { // nodes from readonly layers can not be selected and therefore associated images can not be displayed + if (QMessageBox::question(this, tr("Layer is read-only"), + tr("The used layer is not writeable. Should it be made writeable?\nIf not, you can't load images that belong to it."), + QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Yes) == QMessageBox::Yes) + theLayer->getWidget()->setLayerReadonly(false); // this makes/updates both the widget and the layer with readonly = false + else + return; + } + + Node *Pt = 0; + int i = 0; + for (; i<theLayer->size(); ++i) // use existing TrackPoint if there is one in small distance + if ((Pt = CAST_NODE(theLayer->get(i))) && + Pt->position().distanceFrom(pos) <= .002) + break; + else + Pt = 0; + + PhotoNode* phNode; + if (!Pt) { + phNode = g_backend.allocPhotoNode(theLayer, pos); + theLayer->add(Pt); + g_backend.sync(Pt); + } else { + if (CAST_TRACKNODE(Pt)) + phNode = g_backend.allocPhotoNode(theLayer, *CAST_TRACKNODE(Pt)); + else + phNode = g_backend.allocPhotoNode(theLayer, *Pt); + theLayer->add(phNode); + for (int i=0; i<Pt->sizeParents(); ++i) { + Feature *P = CAST_FEATURE(Pt->getParent(i)); + int idx = P->find(Pt); + if (Way* W = CAST_WAY(P)) { + W->add(phNode, idx); + } else if (Relation* R = CAST_RELATION(P)) { + R->add(R->getRole(idx), phNode, idx); + } else if (TrackSegment* S = CAST_SEGMENT(P)) { + S->add(phNode, idx); + } + P->remove(idx+1); + g_backend.deallocFeature(theLayer, Pt); + + } + + } + + QDateTime time = QFileInfo(file).created(); + + //Pt->setTag("_waypoint_", "true"); + phNode->setTag("_picture_", "GeoTagged"); + phNode->setPhoto(QPixmap(file)); + addUsedTrackpoint(NodeData(phNode, file, time, i == theLayer->size())); +} + +void GeoImageDock::loadImages(QStringList fileNames) +{ + QString file; + QDateTime time; + int offset = -1, noMatchQuestion = 0; + + Document *theDocument = Main->document(); + MapView *theView = Main->view(); + + Exiv2::Image::AutoPtr image; + Exiv2::ExifData exifData; + bool positionValid = false; + + Layer *theLayer; + if (photoLayer == NULL) { + photoLayer = new TrackLayer(tr("Photo layer")); + photoLayer->setReadonly(false); + theDocument->add(photoLayer); + } + + { // retrieve the target layer from the user + QStringList layers; + QList<int> layerId; + int i; + Layer *layer; + Layer *singleLayer = NULL; + Layer *singleTrackLayer = NULL; + int trackLayersCount = 0; + for (i=0;i<theDocument->layerSize();i++) { + layer = theDocument->getLayer(i); + if (!layer->isEnabled()) + continue; + if (layer->classType() == Layer::TrackLayerType) { + trackLayersCount++; + if (!singleTrackLayer) + singleTrackLayer = layer; + } + if (layer->classType() == Layer::TrackLayerType || layer->classType() == Layer::DrawingLayerType) { + if (!singleLayer) + singleLayer = layer; + layers.append(theDocument->getLayer(i)->name()); + layerId.append(i); + } + } + + // Select single layer if there is only one + if (layers.size() == 1) + { + theLayer = singleLayer; + } + // Select single track layer if there is only one + else if (trackLayersCount == 1) + { + theLayer = singleTrackLayer; + } + // Now ask the user what layer to add the photos to + else + { + bool ok; + QString name = QInputDialog::getItem(NULL, tr("Load geotagged Images"), + tr("Select the layer to which the images belong:"), layers, 0, false, &ok); + if (ok && !name.isEmpty()) + theLayer = theDocument->getLayer(layerId.at(layers.indexOf(name))); + else + return; + } + if (theLayer != photoLayer && !photoLayer->size()) { + theDocument->remove(photoLayer); + SAFE_DELETE(photoLayer); + } + } + + if (theLayer->isReadonly()) { // nodes from readonly layers can not be selected and therefore associated images can not be displayed + if (QMessageBox::question(this, tr("Layer is read-only"), + tr("The used layer is not writeable. Should it be made writeable?\nIf not, you can't load images that belong to it."), + QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Yes) == QMessageBox::Yes) + theLayer->getWidget()->setLayerReadonly(false); // this makes/updates both the widget and the layer with readonly = false + else + return; + } + + QProgressDialog progress(tr("Loading Images ..."), tr("Abort loading"), 0, fileNames.size()); + progress.setWindowFlags(progress.windowFlags() & ~Qt::WindowContextHelpButtonHint); + progress.setWindowFlags(progress.windowFlags() | Qt::MSWindowsFixedSizeDialogHint); + progress.setWindowModality(Qt::WindowModal); + progress.show(); + + int photoDlgRes = -1; + foreach(file, fileNames) { + progress.setValue(fileNames.indexOf(file)); + double lat = 0.0, lon = 0.0; + + if (!QFile::exists(file)) { + WARNING(tr("No such file"), tr("Can't find image \"%1\".").arg(file)); + continue; + } + + try { + image = Exiv2::ImageFactory::open(file.toStdString()); + } + catch (Exiv2::Error error) + WARNING(tr("Exiv2"), tr("Error while opening \"%2\":\n%1").arg(error.what()).arg(file)); + if (image.get() == 0) + WARNING(tr("Exiv2"), tr("Error while loading EXIF-data from \"%1\".").arg(file)); + + image->readMetadata(); + exifData = image->exifData(); + + time = QDateTime(); + if (!exifData.empty()) { + Exiv2::Exifdatum &latV = exifData["Exif.GPSInfo.GPSLatitude"]; + Exiv2::Exifdatum &lonV = exifData["Exif.GPSInfo.GPSLongitude"]; + positionValid = latV.count()==3 && lonV.count()==3; + + if (positionValid) { + lat = latV.toFloat(0) + latV.toFloat(1) / 60.0 + latV.toFloat(2) / 3600.0; + lon = lonV.toFloat(0) + lonV.toFloat(1) / 60.0 + lonV.toFloat(2) / 3600.0; + if (exifData["Exif.GPSInfo.GPSLatitudeRef"].toString() == "S") + lat *= -1.0; + if (exifData["Exif.GPSInfo.GPSLongitudeRef"].toString() == "W") + lon *= -1.0; + } + + QString timeStamp = QString::fromStdString(exifData["Exif.Image.DateTime"].toString()); + if (timeStamp.isEmpty()) + timeStamp = QString::fromStdString(exifData["Exif.Photo.DateTimeOriginal"].toString()); + + if (!timeStamp.isEmpty()) + time = QDateTime::fromString(timeStamp, "yyyy:MM:dd hh:mm:ss"); + } +// if (exifData.empty() || (!positionValid && time.isNull()) ) { +// // this question is asked when the file timestamp is used to find out to which node the image belongs +// QUESTION(tr("No EXIF"), tr("No EXIF header found in image \"%1\".\nDo you want to revert to improper file timestamp?").arg(file), timeQuestion); +// time = QFileInfo(file).created(); +// } + if (time.isNull()) // if time is still null, we use the file date as reference for image sorting (and not for finding out to which node the image belongs) + // so we don't have to ask a question here + time = QFileInfo(file).created(); + + int res = photoDlgRes; + if (!positionValid && res == -1) { + QDialog* dlg = new QDialog; + Ui::PhotoLoadErrorDialog* ui = new Ui::PhotoLoadErrorDialog; + ui->setupUi(dlg); + ui->photo->setPixmap(QPixmap(file).scaledToWidth(320)); + + if (M_PREFS->getOfflineMode()) + ui->pbBarcode->setVisible(false); + + dlg->exec(); + if (ui->pbIgnore->isChecked()) + res = 0; + else if (ui->pbLoad->isChecked()) + res = 1; + else if (ui->pbMatch->isChecked()) + res = 2; + else if (ui->pbBarcode->isChecked()) + res = 3; + + if (ui->cbRemember->isChecked()) + photoDlgRes = res; + } + + if (res == 3) { // Barcode + QImage img(file); + +#ifdef USE_ZBAR + zbar::QZBarImage image(img); + + // create a reader + zbar::ImageScanner scanner; + + // configure the reader + scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1); + + // scan the image for barcodes + scanner.recycle_image(image); + zbar::Image tmp = image.convert(*(long*)"Y800"); + int n = scanner.scan(tmp); + image.set_symbols(tmp.get_symbols()); + + if (n <= 0) { + if (!askAndgetWalkingPapersDetails(lat, lon, positionValid)) + continue; + } else { + QUrl url; + // extract results + for(zbar::Image::SymbolIterator symbol = image.symbol_begin(); symbol != image.symbol_end(); ++symbol) { + // do something useful with results + qDebug() << "decoded" << QString::fromStdString(symbol->get_type_name()) + << " symbol \"" << QString::fromStdString(symbol->get_data()) << '"'; + qDebug() << "x;y:" << symbol->get_location_x(0) << "," << symbol->get_location_y(0); + + url = QUrl(QString::fromStdString(symbol->get_data())); + if (url.host().contains("walking-papers.org")) { + + int x = symbol->get_location_x(0); + int y = symbol->get_location_y(0); + QPoint mid = QPoint(img.width()/2, img.height()/2); + if (x < mid.x() || y < mid.y()) { + if (QMessageBox::warning(this, "Wrong image orientation", "Image appear to be wrognly oriented.\nDo you want to rotate it?", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { + QMatrix mat; + if (x < mid.x() && y < mid.y()) + mat.rotate(180); + else if (x > mid.x() && y < mid.y()) + mat.rotate(90); + else if (x < mid.x() && y > mid.y()) + mat.rotate(-90); + img = img.transformed(mat); + img.save(file); + } + } + getWalkingPapersDetails(url, lat, lon, positionValid); + } else { + if (!askAndgetWalkingPapersDetails(lat, lon, positionValid)) + continue; + } + } + } + + // clean up + image.set_data(NULL, 0); +#else + if (!askAndgetWalkingPapersDetails(lat, lon, positionValid)) + continue; +#endif + } + + if (positionValid) { + Coord newPos(lon, lat); + Node *Pt = 0; + int i = 0; + for (; i<theLayer->size(); ++i) { // use existing TrackPoint if there is one in small distance + if ((Pt = CAST_NODE(theLayer->get(i))) && + Pt->position().distanceFrom(newPos) <= .002) + break; + else + Pt = 0; + } + + PhotoNode* phNode; + if (!Pt) { + phNode = g_backend.allocPhotoNode(theLayer, newPos); + theLayer->add(phNode); + g_backend.sync(phNode); + } else { + if (CAST_TRACKNODE(Pt)) + phNode = g_backend.allocPhotoNode(theLayer, *CAST_TRACKNODE(Pt)); + else + phNode = g_backend.allocPhotoNode(theLayer, *Pt); + theLayer->add(phNode); + for (int i=0; i<Pt->sizeParents(); ++i) { + Feature *P = CAST_FEATURE(Pt->getParent(i)); + int idx = P->find(Pt); + if (Way* W = CAST_WAY(P)) { + W->add(phNode, idx); + } else if (Relation* R = CAST_RELATION(P)) { + R->add(R->getRole(idx), phNode, idx); + } else if (TrackSegment* S = CAST_SEGMENT(P)) { + S->add(phNode, idx); + } + P->remove(idx+1); + g_backend.deallocFeature(theLayer, Pt); + + } + + } + //Pt->setTag("_waypoint_", "true"); + phNode->setTag("_picture_", "GeoTagged"); + phNode->setPhoto(QPixmap(file)); + addUsedTrackpoint(NodeData(phNode, file, time, i == theLayer->size())); + } else if (!time.isNull() && res == 2) { + + if (offset == -1) { // ask the user to specify an offset for the images + QDialog dialog(this); + dialog.setWindowTitle(tr("Specify offset")); + + QLabel position(tr("Position images more to the:"), &dialog); + QRadioButton positive(tr("end of the track"), &dialog); + QRadioButton negative(tr("beginning of the track"), &dialog); + QTimeEdit timeEdit(&dialog); + QDialogButtonBox buttons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, &dialog); + + timeEdit.setDisplayFormat(tr("hh:mm:ss")); + + connect(&buttons, SIGNAL(accepted()), &dialog, SLOT(accept())); + connect(&buttons, SIGNAL(rejected()), &dialog, SLOT(reject())); + + QVBoxLayout layout(&dialog); // very important to first declare the QVBoxLayout. + QHBoxLayout radioLayout; // otherwise there would be a segmentation fault when return; + QHBoxLayout timeLayout; + + radioLayout.addWidget(&positive); + radioLayout.addWidget(&negative); + timeLayout.addStretch(); + timeLayout.addWidget(&timeEdit); // center and make as small as possible + timeLayout.addStretch(); + + layout.addWidget(&position); + layout.addLayout(&radioLayout); + layout.addLayout(&timeLayout); + layout.addWidget(&buttons); + + dialog.setLayout(&layout); + + if (dialog.exec()) { // we have to change the sign here because secsTo returns negative value + if (positive.isChecked()) + offset = - timeEdit.time().secsTo(QTime(0, 0, 0)); + else if (negative.isChecked()) + offset = timeEdit.time().secsTo(QTime(0, 0, 0)); + else + offset = 0; + } else { + theView->invalidate(true, true, false); + if (photoLayer && !photoLayer->size()) { + theDocument->remove(photoLayer); + SAFE_DELETE(photoLayer); + } + return; + } + } + + time = time.addSecs(offset); + + Feature *feature = NULL; + TrackNode *Pt, *bestPt = NULL; + int a, secondsTo = INT_MAX; + int u; + + for (u=0; u<theLayer->size(); u++) { + feature = theLayer->get(u); + if ((Pt = dynamic_cast<TrackNode*>(feature))) { + a = time.secsTo(Pt->time().toLocalTime()); + if (abs(a) < abs(secondsTo)) { + secondsTo = a; + bestPt = Pt; + } + } + } + + if (!bestPt) + WARNING(tr("No TrackPoints"), tr("No TrackPoints found for image \"%1\"")); + + if (abs(secondsTo) >= 15) { + QTime difference = QTime().addSecs(abs(secondsTo)); + QString display; + if (difference.hour() == 0) + if (difference.minute() == 0) + display = difference.toString(tr("ss 'seconds'")); + else + display = difference.toString(tr("mm 'minutes and' ss 'seconds'")); + else + display = difference.toString(tr("hh 'hours,' mm 'minutes and' ss 'seconds'")); + QUESTION(tr("Wrong image?"), secondsTo > 0 ? + tr("Image \"%1\" was taken %2 before the next trackpoint was recorded.\nDo you still want to use it?").arg(file).arg(display) : + tr("Image \"%1\" was taken %2 after the last trackpoint was recorded.\nDo you still want to use it?").arg(file).arg(display), + noMatchQuestion); + } + + addUsedTrackpoint(NodeData(bestPt, file, time, false)); + //bestPt->setTag("_waypoint_", "true"); + bestPt->setTag("_picture_", "GeoTagged"); + + time = QDateTime(); // empty time to be null for the next image + } else if (res == 1) { + Coord newPos; + addUsedTrackpoint(NodeData(0, file, time, true)); + } + + if (progress.wasCanceled()) { + theView->invalidate(true, true, false); + if (photoLayer && !photoLayer->size()) { + theDocument->remove(photoLayer); + SAFE_DELETE(photoLayer); + } + return; + } + qApp->processEvents(); + } + + progress.setValue(fileNames.size()); + + qSort(usedTrackPoints); // sort them chronological + curImage = -1; // the sorting invalidates curImage + + if (photoLayer && !photoLayer->size()) { + theDocument->remove(photoLayer); + SAFE_DELETE(photoLayer); + } + theView->invalidate(true, true, false); + +} + +void GeoImageDock::saveImage() +{ + int index = curImage; + if (index == -1) + index = lastImage; + if (index < 0 || index >= usedTrackPoints.size()) { // invalid ImageId + return; + } + Node* n = usedTrackPoints.at(index).node; + if (!n) + return; + + QFileInfo fi(usedTrackPoints.at(index).filename); + QString fn = fi.absoluteFilePath() + "/" + fi.completeBaseName() + ".jpg"; + + QFileDialog dlg(0, tr("Specify output filename"), fn, tr("JPEG Images (*.jpg)")); + dlg.setFileMode(QFileDialog::AnyFile); + dlg.setDefaultSuffix("jpg"); + dlg.setAcceptMode(QFileDialog::AcceptSave); + + if (dlg.exec()) { + if (dlg.selectedFiles().size()) + fn = dlg.selectedFiles()[0]; + } +// fn = QFileDialog::getSaveFileName(0, "Specify output filename", fn, tr("JPEG Images (*.jpg)")); + qDebug() << fn; + if (!fn.isEmpty()) { + Exiv2::Image::AutoPtr imageIn, imageOut; + Exiv2::ExifData exifData; + try { + imageIn = Exiv2::ImageFactory::open(usedTrackPoints.at(index).filename.toStdString()); + imageIn->readMetadata(); + exifData = imageIn->exifData(); + } + catch (Exiv2::Error error) {} + QPixmap px(usedTrackPoints.at(index).filename); + px.save(fn); + try { + imageOut = Exiv2::ImageFactory::open(fn.toStdString()); + imageOut->setExifData(exifData); + imageOut->writeMetadata(); + } + catch (Exiv2::Error error) {} + addGeoDataToImage(n->position(), fn); + } +} + +Coord GeoImageDock::getGeoDataFromImage(const QString & file) +{ + Coord pos; + double lat = 0.0, lon = 0.0; + Exiv2::Image::AutoPtr image; + Exiv2::ExifData exifData; + bool positionValid = false; + + if (!QFile::exists(file)) { + return pos; + } + + try { + image = Exiv2::ImageFactory::open(file.toStdString()); + } + catch (Exiv2::Error error) { + return pos; + } + if (image.get() == 0) + return pos; + + image->readMetadata(); + + exifData = image->exifData(); + if (!exifData.empty()) { + Exiv2::Exifdatum &latV = exifData["Exif.GPSInfo.GPSLatitude"]; + Exiv2::Exifdatum &lonV = exifData["Exif.GPSInfo.GPSLongitude"]; + positionValid = latV.count()==3 && lonV.count()==3; + + if (!positionValid) + return pos; + lat = latV.toFloat(0) + latV.toFloat(1) / 60.0 + latV.toFloat(2) / 3600.0; + lon = lonV.toFloat(0) + lonV.toFloat(1) / 60.0 + lonV.toFloat(2) / 3600.0; + if (exifData["Exif.GPSInfo.GPSLatitudeRef"].toString() == "S") + lat *= -1.0; + if (exifData["Exif.GPSInfo.GPSLongitudeRef"].toString() == "W") + lon *= -1.0; + } + pos = Coord(lon, lat); + return pos; +} + +void GeoImageDock::addGeoDataToImage(Coord position, const QString & file) +{ + Exiv2::Image::AutoPtr image; + + try { + image = Exiv2::ImageFactory::open(file.toStdString()); + } + catch (Exiv2::Error error) { + QMessageBox::warning(0, tr("Exiv2"), tr("Error while opening \"%1\":\n%2").arg(file).arg(error.what()), QMessageBox::Ok); + return; + } + if (image.get() == 0) { + QMessageBox::warning(0, tr("Exiv2"), tr("Error while loading EXIF-data from \"%1\".").arg(file), QMessageBox::Ok); + return; + } + + image->readMetadata(); + Exiv2::ExifData &exifData = image->exifData(); + + double lat = fabs(position.y()); + double lon = fabs(position.x()); + int h, m, s; + + QString hourFormat("%1/1 %2/1 %3/100"); + + h = int(lon / 1); // translate angle to hours, minutes and seconds + m = int((lon - h) * 60 / 1); + s = int((lon - h - m/60.0) * 60 * 60 * 100 / 1); // multiply with 100 because of divider in hourFormat + Exiv2::ValueType<Exiv2::URational> vlon; + vlon.read(hourFormat.arg(h).arg(m).arg(s).toStdString()); // fil vlon with string + + h = int(lat / 1); // translate angle to hours, minutes and seconds + m = int((lat - h) * 60 / 1); + s = int((lat - h - m/60.0) * 60 * 60 * 100 / 1); // multiply with 100 because of divider in hourFormat + Exiv2::ValueType<Exiv2::URational> vlat; + vlat.read(hourFormat.arg(h).arg(m).arg(s).toStdString()); // fill vlat with string + + exifData["Exif.GPSInfo.GPSVersionID"] = "2 0 0 0"; + + exifData["Exif.GPSInfo.GPSLatitude"] = vlat; + if (position.y() < 0) + exifData["Exif.GPSInfo.GPSLatitudeRef"] = "S"; + else + exifData["Exif.GPSInfo.GPSLatitudeRef"] = "N"; + exifData["Exif.GPSInfo.GPSLongitude"] = vlon; + if (position.x() < 0) + exifData["Exif.GPSInfo.GPSLongitudeRef"] = "W"; + else + exifData["Exif.GPSInfo.GPSLongitudeRef"] = "E"; + + image->writeMetadata(); // store it + + return; +} + +void GeoImageDock::changeEvent(QEvent * event) +{ + if (event->type() == QEvent::LanguageChange) + retranslateUi(); + MDockAncestor::changeEvent(event); +} + +void GeoImageDock::retranslateUi() +{ + setWindowTitle(tr("Geo Images")); + centerAction->setText(tr("Center map")); + remImagesAction->setText(tr("Remove Images")); + toClipboardAction->setText(tr("Copy filename to clipboard")); + nextImageAction->setText(tr("Select next image")); + previousImageAction->setText(tr("Select previous image")); + saveImageAction->setText(tr("Save geotagged image...")); +} + +// *** ImageView *** // + +ImageView::ImageView(QWidget *parent) + : QWidget(parent) +{ + zoomLevel = 1.0; +} + +ImageView::~ImageView() +{ +} + +void ImageView::setImage(QString filename, bool movable) +{ + name = filename; + Movable = movable; + if (!name.isEmpty()) + image.load(name); + else + image = QImage(); + area = QRectF(QPoint(0, 0), image.size()); + zoomLevel = 1.0; + resizeEvent(NULL); + update(); +} + +void ImageView::setMovable(bool movable) +{ + Movable = movable; +} + +void ImageView::paintEvent(QPaintEvent * /* e */) +{ + QPainter P(this); + +// P.setRenderHint(QPainter::SmoothPixmapTransform); + P.drawImage(rect, image, area, Qt::OrderedDither); // draw the image + + QRect text = QFontMetrics(P.font()).boundingRect(name); // calculate size of filename + text.translate(-text.topLeft()); // move topLeft to (0, 0) + if (text.width() > width()) + text.setWidth(width()); // max size is width() + + P.fillRect(text, QColor(255, 255, 255, 192)); // draw the text background + + if (text.width() == width()) { // draw a cutting text ("...") in front of the cutted filename + QRect cutting = QFontMetrics(P.font()).boundingRect("..."); + cutting.translate(-cutting.topLeft()); // move topLeft to (0, 0) + text.setWidth(width() - cutting.width()); + text.translate(QPoint(cutting.width(), 0)); + P.drawText(cutting, "..."); + } + + P.drawText(text, Qt::AlignRight, name); + + if (!Movable) { + P.setPen(QPen(Qt::red, 2)); + P.drawRect(rect); + } +} + +void ImageView::resizeEvent(QResizeEvent * /* e */) +{ + if (image.height() == 0 || image.width() == 0) return; + rect = geometry(); + rect.translate(-rect.topLeft()); + zoom(0); // update zoom +} + +void ImageView::mouseDoubleClickEvent(QMouseEvent * /* e */) +{ + if (QApplication::keyboardModifiers() == Qt::ControlModifier) + zoom(-1); + else + zoom(1); +} + +void ImageView::mousePressEvent(QMouseEvent * e) +{ + if ((e->button() & Qt::LeftButton) && !Movable) { + QDrag *drag = new QDrag(this); + QMimeData *mimeData = new QMimeData; + + QList<QUrl> urls; + urls << QUrl::fromLocalFile(name); + mimeData->setUrls(urls); + drag->setMimeData(mimeData); + drag->setPixmap(QPixmap::fromImage(image).scaledToWidth(64)); + + /* Qt::DropAction dropAction = */ drag->exec(); + return; + } + if (e->button() & Qt::RightButton) + return QWidget::mousePressEvent(e); + mousePos = e->pos(); +} + +void ImageView::mouseMoveEvent(QMouseEvent * e) +{ + if (!Movable) + return QWidget::mouseMoveEvent(e); + + if (geometry().width() == 0 || geometry().height() == 0) return; + area.translate((double)(mousePos.x() - e->pos().x()) / (double)rect.width() * area.width(), + (double)(mousePos.y() - e->pos().y()) / (double)rect.height() * area.height()); + mousePos = e->pos(); + update(); +} + +void ImageView::wheelEvent(QWheelEvent *e) +{ + zoom(e->delta() / 8.0 / 360.0 * 10.0); // one wheel rotation is about 10 steps +} + +void ImageView::zoom(double levelStep) +{ + if (name.isEmpty() || !rect.isValid()) + return; + + // zoomValue (in percent) increases/decreases following this function: 100 * sqrt(2)^x + // round about it results in -> 100% 150% 200% 300% 400% 550% 800% (see zooming values e.g. in gimp) + double newZoom = zoomLevel * pow(sqrt(2.0), levelStep); + if (newZoom > 256 || newZoom < 0.8) // only zoom up to 25600 % or down to 80% + return; + + QRectF oldArea = area; + QPointF center = area.center(); + area.setWidth(1 / newZoom * image.width()); + area.setHeight(1 / newZoom * image.height()); + double rAspect = (double)rect.height() / (double)rect.width(); // ensure that area has the same aspect as rect has + double aAspect = (double)area.height() / (double)area.width(); + if (rAspect > aAspect) + area.setHeight(area.width() * rAspect); + else if (rAspect < aAspect) + area.setWidth(area.height() / rAspect); + area.moveCenter(center); + + if (levelStep > 0 ) { + QPointF cursor = mapFromGlobal(QCursor::pos()); + QPointF old = cursor / (double)rect.width() * oldArea.width() + oldArea.topLeft(); // map to image coordinates + QPointF neu = cursor / (double)rect.width() * area.width() + area.topLeft(); // map to image coordinates + area.translate(old - neu); // ensure that the point under cursor doesn't move + } + zoomLevel = newZoom; + + update(); +} + diff --git a/src/Docks/GeoImageDock.h b/src/Docks/GeoImageDock.h new file mode 100644 index 0000000..2c5060c --- /dev/null +++ b/src/Docks/GeoImageDock.h @@ -0,0 +1,107 @@ + +#include "MapView.h" +#include "MainWindow.h" +#include "Document.h" + +#include <QPainter> +#include <QDockWidget> +#include <QMouseEvent> +#include <QShortcut> +#include <exiv2/exiv2.hpp> +#include <QDrag> + +class ImageView; + +class GeoImageDock : public MDockAncestor +{ + Q_OBJECT + +public: + GeoImageDock(MainWindow *aMain); + ~GeoImageDock(void); + + void clear(); + void loadImage(QString fileName, Coord pos); + void loadImages(QStringList fileNames); + void setImage(Node *Pt); + void setImage(int ImageId); + + static void addGeoDataToImage(Coord pos, const QString & file); + static Coord getGeoDataFromImage(const QString & file); + +private slots: + void removeImages(void); + void toClipboard(void); + void selectNext(void); + void selectPrevious(void); + void centerMap(void); + void saveImage(void); + +private: + + MainWindow *Main; + QAction *centerAction; + QAction *remImagesAction; + QAction *toClipboardAction; + QAction *nextImageAction; + QAction *previousImageAction; + QAction *saveImageAction; + + + QStringList Images; + int curImage, lastImage; + bool updateByMe; + QPointer<TrackLayer> photoLayer; + + ImageView *Image; + + struct NodeData { + NodeData(Node* mNode, const QString & mFilename, const QDateTime & mTimestamp, bool mInserted) + : node(mNode), filename(mFilename), inserted(mInserted), timestamp(mTimestamp) { } + bool operator<(const NodeData & other) const { return timestamp < other.timestamp; } + Node* node; + QString filename; + bool inserted; + QDateTime timestamp; + }; + QList<NodeData> usedTrackPoints; + + void addUsedTrackpoint(NodeData data); + bool getWalkingPapersDetails(const QUrl& reqUrl, double &lat, double &lon, bool& positionValid) const; + bool askAndgetWalkingPapersDetails(double &lat, double &lon, bool& positionValid) const; + +public: + void changeEvent(QEvent*); + void retranslateUi(); +}; + +class ImageView : public QWidget +{ +public: + ImageView(QWidget *parent); + ~ImageView(); + + void setImage(QString filename, bool movable=true); + void setMovable(bool movable=true); + +protected: + void paintEvent(QPaintEvent *e); + void mousePressEvent(QMouseEvent *e); + void mouseMoveEvent(QMouseEvent *e); + void wheelEvent(QWheelEvent *e); + void mouseDoubleClickEvent(QMouseEvent *e); + void resizeEvent(QResizeEvent *e); + +private: + bool Movable; + QImage image; + QString name; + QPoint mousePos; + QRect rect; + QRectF area; + + double zoomLevel; // zoom in percent + + void zoom(double levelStep); // zoom levelStep steps + +}; diff --git a/src/Docks/InfoDock.cpp b/src/Docks/InfoDock.cpp new file mode 100644 index 0000000..744e880 --- /dev/null +++ b/src/Docks/InfoDock.cpp @@ -0,0 +1,99 @@ +// +// C++ Implementation: InfoDock +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "InfoDock.h" +#include "MainWindow.h" +#include "MerkaartorPreferences.h" +#include "DownloadOSM.h" + +#include <QApplication> +#include <QDesktopServices> + +InfoDock::InfoDock(MainWindow* aParent) + : MDockAncestor(aParent), Main(aParent), theText(new QTextBrowser(this)) +{ + setMinimumSize(220,100); + setWindowTitle(tr("Info")); + setObjectName("infoDock"); + + theText->setReadOnly(true); + theText->setOpenLinks(false); + setWidget(theText); + + connect(theText, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(on_anchorClicked(const QUrl &))); + retranslateUi(); +} + + +InfoDock::~InfoDock() +{ +} + +void InfoDock::setHtml(QString html) +{ + currentHtml = html; + theText->setHtml(html); +} + +void InfoDock::setHoverHtml(QString html) +{ + theText->setHtml(html); +} + +void InfoDock::unsetHoverHtml() +{ + theText->setHtml(currentHtml); +} + +QString InfoDock::getHtml() +{ + return theText->toHtml(); +} + +void InfoDock::on_anchorClicked(const QUrl & link) +{ +// QString data; + +// QString osmWebsite = M_PREFS->getOsmApiUrl(); +// QString osmUser = M_PREFS->getOsmUser(); +// QString osmPwd = M_PREFS->getOsmPassword(); + +// Downloader theDownloader(osmUser, osmPwd); +// QUrl theUrl(osmWebsite+link.path()); + +// if (theDownloader.request("GET", theUrl, data)) { +// QTextBrowser* b = new QTextBrowser; +// QString s = QString::fromUtf8(theDownloader.content().constData()); +// b->setPlainText(s); +// b->setAttribute(Qt::WA_DeleteOnClose,true); +// b->resize(640, 480); +// b->show(); +// b->raise(); +// } else { +// QMessageBox::warning(Main,QApplication::translate("Downloader","Download failed"),QApplication::translate("Downloader","Unexpected http status code (%1)").arg(theDownloader.resultCode())); +// } + QUrl theUrl(M_PREFS->getOsmWebsite()+link.path()); + QDesktopServices::openUrl(theUrl); +} + +void InfoDock::changeEvent(QEvent *event) +{ + if (event->type() == QEvent::LanguageChange) + retranslateUi(); + MDockAncestor::changeEvent(event); +} + +void InfoDock::retranslateUi() +{ + setWindowTitle(tr("Info")); + setHtml(""); +} + diff --git a/src/Docks/InfoDock.h b/src/Docks/InfoDock.h new file mode 100644 index 0000000..b5f9cd2 --- /dev/null +++ b/src/Docks/InfoDock.h @@ -0,0 +1,49 @@ +// +// C++ Interface: InfoDock +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef INFODOCK_H +#define INFODOCK_H + +#include "MDockAncestor.h" +#include <QTextBrowser> + +class MainWindow; +class Feature; + +/** + @author cbro <cbro@semperpax.com> +*/ +class InfoDock : public MDockAncestor +{ +Q_OBJECT +public: + InfoDock(MainWindow* aParent); + + ~InfoDock(); + +public: + void setHtml(QString html); + QString getHtml(); + void setHoverHtml(QString html); + void unsetHoverHtml(); + void changeEvent(QEvent *); + void retranslateUi(); + +private slots: + void on_anchorClicked(const QUrl & link); + +private: + MainWindow* Main; + QTextBrowser* theText; + QString currentHtml; +}; + +#endif diff --git a/src/Docks/LayerDock.cpp b/src/Docks/LayerDock.cpp new file mode 100644 index 0000000..cef60e0 --- /dev/null +++ b/src/Docks/LayerDock.cpp @@ -0,0 +1,564 @@ +#include "LayerDock.h" +#include "LayerWidget.h" + +#include "MainWindow.h" +#ifndef _MOBILE +#include "ui_MainWindow.h" +#endif +#include "MapView.h" +#include "Document.h" +#include "Layer.h" +#include "PropertiesDock.h" +#include "Command.h" +#include "InfoDock.h" + +#include <QPushButton> +#include <QDragEnterEvent> +#include <QMenu> + +#define LINEHEIGHT 25 + +#define CHILD_WIDGETS (p->Content->children()) +#define CHILD_WIDGET(x) (dynamic_cast<LayerWidget*>(p->Content->children().at(x))) +#define CHILD_LAYER(x) (dynamic_cast<LayerWidget*>(p->Content->children().at(x))->getLayer()) + +class LayerDockPrivate +{ + public: + LayerDockPrivate(MainWindow* aMain) : + Main(aMain), Scroller(0), Content(0), Layout(0), theDropWidget(0), + lastSelWidget(0) + {} + public: + MainWindow* Main; + QScrollArea* Scroller; + QWidget* Content; + QVBoxLayout* Layout; + QVBoxLayout* frameLayout; + QTabBar* tab; + LayerWidget* theDropWidget; + LayerWidget* lastSelWidget; + QMenu* ctxMenu; + QList<LayerWidget*> selWidgets; +}; + +LayerDock::LayerDock(MainWindow* aMain) +: MDockAncestor(aMain) +{ + p = new LayerDockPrivate(aMain); + setMinimumSize(1,1); + setObjectName("layersDock"); + setAcceptDrops(true); + + createContent(); + + retranslateUi(); +} + +LayerDock::~LayerDock() +{ + delete p; +} + +void LayerDock::dragEnterEvent(QDragEnterEvent *event) +{ + p->theDropWidget = NULL; + if (event->mimeData()->hasFormat("application/x-layer")) + if ((p->theDropWidget = dynamic_cast<LayerWidget*>(event->source()))) + event->acceptProposedAction(); +} + +void LayerDock::dragMoveEvent(QDragMoveEvent *event) +{ + if (event->mimeData()->hasFormat("application/x-layer")) + event->accept(); + else { + event->ignore(); + return; + } + + LayerWidget* aW = dynamic_cast<LayerWidget*>(childAt(event->pos())); + if (aW != p->theDropWidget) { + if (!aW) { + p->Layout->removeWidget(p->theDropWidget); + p->Layout->addWidget(p->theDropWidget); + } else { + p->Layout->removeWidget(p->theDropWidget); + p->Layout->insertWidget(p->Layout->indexOf(aW), p->theDropWidget); + } + update(); + } +} + +void LayerDock::dragLeaveEvent(QDragLeaveEvent * /*event*/) +{ +// if (p->theDropWidget) { +// p->Layout->removeWidget(p->theDropWidget); +// SAFE_DELETE(p->theDropWidget); +// } +} + +void LayerDock::dropEvent(QDropEvent *event) +{ + if (event->mimeData()->hasFormat("application/x-layer")) + event->accept(); + else { + event->ignore(); + return; + } + + p->Main->document()->moveLayer(p->theDropWidget->getLayer(), p->Layout->indexOf(p->theDropWidget)); + emit(layersChanged(false)); + update(); +} + +void LayerDock::clearLayers() +{ + for (int i=CHILD_WIDGETS.size()-1; i >= 0; i--) { + if (!CHILD_WIDGET(i)) + continue; + CHILD_WIDGET(i)->deleteLater(); + } +} + +void LayerDock::addLayer(Layer* aLayer) +{ + LayerWidget* w = aLayer->newWidget(); + if (w) { + p->Layout->addWidget(w); + + connect(w, SIGNAL(layerChanged(LayerWidget*,bool)), this, SLOT(layerChanged(LayerWidget*,bool))); + connect(w, SIGNAL(layerClosed(Layer*)), this, SLOT(layerClosed(Layer*))); + connect(w, SIGNAL(layerCleared(Layer*)), this, SLOT(layerCleared(Layer*))); + connect(w, SIGNAL(layerZoom(Layer*)), this, SLOT(layerZoom(Layer*))); + connect(w, SIGNAL(layerProjection(const QString&)), this, SLOT(layerProjection(const QString&))); + +#ifndef _MOBILE + p->Main->ui->menuLayers->addMenu(w->getAssociatedMenu()); +#endif + + //w->setChecked(aLayer->isSelected()); + w->setVisible(aLayer->isEnabled()); + w->setEnabled(aLayer->isEnabled()); + w->setChecked(aLayer->isSelected()); + w->getAssociatedMenu()->menuAction()->setVisible(aLayer->isEnabled()); + + update(); + } +} + +void LayerDock::deleteLayer(Layer* aLayer) +{ + for (int i=CHILD_WIDGETS.size()-1; i >= 0; i--) { + if (!CHILD_WIDGET(i)) + continue; + if (CHILD_LAYER(i) == aLayer) { +#ifndef _MOBILE + p->Main->ui->menuLayers->removeAction(CHILD_WIDGET(i)->getAssociatedMenu()->menuAction()); +#endif + LayerWidget* curW = CHILD_WIDGET(i); + curW->deleteLater(); + break; + } + } + + update(); +} + +Layer* LayerDock::getSelectedLayer() +{ + for (int i=CHILD_WIDGETS.size()-1; i >= 0; i--) { + if (!CHILD_WIDGET(i)) + continue; + if (CHILD_WIDGET(i)->isChecked()) { + return CHILD_LAYER(i); + } + } + + return NULL; +} + +void LayerDock::createContent() +{ + delete p->Scroller; + + QWidget* frame = new QWidget(); + p->frameLayout = new QVBoxLayout(frame); + p->frameLayout->setMargin(0); + p->frameLayout->setSpacing(0); + + p->tab = new QTabBar(frame); + p->tab->setShape(QTabBar::RoundedNorth); + p->tab->setContextMenuPolicy(Qt::CustomContextMenu); + p->tab->setUsesScrollButtons(true); + p->tab->setElideMode(Qt::ElideRight); + int t; + t = p->tab->addTab(NULL); + p->tab->setTabData(t, Layer::All); + t = p->tab->addTab(NULL); + p->tab->setTabData(t, Layer::Map); + t = p->tab->addTab(NULL); + p->tab->setTabData(t, Layer::Draw); + t = p->tab->addTab(NULL); + p->tab->setTabData(t, Layer::Tracks); + retranslateTabBar(); + connect(p->tab, SIGNAL(currentChanged (int)), this, SLOT(tabChanged(int))); + connect(p->tab, SIGNAL(customContextMenuRequested (const QPoint&)), this, SLOT(tabContextMenuRequested(const QPoint&))); + + QVBoxLayout* tabLayout = new QVBoxLayout(); + tabLayout->addWidget(p->tab); +// QSpacerItem* tabSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); +// tabLayout->addItem(tabSpacer); + + p->frameLayout->addLayout(tabLayout); + + p->Scroller = new QScrollArea(frame); + p->Scroller->setBackgroundRole(QPalette::Base); + p->Scroller->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + p->Scroller->setWidgetResizable(true); + + QWidget* aWidget = new QWidget(); + QVBoxLayout* aLayout = new QVBoxLayout(aWidget); + aLayout->setSpacing(0); + aLayout->setMargin(0); + + p->Content = new QWidget(); + p->Layout = new QVBoxLayout(p->Content); + p->Layout->setSpacing(0); + p->Layout->setMargin(0); + + aLayout->addWidget(p->Content); + aLayout->addStretch(); + + p->Scroller->setWidget(aWidget); + + p->frameLayout->addWidget(p->Scroller); + + setWidget(frame); + update(); + + //Contextual Menu + p->ctxMenu = new QMenu(this); + + QAction* actShowAll = new QAction(tr("Show All"), p->ctxMenu); + actShowAll->setCheckable(false); + p->ctxMenu->addAction(actShowAll); + connect(actShowAll, SIGNAL(triggered(bool)), this, SLOT(showAllLayers(bool))); + + QAction* actHideAll = new QAction(tr("Hide All"), p->ctxMenu); + actHideAll->setCheckable(false); + p->ctxMenu->addAction(actHideAll); + connect(actHideAll, SIGNAL(triggered(bool)), this, SLOT(hideAllLayers(bool))); + + p->ctxMenu->addSeparator(); + + QAction* actReadonlyAll = new QAction(tr("Readonly All"), p->ctxMenu); + actReadonlyAll->setCheckable(false); + p->ctxMenu->addAction(actReadonlyAll); + connect(actReadonlyAll, SIGNAL(triggered(bool)), this, SLOT(readonlyAllLayers(bool))); + + QAction* actReadonlyNone = new QAction(tr("Readonly None"), p->ctxMenu); + actReadonlyNone->setCheckable(false); + p->ctxMenu->addAction(actReadonlyNone); + connect(actReadonlyNone, SIGNAL(triggered(bool)), this, SLOT(readonlyNoneLayers(bool))); + + p->ctxMenu->addSeparator(); + + QAction* actClose = new QAction(tr("Close"), p->ctxMenu); + actClose->setCheckable(false); + p->ctxMenu->addAction(actClose); + connect(actClose, SIGNAL(triggered(bool)), this, SLOT(closeLayers(bool))); +} + +void LayerDock::resizeEvent(QResizeEvent* ) +{ +} + +void LayerDock::layerChanged(LayerWidget* l, bool adjustViewport) +{ + l->getAssociatedMenu()->setTitle(l->getLayer()->name()); + emit(layersChanged(adjustViewport)); +} + +void LayerDock::layerClosed(Layer* l) +{ +// Main->document()->getUploadedLayer()->clear(); + //Main->document()->remove(l); + //delete l; + l->deleteAll(); + l->setEnabled(false); + l->setVisible(false); + l->getWidget()->setVisible(false); + l->getWidget()->getAssociatedMenu()->setVisible(false); +#ifndef _MOBILE + p->Main->on_editPropertiesAction_triggered(); +#endif + p->Main->document()->removeDownloadBox(l); + if (p->Main->document()->getLastDownloadLayer() == l) + p->Main->document()->setLastDownloadLayer(NULL); + + emit layersClosed(); + update(); +} + +void LayerDock::layerCleared(Layer* l) +{ + l->clear(); +#ifndef _MOBILE + p->Main->on_editPropertiesAction_triggered(); +#endif + + emit layersCleared(); +} + +void LayerDock::layerZoom(Layer * l) +{ + CoordBox bb = l->boundingBox(); + qDebug() << "layerZoom:" << bb.topLeft().y() << ";" << bb.topLeft().x() << ";" << bb.bottomRight().y() << ";" << bb.bottomRight().x(); + if (bb.isNull()) + return; + + CoordBox mini(bb.center()-COORD_ENLARGE, bb.center()+COORD_ENLARGE); + bb.merge(mini); +// bb = bb.zoomed(1.1); + p->Main->view()->setViewport(bb, p->Main->view()->rect()); + emit(layersChanged(false)); +} + +void LayerDock::layerProjection(const QString &prj) +{ + emit layersProjection(prj); +} + +void LayerDock::tabChanged(int idx) +{ + for (int i=CHILD_WIDGETS.size()-1; i >= 0; i--) { + if (!CHILD_WIDGET(i)) + continue; + if ((CHILD_LAYER(i)->isEnabled()) && (CHILD_LAYER(i)->classGroups() & (p->tab->tabData(idx).toUInt()))) + CHILD_WIDGET(i)->setVisible(true); + else + CHILD_WIDGET(i)->setVisible(false); + } +} + +void LayerDock::tabContextMenuRequested(const QPoint& pos) +{ + int idx = p->tab->tabAt(pos); + p->tab->setCurrentIndex(idx); + + QMenu* ctxMenu = new QMenu(this); + + QAction* actTabShow = new QAction(tr("Show All"), ctxMenu); + ctxMenu->addAction(actTabShow); + connect(actTabShow, SIGNAL(triggered(bool)), this, SLOT(TabShowAll(bool))); + + QAction* actTabHide = new QAction(tr("Hide All"), ctxMenu); + ctxMenu->addAction(actTabHide); + connect(actTabHide, SIGNAL(triggered(bool)), this, SLOT(TabHideAll(bool))); + + ctxMenu->exec(mapToGlobal(pos)); + +} + +void LayerDock::TabShowAll(bool) +{ + for (int i=CHILD_WIDGETS.size()-1; i >= 0; i--) { + if (!CHILD_WIDGET(i)) + continue; + if (CHILD_LAYER(i)->classGroups() & p->tab->tabData(p->tab->currentIndex()).toInt()) { + CHILD_WIDGET(i)->setLayerVisible(true); + } + } +} + +void LayerDock::TabHideAll(bool) +{ + for (int i=CHILD_WIDGETS.size()-1; i >= 0; i--) { + if (!CHILD_WIDGET(i)) + continue; + if (CHILD_LAYER(i)->classGroups() & p->tab->tabData(p->tab->currentIndex()).toInt()) { + CHILD_WIDGET(i)->setLayerVisible(false); + } + } +} + +void LayerDock::changeEvent(QEvent * event) +{ + if (event->type() == QEvent::LanguageChange) + retranslateUi(); + MDockAncestor::changeEvent(event); +} + +void LayerDock::retranslateUi() +{ + setWindowTitle(tr("Layers")); + retranslateTabBar(); +} + +void LayerDock::retranslateTabBar() +{ + p->tab->setTabText(0, tr("All")); + p->tab->setTabText(1, tr("Map")); + p->tab->setTabText(2, tr("Draw")); + p->tab->setTabText(3, tr("Tracks")); +} + +void LayerDock::showAllLayers(bool) +{ + for (int i=0; i<p->selWidgets.size(); ++i) { + p->selWidgets[i]->setLayerVisible(true); + } +} + +void LayerDock::hideAllLayers(bool) +{ + for (int i=0; i<p->selWidgets.size(); ++i) { + p->selWidgets[i]->setLayerVisible(false); + } +} + +void LayerDock::readonlyAllLayers(bool) +{ + for (int i=0; i<p->selWidgets.size(); ++i) { + p->selWidgets[i]->setLayerReadonly(true); + } +} + +void LayerDock::readonlyNoneLayers(bool) +{ + for (int i=0; i<p->selWidgets.size(); ++i) { + p->selWidgets[i]->setLayerReadonly(false); + } +} + +void LayerDock::closeLayers(bool) +{ + for (int i=0; i<p->selWidgets.size(); ++i) { + if (p->selWidgets[i]->getLayer()->canDelete()) + layerClosed(p->selWidgets[i]->getLayer()); + } +} + +void LayerDock::resetLayers() +{ + QList<Layer*> toDelete; + for (int i=0; i < CHILD_WIDGETS.size(); ++i) { + if (CHILD_WIDGET(i)) { + if (CHILD_LAYER(i)->classType() == Layer::FilterLayerType) + toDelete << CHILD_LAYER(i); + else if ((CHILD_LAYER(i)->classType() == Layer::DirtyLayerType || CHILD_LAYER(i)->classType() == Layer::UploadedLayerType) && CHILD_LAYER(i)->size() == 0) + toDelete << CHILD_LAYER(i); + else { + CHILD_WIDGET(i)->setLayerVisible(true); + CHILD_LAYER(i)->setReadonly(false); + CHILD_LAYER(i)->setAlpha(1.0); + } + } + } + foreach (Layer* f, toDelete) + layerClosed(f); + p->Main->document()->addFilterLayers(); +} + +void LayerDock::contextMenuEvent(QContextMenuEvent* anEvent) +{ + LayerWidget* aWidget = dynamic_cast<LayerWidget*>(childAt(anEvent->pos())); + + if (aWidget) { + p->selWidgets.clear(); + for (int i=0; i < CHILD_WIDGETS.size(); ++i) { + if (CHILD_WIDGET(i) && CHILD_WIDGET(i)->isChecked()) + p->selWidgets.push_back(CHILD_WIDGET(i)); + } + + if (p->selWidgets.size() == 0 || p->selWidgets.size() == 1) { + for (int i=0; i < CHILD_WIDGETS.size(); ++i) { + if (CHILD_WIDGET(i)) + CHILD_WIDGET(i)->setChecked(false); + } + aWidget->setChecked(true); + p->lastSelWidget = aWidget; + + aWidget->showContextMenu(anEvent); + } else if (p->selWidgets.size()) { + p->ctxMenu->exec(anEvent->globalPos()); + } + } else { + //Contextual Menu + QMenu* ctxMenu = new QMenu(this); + + QAction* actResetLayers = new QAction(tr("Reset Layers to default"), ctxMenu); + ctxMenu->addAction(actResetLayers); + connect(actResetLayers, SIGNAL(triggered(bool)), this, SLOT(resetLayers())); + + ctxMenu->exec(anEvent->globalPos()); + } +} + +#if QT_VERSION < 0x040500 +bool LayerDock::event (QEvent* ev) +{ + switch (ev->type()) { + case QEvent::MouseButtonPress: + mousePressEvent(static_cast<QMouseEvent *>(ev)); + break; + default: + break; + } + return MDockAncestor::event(ev); +} +#endif + +void LayerDock::mousePressEvent ( QMouseEvent * ev ) +{ + if (ev->button() != Qt::LeftButton) { + ev->ignore(); + return; + } + + LayerWidget* aWidget = dynamic_cast<LayerWidget*>(childAt(ev->pos())); + + if (!aWidget) { + for (int i=0; i < CHILD_WIDGETS.size(); ++i) { + if (CHILD_WIDGET(i)) + CHILD_WIDGET(i)->setChecked(false); + } + p->lastSelWidget = NULL; + ev->ignore(); + return; + } + + if (ev->modifiers() & Qt::ControlModifier) { + bool toSelect = !aWidget->isChecked(); + aWidget->setChecked(toSelect); + if (toSelect) + p->lastSelWidget = aWidget; + else + p->lastSelWidget = NULL; + } else + if (ev->modifiers() & Qt::ShiftModifier) { + bool toSelect = false; + for (int i=0; i < CHILD_WIDGETS.size(); ++i) { + if (CHILD_WIDGET(i)) { + if (CHILD_WIDGET(i) == aWidget || CHILD_WIDGET(i) == p->lastSelWidget) + toSelect = !toSelect; + + if (toSelect) + CHILD_WIDGET(i)->setChecked(true); + } + } + aWidget->setChecked(true); + } else { + for (int i=0; i < CHILD_WIDGETS.size(); ++i) { + if (CHILD_WIDGET(i)) + CHILD_WIDGET(i)->setChecked(false); + } + aWidget->setChecked(true); + p->lastSelWidget = aWidget; + + if (p->Main->info()) + p->Main->info()->setHtml(aWidget->getLayer()->toHtml()); + } + ev->accept(); +} diff --git a/src/Docks/LayerDock.h b/src/Docks/LayerDock.h new file mode 100644 index 0000000..6e7629c --- /dev/null +++ b/src/Docks/LayerDock.h @@ -0,0 +1,82 @@ +#ifndef MERKATOR_LAYERDOCK_H_ +#define MERKATOR_LAYERDOCK_H_ + +#include "MDockAncestor.h" +#include <QScrollArea> +#include <QVBoxLayout> +#include <QGroupBox> +#include <QButtonGroup> +#include <QTabBar> + +class MainWindow; +class Layer; +class LayerWidget; +class LayerDockPrivate; + +class LayerDock : public MDockAncestor +{ + Q_OBJECT + + public: + LayerDock(MainWindow* aParent); + public: + ~LayerDock(void); + + void createContent(); + //void updateContent(); + void resizeEvent(QResizeEvent* anEvent); + + void clearLayers(); + void addLayer(Layer* aLayer); + void deleteLayer(Layer* aLayer); + + Layer* getSelectedLayer(); + + private slots: + void layerChanged(LayerWidget*, bool adjustViewport); + void layerClosed(Layer*); + void layerCleared(Layer*); + void layerZoom(Layer*); + void layerProjection(const QString&); + + void tabChanged(int idx); + void tabContextMenuRequested(const QPoint& pos); + void TabShowAll(bool); + void TabHideAll(bool); + + void showAllLayers(bool); + void hideAllLayers(bool); + void readonlyAllLayers(bool); + void readonlyNoneLayers(bool); + void closeLayers(bool); + void resetLayers(); + + signals: + void layersChanged(bool adjustViewport); + void layersClosed(); + void layersCleared(); + void layersProjection(const QString&); + + protected: + LayerDockPrivate* p; +#if QT_VERSION < 0x040500 + virtual bool event (QEvent* ev); +#endif + + virtual void contextMenuEvent(QContextMenuEvent* anEvent); + virtual void mousePressEvent ( QMouseEvent * event ); + + void dragEnterEvent(QDragEnterEvent *event); + void dragMoveEvent(QDragMoveEvent *event); + void dragLeaveEvent(QDragLeaveEvent *event); + void dropEvent(QDropEvent *event); + + private: + void changeEvent(QEvent*); + void retranslateUi(); + void retranslateTabBar(); +}; + +#endif + + diff --git a/src/Docks/MDockAncestor.cpp b/src/Docks/MDockAncestor.cpp new file mode 100644 index 0000000..f2e2ee5 --- /dev/null +++ b/src/Docks/MDockAncestor.cpp @@ -0,0 +1,40 @@ +#include "MDockAncestor.h" + +#include <QVBoxLayout> +#include <QApplication> +#include <QDialogButtonBox> + +#ifdef _MOBILE + +MDockAncestor::MDockAncestor(QWidget *parent) + : QWidget(parent), mainWidget(0) +{ + theLayout = new QVBoxLayout(this); + theLayout->setSpacing(4); + theLayout->setMargin(4); +} + +void MDockAncestor::setWidget ( QWidget * widget ) +{ + mainWidget = widget; + mainWidget->setParent(this); + theLayout->insertWidget(0, mainWidget); +} + +#endif + +QWidget* MDockAncestor::getWidget() +{ + if (!mainWidget) { + mainWidget = new QWidget(); + mainWidget->setParent(this); + +#ifndef _MOBILE + QDockWidget::setWidget(mainWidget); +#else + theLayout->addWidget(mainWidget); +#endif + } + + return mainWidget; +} diff --git a/src/Docks/MDockAncestor.h b/src/Docks/MDockAncestor.h new file mode 100644 index 0000000..2ac0c47 --- /dev/null +++ b/src/Docks/MDockAncestor.h @@ -0,0 +1,44 @@ +#ifndef MDOCKANCESTOR_H +#define MDOCKANCESTOR_H + + +#ifndef _MOBILE + +#include <QDockWidget> + +class MDockAncestor : public QDockWidget +{ + public: + MDockAncestor(QWidget *parent = 0) : QDockWidget(parent), mainWidget(0) {} + void setWidget ( QWidget * widget ) { QDockWidget::setWidget(widget); } + QWidget* getWidget(); + void setAllowedAreas ( Qt::DockWidgetAreas areas ) { QDockWidget::setAllowedAreas(areas); } + + protected: + QWidget* mainWidget; + virtual void retranslateUi() = 0; +}; + +#else + +#include <QDialog> + +class QVBoxLayout; + +class MDockAncestor : public QWidget +{ + public: + MDockAncestor(QWidget *parent = 0); + void setWidget ( QWidget * widget ); + QWidget* getWidget(); + void setAllowedAreas ( Qt::DockWidgetAreas ) { }; + + protected: + QVBoxLayout* theLayout; + QWidget* mainWidget; + virtual void retranslateUi() = 0; +}; + +#endif + +#endif //MDOCKANCESTOR_H diff --git a/src/Docks/MinimumRelationProperties.ui b/src/Docks/MinimumRelationProperties.ui new file mode 100644 index 0000000..a980c84 --- /dev/null +++ b/src/Docks/MinimumRelationProperties.ui @@ -0,0 +1,190 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>RelationProperties</class> + <widget class="QWidget" name="RelationProperties"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>228</width> + <height>495</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <layout class="QGridLayout" name="variableLayout"/> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="MembersLabel"> + <property name="text"> + <string>Members</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QToolButton" name="RemoveMemberButton"> + <property name="toolTip"> + <string>Remove selected member(s)</string> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="icon"> + <iconset resource="../../Icons/AllIcons.qrc"> + <normaloff>:/Icons/small-remove.xpm</normaloff>:/Icons/small-remove.xpm</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QTableView" name="MembersView"> + <property name="tabKeyNavigation"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QToolButton" name="btMemberUp"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="arrowType"> + <enum>Qt::UpArrow</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="btMemberDown"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="arrowType"> + <enum>Qt::DownArrow</enum> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Tags</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QToolButton" name="SourceTagButton"> + <property name="minimumSize"> + <size> + <width>23</width> + <height>23</height> + </size> + </property> + <property name="toolTip"> + <string>Add "source" tag</string> + </property> + <property name="text"> + <string>S</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="RemoveTagButton"> + <property name="minimumSize"> + <size> + <width>23</width> + <height>23</height> + </size> + </property> + <property name="toolTip"> + <string>Remove selected tag(s)</string> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="icon"> + <iconset resource="../../Icons/AllIcons.qrc"> + <normaloff>:/Icons/small-remove.xpm</normaloff>:/Icons/small-remove.xpm</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QTableView" name="TagView"> + <property name="tabKeyNavigation"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </widget> + <resources> + <include location="../../Icons/AllIcons.qrc"/> + </resources> + <connections/> +</ui> diff --git a/src/Docks/MinimumRoadProperties.ui b/src/Docks/MinimumRoadProperties.ui new file mode 100644 index 0000000..c9a6c41 --- /dev/null +++ b/src/Docks/MinimumRoadProperties.ui @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>RoadProperties</class> + <widget class="QWidget" name="RoadProperties"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>220</width> + <height>362</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <layout class="QGridLayout" name="mainMayout"> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <item row="0" column="1"> + <widget class="QLabel" name="Id"> + <property name="text"> + <string>xxx</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Id</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QVBoxLayout" name="variableLayout"/> + </item> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Tags</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QToolButton" name="SourceTagButton"> + <property name="minimumSize"> + <size> + <width>23</width> + <height>23</height> + </size> + </property> + <property name="toolTip"> + <string>Add "source" tag</string> + </property> + <property name="text"> + <string>S</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="RemoveTagButton"> + <property name="minimumSize"> + <size> + <width>23</width> + <height>23</height> + </size> + </property> + <property name="toolTip"> + <string>Remove selected tag(s)</string> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="icon"> + <iconset resource="../../Icons/AllIcons.qrc"> + <normaloff>:/Icons/small-remove.xpm</normaloff>:/Icons/small-remove.xpm</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QTableView" name="TagView"> + <property name="tabKeyNavigation"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>RemoveTagButton</tabstop> + <tabstop>TagView</tabstop> + </tabstops> + <resources> + <include location="../../Icons/AllIcons.qrc"/> + </resources> + <connections/> +</ui> diff --git a/src/Docks/MinimumTrackPointProperties.ui b/src/Docks/MinimumTrackPointProperties.ui new file mode 100644 index 0000000..7a4e2f5 --- /dev/null +++ b/src/Docks/MinimumTrackPointProperties.ui @@ -0,0 +1,149 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>TrackPointProperties</class> + <widget class="QWidget" name="TrackPointProperties"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>219</width> + <height>385</height> + </rect> + </property> + <property name="windowTitle"> + <string>Trackpoint</string> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <layout class="QGridLayout" name="mainLayout"> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <item row="1" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Latitude</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="Latitude"/> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Longitude</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Id</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="Id"> + <property name="text"> + <string>xxx</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="Longitude"/> + </item> + </layout> + </item> + <item> + <layout class="QVBoxLayout" name="variableLayout"/> + </item> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Tags</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QToolButton" name="SourceTagButton"> + <property name="minimumSize"> + <size> + <width>23</width> + <height>23</height> + </size> + </property> + <property name="toolTip"> + <string>Add "source" tag</string> + </property> + <property name="text"> + <string>S</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="RemoveTagButton"> + <property name="minimumSize"> + <size> + <width>23</width> + <height>23</height> + </size> + </property> + <property name="toolTip"> + <string>Remove selected tag(s)</string> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="icon"> + <iconset resource="../../Icons/AllIcons.qrc"> + <normaloff>:/Icons/small-remove.xpm</normaloff>:/Icons/small-remove.xpm</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QTableView" name="TagView"> + <property name="tabKeyNavigation"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </widget> + <resources> + <include location="../../Icons/AllIcons.qrc"/> + </resources> + <connections/> +</ui> diff --git a/src/Docks/PhotoLoadErrorDialog.ui b/src/Docks/PhotoLoadErrorDialog.ui new file mode 100644 index 0000000..8806129 --- /dev/null +++ b/src/Docks/PhotoLoadErrorDialog.ui @@ -0,0 +1,172 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PhotoLoadErrorDialog</class> + <widget class="QDialog" name="PhotoLoadErrorDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>328</width> + <height>202</height> + </rect> + </property> + <property name="windowTitle"> + <string>No Valid geotag</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="photo"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="pbMatch"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Try to match with a track node</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="pbLoad"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Load without associated node</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="pbBarcode"> + <property name="text"> + <string>Extract info from barcode (Walking Papers)</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="pbIgnore"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Ignore it</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="cbRemember"> + <property name="text"> + <string>Do this for all current photos.</string> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>pbMatch</sender> + <signal>clicked()</signal> + <receiver>PhotoLoadErrorDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>272</x> + <y>82</y> + </hint> + <hint type="destinationlabel"> + <x>300</x> + <y>68</y> + </hint> + </hints> + </connection> + <connection> + <sender>pbLoad</sender> + <signal>clicked()</signal> + <receiver>PhotoLoadErrorDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>188</x> + <y>111</y> + </hint> + <hint type="destinationlabel"> + <x>300</x> + <y>160</y> + </hint> + </hints> + </connection> + <connection> + <sender>pbIgnore</sender> + <signal>clicked()</signal> + <receiver>PhotoLoadErrorDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>123</x> + <y>158</y> + </hint> + <hint type="destinationlabel"> + <x>300</x> + <y>35</y> + </hint> + </hints> + </connection> + <connection> + <sender>pbBarcode</sender> + <signal>clicked()</signal> + <receiver>PhotoLoadErrorDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>162</x> + <y>126</y> + </hint> + <hint type="destinationlabel"> + <x>251</x> + <y>3</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/Docks/PropertiesDock.cpp b/src/Docks/PropertiesDock.cpp new file mode 100644 index 0000000..a556e27 --- /dev/null +++ b/src/Docks/PropertiesDock.cpp @@ -0,0 +1,1185 @@ +#include "PropertiesDock.h" +#include "InfoDock.h" +#include "MainWindow.h" +#ifndef _MOBILE +#include "ui_MainWindow.h" +#endif +#include "MapView.h" +#include "Interaction.h" +#include "TagModel.h" +#include "EditCompleterDelegate.h" +#include "ShortcutOverrideFilter.h" +#include "DocumentCommands.h" +#include "FeatureCommands.h" +#include "NodeCommands.h" +#include "RelationCommands.h" +#include "Coord.h" +#include "Document.h" +#include "Features.h" +#include "FeatureManipulations.h" +#include "TagTemplate.h" + +#ifdef GEOIMAGE +#include "GeoImageDock.h" +#endif + +#include <QTimer> +#include <QHeaderView> +#include <QLineEdit> +#include <QListWidget> +#include <QTableView> +#include <QClipboard> +#include <QMessageBox> +#include <QMenu> + +#include <algorithm> + +PropertiesDock::PropertiesDock(MainWindow* aParent) +: MDockAncestor(aParent), Main(aParent), CurrentUi(0), + theTemplates(0), CurrentTagView(0), CurrentMembersView(0), NowShowing(NoUiShowing) +{ + setMinimumSize(220,100); + switchToNoUi(); + setObjectName("propertiesDock"); + theModel = new TagModel(aParent); + delegate = new EditCompleterDelegate(aParent); + + // Set up the shortcut event filter for the tableviews + // This allows them to react to keys already bound to + // application wide shortcuts + shortcutFilter = new ShortcutOverrideFilter(); + shortcutFilter->addOverride(Qt::Key_Up); + shortcutFilter->addOverride(Qt::Key_Down); + shortcutFilter->addOverride(Qt::Key_Left); + shortcutFilter->addOverride(Qt::Key_Right); + shortcutFilter->addOverride(Qt::Key_F2); + shortcutFilter->addOverride(Qt::Key_Delete); + + centerAction = new QAction(NULL, this); + connect(centerAction, SIGNAL(triggered()), this, SLOT(on_centerAction_triggered())); + centerZoomAction = new QAction(NULL, this); + connect(centerZoomAction, SIGNAL(triggered()), this, SLOT(on_centerZoomAction_triggered())); + selectAction = new QAction(NULL, this); + connect(selectAction, SIGNAL(triggered()), this, SLOT(on_Member_selected())); + + loadTemplates(); + + retranslateUi(); +} + +PropertiesDock::~PropertiesDock(void) +{ + delete theModel; + delete theTemplates; + delete shortcutFilter; +} + +static bool isChildOfSingleRoadInner(Feature *mapFeature) +{ + return Way::GetSingleParentRoadInner(mapFeature) != NULL; +} + +static bool isChildOfArea(Feature *mapFeature) +{ + Way* R = Way::GetSingleParentRoadInner(mapFeature); + if (R) + return (R->area() > 0.0); + return false; +} + +static bool isChildOfSingleRoad(Feature *mapFeature) +{ + return Way::GetSingleParentRoad(mapFeature) != NULL; +} + +static bool isChildOfSingleRelation(Feature *mapFeature) +{ + int parentRelations = 0; + for (int i=0; i<mapFeature->sizeParents(); i++) + { + Feature * parent = CAST_FEATURE(mapFeature->getParent(i)); + if (!parent || parent->isDeleted()) continue; + + bool isParentRelation = dynamic_cast<Relation*>(parent) != 0; + if (isParentRelation) + parentRelations++; + if (parentRelations > 1) + return false; + } + + return (parentRelations == 1); +} + +static bool isChildOfRelation(Feature *mapFeature) +{ + for (int i=0; i<mapFeature->sizeParents(); i++) + { + Relation * rel = CAST_RELATION(mapFeature->getParent(i)); + if (rel && !rel->isDeleted()) + return true; + } + + return false; +} + +void PropertiesDock::checkMenuStatus() +{ + bool IsPoint = false; + bool IsRoad = false; + bool IsRelation = false; + bool IsParentRoad = false; + Q_UNUSED(IsParentRoad); + bool IsParentRoadInner = false; + bool IsParentRelation = false; + bool IsParentArea = false; + int NumRoads = 0; + int NumCommitableFeature = 0; + int NumPoints = 0; + int NumRelation = 0; + int NumRelationChild = 0; + int NumAreas = 0; + int NumParents = 0; + int NumChildren = 0; + int NumIncomplete = 0; + if (Selection.size() == 1) + { + IsPoint = CAST_NODE(Selection[0]) != 0; + IsRoad = CAST_WAY(Selection[0]) != 0; + IsRelation = CAST_RELATION(Selection[0]) != 0; + IsParentRoad = IsPoint && isChildOfSingleRoad(Selection[0]); + IsParentRoadInner = IsPoint && isChildOfSingleRoadInner(Selection[0]); + IsParentRelation = isChildOfSingleRelation(Selection[0]); + IsParentArea = isChildOfArea(Selection[0]); + } + for (int i=0; i<Selection.size(); ++i) + { + if (Selection[i]->sizeParents()) + ++NumParents; + if (Selection[i]->size()) + ++NumChildren; + if (Selection[i]->notEverythingDownloaded()) + ++NumIncomplete; + + if (CAST_NODE(Selection[i])) + ++NumPoints; + if (Way* R = dynamic_cast<Way*>(Selection[i])) + { + if (R->area() > 0.0) + { + ++NumAreas; + } + else + { + ++NumRoads; + } + } + if (CAST_RELATION(Selection[i])) + ++NumRelation; + if (isChildOfRelation(Selection[i])) + ++NumRelationChild; + + if (!Selection[i]->isUploadable() && !Selection[i]->isSpecial()) + ++NumCommitableFeature; + } +#ifndef _MOBILE + Main->ui->createRelationAction->setEnabled(Selection.size()); + Main->ui->editRemoveAction->setEnabled(Selection.size()); + Main->ui->editMoveAction->setEnabled(true); + Main->ui->editReverseAction->setEnabled(IsRoad || NumAreas + NumRoads > 0); + Main->ui->roadAddStreetNumbersAction->setEnabled(NumRoads >= 1); + Main->ui->roadJoinAction->setEnabled(NumRoads >= 1 && canJoinRoads(this)); + Main->ui->roadCreateJunctionAction->setEnabled(NumRoads > 1 && canCreateJunction(this)); + Main->ui->roadSplitAction->setEnabled((IsParentRoadInner && !IsParentArea) || (NumRoads && NumPoints) || (NumAreas && NumPoints > 1)); + Main->ui->roadBreakAction->setEnabled(IsParentRoadInner || ((NumRoads == 1 || NumAreas == 1) && NumPoints) || (NumRoads > 1 && canBreakRoads(this))); + Main->ui->roadSimplifyAction->setEnabled(IsRoad || NumRoads > 0 || NumAreas > 0); + Main->ui->roadSubdivideAction->setEnabled((NumRoads + NumAreas) == 1 && (!NumPoints || NumPoints == 2) && canSubdivideRoad(this)); + Main->ui->roadAxisAlignAction->setEnabled((NumRoads + NumAreas) > 0 || (NumRelation > 0 && canAxisAlignRoads(this))); + Main->ui->areaJoinAction->setEnabled(NumAreas > 1); + Main->ui->areaSplitAction->setEnabled(NumAreas == 1 && NumPoints == 2 && canSplitArea(this)); + Main->ui->areaTerraceAction->setEnabled(NumAreas == 1 && NumRoads == 0 && canTerraceArea(this)); + Main->ui->featureSelectChildrenAction->setEnabled(NumChildren); + Main->ui->featureSelectParentsAction->setEnabled(NumParents); + Main->ui->featureDownloadMissingChildrenAction->setEnabled(NumIncomplete); + Main->ui->featureDeleteAction->setEnabled((IsPoint || IsRoad || IsRelation) && !Selection[0]->isDirty()); + Main->ui->featureCommitAction->setEnabled(NumCommitableFeature); + Main->ui->nodeMergeAction->setEnabled(NumPoints > 1); + Main->ui->nodeAlignAction->setEnabled(NumPoints > 2); + Main->ui->nodeSpreadAction->setEnabled(NumPoints > 2); + Main->ui->nodeDetachAction->setEnabled(NumPoints && canDetachNodes(this)); + Main->ui->relationAddMemberAction->setEnabled(NumRelation && Selection.size() > 1); + Main->ui->relationRemoveMemberAction->setEnabled((NumRelation && Selection.size() > 1 && NumRelationChild) || IsParentRelation); + Main->ui->relationAddToMultipolygonAction->setEnabled((NumAreas > 1) || (NumAreas >0 && NumRelation == 1)); + + Main->ui->editCopyAction->setEnabled(Selection.size()); + Main->clipboardChanged(); +#endif +} + +int PropertiesDock::selectionSize() const +{ + return Selection.size(); +} + +Feature* PropertiesDock::selection(int idx) +{ + if (idx < Selection.size()) + return Selection[idx]; + return 0; +} + +QList<Feature*> PropertiesDock::selection() +{ + return Selection; +} + +void PropertiesDock::setSelection(Feature*aFeature) +{ + cleanUpUi(); + Selection.clear(); + if (aFeature) + Selection.push_back(aFeature); + FullSelection = Selection; + switchUi(); + fillMultiUiSelectionBox(); + emit selectionChanged(); +} + +void PropertiesDock::setMultiSelection(const QList<Feature*>& aFeatureList) +{ + cleanUpUi(); + Selection.clear(); + for (int i=0; i<aFeatureList.size(); ++i) + Selection.push_back(aFeatureList[i]); + FullSelection = Selection; + switchToMultiUi(); + // to prevent slots to change the values also + QList<Feature*> Current = Selection; + Selection.clear(); + MultiUi.TagView->setModel(theModel); + MultiUi.TagView->setItemDelegate(delegate); + Main->info()->setHtml(""); + #ifdef GEOIMAGE + Main->geoImage()->setImage((Node *)NULL); + #endif + CurrentTagView = MultiUi.TagView; + theModel->setFeature(Current); + Selection = Current; + fillMultiUiSelectionBox(); + emit selectionChanged(); +} + +void PropertiesDock::toggleSelection(Feature* S) +{ + cleanUpUi(); + QList<Feature*>::iterator i = std::find(Selection.begin(),Selection.end(),S); + if (i == Selection.end()) + Selection.push_back(S); + else + Selection.erase(i); + FullSelection = Selection; + switchUi(); + fillMultiUiSelectionBox(); + emit selectionChanged(); +} + +void PropertiesDock::addSelection(Feature* S) +{ + cleanUpUi(); + QList<Feature*>::iterator i = std::find(Selection.begin(),Selection.end(),S); + if (i == Selection.end()) + Selection.push_back(S); + FullSelection = Selection; + switchUi(); + fillMultiUiSelectionBox(); + emit selectionChanged(); +} + +void PropertiesDock::adjustSelection() +{ + QList<Feature*> aSelection; + int cnt = Selection.size(); + + for (int i=0; i<FullSelection.size(); ++i) { + if (Main->document()->exists(FullSelection[i]) && FullSelection[i] && !FullSelection[i]->isDeleted()) { + aSelection.push_back(FullSelection[i]); + } else { + QList<Feature*>::iterator it = std::find(Selection.begin(),Selection.end(),FullSelection[i]); + if (it != Selection.end()) + Selection.erase(it); + } + } + + FullSelection = aSelection; + if (Selection.size() != cnt) + switchUi(); + emit selectionChanged(); +} + +bool PropertiesDock::isSelected(Feature *aFeature) +{ + QList<Feature*>::iterator i = std::find(Selection.begin(),Selection.end(),aFeature); + if (i == Selection.end()) + return false; + else + return true; +} + +void PropertiesDock::fillMultiUiSelectionBox() +{ + if (NowShowing == MultiShowing) + { + // to prevent on_SelectionList_itemSelectionChanged to kick in + NowShowing = NoUiShowing; + Main->setUpdatesEnabled(false); + MultiUi.SelectionList->clear(); + for (int i=0; i<FullSelection.size(); ++i) + { + QListWidgetItem* it = new QListWidgetItem(FullSelection[i]->description(),MultiUi.SelectionList); + it->setData(Qt::UserRole,QVariant(i)); + it->setSelected(true); + } + MultiUi.lbStatus->setText(tr("%1/%1 selected item(s)").arg(FullSelection.size())); + Main->setUpdatesEnabled(true); + NowShowing = MultiShowing; + } +} + +void PropertiesDock::on_SelectionList_itemSelectionChanged() +{ + if (NowShowing == MultiShowing) + { + Selection.clear(); + for (int i=0; i<FullSelection.size(); ++i) + if (MultiUi.SelectionList->item(i)->isSelected()) + Selection.push_back(FullSelection[i]); + if (Selection.size() == 1) { + Main->info()->setHtml(Selection[0]->toHtml()); + + #ifdef GEOIMAGE + Node *Pt; + if ((Pt = dynamic_cast<Node*>(Selection[0]))) Main->geoImage()->setImage(Pt); + #endif + } + theModel->setFeature(Selection); + MultiUi.lbStatus->setText(tr("%1/%2 selected item(s)").arg(Selection.size()).arg(FullSelection.size())); + Main->view()->update(); + emit selectionChanged(); + } +} + +void PropertiesDock::on_SelectionList_itemDoubleClicked(QListWidgetItem* item) +{ + int i=item->data(Qt::UserRole).toUInt(); + PendingSelectionChange = i; + // changing directly from this method would delete the current Ui from + // which this slot is called + QTimer::singleShot(0,this,SLOT(executePendingSelectionChange())); +} + +void PropertiesDock::executePendingSelectionChange() +{ + if (PendingSelectionChange < FullSelection.size()) + setSelection(FullSelection[PendingSelectionChange]); +} + +void PropertiesDock::cleanUpUi() +{ + if (NowShowing == RelationUiShowing) + { + RelationUi.MembersView->setModel(0); + Relation* R = dynamic_cast<Relation*>(FullSelection[0]); + R->releaseMemberModel(); + } +} + +void PropertiesDock::switchUi() +{ + if (CurrentTagView) + M_PREFS->setTagListFirstColumnWidth(qMax(CurrentTagView->columnWidth(0), 20)); + + if (FullSelection.size() == 0) + switchToNoUi(); + else if (FullSelection.size() == 1) + { + if (FullSelection[0]->isVirtual()) + switchToNoUi(); + else if (CAST_NODE(FullSelection[0])) + switchToNodeUi(); + else if (CAST_WAY(FullSelection[0])) + switchToWayUi(); + else if (CAST_RELATION(FullSelection[0])) + switchToRelationUi(); + else + switchToNoUi(); + } + else + switchToMultiUi(); + resetValues(); +} + +void PropertiesDock::switchToMultiUi() +{ + if (NowShowing == MultiShowing) return; + NowShowing = MultiShowing; + QWidget* NewUi = new QWidget(this); + MultiUi.setupUi(NewUi); + MultiUi.TagView->verticalHeader()->hide(); + MultiUi.SelectionList->setContextMenuPolicy(Qt::CustomContextMenu); + MultiUi.lbStatus->setText(tr("Selected items")); + setWidget(NewUi); + if (CurrentUi) + CurrentUi->deleteLater(); + CurrentUi = NewUi; + connect(MultiUi.RemoveTagButton,SIGNAL(clicked()),this, SLOT(on_RemoveTagButton_clicked())); + connect(MultiUi.SelectionList,SIGNAL(itemSelectionChanged()),this,SLOT(on_SelectionList_itemSelectionChanged())); + connect(MultiUi.SelectionList,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(on_SelectionList_itemDoubleClicked(QListWidgetItem*))); + connect(MultiUi.SelectionList, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(on_SelectionList_customContextMenuRequested(const QPoint &))); + setWindowTitle(tr("Properties - Multiple elements")); +} + +void PropertiesDock::switchToNodeUi() +{ + NowShowing = TrackPointUiShowing; + QWidget* NewUi = new QWidget(this); + TrackPointUi.setupUi(NewUi); + TrackPointUi.TagView->verticalHeader()->hide(); + setWidget(NewUi); + if (CurrentUi) + CurrentUi->deleteLater(); + CurrentUi = NewUi; + connect(TrackPointUi.Longitude,SIGNAL(editingFinished()),this, SLOT(on_TrackPointLon_editingFinished())); + connect(TrackPointUi.Latitude,SIGNAL(editingFinished()),this, SLOT(on_TrackPointLat_editingFinished())); + connect(TrackPointUi.RemoveTagButton,SIGNAL(clicked()),this, SLOT(on_RemoveTagButton_clicked())); + connect(TrackPointUi.SourceTagButton,SIGNAL(clicked()),this, SLOT(on_SourceTagButton_clicked())); + setWindowTitle(tr("Properties - Node")); +} + +void PropertiesDock::switchToWayUi() +{ + NowShowing = RoadUiShowing; + QWidget* NewUi = new QWidget(this); + RoadUi.setupUi(NewUi); + RoadUi.TagView->verticalHeader()->hide(); + setWidget(NewUi); + if (CurrentUi) + CurrentUi->deleteLater(); + CurrentUi = NewUi; + connect(RoadUi.RemoveTagButton,SIGNAL(clicked()),this, SLOT(on_RemoveTagButton_clicked())); + connect(RoadUi.SourceTagButton,SIGNAL(clicked()),this, SLOT(on_SourceTagButton_clicked())); + setWindowTitle(tr("Properties - Way")); +} + +void PropertiesDock::switchToRelationUi() +{ + NowShowing = RelationUiShowing; + QWidget* NewUi = new QWidget(this); + RelationUi.setupUi(NewUi); + RelationUi.TagView->verticalHeader()->hide(); + setWidget(NewUi); + if (CurrentUi) + CurrentUi->deleteLater(); + CurrentUi = NewUi; + RelationUi.MembersView->setContextMenuPolicy(Qt::CustomContextMenu); + connect(RelationUi.MembersView, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(on_Member_customContextMenuRequested(const QPoint &))); + connect(RelationUi.MembersView, SIGNAL(clicked(QModelIndex)), this, SLOT(on_Member_clicked(QModelIndex))); + connect(RelationUi.RemoveMemberButton,SIGNAL(clicked()),this, SLOT(on_RemoveMemberButton_clicked())); + connect(RelationUi.RemoveTagButton,SIGNAL(clicked()),this, SLOT(on_RemoveTagButton_clicked())); + connect(RelationUi.SourceTagButton,SIGNAL(clicked()),this, SLOT(on_SourceTagButton_clicked())); + connect(RelationUi.btMemberUp, SIGNAL(clicked()), SLOT(on_btMemberUp_clicked())); + connect(RelationUi.btMemberDown, SIGNAL(clicked()), SLOT(on_btMemberDown_clicked())); + setWindowTitle(tr("Properties - Relation")); +} + +void PropertiesDock::switchToNoUi() +{ + if (NowShowing == NoUiShowing) return; + NowShowing = NoUiShowing; + QWidget* NewUi = new QWidget(this); + setWidget(NewUi); + if (CurrentUi) + CurrentUi->deleteLater(); + CurrentUi = NewUi; + setWindowTitle(tr("Properties")); +} + +void PropertiesDock::resetValues() +{ + Highlighted.clear(); + + // Tables that might need column sizing + CurrentTagView = NULL; + CurrentMembersView = NULL; + + // to prevent slots to change the values also + QList<Feature*> Current = Selection; + Selection.clear(); + if (FullSelection.size() == 1) + { + Main->info()->setHtml(FullSelection[0]->toHtml()); + + Node* Pt = dynamic_cast<Node*>(FullSelection[0]); + Way* R = dynamic_cast<Way*>(FullSelection[0]); + Relation* L = dynamic_cast<Relation*>(FullSelection[0]); + + if ((Pt) && (NowShowing == TrackPointUiShowing)) + { + TrackPointUi.Id->setText(QString::number(Pt->id().numId)); + TrackPointUi.Latitude->setText(COORD2STRING(Pt->position().y())); + TrackPointUi.Longitude->setText(COORD2STRING(Pt->position().x())); + TrackPointUi.TagView->setModel(theModel); + TrackPointUi.TagView->setItemDelegate(delegate); + + QWidget* w; + for (int i=0; i<TrackPointUi.variableLayout->count(); ++i) { + w = TrackPointUi.variableLayout->itemAt(i)->widget(); + if (w) { + w->hide(); + w->deleteLater(); + } + } + if (theTemplates) { + w = theTemplates->getWidget(Pt, Main->view()); + w->installEventFilter(shortcutFilter); + TrackPointUi.variableLayout->addWidget(w); + } + + CurrentTagView = TrackPointUi.TagView; + + #ifdef GEOIMAGE + Main->geoImage()->setImage(Pt); + #endif + } + else if ((R) && (NowShowing == RoadUiShowing)) + { + RoadUi.Id->setText(QString::number(R->id().numId)); + //RoadUi.Name->setText(R->tagValue("name","")); + RoadUi.TagView->setModel(theModel); + RoadUi.TagView->setItemDelegate(delegate); + + QWidget* w; + for (int i=0; i<RoadUi.variableLayout->count(); ++i) { + w = RoadUi.variableLayout->itemAt(i)->widget(); + if (w) { + w->hide(); + w->deleteLater(); + } + } + if (theTemplates) { + w = theTemplates->getWidget(R, Main->view()); + w->installEventFilter(shortcutFilter); + RoadUi.variableLayout->addWidget(w); + } + + CurrentTagView = RoadUi.TagView; + } + else if ((L) && (NowShowing == RelationUiShowing)) + { + RelationUi.MembersView->setModel(L->referenceMemberModel(Main)); + RelationUi.TagView->setModel(theModel); + RelationUi.TagView->setItemDelegate(delegate); + + QWidget* w; + for (int i=0; i<RelationUi.variableLayout->count(); ++i) { + w = RelationUi.variableLayout->itemAt(i)->widget(); + if (w) { + w->hide(); + w->deleteLater(); + } + } + if (theTemplates) { + w = theTemplates->getWidget(L, Main->view()); + w->installEventFilter(shortcutFilter); + RelationUi.variableLayout->addWidget(w); + } + + CurrentTagView = RelationUi.TagView; + CurrentMembersView = RelationUi.MembersView; + } + + if (theTemplates) + theTemplates->apply(FullSelection[0]); + } + else if ((FullSelection.size() > 1) && (NowShowing == MultiShowing)) + { + Main->info()->setHtml(""); + #ifdef GEOIMAGE + Main->geoImage()->setImage((Node *)NULL); + #endif + MultiUi.TagView->setModel(theModel); + MultiUi.TagView->setItemDelegate(delegate); + CurrentTagView = MultiUi.TagView; + } + theModel->setFeature(Current); + Selection = Current; + checkMenuStatus(); + emit selectionChanged(); + + /* If we have standard TableViews in the current UI, set it so that the */ + /* first column is the width of the default text (Edit this to add...) */ + /* And the rest of the space is assigned to the second column */ + if (CurrentTagView) { + if (M_PREFS->getTagListFirstColumnWidth() > 20 && M_PREFS->getTagListFirstColumnWidth() < CurrentTagView->width()) + CurrentTagView->setColumnWidth( + 0, M_PREFS->getTagListFirstColumnWidth() + ); + else + CurrentTagView->setColumnWidth( + 0, CurrentTagView->fontMetrics().width(theModel->newKeyText())+10 + ); + CurrentTagView->horizontalHeader()->setStretchLastSection(true); + CurrentTagView->installEventFilter(shortcutFilter); + } + if (CurrentMembersView) { + CurrentMembersView->setColumnWidth( + 0, CurrentMembersView->fontMetrics().width(theModel->newKeyText())+10 + ); + CurrentMembersView->horizontalHeader()->setStretchLastSection(true); + CurrentMembersView->installEventFilter(shortcutFilter); + } +} + +void PropertiesDock::on_TrackPointLat_editingFinished() +{ + if (TrackPointUi.Latitude->text().isEmpty()) return; + Node* Pt = dynamic_cast<Node*>(selection(0)); + if (Pt) + { + Main->document()->addHistory( + new MoveNodeCommand(Pt, + Coord(Pt->position().x(), TrackPointUi.Latitude->text().toDouble()), Main->document()->getDirtyOrOriginLayer(Pt->layer()) )); + Main->invalidateView(false); + } +} + +void PropertiesDock::on_TrackPointLon_editingFinished() +{ + if (TrackPointUi.Longitude->text().isEmpty()) return; + Node* Pt = dynamic_cast<Node*>(selection(0)); + if (Pt) + { + Main->document()->addHistory( + new MoveNodeCommand(Pt, + Coord(TrackPointUi.Longitude->text().toDouble(), Pt->position().y()), Main->document()->getDirtyOrOriginLayer(Pt->layer()) )); + Main->invalidateView(false); + } +} + +void PropertiesDock::on_tag_changed(QString k, QString v) +{ + if (!FullSelection.size()) + return; + Feature* F = FullSelection[0]; + if (F->tagValue(k, "__NULL__") != v) { + Main->document()->addHistory(new SetTagCommand(F,k,v,Main->document()->getDirtyOrOriginLayer(F->layer()))); + Main->invalidateView(); + } +} + +void PropertiesDock::on_tag_cleared(QString k) +{ + if (!FullSelection.size()) + return; + Feature* F = FullSelection[0]; + Main->document()->addHistory(new ClearTagCommand(F,k,Main->document()->getDirtyOrOriginLayer(F->layer()))); + Main->invalidateView(); +} + +void PropertiesDock::on_RemoveTagButton_clicked() +{ + QTableView* TagTable = 0; + switch (NowShowing) + { + case TrackPointUiShowing: + TagTable = TrackPointUi.TagView; break; + case RoadUiShowing: + TagTable = RoadUi.TagView; break; + case MultiShowing: + TagTable = MultiUi.TagView; break; + case RelationUiShowing: + TagTable = RelationUi.TagView; break; + default: break; + } + if (!TagTable) return; + + QModelIndexList indexes = TagTable->selectionModel()->selectedIndexes(); + if (indexes.isEmpty()) return; + + CommandList *L = 0; + if (indexes.count()==1) + { + QModelIndex index = indexes.at(0); + QModelIndex idx = index.sibling(index.row(),0); + QVariant Content(theModel->data(idx,Qt::DisplayRole)); + if (Content.isValid()) + { + QString KeyName = Content.toString(); + L = new CommandList(MainWindow::tr("Clear Tag '%1' on %2").arg(KeyName).arg(Selection[0]->id().numId), Selection[0]); + for (int i=0; i<Selection.size(); ++i) + if (Selection[i]->findKey(KeyName) != -1) + L->add(new ClearTagCommand(Selection[i],KeyName,Main->document()->getDirtyOrOriginLayer(Selection[i]->layer()))); + } + } + else + { + L = new CommandList(MainWindow::tr("Clear %1 tags on %2").arg(indexes.count()).arg(Selection[0]->id().numId), Selection[0]); + while (!indexes.isEmpty()) { + QModelIndex index = indexes.takeLast(); + QModelIndex idx = index.sibling(index.row(),0); + QVariant Content(theModel->data(idx,Qt::DisplayRole)); + if (Content.isValid()) + { + QString KeyName = Content.toString(); + for (int i=0; i<Selection.size(); ++i) + if (Selection[i]->findKey(KeyName) != -1) + L->add(new ClearTagCommand(Selection[i],KeyName,Main->document()->getDirtyOrOriginLayer(Selection[i]->layer()))); + } + } + } + if (!L) return; + if (L->empty()) { + delete L; + } else { + Main->document()->addHistory(L); + Main->invalidateView(); + } +} + +void PropertiesDock::on_SourceTagButton_clicked() +{ + QStringList sl = Main->document()->getCurrentSourceTags(); + if (!sl.size()) + return; + + QString src = Selection[0]->tagValue("source", ""); + if (!src.isEmpty()) + sl.prepend(src); + + CommandList* L = new CommandList(MainWindow::tr("Set \"source\" tag on %1").arg(Selection[0]->id().numId), Selection[0]); + L->add(new SetTagCommand(Selection[0], "source", sl.join(";"))); + Main->document()->addHistory(L); + Main->invalidateView(); +} + +void PropertiesDock::on_RemoveMemberButton_clicked() +{ + if (CurrentMembersView) + { + Relation* R = dynamic_cast<Relation*>(Selection[0]); + if (R) { + QModelIndexList indexes = CurrentMembersView->selectionModel()->selectedIndexes(); + QModelIndex index; + + foreach(index, indexes) + { + QModelIndex idx = index.sibling(index.row(),0); + QVariant Content(R->referenceMemberModel(Main)->data(idx,Qt::UserRole)); + if (Content.isValid()) + { + Feature* F = Content.value<Feature*>(); + if (F) { + CommandList* L = new CommandList(MainWindow::tr("Remove member '%1' on %2").arg(F->description()).arg(R->description()), R); + if (R->find(F) < R->size()) + L->add(new RelationRemoveFeatureCommand(R,F,Main->document()->getDirtyOrOriginLayer(R->layer()))); + if (L->empty()) + delete L; + else + { + Main->document()->addHistory(L); + Main->invalidateView(); + return; + } + } + } + } + } + } +} + +void PropertiesDock::on_Member_customContextMenuRequested(const QPoint & pos) +{ + QModelIndex ix = CurrentMembersView->indexAt(pos); + if (ix.isValid()) { + QMenu menu(CurrentMembersView); + menu.addAction(centerAction); + menu.addAction(centerZoomAction); + menu.addAction(selectAction); + menu.exec(CurrentMembersView->mapToGlobal(pos)); + } +} + +void PropertiesDock::on_Member_clicked(const QModelIndex & index) +{ + Highlighted.clear(); + + Relation* R = dynamic_cast<Relation*>(Selection[0]); + if (R) { + QVariant Content(R->referenceMemberModel(Main)->data(index,Qt::UserRole)); + if (Content.isValid()) + { + Feature* F = Content.value<Feature*>(); + if (F) + Highlighted.push_back(F); + } + } + Main->view()->update(); +} + +void PropertiesDock::on_Member_selected() +{ + QList<Feature*> Features; + Relation* R = dynamic_cast<Relation*>(Selection[0]); + if (R) { + QModelIndexList indexes = CurrentMembersView->selectionModel()->selectedIndexes(); + QModelIndex index; + + foreach(index, indexes) + { + QModelIndex idx = index.sibling(index.row(),0); + QVariant Content(R->referenceMemberModel(Main)->data(idx,Qt::UserRole)); + if (Content.isValid()) + { + Feature* F = Content.value<Feature*>(); + if (F) { + Features.append(F); + } + } + } + if (!Features.isEmpty()) + setMultiSelection(Features); + } + Main->invalidateView(false); +} + +void PropertiesDock::on_btMemberUp_clicked() +{ + Relation* R = dynamic_cast<Relation*>(Selection[0]); + if (R) { + CommandList* theList = new CommandList(MainWindow::tr("Reorder members in relation %1").arg(R->id().numId), R); + + QModelIndex index; + foreach(index, CurrentMembersView->selectionModel()->selectedIndexes()) + { + CurrentMembersView->selectionModel()->select(index, QItemSelectionModel::Select | QItemSelectionModel::Rows); + } + QModelIndexList indexes = CurrentMembersView->selectionModel()->selectedRows(0); + QModelIndexList newSel; + foreach(index, indexes) + { + QVariant Content(R->referenceMemberModel(Main)->data(index,Qt::UserRole)); + if (Content.isValid()) + { + Feature* F = Content.value<Feature*>(); + if (F) { + int pos = R->find(F); + if (!pos) + break; + QString role = R->getRole(pos); + theList->add(new RelationRemoveFeatureCommand(R, pos, Main->document()->getDirtyOrOriginLayer(R->layer()))); + theList->add(new RelationAddFeatureCommand(R, role, F, pos-1, Main->document()->getDirtyOrOriginLayer(R->layer()))); + newSel.append(CurrentMembersView->model()->index(pos-1, 0)); + } + } + } + CurrentMembersView->selectionModel()->clearSelection(); + foreach(index, newSel) + { + CurrentMembersView->selectionModel()->select(index, QItemSelectionModel::Select | QItemSelectionModel::Rows); + } + if (theList->empty()) + delete theList; + else + { + Main->document()->addHistory(theList); + Main->invalidateView(); + } + } +} + +void PropertiesDock::on_btMemberDown_clicked() +{ + Relation* R = dynamic_cast<Relation*>(Selection[0]); + if (R) { + CommandList* theList = new CommandList(MainWindow::tr("Reorder members in relation %1").arg(R->id().numId), R); + + QModelIndex index; + foreach(index, CurrentMembersView->selectionModel()->selectedIndexes()) + { + CurrentMembersView->selectionModel()->select(index, QItemSelectionModel::Select | QItemSelectionModel::Rows); + } + QModelIndexList indexes = CurrentMembersView->selectionModel()->selectedRows(0); + QModelIndexList newSel; + // We need to iterate backwards so that earlier moves don't corrupt the inputs to later ones + for (int i = indexes.count()-1; i >= 0; i--) + { + index = indexes[i]; + QVariant Content(R->referenceMemberModel(Main)->data(index,Qt::UserRole)); + if (Content.isValid()) + { + Feature* F = Content.value<Feature*>(); + if (F) { + int pos = R->find(F); + if (pos >= R->size()-1) + break; + QString role = R->getRole(pos); + theList->add(new RelationRemoveFeatureCommand(R, pos, Main->document()->getDirtyOrOriginLayer(R->layer()))); + theList->add(new RelationAddFeatureCommand(R, role, F, pos+1, Main->document()->getDirtyOrOriginLayer(R->layer()))); + newSel.append(CurrentMembersView->model()->index(pos+1, 0)); + } + } + } + CurrentMembersView->selectionModel()->clearSelection(); + foreach(index, newSel) + { + CurrentMembersView->selectionModel()->select(index, QItemSelectionModel::Select | QItemSelectionModel::Rows); + } + if (theList->empty()) + delete theList; + else + { + Main->document()->addHistory(theList); + Main->invalidateView(); + } + } +} + +void PropertiesDock::on_SelectionList_customContextMenuRequested(const QPoint & pos) +{ + QListWidgetItem *it = MultiUi.SelectionList->itemAt(pos); + if (it) { + QMenu menu(MultiUi.SelectionList); + menu.addAction(centerAction); + menu.addAction(centerZoomAction); + menu.exec(MultiUi.SelectionList->mapToGlobal(pos)); + } +} + +void PropertiesDock::on_centerAction_triggered() +{ + CoordBox cb; + if (CurrentMembersView) + { + Relation* R = dynamic_cast<Relation*>(Selection[0]); + if (R) { + QModelIndexList indexes = CurrentMembersView->selectionModel()->selectedIndexes(); + QModelIndex index; + + foreach(index, indexes) + { + QModelIndex idx = index.sibling(index.row(),0); + QVariant Content(R->referenceMemberModel(Main)->data(idx,Qt::UserRole)); + if (Content.isValid()) + { + Feature* F = Content.value<Feature*>(); + if (F) { + //setSelection(F); + cb = F->boundingBox(); + } + } + } + } + } else + if (CurrentTagView) { + Main->setUpdatesEnabled(false); + int idx = MultiUi.SelectionList->selectedItems()[0]->data(Qt::UserRole).toUInt(); + cb = FullSelection[idx]->boundingBox(); + for (int i=1; i < MultiUi.SelectionList->selectedItems().size(); i++) { + idx = MultiUi.SelectionList->selectedItems()[i]->data(Qt::UserRole).toUInt(); + cb.merge(FullSelection[idx]->boundingBox()); + } + } + Coord c = cb.center(); + Main->view()->setCenter(c, Main->view()->rect()); + Main->setUpdatesEnabled(true); + Main->invalidateView(false); +} + +void PropertiesDock::on_centerZoomAction_triggered() +{ + CoordBox cb; + if (CurrentMembersView) + { + Relation* R = dynamic_cast<Relation*>(Selection[0]); + if (R) { + QModelIndexList indexes = CurrentMembersView->selectionModel()->selectedIndexes(); + QModelIndex index; + + foreach(index, indexes) + { + QModelIndex idx = index.sibling(index.row(),0); + QVariant Content(R->referenceMemberModel(Main)->data(idx,Qt::UserRole)); + if (Content.isValid()) + { + Feature* F = Content.value<Feature*>(); + if (F) { + //setSelection(F); + cb = F->boundingBox(); + CoordBox mini(cb.center()-COORD_ENLARGE, cb.center()+COORD_ENLARGE); + cb.merge(mini); + cb = cb.zoomed(1.1); + } + } + } + } + } else + if (CurrentTagView) { + Main->setUpdatesEnabled(false); + int idx = MultiUi.SelectionList->selectedItems()[0]->data(Qt::UserRole).toUInt(); + cb = FullSelection[idx]->boundingBox(); + for (int i=1; i < MultiUi.SelectionList->selectedItems().size(); i++) { + idx = MultiUi.SelectionList->selectedItems()[i]->data(Qt::UserRole).toUInt(); + cb.merge(FullSelection[idx]->boundingBox()); + } + CoordBox mini(cb.center()-COORD_ENLARGE, cb.center()+COORD_ENLARGE); + cb.merge(mini); + cb = cb.zoomed(1.1); + } + Main->view()->setViewport(cb, Main->view()->rect()); + Main->setUpdatesEnabled(true); + Main->invalidateView(false); +} + +bool PropertiesDock::loadTemplates(const QString& filename) +{ + SAFE_DELETE(theTemplates); + + QFile File; + if (!filename.isEmpty()) + File.setFileName(filename); + else + File.setFileName(M_PREFS->getDefaultTemplate()); + + if (!File.open(QIODevice::ReadOnly)) { + qDebug() << tr("Error reading template file"); + return false; + } + + QDomDocument DomDoc; + QString ErrorStr; + int ErrorLine; + int ErrorColumn; + + if (!DomDoc.setContent(&File, true, &ErrorStr, &ErrorLine,&ErrorColumn)) + { + File.close(); + QMessageBox::warning(Main,"Parse error", + QString("Parse error at line %1, column %2:\n%3") + .arg(ErrorLine) + .arg(ErrorColumn) + .arg(ErrorStr)); + return false; + } + + QDomElement root = DomDoc.documentElement(); + theTemplates = TagTemplates::fromXml(root); + if (theTemplates) { + connect(theTemplates, SIGNAL(tagChanged(QString, QString)), this, SLOT(on_tag_changed(QString, QString))); + connect(theTemplates, SIGNAL(tagCleared(QString)), this, SLOT(on_tag_cleared(QString))); + connect(theTemplates, SIGNAL(templateChanged(TagTemplate*)), this, SLOT(on_template_changed(TagTemplate*))); + } else { + QMessageBox::warning(Main,"Template read error", "Error parsing template file"); + return false; + } + + return true; +} + +bool PropertiesDock::mergeTemplates(const QString& filename) +{ + QFile File; + if (!filename.isEmpty()) + File.setFileName(filename); + else + return false; + + if (!File.open(QIODevice::ReadOnly)) { + QMessageBox::warning(Main,"Template read error", "Error reading template file"); + return false; + } + + QDomDocument DomDoc; + QString ErrorStr; + int ErrorLine; + int ErrorColumn; + + if (!DomDoc.setContent(&File, true, &ErrorStr, &ErrorLine,&ErrorColumn)) + { + File.close(); + QMessageBox::warning(Main,"Parse error", + QString("Parse error at line %1, column %2:\n%3") + .arg(ErrorLine) + .arg(ErrorColumn) + .arg(ErrorStr)); + return false; + } + + QDomElement root = DomDoc.documentElement(); + if (!theTemplates->mergeXml(root)) { + QMessageBox::warning(Main,"Template read error", "Error parsing template file"); + return false; + } + + return true; +} + +bool PropertiesDock::saveTemplates(const QString& filename) +{ + if (!theTemplates) + return false; + + QDomDocument theXmlDoc; + theXmlDoc.appendChild(theXmlDoc.createProcessingInstruction("xml", "version=\"1.0\"")); + + if (!theTemplates->toXML(theXmlDoc)) { + QMessageBox::warning(Main,"Tag templates write error", "Unable to generate XML document"); + return false; + } + + QFile File(filename); + if (!File.open(QIODevice::WriteOnly)) { + QMessageBox::warning(Main,"Tag templates write error", "Error opening template file for writing"); + return false; + } + File.write(theXmlDoc.toString().toUtf8()); + + return true; +} + +void PropertiesDock::on_template_changed(TagTemplate* /* aNewTemplate */) +{ + resetValues(); +} + +void PropertiesDock::changeEvent(QEvent * event) +{ + if (event->type() == QEvent::LanguageChange) + retranslateUi(); + MDockAncestor::changeEvent(event); +} + +void PropertiesDock::retranslateUi() +{ + setWindowTitle(tr("Properties")); + centerAction->setText(tr("Center map")); + centerZoomAction->setText(tr("Center && Zoom map")); + selectAction->setText(tr("Select member")); +} + +int PropertiesDock::highlightedSize() const +{ + if (!isVisible()) + return 0; + return Highlighted.size(); +} + +Feature* PropertiesDock::highlighted(int idx) +{ + if (idx < Highlighted.size()) + return Highlighted[idx]; + return 0; +} + +QList<Feature*> PropertiesDock::highlighted() +{ + return Highlighted; +} + diff --git a/src/Docks/PropertiesDock.h b/src/Docks/PropertiesDock.h new file mode 100644 index 0000000..c753b38 --- /dev/null +++ b/src/Docks/PropertiesDock.h @@ -0,0 +1,130 @@ +#ifndef MERKATOR_PROPERTIESDOCK_H_ +#define MERKATOR_PROPERTIESDOCK_H_ + +#include <ui_MinimumTrackPointProperties.h> +#include <ui_MinimumRelationProperties.h> +#include <ui_MinimumRoadProperties.h> +#include <ui_MultiProperties.h> + +#include <QList> + +#include "MDockAncestor.h" +#include "ShortcutOverrideFilter.h" + +class MainWindow; +class Feature; +class TagModel; +class EditCompleterDelegate; +class TagTemplates; +class TagTemplate; +class CommandList; + +class PropertiesDock : public MDockAncestor +{ + Q_OBJECT + + public: + PropertiesDock(MainWindow* aParent); + public: + ~PropertiesDock(void); + + void setSelection(Feature* aFeature); + void setMultiSelection(Feature* aFeature); + template<class T> + void setSelection(const QList<T*>& aFeatureList); + void setMultiSelection(const QList<Feature*>& aFeatureList); + void toggleSelection(Feature* aFeature); + void addSelection(Feature* aFeature); + Feature* selection(int idx); + QList<Feature*> selection(); + bool isSelected(Feature *aFeature); + int selectionSize() const; + void resetValues(); + void checkMenuStatus(); + bool loadTemplates(const QString& filename = QString()); + bool mergeTemplates(const QString& filename = QString()); + bool saveTemplates(const QString& filename); + + Feature* highlighted(int idx); + QList<Feature*> highlighted(); + int highlightedSize() const; + + + public slots: + void on_TrackPointLat_editingFinished(); + void on_TrackPointLon_editingFinished(); + void on_Member_customContextMenuRequested(const QPoint & pos); + void on_Member_clicked(const QModelIndex & index); + void on_Member_selected(); + void on_btMemberUp_clicked(); + void on_btMemberDown_clicked(); + void on_RemoveMemberButton_clicked(); + void on_RemoveTagButton_clicked(); + void on_SourceTagButton_clicked(); + void on_SelectionList_itemSelectionChanged(); + void on_SelectionList_itemDoubleClicked(QListWidgetItem* item); + void executePendingSelectionChange(); + void on_SelectionList_customContextMenuRequested(const QPoint & pos); + void on_centerAction_triggered(); + void on_centerZoomAction_triggered(); + void on_tag_changed(QString k, QString v); + void on_tag_cleared(QString k); + void on_template_changed(TagTemplate* aNewTemplate); + void adjustSelection(); + + signals: + void selectionChanged(); + + private: + void cleanUpUi(); + void switchUi(); + void switchToNoUi(); + void switchToNodeUi(); + void switchToWayUi(); + void switchToMultiUi(); + void switchToRelationUi(); + void fillMultiUiSelectionBox(); + void changeEvent(QEvent*); + void retranslateUi(); + + MainWindow* Main; + QWidget* CurrentUi; + QList<Feature*> Selection; + QList<Feature*> FullSelection; + Ui::TrackPointProperties TrackPointUi; + Ui::RoadProperties RoadUi; + Ui::MultiProperties MultiUi; + Ui::RelationProperties RelationUi; + TagModel* theModel; + int PendingSelectionChange; + EditCompleterDelegate* delegate; + QAction* centerAction; + QAction* centerZoomAction; + QAction* selectAction; + ShortcutOverrideFilter* shortcutFilter; + TagTemplates* theTemplates; + + QList<Feature*> Highlighted; + + QTableView *CurrentTagView; + QTableView *CurrentMembersView; + + enum { NoUiShowing, TrackPointUiShowing, RoadUiShowing, RelationUiShowing, MultiShowing } NowShowing ; +}; + +template<class T> + void PropertiesDock::setSelection(const QList<T*>& aFeatureList) +{ + cleanUpUi(); + Selection.clear(); + for (int i=0; i<aFeatureList.size(); ++i) + Selection.push_back(aFeatureList[i]); + FullSelection = Selection; + switchUi(); + fillMultiUiSelectionBox(); +} + + +#endif + + diff --git a/src/Docks/StyleDock.cpp b/src/Docks/StyleDock.cpp new file mode 100644 index 0000000..4189ca1 --- /dev/null +++ b/src/Docks/StyleDock.cpp @@ -0,0 +1,104 @@ +// +// C++ Implementation: StyleDock +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "StyleDock.h" + +#include "MainWindow.h" +#include "MapView.h" +#include "Document.h" +#include "Feature.h" + +#include <QAction> + +StyleDock::StyleDock(MainWindow* aParent) + : MDockAncestor(aParent), Main(aParent) +{ + setMinimumSize(220,100); + setObjectName("StyleDock"); + + ui.setupUi(getWidget()); + + connect(ui.StyleList, SIGNAL(itemSelectionChanged()), this, SLOT(on_StyleList_itemSelectionChanged())); + connect(ui.StyleList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(on_StyleList_itemDoubleClicked(QListWidgetItem*))); + connect(ui.StyleList, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(on_StyleList_customContextMenuRequested(const QPoint &))); + + retranslateUi(); +} + +StyleDock::~StyleDock() +{ +} + +void StyleDock::clearItems() +{ + ui.StyleList->blockSignals(true); + ui.StyleList->clear(); + ui.StyleList->blockSignals(false); +} + +void StyleDock::addItem(QAction* a) +{ + ui.StyleList->blockSignals(true); + + QListWidgetItem* it = new QListWidgetItem(a->text()); + it->setData(Qt::UserRole, qVariantFromValue((void *)a)); + ui.StyleList->addItem(it); + if (a->data().toString() == M_PREFS->getDefaultStyle()) + ui.StyleList->setCurrentItem(it); + + ui.StyleList->blockSignals(false); +} + +void StyleDock::setCurrent(QAction* a) +{ + ui.StyleList->blockSignals(true); + + for (int i=0; i < ui.StyleList->count(); i++) { + if (ui.StyleList->item(i)->data(Qt::UserRole).value<void *>() == a) { + ui.StyleList->setCurrentRow(i); + break; + } + } + + ui.StyleList->blockSignals(false); +} + +void StyleDock::on_StyleList_itemSelectionChanged() +{ + QListWidgetItem* item = ui.StyleList->currentItem(); + QAction * a = (QAction *)item->data(Qt::UserRole).value<void *>(); + a->trigger(); +} + +void StyleDock::on_StyleList_itemDoubleClicked(QListWidgetItem* item) +{ + Q_UNUSED(item) +} + +void StyleDock::on_StyleList_customContextMenuRequested(const QPoint & pos) +{ + Q_UNUSED(pos) +} + +void StyleDock::changeEvent(QEvent * event) +{ + if (event->type() == QEvent::LanguageChange) + retranslateUi(); + MDockAncestor::changeEvent(event); +} + +void StyleDock::retranslateUi() +{ + ui.retranslateUi(getWidget()); + + setWindowTitle(tr("Styles")); +} + diff --git a/src/Docks/StyleDock.h b/src/Docks/StyleDock.h new file mode 100644 index 0000000..e61f018 --- /dev/null +++ b/src/Docks/StyleDock.h @@ -0,0 +1,49 @@ +// +// C++ Interface: StyleList +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef STYLEDOCK_H +#define STYLEDOCK_H + +#include "MDockAncestor.h" + +#include "ui_StyleDock.h" + +class MainWindow; +class QAction; + +class StyleDock : public MDockAncestor +{ +Q_OBJECT +public: + StyleDock(MainWindow* aParent); + + ~StyleDock(); + + void setCurrent(QAction * a); + //void updateList(); + void clearItems(); + void addItem(QAction* a); + +public slots: + void on_StyleList_itemSelectionChanged(); + void on_StyleList_itemDoubleClicked(QListWidgetItem* item); + void on_StyleList_customContextMenuRequested(const QPoint & pos); + +private: + MainWindow* Main; + Ui::StyleDockWidget ui; + +public: + void changeEvent(QEvent*); + void retranslateUi(); +}; + +#endif // STYLEDOCK_H diff --git a/src/Docks/StyleDock.ui b/src/Docks/StyleDock.ui new file mode 100644 index 0000000..440fbc1 --- /dev/null +++ b/src/Docks/StyleDock.ui @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>StyleDockWidget</class> + <widget class="QWidget" name="StyleDockWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>459</height> + </rect> + </property> + <property name="windowTitle"> + <string>Styles</string> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <widget class="QFrame" name="frame"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout"> + <item> + <widget class="QListWidget" name="StyleList"> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/Features/Feature.cpp b/src/Features/Feature.cpp new file mode 100644 index 0000000..740b715 --- /dev/null +++ b/src/Features/Feature.cpp @@ -0,0 +1,1108 @@ +#include "Global.h" + +#include "MainWindow.h" +#include "Features.h" +#include "Command.h" +#include "DocumentCommands.h" +#include "FeatureCommands.h" +#include "RelationCommands.h" +#include "WayCommands.h" +#include "NodeCommands.h" +#include "Document.h" +#include "Layer.h" +#include "MasPaintStyle.h" +#include "TagSelector.h" +#include "MapView.h" +#include "PropertiesDock.h" + +#include "Utils.h" + +#include <QApplication> +#include <QUuid> +#include <QProgressDialog> +#include <QPainter> +#include <QPainterPath> +#include <QLocale> + +#include <algorithm> + +qint64 g_feat_rndId = 0; +QStringList TechnicalTags = QString(TECHNICAL_TAGS).split("#"); + +IFeature::FId Feature::newId(IFeature::FeatureType type) const +{ + IFeature::FId id = IFeature::FId(type, --g_feat_rndId); + return id; +} + +//static QString randomId() +//{ +// QUuid uuid = QUuid::createUuid(); +//#ifdef _MOBILE +// return uuid.toString(); +//#else +// // This is fairly horrible, but it's also around 10 times faster than QUuid::toString() +// // and randomId() is called a lot during large imports +// +// // Lookup table of hex value-pairs representing a byte +// static char hex[(2*256)+1] = "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; +// +// char buffer[39] = "{________-____-____-____-____________}"; +// +// +// +// // {__%08x__-____-____-____-____________} +// memcpy(&buffer[ 1], &hex[((uuid.data1 >> 24) & 0xFF)], 2); +// memcpy(&buffer[ 3], &hex[((uuid.data1 >> 16) & 0xFF)], 2); +// memcpy(&buffer[ 5], &hex[((uuid.data1 >> 8) & 0xFF)], 2); +// memcpy(&buffer[ 7], &hex[((uuid.data1 >> 0) & 0xFF)], 2); +// +// // {________-%04x-____-____-____________} +// memcpy(&buffer[10], &hex[((uuid.data2 >> 8) & 0xFF)], 2); +// memcpy(&buffer[12], &hex[((uuid.data2 >> 0) & 0xFF)], 2); +// +// // {________-____-%04x-____-____________} +// memcpy(&buffer[15], &hex[((uuid.data3 >> 8) & 0xFF)], 2); +// memcpy(&buffer[17], &hex[((uuid.data3 >> 0) & 0xFF)], 2); +// +// // {________-____-____-%04x-____________} +// memcpy(&buffer[20], &hex[uuid.data4[0]], 2); +// memcpy(&buffer[22], &hex[uuid.data4[1]], 2); +// +// // {________-____-____-____-___%012x____} +// for (int i=0; i<6; i++) { +// memcpy(&buffer[25+(i*2)], &hex[uuid.data4[i+2]], 2); +// } +// +// return QString::fromLatin1(buffer,38); +//#endif +//} + +void copyTags(Feature* Dest, Feature* Src) +{ + for (int i=0; i<Src->tagSize(); ++i) + Dest->setTag(Src->tagKey(i),Src->tagValue(i)); +} + + +class FeaturePrivate +{ +public: + FeaturePrivate(Feature* aFeature) + : LastActor(Feature::User) + , PossiblePaintersUpToDate(false) + , PixelPerMForPainter(-1), CurrentPainter(0), HasPainter(false) + , theFeature(aFeature), LastPartNotification(0) + , Deleted(false), Visible(true), Uploaded(false), FilterRevision(-1) + , Virtual(false), Special(false), DirtyLevel(0) + , parentLayer(0) + #ifndef FRISIUS_BUILD + , Time(QDateTime::currentDateTime().toTime_t()), User(0xffffffff) + #endif + { +#ifndef FRISIUS_BUILD + initVersionNumber(); + // qDebug() << "MapFeaturePrivate size:" << sizeof(FeaturePrivate) << sizeof(IFeature::FId) << sizeof(RenderPriority); +#endif + } + FeaturePrivate(const FeaturePrivate& other) + : Tags(other.Tags), LastActor(other.LastActor) + , PossiblePaintersUpToDate(false) + , PixelPerMForPainter(-1), CurrentPainter(0), HasPainter(false) + , theFeature(NULL), LastPartNotification(0) + , Deleted(false), Visible(true), Uploaded(false), FilterRevision(-1) + , Virtual(other.Virtual), Special(other.Special), DirtyLevel(0) + , parentLayer(0) + #ifndef FRISIUS_BUILD + , Time(other.Time), User(other.User) + #endif + { +#ifndef FRISIUS_BUILD + initVersionNumber(); +#endif + } + + void updatePossiblePainters(); + void blankPainters(); + void updatePainters(qreal PixelPerM); +#ifndef FRISIUS_BUILD + void initVersionNumber() + { + // static int VN = -1; + // VersionNumber = VN--; + VersionNumber = 0; + } +#endif + + mutable IFeature::FId Id; // 9 (16) + QList<QPair<quint32, quint32> > Tags; // 4 + Feature::ActorType LastActor; // 4 + QList<const FeaturePainter*> PossiblePainters; // 4 + bool PossiblePaintersUpToDate; // 1 + qreal PixelPerMForPainter; // 8 + const FeaturePainter* CurrentPainter; // 4 + bool HasPainter; // 1 + Feature* theFeature; // 4 + QList<Feature*> Parents; // 4 + int LastPartNotification; // 4 +#ifndef FRISIUS_BUILD + uint Time; // 4 + quint32 User; // 4 + int VersionNumber; // 4 +#endif + bool Deleted; // 1 + bool Visible; // 1 + bool Uploaded; // 1 + int FilterRevision; // 4 + bool Virtual; // 1 + bool Special; // 1 + int DirtyLevel; // 4 + QList<FilterLayer*> FilterLayers; // 4 + qreal Alpha; // 8 + Layer* parentLayer; // 4 +}; + +Feature::Feature() +: MetaUpToDate(false), ReadOnly(false) +{ + p = new FeaturePrivate(this); + p->Id = IFeature::FId(IFeature::Uninitialized, 0); + + // qDebug() << "Feature size:" << sizeof(Feature); +} + +Feature::Feature(const Feature& other) +: IFeature(other), MetaUpToDate(false), ReadOnly(other.ReadOnly) +{ + p = new FeaturePrivate(*other.p); + p->Id = IFeature::FId(IFeature::Uninitialized, 0); + p->theFeature = this; +} + +Feature::~Feature(void) +{ + // TODO Those cleanup shouldn't be necessary and lead to crashes + // Check for side effect of supressing them. +// while (sizeParents()) +// getParent(0)->remove(this); + delete p; +} + +void Feature::setLayer(Layer* aLayer) +{ + p->parentLayer = aLayer; +} + +Layer* Feature::layer() const +{ + return p->parentLayer; +} + +void Feature::setLastUpdated(Feature::ActorType A) +{ + p->LastActor = A; +} + +Feature::ActorType Feature::lastUpdated() const +{ + Layer* L = p->parentLayer; + if (L && L->classType() == Layer::DirtyLayerType) + return Feature::User; + else + return p->LastActor; +} + +QString Feature::stripToOSMId(const IFeature::FId& id) +{ + return QString::number(id.numId); +} + +void Feature::setId(const IFeature::FId& id) +{ + if (id == p->Id) + return; + + if (p->parentLayer) + { + if (p->Id.type != IFeature::Uninitialized) + p->parentLayer->notifyIdUpdate(p->Id,0); + if (id.type != IFeature::Uninitialized) + p->parentLayer->notifyIdUpdate(id,this); + } + p->Id = id; + + // Make sure any new id is unique + if (id.numId < g_feat_rndId) + g_feat_rndId = id.numId; +} + +const IFeature::FId& Feature::resetId() const +{ + p->Id = newId((IFeature::FeatureType)getType()); + return p->Id; +} + +const IFeature::FId& Feature::id() const +{ + if (p->Id.type == IFeature::Uninitialized) + resetId(); + + return p->Id; +} + +QString Feature::xmlId() const +{ + return stripToOSMId(id()); +} + +bool Feature::hasOSMId() const +{ + return (p->Id.numId >= 0); +} + +#ifndef FRISIUS_BUILD + +const QDateTime Feature::time() const +{ + return QDateTime::fromTime_t(p->Time); +} + +void Feature::setTime(const QDateTime& time) +{ + p->Time = time.toTime_t(); +} + +void Feature::setTime(uint epoch) +{ + p->Time = epoch; +} + +const QString& Feature::user() const +{ + return g_getUser(p->User); +} + +void Feature::setUser(const QString& user) +{ + p->User = g_setUser(user); +} + +void Feature::setVersionNumber(int vn) +{ + p->VersionNumber = vn; +} + +int Feature::versionNumber() const +{ + return p->VersionNumber; +} + + +#endif + +int Feature::incDirtyLevel(int inc) +{ + return p->DirtyLevel += inc; +} + +int Feature::decDirtyLevel(int inc) +{ + return p->DirtyLevel -= inc; +} + +int Feature::setDirtyLevel(int newLevel) +{ + return (p->DirtyLevel = newLevel); +} + +int Feature::getDirtyLevel() const +{ + return p->DirtyLevel; +} + +qreal Feature::getAlpha() +{ + if (!MetaUpToDate) + updateMeta(); + return p->Alpha; +} + +bool Feature::isDirty() const +{ + if (g_Merk_Frisius) + return (p->DirtyLevel > 0); + + if (p->parentLayer) + return (p->parentLayer->classType() == Layer::DirtyLayerType); + else + return false; +} + +void Feature::setUploaded(bool state) +{ + p->Uploaded = state; +} + +bool Feature::isUploaded() const +{ + return p->Uploaded; +} + +bool Feature::isUploadable() const +{ + if (p->parentLayer) + return (p->parentLayer->isUploadable()); + else + return false; +} + +void Feature::setReadonly(bool val) +{ + ReadOnly = val; +} + +bool Feature::isReadonly() +{ + if (!MetaUpToDate) + updateMeta(); + return ReadOnly; +} + +void Feature::setDeleted(bool delState) +{ + if (delState == p->Deleted) + return; + p->Deleted = delState; + g_backend.sync(this); +} + +bool Feature::isDeleted() const +{ + return p->Deleted; +} + +void Feature::setVisible(bool state) +{ + if (state == p->Visible) + return; + p->Visible = state; +} + +bool Feature::isVisible() +{ + if (!MetaUpToDate) + updateMeta(); + return p->Visible; +} + +bool Feature::isHidden() +{ + if (!MetaUpToDate) + updateMeta(); + return !p->Visible; +} + +void Feature::setVirtual(bool val) +{ + if (val == p->Virtual) + return; + p->Virtual = val; + if (!p->Virtual) { + resetId(); + } + g_backend.sync(this); +} + +bool Feature::isVirtual() const +{ + return p->Virtual; +} + +void Feature::setSpecial(bool val) +{ + p->Special = val; +} + +void Feature::buildPath(const Projection &) +{ +} + +bool Feature::isSpecial() const +{ + return p->Special; +} + +void Feature::setTag(int index, const QString& key, const QString& value) +{ + if (key.toLower() == "created_by") + return; + + QPair<quint32, quint32> pi = g_addToTagList(key, value); + + int i = 0; + for (; i<p->Tags.size(); ++i) + if (p->Tags[i].first == pi.first) + { + if (p->Tags[i].second == pi.second) + return; + g_removeFromTagList(p->Tags[i].first, p->Tags[i].second); + p->Tags[i].second = pi.second; + break; + } + if (i == p->Tags.size()) { + p->Tags.insert(p->Tags.begin() + index, pi); + } + invalidatePainter(); + invalidateMeta(); +} + +void Feature::setTag(const QString& key, const QString& value) +{ + if (key.toLower() == "created_by") + return; + + QPair<quint32, quint32> pi = g_addToTagList(key, value); + + int i = 0; + for (; i<p->Tags.size(); ++i) + if (p->Tags[i].first == pi.first) + { + if (p->Tags[i].second == pi.second) + return; + g_removeFromTagList(p->Tags[i].first, p->Tags[i].second); + p->Tags[i].second = pi.second; + break; + } + if (i == p->Tags.size()) { + p->Tags.push_back(pi); + } + invalidateMeta(); + invalidatePainter(); +} + +void Feature::clearTags() +{ + while (p->Tags.size()) { + g_removeFromTagList(p->Tags[0].first, p->Tags[0].second); + p->Tags.erase(p->Tags.begin()); + } + invalidateMeta(); + invalidatePainter(); +} + +void Feature::clearTag(const QString& k) +{ + quint32 ik = g_getTagKeyIndex(k); + + for (int i=0; i<p->Tags.size(); ++i) + if (p->Tags[i].first == ik) + { + g_removeFromTagList(p->Tags[i].first, p->Tags[i].second); + p->Tags.erase(p->Tags.begin()+i); + break; + } + invalidateMeta(); + invalidatePainter(); +} + +void Feature::removeTag(int idx) +{ + g_removeFromTagList(p->Tags[idx].first, p->Tags[idx].second); + p->Tags.erase(p->Tags.begin()+idx); + invalidateMeta(); + invalidatePainter(); +} + +int Feature::tagSize() const +{ + return p->Tags.size(); +} + +QString Feature::tagValue(int i) const +{ + return g_getTagValue(p->Tags[i].second); +} + +QString Feature::tagKey(int i) const +{ + return g_getTagKey(p->Tags[i].first); +} + +int Feature::findKey(const QString &k) const +{ + for (int i=0; i<p->Tags.size(); ++i) + if (tagKey(i) == k) + return i; + return -1; +} + +QString Feature::tagValue(const QString& k, const QString& Default) const +{ + for (int i=0; i<p->Tags.size(); ++i) + if (tagKey(i) == k) + return tagValue(i); + return Default; +} + +void Feature::invalidateMeta() +{ + MetaUpToDate = false; +} + +void Feature::invalidatePainter() +{ + p->PossiblePaintersUpToDate = false; + p->PixelPerMForPainter = -1; +} + +static QPainterPath painterPath; + +const QPainterPath& Feature::getPath() const +{ + return painterPath; +} + +void FeaturePrivate::updatePossiblePainters() +{ + QMutexLocker mutlock(&theFeature->featMutex); + + //still match features with no tags and no parent, i.e. "lost" trackpoints + if ( (theFeature->layer()->isTrack()) && M_PREFS->getDisableStyleForTracks() ) return blankPainters(); + + if ( (theFeature->layer()->isTrack()) || theFeature->sizeParents() ) { + if (CHECK_NODE(theFeature) && !STATIC_CAST_NODE(theFeature)->isPOI()) return blankPainters(); + if (!theFeature->tagSize()) return blankPainters(); + } + + PossiblePainters.clear(); + QList<const FeaturePainter*> DefaultPainters; + for (int i=0; i<theFeature->layer()->getDocument()->getPaintersSize(); ++i) + { + const FeaturePainter* Current = dynamic_cast<const FeaturePainter*>(theFeature->layer()->getDocument()->getPainter(i)); + switch (Current->matchesTag(theFeature,NULL)) { + case TagSelect_Match: + PossiblePainters.push_back(Current); + break; + case TagSelect_DefaultMatch: + DefaultPainters.push_back(Current); + break; + default: + break; + } + } + if (!PossiblePainters.size()) + PossiblePainters = DefaultPainters; + PossiblePaintersUpToDate = true; + HasPainter = (PossiblePainters.size() > 0); +} + +void FeaturePrivate::updatePainters(qreal PixelPerM) +{ + if (!PossiblePaintersUpToDate) + updatePossiblePainters(); + + QMutexLocker mutlock(&theFeature->featMutex); + CurrentPainter = NULL; + PixelPerMForPainter = PixelPerM; + for (int i=0; i<PossiblePainters.size(); ++i) + if (PossiblePainters[i]->matchesZoom(PixelPerM)) + { + CurrentPainter = PossiblePainters[i]; + return; + } +} + +void FeaturePrivate::blankPainters() +{ + CurrentPainter = NULL; + PossiblePainters.clear(); + PossiblePaintersUpToDate = true; + HasPainter = false; +} + +const FeaturePainter* Feature::getPainter(qreal PixelPerM) const +{ + if (p->PixelPerMForPainter != PixelPerM) + p->updatePainters(PixelPerM); + return p->CurrentPainter; +} + +const FeaturePainter* Feature::getCurrentPainter() const +{ + if (p->CurrentPainter) + return p->CurrentPainter; + else { + if (p->PossiblePainters.size()) + return p->PossiblePainters[0]; + else return NULL; + } +} + +bool Feature::hasPainter() const +{ + if (!p->PossiblePaintersUpToDate) + p->updatePossiblePainters(); + + return p->HasPainter; +} + +bool Feature::hasPainter(qreal PixelPerM) const +{ + if (!layer()) + return false; + if (p->PixelPerMForPainter != PixelPerM) + p->updatePainters(PixelPerM); + return (p->CurrentPainter != NULL); +} + +void Feature::setParentFeature(Feature* F) +{ + if (std::find(p->Parents.begin(),p->Parents.end(),F) == p->Parents.end()) + p->Parents.push_back(F); +} + +void Feature::unsetParentFeature(Feature* F) +{ + for (int i=0; i<p->Parents.size(); ++i) + if (p->Parents[i] == F) + { + p->Parents.erase(p->Parents.begin()+i); + return; + } +} + +void Feature::updateFilters() +{ + p->FilterLayers.clear(); + + Layer* L = layer(); + if (!L) + return; + + Document* D = L->getDocument(); + if (!D) + return; + + for (int i=0; i<D->layerSize(); ++i) { + if (D->getLayer(i)->classType() == Layer::FilterLayerType) { + FilterLayer* Fl = dynamic_cast<FilterLayer*>(D->getLayer(i)); + if (!Fl->isEnabled() || !Fl->selector()) + continue; + if (Fl->selector()->matches(this, 0) != TagSelect_NoMatch) + p->FilterLayers << Fl; + } + } + invalidateMeta(); +} + +void Feature::updateMeta() +{ + updateFilters(); + + Layer* L = layer(); + if (!L) + return; + + if (!L->isVisible()) + p->Visible = false; + else { + p->Visible = true; + foreach(FilterLayer* Fl, p->FilterLayers) { + if (!Fl->isVisible()) { + p->Visible = false; + break; + } + } + } + + if (L->getAlpha() != 1.0) + p->Alpha = L->getAlpha(); + else { + p->Alpha = 1.0; + foreach(FilterLayer* Fl, p->FilterLayers) { + if (Fl->getAlpha() != 1) { + p->Alpha = Fl->getAlpha(); + break; + } + } + } + + if (L->isReadonly()) + ReadOnly = true; + else { + ReadOnly = false; + foreach(FilterLayer* Fl, p->FilterLayers) { + if (Fl->isReadonly()) { + ReadOnly = true; + break; + } + + } + } +} + +int Feature::sizeParents() const +{ + return p->Parents.size(); +} + +IFeature* Feature::getParent(int i) +{ + return p->Parents[i]; +} + +const IFeature* Feature::getParent(int i) const +{ + return p->Parents[i]; +} + +void Feature::notifyChanges() +{ + static int Id = 0; + notifyParents(++Id); +} + +void Feature::notifyParents(int Id) +{ + if (Id != p->LastPartNotification) + { + p->LastPartNotification = Id; + for (int i=0; i<p->Parents.size(); ++i) + p->Parents[i]->partChanged(this, Id); + } +} + + +void Feature::drawHover(QPainter& thePainter, MapView* theView) +{ + QPen TP(M_PREFS->getHoverColor(),M_PREFS->getHoverWidth(),Qt::SolidLine); + thePainter.setPen(TP); + + drawSpecial(thePainter, TP, theView); + + drawChildrenSpecial(thePainter, TP, theView, 1); + + if (M_PREFS->getShowParents()) { + TP.setDashPattern(M_PREFS->getParentDashes()); + thePainter.setPen(TP); + drawParentsSpecial(thePainter, TP, theView); + } +} + +void Feature::drawFocus(QPainter& thePainter, MapView* theView) +{ + QPen TP(M_PREFS->getFocusColor(),M_PREFS->getFocusWidth(),Qt::SolidLine); + thePainter.setPen(TP); + + drawSpecial(thePainter, TP, theView); + + drawChildrenSpecial(thePainter, TP, theView, 1); + + if (M_PREFS->getShowParents()) { + TP.setDashPattern(M_PREFS->getParentDashes()); + thePainter.setPen(TP); + drawParentsSpecial(thePainter, TP, theView); + } +} + +void Feature::drawHighlight(QPainter& thePainter, MapView* theView) +{ + QPen TP(M_PREFS->getHighlightColor(),M_PREFS->getHighlightWidth(),Qt::SolidLine); + thePainter.setPen(TP); + + drawSpecial(thePainter, TP, theView); + + drawChildrenSpecial(thePainter, TP, theView, 1); + + if (M_PREFS->getShowParents()) { + TP.setDashPattern(M_PREFS->getParentDashes()); + thePainter.setPen(TP); + drawParentsSpecial(thePainter, TP, theView); + } +} + +QString Feature::toXML(int lvl, QProgressDialog * progress) +{ + QString xml; + QXmlStreamWriter stream(&xml); + stream.setAutoFormatting(true); + stream.setAutoFormattingIndent(lvl*2); + + stream.writeStartDocument(); + stream.writeStartElement("root"); + if (toXML(stream, progress)) { + stream.writeEndElement(); + stream.writeEndDocument(); + return xml; + } else + return QString(); +} + +void Feature::fromXML(QXmlStreamReader& stream, Feature* F) +{ + bool Deleted = (stream.attributes().value("deleted") == "true"); + int Dirty = (stream.attributes().hasAttribute("dirtylevel") ? stream.attributes().value("dirtylevel").toString().toInt() : 0); + bool Uploaded = (stream.attributes().value("uploaded") == "true"); + bool Special = (stream.attributes().value("special") == "true"); +// bool Selected = (stream.attributes().value("selected") == "true"); + + QDateTime time; + time = QDateTime::fromString(stream.attributes().value("timestamp").toString().left(19), Qt::ISODate); + QString user = stream.attributes().value("user").toString(); + int Version = stream.attributes().value("version").toString().toInt(); + if (Version < 1) + Version = 0; + Feature::ActorType A = (Feature::ActorType)(stream.attributes().hasAttribute("actor") ? stream.attributes().value("actor").toString().toInt() : 2); + + F->setLastUpdated(A); + F->setDeleted(Deleted); + F->setDirtyLevel(Dirty); + F->setUploaded(Uploaded); + F->setSpecial(Special); +#ifndef FRISIUS_BUILD + F->setTime(time); + F->setUser(user); + F->setVersionNumber(Version); +#endif + + // TODO Manage selection at document level +// if(Selected) +// g_Merk_MainWindow->properties()->addSelection(F); +} + +void Feature::toXML(QXmlStreamWriter& stream, bool strict, QString changetsetid) +{ + stream.writeAttribute("id", xmlId()); +#ifndef FRISIUS_BUILD + stream.writeAttribute("timestamp", time().toString(Qt::ISODate)+"Z"); + stream.writeAttribute("version", QString::number(versionNumber())); + stream.writeAttribute("user", user()); +#endif + if (!changetsetid.isEmpty()) + stream.writeAttribute("changeset", changetsetid); + if (!strict) { + stream.writeAttribute("actor", QString::number((int)lastUpdated())); + if (isDeleted()) + stream.writeAttribute("deleted","true"); + if (getDirtyLevel()) + stream.writeAttribute("dirtylevel", QString::number(getDirtyLevel())); + if (isUploaded()) + stream.writeAttribute("uploaded","true"); + if (isSpecial()) + stream.writeAttribute("special","true"); + // TODO Manage selection at document level +#ifndef _MOBILE + if (g_Merk_MainWindow && g_Merk_MainWindow->properties()->isSelected(this)) + stream.writeAttribute("selected","true"); +#endif + } +} + +bool Feature::tagsToXML(QXmlStreamWriter& stream, bool strict) +{ + bool OK = true; + + for (int i=0; i<tagSize(); ++i) + { + if (strict) { + if (tagKey(i).startsWith('_') && (tagKey(i).endsWith('_'))) + continue; + } + + stream.writeStartElement("tag"); + stream.writeAttribute("k", tagKey(i)); + stream.writeAttribute("v", tagValue(i)); + stream.writeEndElement(); + } + + return OK; +} + +void Feature::tagsFromXML(Document* d, Feature * f, QXmlStreamReader& stream) +{ + Q_UNUSED(d) + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "tag") { + f->setTag(stream.attributes().value("k").toString(), stream.attributes().value("v").toString()); + stream.readNext(); + } + stream.readNext(); + } +} + +Relation * Feature::GetSingleParentRelation(Feature * mapFeature) +{ + int parents = mapFeature->sizeParents(); + + if (parents == 0) + return NULL; + + Relation * parentRelation = NULL; + + int i; + for (i=0; i<parents; i++) + { + Relation * rel = dynamic_cast<Relation*>(mapFeature->getParent(i)); + if (!rel || rel->isDeleted()) continue; + + if (parentRelation) + return NULL; + + if (rel->layer()->isEnabled()) + parentRelation = rel; + } + + return parentRelation; +} + +//Static +Node* Feature::getNodeOrCreatePlaceHolder(Document *theDocument, Layer *theLayer, const IFeature::FId& Id) +{ + Node* Part = CAST_NODE(theDocument->getFeature(Id)); + if (!Part) + { + if (!theLayer) + theLayer = theDocument->getDirtyOrOriginLayer(); + Part = g_backend.allocNode(theLayer, Coord(0,0)); + Part->setId(Id); + Part->setLastUpdated(Feature::NotYetDownloaded); + theLayer->add(Part); + } + return Part; +} + +TrackNode* Feature::getTrackNodeOrCreatePlaceHolder(Document *theDocument, Layer *theLayer, const IFeature::FId& Id) +{ + TrackNode* Part = CAST_TRACKNODE(theDocument->getFeature(Id)); + if (!Part) + { + if (!theLayer) + theLayer = theDocument->getDirtyOrOriginLayer(); + Part = g_backend.allocTrackNode(theLayer, Coord(0,0)); + Part->setId(Id); + Part->setLastUpdated(Feature::NotYetDownloaded); + theLayer->add(Part); + } + return Part; +} + +Way* Feature::getWayOrCreatePlaceHolder(Document *theDocument, Layer *theLayer, const IFeature::FId& Id) +{ + Way* Part = CAST_WAY(theDocument->getFeature(Id)); + if (!Part) + { + if (!theLayer) + theLayer = theDocument->getDirtyOrOriginLayer(); + Part = g_backend.allocWay(theLayer); + Part->setId(Id); + Part->setLastUpdated(Feature::NotYetDownloaded); + theLayer->add(Part); + + } + return Part; +} + +Relation* Feature::getRelationOrCreatePlaceHolder(Document *theDocument, Layer *theLayer, const IFeature::FId& Id) +{ + Relation* Part = CAST_RELATION(theDocument->getFeature(Id)); + if (!Part) + { + if (!theLayer) + theLayer = theDocument->getDirtyOrOriginLayer(); + Part = g_backend.allocRelation(theLayer); + Part->setId(Id); + Part->setLastUpdated(Feature::NotYetDownloaded); + theLayer->add(Part); + } + return Part; +} + +void Feature::mergeTags(Document* theDocument, CommandList* L, Feature* Dest, Feature* Src) +{ + for (int i=0; i<Src->tagSize(); ++i) + { + QString k = Src->tagKey(i); + QString v1 = Src->tagValue(i); + int j = Dest->findKey(k); + if (j == -1) + L->add(new SetTagCommand(Dest,k,v1, theDocument->getDirtyOrOriginLayer(Dest->layer()))); + else + { + QString v2 = Dest->tagValue(j); + if (v1 != v2) + { + L->add(new SetTagCommand(Dest,k,QString("%1;%2").arg(v2).arg(v1), theDocument->getDirtyOrOriginLayer(Dest->layer()))); + } + } + } +} + + +QString Feature::toMainHtml(QString type, QString systemtype) +{ + QString desc; + QString name(tagValue("name","")); + if (!name.isEmpty()) + desc = QString("<big><b>%1</b></big><br/><small>(%2)</small>").arg(name).arg(id().numId); + else + desc = QString("<big><b>%1</b></big>").arg(id().numId); + + QString S = + "<html><head/><body>" + "<small><i>" + type + "</i></small><br/>" + + desc + + "<br/>" + "<i>" + "<small>"; +#ifndef FRISIUS_BUILD + S += QApplication::translate("MapFeature", "<i>V: </i><b>%1</b> ").arg(QString::number(versionNumber())); + { + QLocale locale; + QString lastModTime = time().toString(locale.dateTimeFormat(QLocale::FormatType::ShortFormat)); + if (!user().isEmpty()) + S += QApplication::translate("MapFeature", "<i>last: </i><b>%1</b> by <b>%2</b>").arg(lastModTime).arg(user()); + else + S += QApplication::translate("MapFeature", "<i>last: </i><b>%1</b>").arg(lastModTime); + } +#endif + if (layer()) + S += QApplication::translate("MapFeature", "<br/><i>layer: </i><b>%1</b> ").arg(layer()->name()); + S += "</small>" + "<hr/>" + "%1"; + + if (tagSize()) { + QStringList sTags; + int t=0; + for (int i=0; i<tagSize(); ++i) { + if (tagKey(i) != "_description_" && tagKey(i) != "_comment_") { + ++t; + sTags << tagKey(i) + " = " + "<b>" + tagValue(i) + "</b>"; + } + } + + if (t) { + S += "<hr/><small>"; + S += sTags.join("<br/>"); + S += "</small>"; + } + } + + if (hasOSMId()) { + S += "<hr/>" + "<a href='/browse/" + systemtype + "/" + xmlId() + "'>"+QApplication::translate("MapFeature", "Browse")+"</a>"; + } + S += "</body></html>"; + + return S; +} + +void Feature::getLock() +{ + featMutex.lock(); +} + +void Feature::releaseLock() +{ + featMutex.unlock(); +} diff --git a/src/Features/Feature.h b/src/Features/Feature.h new file mode 100644 index 0000000..f466a5a --- /dev/null +++ b/src/Features/Feature.h @@ -0,0 +1,368 @@ +#ifndef MERKATOR_MAPFEATURE_H_ +#define MERKATOR_MAPFEATURE_H_ + +class Feature; + +#include "IFeature.h" +#include "Coord.h" +#include "MapView.h" +#include "FeaturePainter.h" + +#include <QList> +#include <QPainter> +#include <QPainterPath> +#include <QString> + +#define CAST_FEATURE(x) (dynamic_cast<Feature*>(x)) +#define CAST_NODE(x) (dynamic_cast<Node*>(x)) +#define CAST_TRACKNODE(x) (dynamic_cast<TrackNode*>(x)) +#define CAST_WAY(x) (dynamic_cast<Way*>(x)) +#define CAST_RELATION(x) (dynamic_cast<Relation*>(x)) +#define CAST_SEGMENT(x) (dynamic_cast<TrackSegment*>(x)) + +#define STATIC_CAST_FEATURE(x) (static_cast<Feature*>(x)) +#define STATIC_CAST_NODE(x) (static_cast<Node*>(x)) +#define STATIC_CAST_TRACKNODE(x) (static_cast<TrackNode*>(x)) +#define STATIC_CAST_WAY(x) (static_cast<Way*>(x)) +#define STATIC_CAST_RELATION(x) (static_cast<Relation*>(x)) +#define STATIC_CAST_SEGMENT(x) (static_cast<TrackSegment*>(x)) + +#define CHECK_NODE(x) ((x)->getType() & IFeature::Point) +#define CHECK_WAY(x) ((x)->getType() & IFeature::LineString) +#define CHECK_RELATION(x) ((x)->getType() & IFeature::OsmRelation) +#define CHECK_SEGMENT(x) ((x)->getType() & IFeature::GpxSegment) + +class CommandList; +class Document; +class Layer; +class Projection; +class TrackNode; + +class QPointF; +class QPainter; +class QPen; +class QProgressDialog; + +class FeaturePrivate; + +class RenderPriority +{ +public: + typedef enum { IsArea, IsLinear, IsSingular } Class; + RenderPriority() + : theClass(IsLinear), InClassPriority(0.0), theLayer(0) { } + RenderPriority(Class C, qreal IC, int L) + : theClass(C), InClassPriority(IC), theLayer(L) { } + RenderPriority(const RenderPriority& other) + : theClass(other.theClass), InClassPriority(other.InClassPriority), theLayer(other.theLayer) { } + bool operator<(const RenderPriority& R) const + { + return (theClass < R.theClass) || + ( (theClass == R.theClass) && (InClassPriority < R.InClassPriority) ); + } + bool operator==(const RenderPriority& R) const + { + return ((theClass == R.theClass) && (InClassPriority == R.InClassPriority)); + } + RenderPriority &operator=(const RenderPriority &other) + { + if (this != &other) { + theClass = other.theClass; + InClassPriority = other.InClassPriority; + theLayer = other.theLayer; + } + return *this; + } + int layer() const + { + return theLayer; + } + +private: + Class theClass; + qreal InClassPriority; + int theLayer; +}; + + +/// Used to store objects of the map +class Feature : public IFeature +{ + friend class FeaturePrivate; + friend class MemoryBackend; + +public: + typedef enum { User, UserResolved, OSMServer, OSMServerConflict, NotYetDownloaded, Log } ActorType; + typedef enum { UnknownDirection, BothWays, OneWay, OtherWay } TrafficDirectionType; +public: + /// Constructor for an empty map feature + Feature(); + /// Copy constructor + /// @param other the MapFeature + Feature(const Feature& other); + /// Destructor + virtual ~Feature(); + + /** Return the smalest box contening all the MapFeature + * @return A coord box + */ + virtual const CoordBox& boundingBox(bool update=true) const = 0; + + /** Draw the feature using the given QPainter an Projection + * @param P The QPainter used to draw + * @param theProjection the Projection used to convert real coordinates to screen coordinates + */ + virtual void drawSimple(QPainter& P, MapView* theView) = 0; + virtual void drawTouchup(QPainter& P, MapView* theView) = 0; + + virtual void drawSpecial(QPainter& P, QPen& Pen, MapView* theView) = 0; + virtual void drawParentsSpecial(QPainter& P, QPen& Pen, MapView* theView) = 0; + virtual void drawChildrenSpecial(QPainter & P, QPen& Pen, MapView* theView, int depth) = 0; + virtual void drawHover(QPainter& P, MapView* theView); + virtual void drawHighlight(QPainter& P, MapView* theView); + virtual void drawFocus(QPainter& P, MapView* theView); + + virtual qreal pixelDistance(const QPointF& Target, qreal ClearEndDistance, const QList<Feature*>& NoSnap, MapView* theView) const = 0; + virtual void cascadedRemoveIfUsing(Document* theDocument, Feature* aFeature, CommandList* theList, const QList<Feature*>& Alternatives) = 0; + virtual bool notEverythingDownloaded() = 0; + + /** Set the id for the current feature. + */ + void setId(const IFeature::FId& id); + + /** Reset the id for the current feature to a random one. + */ + const IFeature::FId& resetId() const; + + /** Give the id of the feature. + * If the feature has no id, a random id is generated + * @return the id of the current feature + */ + const IFeature::FId& id() const; + + QString xmlId() const; + bool hasOSMId() const; + ActorType lastUpdated() const; + void setLastUpdated(ActorType A); +#ifndef FRISIUS_BUILD + const QDateTime time() const; + void setTime(const QDateTime& aTime); + void setTime(uint epoch); + const QString& user() const; + void setUser(const QString& aUser); + int versionNumber() const; + void setVersionNumber(int vn); +#endif + virtual void setLayer(Layer* aLayer); + virtual Layer* layer() const; + virtual QString description() const = 0; + + /** Set the tag "key=value" to the current object + * If a tag with the same key exist, it is replaced + * Otherwise the tag is added at the end + * @param key the key of the tag + * @param value the value corresponding to the key + */ + virtual void setTag(const QString& key, const QString& value); + + /** Set the tag "key=value" at the position index + * If a tag with the same key exist, it is replaced + * Otherwise the tag is added at the index position + * @param index the place for the given tag. Start at 0. + * @param key the key of the tag + * @param value the value corresponding to the key + */ + virtual void setTag(int index, const QString& key, const QString& value); + + /** remove all the tags for the curent feature + */ + virtual void clearTags(); + + /** remove the tag with the key "k". + * if no corresponding tag, don't do anything + */ + virtual void clearTag(const QString& k); + + /** @return the number of tags for the current object + */ + virtual int tagSize() const; + + /** if a tag with the key "k" exists, return its index. + * if the key doesn't exist, return the number of tags + * @return index of tag + */ + virtual int findKey(const QString& k) const; + + /** return the value of the tag at the position "i". + * position start at 0. + * Be carefull: no verification is made on i. + * @return the value + */ + virtual QString tagValue(int i) const; + + /** return the value of the tag with the key "k". + * if such a tag doesn't exists, return Default. + * @return value or Default + */ + virtual QString tagValue(const QString& k, const QString& Default) const; + + /** return the value of the tag at the position "i". + * position start at 0. + * Be carefull: no verification is made on i. + * @return the value + */ + virtual QString tagKey(int i) const; + + /** remove the tag at the position "i". + * position start at 0. + * Be carefull: no verification is made on i. + */ + virtual void removeTag(int i); + + /** check if the dirty status of the feature + * @return true if the feature is dirty + */ + virtual bool isDirty() const; + + virtual int incDirtyLevel(int inc=1); + virtual int decDirtyLevel(int inc=1); + virtual int getDirtyLevel() const; + virtual int setDirtyLevel(int newLevel); + + /** check if the feature is on an uploadable layer + * @return true if on an uploadable layer + */ + virtual bool isUploadable() const; + + /** check if the feature is read-only + * @return true if is read-only + */ + virtual bool isReadonly(); + virtual void setReadonly(bool val); + + /** set the logical delete state of the feature + */ + virtual void setDeleted(bool delState); + + /** check if the feature is logically deleted + * @return true if logically deleted + */ + virtual bool isDeleted() const; + + /** set the visibility state of the feature + */ + virtual void setVisible(bool val); + + /** check if the feature is visible + * @return true if visible + */ + virtual bool isVisible(); + + /** check if the feature is hidden + * @return true if hidden + */ + virtual bool isHidden(); + + /** check if the feature has been uploaded + * @return true if uploaded + */ + virtual bool isUploaded() const; + virtual void setUploaded(bool state); + + /** check if the feature is virtual + * @return true if virtual + */ + virtual bool isVirtual() const; + virtual void setVirtual(bool val); + + /** check if the feature is a special one (cannot be uploaded) + * @return true if special + */ + virtual bool isSpecial() const; + virtual void setSpecial(bool val); + + virtual void buildPath(const Projection& aProjection); + virtual const QPainterPath& getPath() const; + + const FeaturePainter* getPainter(qreal PixelPerM) const; + const FeaturePainter* getCurrentPainter() const; + bool hasPainter() const; + bool hasPainter(qreal PixelPerM) const; + void invalidatePainter(); + QVector<qreal> getParentDashes() const; + + virtual qreal getAlpha(); + + virtual void remove(int Idx) = 0; + virtual void remove(Feature* F) = 0; + virtual int size() const = 0; + virtual int find(Feature* Pt) const = 0; + virtual Feature* get(int idx) = 0; + virtual const Feature* get(int Idx) const = 0; + virtual bool isNull() const = 0; + + int sizeParents() const; + IFeature* getParent(int i); + const IFeature* getParent(int i) const; + + void setParentFeature(Feature* F); + void unsetParentFeature(Feature* F); + virtual void partChanged(Feature* F, int ChangeId) = 0; + void notifyChanges(); + void notifyParents(int Id); + + static void fromXML(QXmlStreamReader& stream, Feature* F); + virtual void toXML(QXmlStreamWriter& stream, bool strict, QString changetsetid = QString()); + + virtual QString toXML(int lvl=0, QProgressDialog * progress=NULL); + virtual bool toXML(QXmlStreamWriter& stream, QProgressDialog * progress=NULL, bool strict=false, QString changetsetid = QString()) = 0; + + QString toMainHtml(QString type, QString systemtype); + virtual QString toHtml() { return QString(); } + + virtual QString getClass() const = 0; + virtual char getType() const = 0; + virtual void updateMeta(); + virtual void updateFilters(); + virtual void invalidateMeta(); + + virtual bool deleteChildren(Document* , CommandList* ) { return true; } + + static Relation * GetSingleParentRelation(Feature * mapFeature); + static Node* getNodeOrCreatePlaceHolder(Document *theDocument, Layer *theLayer, const IFeature::FId& Id); + static TrackNode* getTrackNodeOrCreatePlaceHolder(Document *theDocument, Layer *theLayer, const IFeature::FId& Id); + static Way* getWayOrCreatePlaceHolder(Document *theDocument, Layer *theLayer, const IFeature::FId& Id); + static Relation* getRelationOrCreatePlaceHolder(Document *theDocument, Layer *theLayer, const IFeature::FId& Id); + static void mergeTags(Document* theDocument, CommandList* L, Feature* Dest, Feature* Src); + + static QString stripToOSMId(const IFeature::FId& id); + + void getLock(); + void releaseLock(); + +private: + FeaturePrivate* p; + +protected: + mutable CoordBox BBox; + bool ReadOnly; // 1 + bool MetaUpToDate; + IFeature::FId newId(IFeature::FeatureType type) const; + QMutex featMutex; + + bool tagsToXML(QXmlStreamWriter& stream, bool strict); + static void tagsFromXML(Document* d, Feature* f, QXmlStreamReader& stream); + + QPainterPath thePath; +}; + +Q_DECLARE_METATYPE( Feature * ); + +extern qint64 g_feat_rndId; + +void copyTags(Feature* Dest, Feature* Src); +bool hasOSMId(const Feature* aFeature); + +#endif + + diff --git a/src/Features/Features.h b/src/Features/Features.h new file mode 100644 index 0000000..d8a52ea --- /dev/null +++ b/src/Features/Features.h @@ -0,0 +1,6 @@ +#include "IFeature.h" +#include "Feature.h" +#include "Node.h" +#include "Way.h" +#include "Relation.h" +#include "TrackSegment.h" diff --git a/src/Features/Features.pri b/src/Features/Features.pri new file mode 100644 index 0000000..fd2900a --- /dev/null +++ b/src/Features/Features.pri @@ -0,0 +1,17 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/Features +DEPENDPATH += $$MERKAARTOR_SRC_DIR/Features + +HEADERS += \ + Feature.h \ + Relation.h \ + Way.h \ + Node.h \ + TrackSegment.h \ + IFeature.h + +SOURCES += \ + Feature.cpp \ + Relation.cpp \ + Way.cpp \ + Node.cpp \ + TrackSegment.cpp \ diff --git a/src/Features/Node.cpp b/src/Features/Node.cpp new file mode 100644 index 0000000..5150753 --- /dev/null +++ b/src/Features/Node.cpp @@ -0,0 +1,768 @@ +#include "Node.h" + +#include "MapView.h" +#include "MapRenderer.h" +#include "LineF.h" +#include "Global.h" + +#include <QApplication> +#include <QtGui/QPainter> +#include <QProgressDialog> + +#define TEST_RFLAGS(x) theView->renderOptions().options.testFlag(x) + +Node::Node(const Coord& aCoord) + : Feature() + , ProjectionRevision(0) +{ + BBox = CoordBox(aCoord, aCoord); +// qDebug() << "Node size:" << sizeof(Node) << sizeof(PhotoNode); + +} + +Node::Node(const Node& other) + : Feature(other) +{ + BBox = other.BBox; + Projected = other.Projected; +} + +Node::~Node(void) +{ +} + +const QPointF& Node::projected() const +{ + return Projected; +} + +const QPointF& Node::projected(const Projection& aProjection) +{ + buildPath(aProjection); + return Projected; +} + +void Node::buildPath(const Projection& aProjection) +{ + if (ProjectionRevision != aProjection.projectionRevision()) { + Projected = aProjection.project(BBox.topLeft()); + ProjectionRevision = aProjection.projectionRevision(); + } +} + +Coord Node::position() const +{ + return BBox.topLeft(); +} + +void Node::setPosition(const Coord& aCoord) +{ + BBox = CoordBox(aCoord, aCoord); + ProjectionRevision = 0; + g_backend.sync(this); + + notifyChanges(); +} + +void Node::remove(int ) +{ +} + +void Node::remove(Feature*) +{ +} + +int Node::size() const +{ + return 0; +} + +int Node::find(Feature* ) const +{ + return 0; +} + +Feature* Node::get(int ) +{ + return NULL; +} + +const Feature* Node::get(int ) const +{ + return NULL; +} + +bool Node::isNull() const +{ + return BBox.isNull(); +} + +bool Node::isInteresting() const +{ + // does its id look like one from osm + if (hasOSMId()) + return true; + // if the user has added special tags, that's fine also + if (tagSize()) + return true; + // if it is part of a road, then too + if (sizeParents()) + return true; + + return false; +} + +bool Node::isPOI() +{ + if (!MetaUpToDate) + updateMeta(); + + return IsPOI; +} + +bool Node::isWaypoint() +{ + if (!MetaUpToDate) + updateMeta(); + + return IsWaypoint; +} + +bool Node::isSelectable(qreal PixelPerM, RendererOptions options) +{ + // If Node has non-default tags -> POI -> always selectable + if (isPOI()) + return true; + + bool Draw = false; + if (options.options.testFlag(RendererOptions::NodesVisible) || (lastUpdated() == Feature::Log && !options.options.testFlag(RendererOptions::TrackSegmentVisible))) { + Draw = (PixelPerM * M_PREFS->getNodeSize() >= 1); + // Do not draw GPX nodes when simple GPX track appearance is enabled + if (M_PREFS->getSimpleGpxTrack() && layer()->isTrack()) + Draw = false; + if (!Draw) { + if (!sizeParents()) + Draw = true; + else if (lastUpdated() == Feature::Log && !options.options.testFlag(RendererOptions::TrackSegmentVisible)) + Draw = true; + } + } + return Draw; +} + + +bool Node::notEverythingDownloaded() +{ + return lastUpdated() == Feature::NotYetDownloaded; +} + +const CoordBox& Node::boundingBox(bool) const +{ + return BBox; +} + +void Node::drawSimple(QPainter &P, MapView *theView) +{ +// if (!M_PREFS->getWireframeView() && !TEST_RFLAGS(RendererOptions::Interacting)) +// return; + + if (! ((isReadonly() || !isSelectable(theView->pixelPerM(), theView->renderOptions())) && (!isPOI() && !isWaypoint()))) + // if (!Pt->isReadonly() && Pt->isSelectable(r)) + { + if (!layer()) { + qDebug() << "Node without layer:" << id().numId << xmlId(); + return; + } + qreal WW = theView->nodeWidth(); + if (WW >= 1) { + QColor theColor = QColor(0,0,0,128); + if (M_PREFS->getUseStyledWireframe() && hasPainter()) { + const FeaturePainter* thePainter = getCurrentPainter(); + if (thePainter->DrawForeground) + theColor = thePainter->ForegroundColor; + else if (thePainter->DrawBackground) + theColor = thePainter->BackgroundColor; + } + QPointF Pp(theView->toView(this)); + if (layer()->classGroups() & Layer::Special) { + QRect R2(Pp.x()-(WW+4)/2, Pp.y()-(WW+4)/2, WW+4, WW+4); + P.fillRect(R2,QColor(255,0,255,192)); + } else if (isWaypoint()) { + QRect R2(Pp.x()-(WW+4)/2, Pp.y()-(WW+4)/2, WW+4, WW+4); + P.fillRect(R2,QColor(255,0,0,192)); + } + + QRect R(Pp.x()-WW/2, Pp.y()-WW/2, WW, WW); + P.fillRect(R,theColor); + } + } +} + +void Node::drawTouchup(QPainter& thePainter, MapView* theView) +{ + if (isDirty() && isUploadable() && M_PREFS->getDirtyVisible()) { + QPoint P = theView->toView(this); + qreal theWidth = theView->nodeWidth(); + if (theWidth >= 1) { + QRect R(P-QPoint(theWidth/2,theWidth/2),QSize(theWidth,theWidth)); + thePainter.fillRect(R,M_PREFS->getDirtyColor()); + } + } +} + +void Node::drawSpecial(QPainter& thePainter, QPen& Pen, MapView* theView) +{ + QPen TP(Pen); + TP.setWidth(TP.width() / 2); + + buildPath(theView->projection()); + QPoint me(theView->toView(this)); + QRect R(me-QPoint(3,3),QSize(6,6)); + + thePainter.setPen(TP); + thePainter.drawRect(R); + R.adjust(-7, -7, 7, 7); + thePainter.drawEllipse(R); +} + +void Node::drawParentsSpecial(QPainter& thePainter, QPen& Pen, MapView* theView) +{ + for (int i=0; i<sizeParents(); ++i) { + if (!getParent(i)->isDeleted()) { + Feature* f = CAST_FEATURE(getParent(i)); + if (f) + f->drawSpecial(thePainter, Pen, theView); + } + } +} + +void Node::drawChildrenSpecial(QPainter& thePainter, QPen& Pen, MapView* theView, int depth) +{ + Q_UNUSED(thePainter); + Q_UNUSED(Pen); + Q_UNUSED(theView); + Q_UNUSED(depth); + // Node has no children +} + + +qreal Node::pixelDistance(const QPointF& Target, qreal, const QList<Feature*>& /* NoSnap */, MapView* theView) const +{ + qreal Best = 1000000; + + QPoint me = theView->toView(const_cast<Node*>(this)); + + Best = distance(Target, me); + + return Best; +} + +void Node::cascadedRemoveIfUsing(Document*, Feature*, CommandList*, const QList<Feature*>&) +{ +} + +QString Node::description() const +{ + QString s(tagValue("name","")); + if (!s.isEmpty()) + return QString("%1 (%2)").arg(s).arg(id().numId); + return + QString("%1").arg(id().numId); +} + +void Node::partChanged(Feature*, int) +{ +} + +void Node::updateMeta() +{ + QMutexLocker mutlock(&featMutex); + if (MetaUpToDate) + return; + + Feature::updateMeta(); + + IsWaypoint = (findKey("_waypoint_") != -1); + IsPOI = false; + for (int i=0; i<tagSize(); ++i) { + if (!M_PREFS->getTechnicalTags().contains(tagKey(i))) { + IsPOI = true; + break; + } + } + + if (!IsPOI && !IsWaypoint) { + int i=0; + int prtReadonly=0, prtWritable=0; + for (; i<sizeParents(); ++i) { + if (getParent(i)->isReadonly()) + ++prtReadonly; + else + ++prtWritable; + } + if (!ReadOnly) { + if (prtReadonly && !prtWritable) + setReadonly(true); + } + } + MetaUpToDate = true; +} + +bool Node::toXML(QXmlStreamWriter& stream, QProgressDialog * progress, bool strict, QString changesetid) +{ + bool OK = true; + + if (isVirtual()) + return OK; + + stream.writeStartElement("node"); + + Feature::toXML(stream, strict, changesetid); + stream.writeAttribute("lon",COORD2STRING(BBox.topRight().x())); + stream.writeAttribute("lat", COORD2STRING(BBox.topRight().y())); + + tagsToXML(stream, strict); + stream.writeEndElement(); + + if (progress) + progress->setValue(progress->value()+1); + + return OK; +} + +Node * Node::fromXML(Document* d, Layer* L, QXmlStreamReader& stream) +{ + qreal Lat = stream.attributes().value("lat").toString().toDouble(); + qreal Lon = stream.attributes().value("lon").toString().toDouble(); + + QString sid = (stream.attributes().hasAttribute("id") ? stream.attributes().value("id").toString() : stream.attributes().value("xml:id").toString()); + IFeature::FId id(IFeature::Point, sid.toLongLong()); + Node* Pt = CAST_NODE(d->getFeature(id)); + if (!Pt) { + Pt = g_backend.allocNode(L, Coord(Lon,Lat)); + Pt->setId(id); + L->add(Pt); + Feature::fromXML(stream, Pt); + } else { + Feature::fromXML(stream, Pt); + if (Pt->layer() != L) { + Pt->layer()->remove(Pt); + L->add(Pt); + } + Pt->setPosition(Coord(Lon, Lat)); + } + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "tag") { + Pt->setTag(stream.attributes().value("k").toString(), stream.attributes().value("v").toString()); + stream.readNext(); + } + + stream.readNext(); + } + + return Pt; +} + +QString Node::toHtml() +{ + QString D; + int i; + + + if ((i = findKey("_waypoint_")) != -1) + D += "<p><b>"+QApplication::translate("MapFeature", "Waypoint")+"</b><br/>"; + D += "<i>"+QApplication::translate("MapFeature", "WGS84 coordinates")+": </i>" + COORD2STRING(position().y()) + " (" + Coord2Sexa(position().y()) + ") / " + COORD2STRING(position().x()) + " (" + Coord2Sexa(position().x()) + ")<br/>"; + D += "<i>"+QApplication::translate("MapFeature", "Projected coordinates")+": </i>" + COORD2STRING(projected().y()) + " / " + COORD2STRING(projected().x()); + + if ((i = findKey("_description_")) != -1) + D += "<br/><i>"+QApplication::translate("MapFeature", "description")+": </i>" + tagValue(i); + if ((i = findKey("_comment_")) != -1) + D += "<br/><i>"+QApplication::translate("MapFeature", "comment")+": </i>" + tagValue(i); + + return Feature::toMainHtml(QApplication::translate("MapFeature", "Node"), "node").arg(D); +} + +bool Node::toGPX(QXmlStreamWriter& stream, QProgressDialog * progress, QString element, bool forExport) +{ + bool OK = true; + + if (isVirtual()) + return OK; + + if (!tagValue("_waypoint_","").isEmpty() ||!sizeParents()) + stream.writeStartElement("wpt"); + else + stream.writeStartElement(element); + + if (!forExport) + stream.writeAttribute("xml:id", xmlId()); + stream.writeAttribute("lon",COORD2STRING(BBox.topRight().x())); + stream.writeAttribute("lat", COORD2STRING(BBox.topRight().y())); +#ifndef FRISIUS_BUILD + stream.writeTextElement("time", time().toString(Qt::ISODate)+"Z"); +#else + stream.writeTextElement("time", QDateTime::currentDateTime().toString(Qt::ISODate)+"Z"); +#endif + + QString s = tagValue("name",""); + if (!s.isEmpty()) { + stream.writeTextElement("name", s); + } + s = tagValue("_comment_",""); + if (!s.isEmpty()) { + stream.writeTextElement("cmt", s); + } + s = tagValue("_description_",""); + if (!s.isEmpty()) { + stream.writeTextElement("desc", s); + } + + // OpenStreetBug + s = tagValue("_special_",""); + if (!s.isEmpty() && id().type & IFeature::Special) { + stream.writeStartElement("extensions"); + QString sid = stripToOSMId(id()); + stream.writeTextElement("id", sid); + stream.writeEndElement(); + } + stream.writeEndElement(); + + if (progress) + progress->setValue(progress->value()+1); + + return OK; +} + +/*********************************************/ + +TrackNode::TrackNode(const Coord &aCoord) + : Node(aCoord) + , Elevation(0.0) + , Speed(0.0) +{ +} + +TrackNode::TrackNode(const Node& other) + : Node(other) + , Elevation(0.0) + , Speed(0.0) +{ +} + +TrackNode::TrackNode(const TrackNode& other) + : Node(other) + , Elevation(other.Elevation) + , Speed(other.Speed) +{ +} + +qreal TrackNode::speed() const +{ + return Speed; +} + +void TrackNode::setSpeed(qreal aSpeed) +{ + Speed = aSpeed; +} + +qreal TrackNode::elevation() const +{ + return Elevation; +} + +void TrackNode::setElevation(qreal aElevation) +{ + Elevation = aElevation; +} + +#ifdef FRISIUS_BUILD + +const QDateTime& TrackNode::time() const +{ + return QDateTime::fromTime_t(Time); +} + +void TrackNode::setTime(const QDateTime& time) +{ + Time = time.toTime_t(); +} + +void TrackNode::setTime(uint epoch) +{ + Time = epoch; +} +#endif + +TrackNode * TrackNode::fromGPX(Document* d, Layer* L, QXmlStreamReader& stream) +{ + qreal Lat = stream.attributes().value("lat").toString().toDouble(); + qreal Lon = stream.attributes().value("lon").toString().toDouble(); + + QString sid = (stream.attributes().hasAttribute("id") ? stream.attributes().value("id").toString() : stream.attributes().value("xml:id").toString()); + IFeature::FId id(IFeature::Point, sid.toLongLong()); + TrackNode* Pt = CAST_TRACKNODE(d->getFeature(id)); + if (!Pt) { + Pt = g_backend.allocTrackNode(L, Coord(Lon,Lat)); + Pt->setId(id); + Pt->setLastUpdated(Feature::Log); + L->add(Pt); + } else { + Pt->setPosition(Coord(Lon,Lat)); + if (Pt->lastUpdated() == Feature::NotYetDownloaded) + Pt->setLastUpdated(Feature::OSMServer); + } + + if (stream.name() == "wpt") + Pt->setTag("_waypoint_", "yes"); + + QDateTime time = QDateTime::currentDateTime(); + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "time") { + stream.readNext(); + QString dtm = stream.text().toString(); + time = QDateTime::fromString(dtm.left(19), Qt::ISODate); + stream.readNext(); + } else if (stream.name() == "ele") { + stream.readNext(); + Pt->setElevation(stream.text().toString().toFloat()); + stream.readNext(); + } else if (stream.name() == "speed") { + stream.readNext(); + Pt->setSpeed(stream.text().toString().toFloat()); + stream.readNext(); + } else if (stream.name() == "name") { + stream.readNext(); + Pt->setTag("name", stream.text().toString()); + stream.readNext(); + } else if (stream.name() == "cmt") { + stream.readNext(); + Pt->setTag("_comment_", stream.text().toString()); + stream.readNext(); + } else if (stream.name() == "desc") { + stream.readNext(); + Pt->setTag("_description_", stream.text().toString()); + stream.readNext(); + } + else if (stream.name() == "cmt") + { + stream.readNext(); + Pt->setTag("_comment_", stream.text().toString()); + stream.readNext(); + } + else if (stream.name() == "extensions") // for OpenStreetBugs + { + QString str = stream.readElementText(QXmlStreamReader::IncludeChildElements); + QDomDocument doc; + doc.setContent(str); + + QDomNodeList li = doc.elementsByTagName("id"); + if (li.size()) { + QString id = li.at(0).toElement().text(); + Pt->setId(IFeature::FId(IFeature::Point | IFeature::Special, id.toLongLong())); + Pt->setTag("_special_", "yes"); // Assumed to be OpenstreetBugs as they don't use their own namesoace + Pt->setSpecial(true); + } + } + + stream.readNext(); + } + Pt->setTime(time); + + return Pt; +} + +bool TrackNode::toGPX(QXmlStreamWriter& stream, QProgressDialog * progress, QString element, bool forExport) +{ + bool OK = true; + + if (isVirtual()) + return OK; + + if (!tagValue("_waypoint_","").isEmpty() ||!sizeParents()) + stream.writeStartElement("wpt"); + else + stream.writeStartElement(element); + + if (!forExport) + stream.writeAttribute("xml:id", xmlId()); + stream.writeAttribute("lon",COORD2STRING(BBox.topRight().x())); + stream.writeAttribute("lat", COORD2STRING(BBox.topRight().y())); + + stream.writeTextElement("time", time().toString(Qt::ISODate)+"Z"); + + QString s = tagValue("name",""); + if (!s.isEmpty()) { + stream.writeTextElement("name", s); + } + if (elevation()) { + stream.writeTextElement("ele", QString::number(elevation(),'f',6)); + } + if (speed()) { + stream.writeTextElement("speed", QString::number(speed(),'f',6)); + } + s = tagValue("_comment_",""); + if (!s.isEmpty()) { + stream.writeTextElement("cmt", s); + } + s = tagValue("_description_",""); + if (!s.isEmpty()) { + stream.writeTextElement("desc", s); + } + + // OpenStreetBug + s = tagValue("_special_",""); + if (!s.isEmpty() && id().type & IFeature::Special) { + stream.writeStartElement("extensions"); + QString sid = stripToOSMId(id()); + stream.writeTextElement("id", sid); + stream.writeEndElement(); + } + stream.writeEndElement(); + + if (progress) + progress->setValue(progress->value()+1); + + return OK; +} + +QString TrackNode::toHtml() +{ + QString D; + int i; + + + if ((i = findKey("_waypoint_")) != -1) + D += "<p><b>"+QApplication::translate("MapFeature", "Waypoint")+"</b><br/>"; + D += "<i>"+QApplication::translate("MapFeature", "coord")+": </i>" + COORD2STRING(position().y()) + " (" + Coord2Sexa(position().y()) + ") / " + COORD2STRING(position().x()) + " (" + Coord2Sexa(position().x()) + ")"; + + if (elevation()) + D += "<br/><i>"+QApplication::translate("MapFeature", "elevation")+": </i>" + QString::number(elevation(), 'f', 4); + if (speed()) + D += "<br/><i>"+QApplication::translate("MapFeature", "speed")+": </i>" + QString::number(speed(), 'f', 4); + if ((i = findKey("_description_")) != -1) + D += "<br/><i>"+QApplication::translate("MapFeature", "description")+": </i>" + tagValue(i); + if ((i = findKey("_comment_")) != -1) + D += "<br/><i>"+QApplication::translate("MapFeature", "comment")+": </i>" + tagValue(i); + + return Feature::toMainHtml(QApplication::translate("MapFeature", "Node"), "node").arg(D); +} + +/*********************************/ + +PhotoNode::PhotoNode(const Coord& aCoord) + : TrackNode(aCoord) + , Photo(0) + , photoLocationBR(true) +{ + +} + +PhotoNode::PhotoNode(const Node& other) + : TrackNode(other) + , Photo(0) + , photoLocationBR(true) +{ +} + +PhotoNode::PhotoNode(const TrackNode& other) + : TrackNode(other) + , Photo(0) + , photoLocationBR(true) +{ +} + +PhotoNode::~PhotoNode(void) +{ + delete Photo; +} + +QPixmap PhotoNode::photo() const +{ + if (Photo) + return *(Photo); + else + return QPixmap(); +} + +void PhotoNode::setPhoto(QPixmap thePhoto) +{ + delete Photo; + Photo = new QPixmap(thePhoto.scaled(M_PREFS->getMaxGeoPicWidth(), M_PREFS->getMaxGeoPicWidth(), Qt::KeepAspectRatio)); +} + +void PhotoNode::drawTouchup(QPainter& thePainter , MapView* theView) +{ +#ifdef GEOIMAGE + QPoint me = theView->toView(this); + thePainter.setPen(QPen(QColor(0, 0, 0), 2)); + QRect box(me - QPoint(5, 3), QSize(10, 6)); + thePainter.drawRect(box); + if (theView->renderOptions().options.testFlag(RendererOptions::PhotosVisible) && theView->pixelPerM() > M_PREFS->getRegionalZoom()) { + qreal rt = qBound(0.2, (double)theView->pixelPerM(), 1.0); + QPoint phPt; + + if (photoLocationBR) { + phPt = me + QPoint(10*rt, 10*rt); + } else { + qreal rt = qBound(0.2, (double)theView->pixelPerM(), 1.0); + qreal phRt = 1. * Photo->width() / Photo->height(); + phPt = me - QPoint(10*rt, 10*rt) - QPoint(M_PREFS->getMaxGeoPicWidth()*rt, M_PREFS->getMaxGeoPicWidth()*rt/phRt); + } + thePainter.drawPixmap(phPt, Photo->scaledToWidth(M_PREFS->getMaxGeoPicWidth()*rt)); + } +#endif + Node::drawTouchup(thePainter, theView); +} + +#ifdef GEOIMAGE +void PhotoNode::drawHover(QPainter& thePainter, MapView* theView) +{ + /* call the parent function */ + Feature::drawHover(thePainter, theView); + + /* and then the image */ + if (TEST_RFLAGS(RendererOptions::PhotosVisible) && theView->pixelPerM() > M_PREFS->getRegionalZoom()) { + QPoint me(theView->toView(this)); + + qreal rt = qBound(0.2, (double)theView->pixelPerM(), 1.0); + qreal phRt = 1. * Photo->width() / Photo->height(); + QPoint phPt; + if (photoLocationBR) { + phPt = me + QPoint(10*rt, 10*rt); + } else { + phPt = me - QPoint(10*rt, 10*rt) - QPoint(M_PREFS->getMaxGeoPicWidth()*rt, M_PREFS->getMaxGeoPicWidth()*rt/phRt); + } + QRect box(phPt, QSize(M_PREFS->getMaxGeoPicWidth()*rt, M_PREFS->getMaxGeoPicWidth()*rt/phRt)); + thePainter.drawRect(box); + } +} +#endif + +qreal PhotoNode::pixelDistance(const QPointF& Target, qreal ClearDistance, const QList<Feature*>& NoSnap, MapView* theView) const +{ +#ifdef GEOIMAGE + QPoint me = theView->toView(const_cast<PhotoNode*>(this)); + if (TEST_RFLAGS(RendererOptions::PhotosVisible) && theView->pixelPerM() > M_PREFS->getRegionalZoom()) { + qreal rt = qBound(0.2, (double)theView->pixelPerM(), 1.0); + qreal phRt = 1. * Photo->width() / Photo->height(); + QPoint phPt; + if (photoLocationBR) { + } else { + phPt = me - QPoint(10*rt, 10*rt) - QPoint(M_PREFS->getMaxGeoPicWidth()*rt, M_PREFS->getMaxGeoPicWidth()*rt/phRt); + } + QRect box(phPt, QSize(M_PREFS->getMaxGeoPicWidth()*rt, M_PREFS->getMaxGeoPicWidth()*rt/phRt)); + if (box.contains(Target.toPoint())) { + photoLocationBR = !photoLocationBR; + theView->invalidate(true, false, false); + } + } +#endif + + return Node::pixelDistance(Target, ClearDistance, NoSnap, theView ); +} + + diff --git a/src/Features/Node.h b/src/Features/Node.h new file mode 100644 index 0000000..c3ee412 --- /dev/null +++ b/src/Features/Node.h @@ -0,0 +1,150 @@ +#ifndef MERKATOR_TRACKPOINT_H_ +#define MERKATOR_TRACKPOINT_H_ + +#include "MerkaartorPreferences.h" + +#include "Coord.h" +#include "Feature.h" +#include "Document.h" +#include "Layer.h" + +#include <QtCore/QDateTime> +#include <QtXml> + +class QProgressDialog; + +class Node : public Feature +{ + friend class MemoryBackend; + +public: + Node() + : ProjectionRevision(0) + { + } + + Node(const Coord& aCoord); + Node(const Node& other); + virtual ~Node(); + + quint16 ProjectionRevision; + QPointF Projected; + + bool IsWaypoint; + bool IsPOI; + +public: + virtual QString getClass() const {return "Node";} + virtual char getType() const {return IFeature::Point;} + virtual void updateMeta(); + + virtual const CoordBox& boundingBox(bool update=true) const; + virtual void drawSimple(QPainter& P, MapView* theView); + virtual void drawTouchup(QPainter& P, MapView* theView); + virtual void drawSpecial(QPainter& P, QPen& Pen, MapView* theView); + virtual void drawParentsSpecial(QPainter& P, QPen& Pen, MapView* theView); + virtual void drawChildrenSpecial(QPainter& P, QPen& Pen, MapView* theView, int depth); + + virtual qreal pixelDistance(const QPointF& Target, qreal ClearEndDistance, const QList<Feature*>& NoSnap, MapView* theView) const; + virtual void cascadedRemoveIfUsing(Document* theDocument, Feature* aFeature, CommandList* theList, const QList<Feature*>& Alternatives); + virtual bool notEverythingDownloaded(); + virtual QString description() const; + + virtual int find(Feature* Pt) const; + virtual void remove(int idx); + virtual void remove(Feature* F); + virtual int size() const; + virtual Feature* get(int idx); + virtual const Feature* get(int Idx) const; + virtual bool isNull() const; + virtual bool isInteresting() const; + virtual bool isPOI(); + virtual bool isWaypoint(); + + /** check if the feature is drawable + * @return true if to be drawn + */ + virtual bool isSelectable(qreal PixelPerM, RendererOptions options); + + virtual void partChanged(Feature* F, int ChangeId); + +public: + const QPointF& projected() const; + const QPointF &projected(const Projection &aProjection); + void buildPath(const Projection& aProjection); + + Coord position() const; + void setPosition(const Coord& aCoord); + + bool toXML(QXmlStreamWriter& stream, QProgressDialog * progress, bool strict=false, QString changetsetid = QString()); + static Node* fromXML(Document* d, Layer* L, QXmlStreamReader& stream); + + bool toGPX(QXmlStreamWriter& stream, QProgressDialog * progress, QString element, bool forExport=false); + + QString toHtml(); +}; + +class TrackNode : public Node +{ + friend class MemoryBackend; + +protected: + TrackNode(const Coord& aCoord); + TrackNode(const Node& other); + TrackNode(const TrackNode& other); + +public: + qreal speed() const; + void setSpeed(qreal aSpeed); + + qreal elevation() const; + void setElevation(qreal aElevation); + +#ifdef FRISIUS_BUILD + const QDateTime& time() const; + void setTime(const QDateTime& aTime); + void setTime(uint epoch); +#endif + + virtual bool toGPX(QXmlStreamWriter& stream, QProgressDialog * progress, QString element, bool forExport=false); + static TrackNode* fromGPX(Document* d, Layer* L, QXmlStreamReader& stream); + + virtual QString toHtml(); + +private: +#ifdef FRISIUS_BUILD + uint Time; +#endif + qreal Elevation; + qreal Speed; +}; + +class PhotoNode : public TrackNode +{ + friend class MemoryBackend; + +protected: + PhotoNode(const Coord& aCoord); + PhotoNode(const Node& other); + PhotoNode(const TrackNode& other); + virtual ~PhotoNode(); + +public: + virtual void drawTouchup(QPainter &thePainter, MapView* theView); +#ifdef GEOIMAGE + virtual void drawHover(QPainter& P, MapView* theView); +#endif + virtual qreal pixelDistance(const QPointF& Target, qreal ClearEndDistance, const QList<Feature*>& NoSnap, MapView* theView) const; + + QPixmap photo() const; + void setPhoto(QPixmap thePhoto); + +protected: + QPixmap* Photo; + mutable bool photoLocationBR; +}; + + +Q_DECLARE_METATYPE( Node * ); + +#endif diff --git a/src/Features/Relation.cpp b/src/Features/Relation.cpp new file mode 100644 index 0000000..1c1e12e --- /dev/null +++ b/src/Features/Relation.cpp @@ -0,0 +1,804 @@ +#include "Features.h" +#include "MapView.h" +#include "MapRenderer.h" +#include "MainWindow.h" +#include "DocumentCommands.h" +#include "RelationCommands.h" +#include "Document.h" +#include "LineF.h" +#include "Global.h" + +#include <QApplication> +#include <QAbstractTableModel> +#include <QProgressDialog> +#include <QPainter> + +#include <algorithm> +#include <utility> +#include <QList> + +#define TEST_RFLAGS(x) theView->renderOptions().options.testFlag(x) + +class RelationMemberModel : public QAbstractTableModel +{ + public: + RelationMemberModel(RelationPrivate* aParent, MainWindow* aMain); + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role) const; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + Qt::ItemFlags flags(const QModelIndex &index) const; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + + RelationPrivate* Parent; + MainWindow* Main; +}; + +class RelationPrivate +{ + public: + RelationPrivate(Relation* R) + : theRelation(R), theModel(0), ModelReferences(0) + , PathUpToDate(false) + , ProjectionRevision(0) + , BBoxUpToDate(false) + , Width(0) + { + } + ~RelationPrivate() + { + delete theModel; + } + void CalculateWidth(); + + Relation* theRelation; + QList<QPair<QString, MapFeaturePtr> > Members; + RelationMemberModel* theModel; + int ModelReferences; + QPainterPath thePath; + QPainterPath theBoundingPath; + bool PathUpToDate; + int ProjectionRevision; + + bool BBoxUpToDate; + + RenderPriority theRenderPriority; + + qreal Width; + }; + +#define DEFAULTWIDTH 6 +#define LANEWIDTH 4 + +void RelationPrivate::CalculateWidth() +{ + QString s(theRelation->tagValue("width",QString())); + if (!s.isNull()) { + Width = s.toDouble(); + return; + } + QString h = theRelation->tagValue("highway",QString()); + if (s.isNull()) { + Width = DEFAULTWIDTH; + return; + } + + if ( (h == "motorway") || (h=="motorway_link") ) + Width = 4*LANEWIDTH; // 3 lanes plus emergency + else if ( (h == "trunk") || (h=="trunk_link") ) + Width = 3*LANEWIDTH; // 2 lanes plus emergency + else if ( (h == "primary") || (h=="primary_link") ) + Width = 2*LANEWIDTH; // 2 lanes + else if (h == "secondary") + Width = 2*LANEWIDTH; // 2 lanes + else if (h == "tertiary") + Width = 1.5*LANEWIDTH; // shared middle lane + else if (h == "cycleway") + Width = 1.5; + Width = DEFAULTWIDTH; +} + + +Relation::Relation() + : Feature() +{ + p = new RelationPrivate(this); +} + +Relation::Relation(const Relation& other) + : Feature(other) +{ + p = new RelationPrivate(this); +} + +Relation::~Relation() +{ + // TODO Those cleanup shouldn't be necessary and lead to crashes + // Check for side effect of supressing them. +// for (int i=0; i<p->Members.size(); ++i) +// if (p->Members[i].second) +// p->Members[i].second->unsetParentFeature(this); + delete p; +} + +void Relation::setLayer(Layer* L) +{ + if (L) { + for (int i=0; i<p->Members.size(); ++i) + if (p->Members[i].second) + p->Members[i].second->setParentFeature(this); + } else { + for (int i=0; i<p->Members.size(); ++i) + if (p->Members[i].second) + p->Members[i].second->unsetParentFeature(this); + } + Feature::setLayer(L); +} + +void Relation::partChanged(Feature*, int ChangeId) +{ + if (isDeleted()) + return; + + p->PathUpToDate = false; + p->BBoxUpToDate = false; + MetaUpToDate = false; + g_backend.sync(this); + + notifyParents(ChangeId); +} + +QString Relation::description() const +{ + QString s(tagValue("name","")); + if (!s.isEmpty()) + return QString("%1 (%2)").arg(s).arg(id().numId); + return QString("%1").arg(id().numId); +} + +const CoordBox& Relation::boundingBox(bool update) const +{ + if (!p->BBoxUpToDate && update) + { + if (p->Members.size() == 0) + BBox = CoordBox(Coord(0,0),Coord(0,0)); + else + { + CoordBox Clip; + bool haveFirst = false; + for (int i=0; i<p->Members.size(); ++i) { + if (p->Members[i].second && !p->Members[i].second->boundingBox().isNull()/* && !CAST_RELATION(p->Members[i].second)*/) { + if (!haveFirst) { + Clip = p->Members[i].second->boundingBox(); + haveFirst = true; + } else + Clip.merge(p->Members[i].second->boundingBox()); + } + } + BBox = Clip; + p->BBoxUpToDate = true; + } + } + return BBox; +} + +void Relation::drawSimple(QPainter &P, MapView *theView) +{ + Q_UNUSED(P) + Q_UNUSED(theView) +} + +void Relation::drawTouchup(QPainter& P, MapView* theView) +{ + if (!theView->renderOptions().options.testFlag(RendererOptions::RelationsVisible)) + return; + + if (notEverythingDownloaded()) + P.setPen(QPen(Qt::red,M_PREFS->getRelationsWidth(),Qt::DashLine)); + else { + if (isDirty() && isUploadable() && M_PREFS->getDirtyVisible()) + P.setPen(QPen(M_PREFS->getDirtyColor(),M_PREFS->getDirtyWidth())); + else + P.setPen(QPen(M_PREFS->getRelationsColor(),M_PREFS->getRelationsWidth(),Qt::DashLine)); + } + P.drawPath(theView->transform().map(p->theBoundingPath)); +} + +void Relation::drawSpecial(QPainter& thePainter, QPen& Pen, MapView* theView) +{ + QPen TP(Pen); + + /* draw relation itself now solid + if (Pen.style() == Qt::SolidLine) + { + TP.setStyle(Qt::DashLine); + } */ + + thePainter.setPen(TP); + buildPath(theView->projection()); + thePainter.drawPath(theView->transform().map(p->theBoundingPath)); +} + +void Relation::drawParentsSpecial(QPainter& thePainter, QPen& Pen, MapView* theView) +{ + for (int i=0; i<sizeParents(); ++i) { + if (!getParent(i)->isDeleted()) { + Feature* f = CAST_FEATURE(getParent(i)); + if (f) + f->drawSpecial(thePainter, Pen, theView); + } + } +} + +void Relation::drawChildrenSpecial(QPainter& thePainter, QPen& Pen, MapView* theView, int depth) +{ + QPen TP(Pen); + TP.setStyle(Qt::DashLine); + for (int i=0; i<p->Members.size(); ++i) + if (p->Members[i].second && !p->Members[i].second->isDeleted()) + if (p->Members[i].second->boundingBox().intersects(theView->viewport())) + { + p->Members[i].second->drawSpecial(thePainter, TP, theView); + if (--depth > 0) + p->Members[i].second->drawChildrenSpecial(thePainter, TP, theView, depth); + } +} + + +qreal Relation::pixelDistance(const QPointF& Target, qreal ClearEndDistance, const QList<Feature*>& NoSnap, MapView* theView) const +{ + Q_UNUSED(NoSnap) + + qreal Best = 1000000; + if (!TEST_RFLAGS(RendererOptions::RelationsVisible) && !M_PREFS->getRelationsSelectableWhenHidden()) + return Best; + + //for (int i=0; i<p->Members.size(); ++i) + //{ + // if (p->Members[i].second) { + // qreal Dist = p->Members[i].second->pixelDistance(Target, ClearEndDistance, theProjection); + // if (Dist < Best) + // Best = Dist; + // } + //} + + + qreal D; + //QRectF bb = QRectF(theView->toView(boundingBox().bottomLeft()),theView->toView(boundingBox().topRight())); + //bb.adjust(-10, -10, 10, 10); + + LineF F(theView->toView(boundingBox().topLeft()), theView->toView(boundingBox().topRight())); + D = F.capDistance(Target); + if ((D < ClearEndDistance) && (D<Best)) Best = D; + F = LineF(theView->toView(boundingBox().topLeft()), theView->toView(boundingBox().bottomLeft())); + D = F.capDistance(Target); + if ((D < ClearEndDistance) && (D<Best)) Best = D; + F = LineF(theView->toView(boundingBox().bottomRight()), theView->toView(boundingBox().bottomLeft())); + D = F.capDistance(Target); + if ((D < ClearEndDistance) && (D<Best)) Best = D; + F = LineF(theView->toView(boundingBox().bottomRight()), theView->toView(boundingBox().topRight())); + D = F.capDistance(Target); + if ((D < ClearEndDistance) && (D<Best)) Best = D; + + return Best + 0.1; // Make sure we select simple elements first +} + +void Relation::cascadedRemoveIfUsing(Document* theDocument, Feature* aFeature, CommandList* theList, const QList<Feature*>& Alternatives) +{ + for (int i=0; i<p->Members.size();) { + if (p->Members[i].second && p->Members[i].second == aFeature) + { + QString Role = p->Members[i].first; + theList->add(new RelationRemoveFeatureCommand(this, i, theDocument->getDirtyOrOriginLayer(layer()))); + for (int j=0; j<Alternatives.size(); ++j) + if (i+j >= p->Members.size() || p->Members[i+j].second != Alternatives[j]) { + if ((i+j) == 0) + theList->add(new RelationAddFeatureCommand(this, Role, Alternatives[j], 0, theDocument->getDirtyOrOriginLayer(Alternatives[j]->layer()))); + else if (p->Members[i+j-1].second != Alternatives[j]) + theList->add(new RelationAddFeatureCommand(this, Role, Alternatives[j], i+j, theDocument->getDirtyOrOriginLayer(Alternatives[j]->layer()))); + } + continue; + } + ++i; + } + if (p->Members.size() == 0) { + if (!isDeleted()) { + QList<Feature*> alt; + theList->add(new RemoveFeatureCommand(theDocument,this,alt)); + } + } +} + +bool Relation::notEverythingDownloaded() +{ + if (lastUpdated() == Feature::NotYetDownloaded) + return true; + for (int i=0; i<p->Members.size(); ++i) + if (p->Members.at(i).second && !CAST_RELATION(p->Members[i].second)) + if (p->Members.at(i).second->notEverythingDownloaded()) + return true; + return false; +} + + +void Relation::add(const QString& Role, Feature* F) +{ + p->Members.push_back(qMakePair(Role,F)); + F->setParentFeature(this); + p->PathUpToDate = false; + p->BBoxUpToDate = false; + MetaUpToDate = false; + g_backend.sync(this); + + notifyChanges(); +} + +void Relation::add(const QString& Role, Feature* F, int Idx) +{ + p->Members.push_back(qMakePair(Role,F)); + std::rotate(p->Members.begin()+Idx,p->Members.end()-1,p->Members.end()); + F->setParentFeature(this); + p->PathUpToDate = false; + p->BBoxUpToDate = false; + MetaUpToDate = false; + g_backend.sync(this); + + notifyChanges(); +} + +void Relation::remove(int Idx) +{ + Feature* F = p->Members[Idx].second; + // only remove as parent if the feature is only a member once + p->Members.erase(p->Members.begin()+Idx); + if (F && find(F) == p->Members.size()) + F->unsetParentFeature(this); + p->PathUpToDate = false; + p->BBoxUpToDate = false; + MetaUpToDate = false; + g_backend.sync(this); + + notifyChanges(); +} + +void Relation::remove(Feature* F) +{ + for (int i=p->Members.size(); i; --i) + if (F == p->Members[i-1].second) + remove(i-1); +} + +int Relation::size() const +{ + return p->Members.size(); +} + +int Relation::find(Feature* Pt) const +{ + for (int i=0; i<p->Members.size(); ++i) + if (Pt == p->Members[i].second) + return i; + return p->Members.size(); +} + +Feature* Relation::get(int idx) +{ + return p->Members[idx].second; +} + +const Feature* Relation::get(int idx) const +{ + return p->Members[idx].second; +} + +bool Relation::isNull() const +{ + return (p->Members.size() == 0); +} + +const QString& Relation::getRole(int idx) const +{ + return p->Members[idx].first; +} + +QAbstractTableModel* Relation::referenceMemberModel(MainWindow* aMain) +{ + ++p->ModelReferences; + if (!p->theModel) + p->theModel = new RelationMemberModel(p, aMain); + return p->theModel; +} + +void Relation::releaseMemberModel() +{ + --p->ModelReferences; + if (p->ModelReferences == 0) + { + delete p->theModel; + p->theModel = 0; + } +} + +void Relation::buildPath(Projection const &theProjection) +{ +// QPainterPath clipPath; +// clipPath.addRect(cr); + + QMutexLocker mutlock(&featMutex); + p->theBoundingPath = QPainterPath(); + + if (!p->Members.size()) + return; + + QPolygonF theVector; + theVector.append(theProjection.project(boundingBox().bottomLeft())); + theVector.append(theProjection.project(boundingBox().topLeft())); + theVector.append(theProjection.project(boundingBox().topRight())); + theVector.append(theProjection.project(boundingBox().bottomRight())); + theVector.append(theProjection.project(boundingBox().bottomLeft())); + + //QRectF bb = QPolygonF(theVector).boundingRect(); + //p->theBoundingPath.addRect(bb); + + p->theBoundingPath.addPolygon(theVector); +// p->theBoundingPath = p->theBoundingPath.intersected(clipPath); + + if (!p->PathUpToDate || p->ProjectionRevision != theProjection.projectionRevision()) { + p->thePath = QPainterPath(); + + Way* outerWay = NULL; + int numOuter = 0; + bool isMultipolygon = false; + if (tagValue("type", "") == "multipolygon") + isMultipolygon = true; + + + // Handle polygons made of scattered ways + QList< QPair<QString,QPainterPath> > memberPaths; + for (int i=0; i<size(); ++i) { + if (CHECK_WAY(p->Members[i].second)) { + Way* M = STATIC_CAST_WAY(p->Members[i].second); + M->buildPath(theProjection); + if (M->getPath().elementCount() > 1) { + memberPaths << qMakePair(p->Members[i].first, M->getPath()); + if (isMultipolygon && (p->Members[i].first == "outer" || p->Members[i].first.isEmpty())) { + if (!numOuter) + outerWay = M; + else + outerWay = NULL; + ++numOuter; + } + } + } + } + + QList<QPainterPath> innerPaths; + QList<QPainterPath> outerPaths; + + while (memberPaths.size()) { + // handle the start... + QPointF curPoint; + QPainterPath curPath; + QString curRole; + + curRole = memberPaths[0].first; + curPath.moveTo(memberPaths[0].second.elementAt(0)); + for (int j=1; j<memberPaths[0].second.elementCount(); ++j) { + curPoint = memberPaths[0].second.elementAt(j); + curPath.lineTo(curPoint); + } + // ... and remove it + memberPaths.removeAt(0); + // Check if any remaining path starts or ends at the current point + for (int k=0; k<memberPaths.size(); ++k) { + if (memberPaths[k].second.elementAt(0) == curPoint && memberPaths[k].first == curRole) { // Check start + for (int l=1; l<memberPaths[k].second.elementCount(); ++l) { + curPoint = memberPaths[k].second.elementAt(l); + curPath.lineTo(curPoint); + } + memberPaths.removeAt(k); + k=0; + } else if (memberPaths[k].second.elementAt(memberPaths[k].second.elementCount()-1) == curPoint && memberPaths[k].first == curRole) { // Check end + for (int l=memberPaths[k].second.elementCount()-2; l>=0; --l) { + curPoint = memberPaths[k].second.elementAt(l); + curPath.lineTo(curPoint); + } + memberPaths.removeAt(k); + k=0; + } + } + if (curRole == "inner" and isMultipolygon) + innerPaths << curPath; + else + outerPaths << curPath; + } + + if (outerWay && tagSize() == 1) { + outerWay->rebuildPath(theProjection); + for (int i=0; i<innerPaths.size(); ++i) { + outerWay->addPathHole(innerPaths[i]); + } + } else { + for (int i=0; i<outerPaths.size(); ++i) { + p->thePath.addPath(outerPaths[i]); + } + for (int i=0; i<innerPaths.size(); ++i) { + p->thePath = p->thePath.subtracted(innerPaths[i]); + } + } + + p->ProjectionRevision = theProjection.projectionRevision(); + p->PathUpToDate = true; + } +} + +const QPainterPath& Relation::getPath() const +{ + return p->thePath; +} + +const RenderPriority& Relation::renderPriority() +{ + if (!MetaUpToDate) + updateMeta(); + return p->theRenderPriority; +} + +void Relation::updateMeta() +{ + QMutexLocker mutlock(&featMutex); + if (MetaUpToDate) + return; + + Feature::updateMeta(); + + p->PathUpToDate = false; + p->CalculateWidth(); + + MetaUpToDate = true; + + p->theRenderPriority = RenderPriority(RenderPriority::IsSingular, 0., 0); + for (int i=0; i<p->Members.size(); ++i) { + if (Way* W = CAST_WAY(p->Members.at(i).second)) { + if (W->renderPriority() < p->theRenderPriority) + p->theRenderPriority = W->renderPriority(); + } else if (Relation* R = CAST_RELATION(p->Members.at(i).second)) { + if (R->renderPriority() < p->theRenderPriority) + p->theRenderPriority = R->renderPriority(); + } + } +} + +bool Relation::toXML(QXmlStreamWriter& stream, QProgressDialog * progress, bool strict, QString changetsetid) +{ + bool OK = true; + + stream.writeStartElement("relation"); + Feature::toXML(stream, strict, changetsetid); + + // Has to be first to be picked up when reading back + if (!strict) + boundingBox().toXML("BoundingBox", stream); + + for (int i=0; i<size(); ++i) { + QString Type("node"); + if (CHECK_WAY(get(i))) + Type="way"; + else if (CHECK_RELATION(get(i))) + Type="relation"; + + stream.writeStartElement("member"); + stream.writeAttribute("type", Type); + stream.writeAttribute("ref", get(i)->xmlId()); + stream.writeAttribute("role", getRole(i)); + stream.writeEndElement(); + } + + tagsToXML(stream, strict); + + stream.writeEndElement(); + + if (progress) + progress->setValue(progress->value()+1); + return OK; +} + +Relation * Relation::fromXML(Document * d, Layer * L, QXmlStreamReader& stream) +{ + bool hasBbox = false; + + QString sid = (stream.attributes().hasAttribute("id") ? stream.attributes().value("id").toString() : stream.attributes().value("xml:id").toString()); + IFeature::FId id; + id.type = IFeature::OsmRelation; + id.numId = sid.toLongLong(); + + Relation* R = CAST_RELATION(d->getFeature(id)); + if (!R) { + R = g_backend.allocRelation(L); + R->setId(id); + L->add(R); + Feature::fromXML(stream, R); + } else { + Feature::fromXML(stream, R); + if (R->layer() != L) { + R->layer()->remove(R); + L->add(R); + } + while (R->p->Members.size()) + R->remove(0); + } + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "member") { + QString Type = stream.attributes().value("type").toString(); + QString sId = stream.attributes().value("ref").toString(); + QString role = stream.attributes().value("role").toString(); + Feature* F = 0; + if (Type == "node") { + IFeature::FId nId(IFeature::Point, sId.toLongLong()); + Node* Part = CAST_NODE(d->getFeature(nId)); + if (!Part) + { + Part = g_backend.allocNode(L, Coord(0,0)); + Part->setId(nId); + Part->setLastUpdated(Feature::NotYetDownloaded); + L->add(Part); + } + F = Part; + } else if (Type == "way") { + IFeature::FId rId(IFeature::LineString, sId.toLongLong()); + Way* Part = CAST_WAY(d->getFeature(rId)); + if (!Part) + { + Part = g_backend.allocWay(L); + Part->setId(rId); + Part->setLastUpdated(Feature::NotYetDownloaded); + L->add(Part); + } + F = Part; + } else if (Type == "relation") { + IFeature::FId RId(IFeature::OsmRelation, sId.toLongLong()); + Relation* Part = dynamic_cast<Relation*>(d->getFeature(RId)); + if (!Part) + { + Part = g_backend.allocRelation(L); + Part->setId(RId); + Part->setLastUpdated(Feature::NotYetDownloaded); + L->add(Part); + } + F = Part; + } + if (F) { + if (!hasBbox) { + R->add(role, F); + } else { + R->p->Members.push_back(qMakePair(role,F)); + F->setParentFeature(R); + } + } + stream.readNext(); + } else if (stream.name() == "tag") { + R->setTag(stream.attributes().value("k").toString(), stream.attributes().value("v").toString()); + stream.readNext(); + } else if (stream.name() == "BoundingBox") { + R->BBox = CoordBox::fromXML(stream); + R->p->BBoxUpToDate = true; + hasBbox = true; + stream.readNext(); + } else if (!stream.isWhitespace()) { + qDebug() << "Relation: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + stream.readNext(); + } + + if (hasBbox && !R->isDeleted()) + g_backend.indexAdd(L, R->BBox, R); + return R; +} + +QString Relation::toHtml() +{ + QString D; + + D += "<i>"+QApplication::translate("MapFeature", "size")+": </i>" + QString::number(size()) + " " + QApplication::translate("MapFeature", "members"); + CoordBox bb = boundingBox(); + D += "<br/>"; + D += "<i>"+QApplication::translate("MapFeature", "Topleft")+": </i>" + COORD2STRING(bb.topLeft().y()) + " / " + COORD2STRING(bb.topLeft().x()); + D += "<br/>"; + D += "<i>"+QApplication::translate("MapFeature", "Botright")+": </i>" + COORD2STRING(bb.bottomRight().y()) + " / " + COORD2STRING(bb.bottomRight().x()); + + return Feature::toMainHtml(QApplication::translate("MapFeature", "Relation"),"relation").arg(D); +} + +qreal Relation::widthOf() +{ + if (MetaUpToDate == false) + updateMeta(); + + return p->Width; +} + +/* RELATIONMODEL */ + +RelationMemberModel::RelationMemberModel(RelationPrivate *aParent, MainWindow* aMain) +: Parent(aParent), Main(aMain) +{ +} + +int RelationMemberModel::rowCount(const QModelIndex &) const +{ + return Parent->Members.size(); +} + +int RelationMemberModel::columnCount(const QModelIndex &) const +{ + return 2; +} + +QVariant RelationMemberModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + if (index.row() >= (int)Parent->Members.size()) + return QVariant(); + if (role == Qt::DisplayRole) + { + if (index.column() == 0) + return Parent->Members[index.row()].first; + else + return Parent->Members[index.row()].second->description(); + } + else if (role == Qt::EditRole) + { + if ( (index.column() == 0) ) + return Parent->Members[index.row()].first; + } + else if (role == Qt::UserRole) + { + QVariant v; + v.setValue((Feature *)(Parent->Members[index.row()].second)); + return v; + } + return QVariant(); +} + +QVariant RelationMemberModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (role != Qt::DisplayRole) + return QVariant(); + if (orientation == Qt::Horizontal) + { + if (section == 0) + return QApplication::translate("MapFeature", "Role"); + else + return QApplication::translate("MapFeature", "Member"); + } + return QVariant(); +} + +Qt::ItemFlags RelationMemberModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return Qt::ItemIsEnabled; + if (index.column() == 0) + return QAbstractTableModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable; + return QAbstractTableModel::flags(index) | Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} + +bool RelationMemberModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (index.isValid() && role == Qt::EditRole) + { + Feature* Tmp = Parent->Members[index.row()].second; + CommandList* L = new CommandList(MainWindow::tr("Relation Modified %1").arg(Parent->theRelation->id().numId), Parent->theRelation); + L->add(new RelationRemoveFeatureCommand(Parent->theRelation, index.row(), Main->document()->getDirtyOrOriginLayer(Parent->theRelation->layer()))); + L->add(new RelationAddFeatureCommand(Parent->theRelation,value.toString(),Tmp,index.row(), Main->document()->getDirtyOrOriginLayer(Parent->theRelation->layer()))); + Main->document()->addHistory(L); + emit dataChanged(index, index); + return true; + } + return false; +} + diff --git a/src/Features/Relation.h b/src/Features/Relation.h new file mode 100644 index 0000000..32cfa70 --- /dev/null +++ b/src/Features/Relation.h @@ -0,0 +1,72 @@ +#ifndef MERKAARTOR_RELATIONS_H_ +#define MERKAARTOR_RELATIONS_H_ + +#include "Document.h" +#include "Feature.h" + +class MainWindow; +class RelationPrivate; +class QAbstractTableModel; +class QProgressDialog; + +class Relation : public Feature +{ + friend class MemoryBackend; + +protected: + Relation(void); + Relation(const Relation&); + virtual ~Relation(void); + +public: + virtual QString getClass() const {return "Relation";} + virtual char getType() const {return IFeature::OsmRelation;} + virtual void updateMeta(); + + virtual const CoordBox& boundingBox(bool update=true) const; + virtual void drawSimple(QPainter& P, MapView* theView); + virtual void drawTouchup(QPainter& P, MapView* theView); + virtual void drawSpecial(QPainter& P, QPen& Pen, MapView* theView); + virtual void drawParentsSpecial(QPainter& P, QPen& Pen, MapView* theView); + virtual void drawChildrenSpecial(QPainter& P, QPen& Pen, MapView* theView, int depth); + + virtual qreal pixelDistance(const QPointF& Target, qreal ClearEndDistance, const QList<Feature*>& NoSnap, MapView* theView) const; + virtual void cascadedRemoveIfUsing(Document* theDocument, Feature* aFeature, CommandList* theList, const QList<Feature*>& Alternatives); + virtual bool notEverythingDownloaded(); + virtual const RenderPriority& renderPriority(); + + void add(const QString& Role, Feature* Pt); + void add(const QString& Role, Feature* Pt, int Idx); + virtual void remove(int Idx); + virtual void remove(Feature* F); + virtual int size() const; + virtual int find(Feature* Pt) const; + virtual Feature* get(int idx); + virtual const Feature* get(int Idx) const; + virtual bool isNull() const; + + const QString& getRole(int Idx) const; + QAbstractTableModel* referenceMemberModel(MainWindow* aMain); + void releaseMemberModel(); + QString description() const; + + virtual void setLayer(Layer* aLayer); + virtual void partChanged(Feature* F, int ChangeId); + + const QPainterPath& getPath() const; + void buildPath(Projection const &theProjection); + + virtual bool toXML(QXmlStreamWriter& stream, QProgressDialog * progress, bool strict=false, QString changetsetid = QString()); + static Relation* fromXML(Document* d, Layer* L, QXmlStreamReader& stream); + + virtual QString toHtml(); + + qreal widthOf(); + +private: + RelationPrivate* p; +}; + +Q_DECLARE_METATYPE( Relation * ); + +#endif diff --git a/src/Features/TrackSegment.cpp b/src/Features/TrackSegment.cpp new file mode 100644 index 0000000..b2e3392 --- /dev/null +++ b/src/Features/TrackSegment.cpp @@ -0,0 +1,413 @@ +#include "TrackSegment.h" + +#include "Global.h" +#include "DocumentCommands.h" +#include "TrackSegmentCommands.h" +#include "MapView.h" +#include "MapRenderer.h" +#include "Node.h" +#include "LineF.h" + +#include <QtGui/QPainter> +#include <QProgressDialog> + +#include <algorithm> +#include <QList> + +#define TEST_RFLAGS(x) theView->renderOptions().options.testFlag(x) + +class TrackSegmentPrivate +{ + public: + TrackSegmentPrivate() + : Distance(0) + { + } + + QList<TrackNode*> Nodes; + qreal Distance; + CoordBox BBox; +}; + +TrackSegment::TrackSegment(void) + : Feature() +{ + p = new TrackSegmentPrivate; +} + +TrackSegment::TrackSegment(const TrackSegment& other) + : Feature(other) +{ + p = new TrackSegmentPrivate; +} + +TrackSegment::~TrackSegment(void) +{ + // TODO Those cleanup shouldn't be necessary and lead to crashes + // Check for side effect of supressing them. +// for (int i=0; i<p->Nodes.size(); ++i) +// p->Nodes[i]->unsetParentFeature(this); + delete p; +} + +void TrackSegment::sortByTime() +{ + for (int i=0; i<p->Nodes.size(); ++i) + { + for (int j=i+1; j<p->Nodes.size(); ++j) + { + if (p->Nodes[i]->time() > p->Nodes[j]->time()) + { + QDateTime dt(p->Nodes[i]->time()); + p->Nodes[i]->setTime(p->Nodes[j]->time()); + p->Nodes[j]->setTime(dt); + } + } + } +} + +QString TrackSegment::description() const +{ + return "tracksegment"; +} + +void TrackSegment::add(TrackNode* aPoint) +{ + p->Nodes.push_back(aPoint); + aPoint->setParentFeature(this); + g_backend.sync(this); +} + +void TrackSegment::add(TrackNode* Pt, int Idx) +{ + p->Nodes.push_back(Pt); + std::rotate(p->Nodes.begin()+Idx,p->Nodes.end()-1,p->Nodes.end()); + g_backend.sync(this); +} + +int TrackSegment::find(Feature* Pt) const +{ + for (int i=0; i<p->Nodes.size(); ++i) + if (p->Nodes[i] == Pt) + return i; + return p->Nodes.size(); +} + +void TrackSegment::remove(int idx) +{ + Node* Pt = p->Nodes[idx]; + p->Nodes.erase(p->Nodes.begin()+idx); + Pt->unsetParentFeature(this); + g_backend.sync(this); +} + +void TrackSegment::remove(Feature* F) +{ + for (int i=p->Nodes.size(); i; --i) + if (p->Nodes[i-1] == F) + remove(i-1); +} + +int TrackSegment::size() const +{ + return p->Nodes.size(); +} + +Feature* TrackSegment::get(int i) +{ + return p->Nodes[i]; +} + +TrackNode* TrackSegment::getNode(int i) +{ + return p->Nodes[i]; +} + +const Feature* TrackSegment::get(int Idx) const +{ + return p->Nodes[Idx]; +} + +bool TrackSegment::isNull() const +{ + return (p->Nodes.size() == 0); +} + +void TrackSegment::drawDirectionMarkers(QPainter &P, QPen &pen, const QPointF & FromF, const QPointF & ToF) +{ + if (::distance(FromF,ToF) <= 30.0) + return; + + const qreal DistFromCenter=10.0; + const qreal theWidth = !M_PREFS->getSimpleGpxTrack() ? 5.0 : 8.0; + const qreal A = angle(FromF-ToF); + + QPointF T(DistFromCenter*cos(A), DistFromCenter*sin(A)); + QPointF V1(theWidth*cos(A+M_PI/6),theWidth*sin(A+M_PI/6)); + QPointF V2(theWidth*cos(A-M_PI/6),theWidth*sin(A-M_PI/6)); + + pen.setStyle(Qt::SolidLine); + P.setPen(pen); + + QPointF H(FromF+ToF); + H /= 2.0; + P.drawLine(H-T,H-T+V1); + P.drawLine(H-T,H-T+V2); +} + +void TrackSegment::drawSimple(QPainter &P, MapView *theView) +{ + Q_UNUSED(P) + Q_UNUSED(theView) +} + +void TrackSegment::drawTouchup(QPainter &P, MapView* theView) +{ + QPen pen; + + if (!TEST_RFLAGS(RendererOptions::TrackSegmentVisible)) + return; + + for (int i=1; i<p->Nodes.size(); ++i) + { + if (!theView->viewport().contains(p->Nodes[i-1]->position()) && !theView->viewport().contains(p->Nodes[i]->position())) + continue; + + QPointF FromF = theView->toView(p->Nodes[i-1]); + QPointF ToF = theView->toView(p->Nodes[i]); + + if (!M_PREFS->getSimpleGpxTrack()) + { + qreal distance = p->Nodes[i-1]->position().distanceFrom(p->Nodes[i]->position()); + qreal slope = (p->Nodes[i]->elevation() - p->Nodes[i-1]->elevation()) / (distance * 10.0); + qreal speed = p->Nodes[i]->speed(); + + int width = M_PREFS->getGpxTrackWidth(); + // Dynamic track line width adaption to zoom level + if (theView->pixelPerM() > 2) + width++; + else if (theView->pixelPerM() < 1) + width--; + + // Encode speed in width of path ... + qreal penWidth = 1.0; + if (speed > 10.0) + penWidth = qMin(1.0+speed*0.02, 5.0); + + penWidth *= width; + + // ... and slope in the color + int green = 0; + int red = 0; + + if (slope > 2.0) + { + slope = qMin(slope, (qreal)20.0); + green = 48 + int(slope*79.0 / 20.0); + } + else if (slope < -2.0) + { + slope = qMax(slope, (qreal)-20.0); + red = 48 + int(-slope*79.0 / 20.0); + } + + pen.setColor(QColor(128 + red, 128 + green, 128)); + + pen.setStyle(Qt::DotLine); + pen.setWidthF(penWidth); + } + else + { + int width = M_PREFS->getGpxTrackWidth(); + // Dynamic track line width adaption to zoom level + if (theView->pixelPerM() > 2) + width++; + else if (theView->pixelPerM() < 1) + width--; + pen.setWidthF(width); + pen.setColor(M_PREFS->getGpxTrackColor()); + } + P.setPen(pen); + + P.drawLine(FromF,ToF); + drawDirectionMarkers(P, pen, FromF, ToF); + } +} + +bool TrackSegment::notEverythingDownloaded() +{ + return false; +} + +void TrackSegment::drawSpecial(QPainter&, QPen&, MapView*) +{ + // not implemented +} + +void TrackSegment::drawParentsSpecial(QPainter&, QPen&, MapView*) +{ + // not implemented +} + +void TrackSegment::drawChildrenSpecial(QPainter&, QPen&, MapView*, int) +{ + // not implemented +} + + +const CoordBox& TrackSegment::boundingBox(bool) const +{ + if (p->Nodes.size()) + { + p->BBox = CoordBox(p->Nodes[0]->position(),p->Nodes[0]->position()); + for (int i=1; i<p->Nodes.size(); ++i) + p->BBox.merge(p->Nodes[i]->position()); + } else + p->BBox = CoordBox(); + return p->BBox; +} + +qreal TrackSegment::pixelDistance(const QPointF& , qreal , const QList<Feature*>& , MapView*) const +{ + // unable to select that one + return 1000000; +} + +void TrackSegment::cascadedRemoveIfUsing(Document* theDocument, Feature* aFeature, CommandList* theList, const QList<Feature*>& Proposals) +{ + for (int i=0; i<p->Nodes.size();) { + if (p->Nodes[i] == aFeature) + { + QList<TrackNode*> Alternatives; + for (int j=0; j<Proposals.size(); ++j) + { + TrackNode* Pt = CAST_TRACKNODE(Proposals[j]); + if (Pt) + Alternatives.push_back(Pt); + } + if ( (p->Nodes.size() == 1) && (Alternatives.size() == 0) ) + theList->add(new RemoveFeatureCommand(theDocument,this)); + else + { + for (int j=0; j<Alternatives.size(); ++j) + { + if (i < p->Nodes.size()) + { + if (p->Nodes[i+j] != Alternatives[j]) + { + if ((i+j) == 0) + theList->add(new TrackSegmentAddNodeCommand(this, Alternatives[j], i+j,Alternatives[j]->layer())); + else if (p->Nodes[i+j-1] != Alternatives[j]) + theList->add(new TrackSegmentAddNodeCommand(this, Alternatives[j], i+j,Alternatives[j]->layer())); + } + } + } + theList->add(new TrackSegmentRemoveNodeCommand(this, (TrackNode*)aFeature,aFeature->layer())); + } + } + ++i; + } +} + +void TrackSegment::partChanged(Feature*, int) +{ +} + +void TrackSegment::updateMeta() +{ + QMutexLocker mutlock(&featMutex); + if (MetaUpToDate) + return; + + Feature::updateMeta(); + + p->Distance = 0; + + if (p->Nodes.size() == 0) + { + MetaUpToDate = true; + return; + } + + for (int i=0; (i+1)<p->Nodes.size(); ++i) + { + if (p->Nodes[i] && p->Nodes[i+1]) { + const Coord & here = p->Nodes[i]->position(); + const Coord & next = p->Nodes[i+1]->position(); + + p->Distance += next.distanceFrom(here); + } + } + + + MetaUpToDate = true; +} + +qreal TrackSegment::distance() +{ + if (MetaUpToDate == false) + updateMeta(); + + return p->Distance; +} + +int TrackSegment::duration() const +{ + return p->Nodes[0]->time().secsTo(p->Nodes[p->Nodes.size() - 1]->time()); +} + + +bool TrackSegment::toGPX(QXmlStreamWriter& stream, QProgressDialog * progress, bool forExport) +{ + bool OK = true; + + stream.writeStartElement("trkseg"); + + if (!forExport) + stream.writeAttribute("xml:id", xmlId()); + + for (int i=0; i<size(); ++i) { + dynamic_cast <Node*> (get(i))->toGPX(stream, progress, "trkpt", forExport); + } + stream.writeEndElement(); + + if (progress) + progress->setValue(progress->value()+1); + + return OK; +} + +bool TrackSegment::toXML(QXmlStreamWriter& stream, QProgressDialog * progress, bool, QString) +{ + return toGPX(stream, progress, false); +} + +TrackSegment* TrackSegment::fromGPX(Document* d, Layer* L, QXmlStreamReader& stream, QProgressDialog * progress) +{ + TrackSegment* ts = g_backend.allocSegment(L); + L->add(ts); + + if (stream.attributes().hasAttribute("xml:id")) + ts->setId(IFeature::FId(IFeature::GpxSegment, stream.attributes().value("xml:id").toString().toLongLong())); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "trkpt") { + TrackNode* N = TrackNode::fromGPX(d, L, stream); + ts->add(N); + progress->setValue(stream.characterOffset()); + } + + if (progress->wasCanceled()) + break; + + stream.readNext(); + } + + return ts; +} + +TrackSegment* TrackSegment::fromXML(Document* d, Layer* L, QXmlStreamReader& stream, QProgressDialog * progress) +{ + return TrackSegment::fromGPX(d, L, stream, progress); +} diff --git a/src/Features/TrackSegment.h b/src/Features/TrackSegment.h new file mode 100644 index 0000000..2159967 --- /dev/null +++ b/src/Features/TrackSegment.h @@ -0,0 +1,70 @@ +#ifndef MERKATOR_TRACKSEGMENT_H_ +#define MERKATOR_TRACKSEGMENT_H_ + +#include "Feature.h" + +class TrackSegmentPrivate; +class TrackNode; + +class QProgressDialog; + +class TrackSegment : public Feature +{ + friend class MemoryBackend; + +protected: + TrackSegment(void); + ~TrackSegment(void); + TrackSegment(const TrackSegment& other); + +private: + void drawDirectionMarkers(QPainter & P, QPen & pen, const QPointF & FromF, const QPointF & ToF); + +public: + virtual QString getClass() const {return "TrackSegment";} + virtual char getType() const {return IFeature::GpxSegment;} + virtual void updateMeta(); + + virtual const CoordBox& boundingBox(bool update=true) const; + virtual void drawSimple(QPainter& P, MapView* theView); + virtual void drawTouchup(QPainter& P, MapView* theView); + virtual void drawSpecial(QPainter& P, QPen& Pen, MapView* theView); + virtual void drawParentsSpecial(QPainter& P, QPen& Pen, MapView* theView); + virtual void drawChildrenSpecial(QPainter& P, QPen& Pen, MapView* theView, int depth); + + virtual qreal pixelDistance(const QPointF& Target, qreal ClearEndDistance, const QList<Feature*>& NoSnap, MapView* theView) const; + void cascadedRemoveIfUsing(Document* theDocument, Feature* aFeature, CommandList* theList, const QList<Feature*>& Alternatives); + virtual bool notEverythingDownloaded(); + virtual QString description() const; + + void add(TrackNode* aPoint); + void add(TrackNode* Pt, int Idx); + virtual int find(Feature* Pt) const; + virtual void remove(int idx); + virtual void remove(Feature* F); + virtual Feature* get(int idx); + virtual int size() const; + TrackNode* getNode(int idx); + virtual const Feature* get(int Idx) const; + virtual bool isNull() const; + + void sortByTime(); + virtual void partChanged(Feature* F, int ChangeId); + + qreal distance(); + int duration() const; + + virtual bool toGPX(QXmlStreamWriter& stream, QProgressDialog * progress, bool forExport=false); + static TrackSegment* fromGPX(Document* d, Layer* L, QXmlStreamReader& stream, QProgressDialog * progress); + virtual bool toXML(QXmlStreamWriter& stream, QProgressDialog * progress, bool strict=false,QString changetsetid = QString()); + static TrackSegment* fromXML(Document* d, Layer* L, QXmlStreamReader& stream, QProgressDialog * progress); + + virtual QString toHtml() {return QString();} + +private: + TrackSegmentPrivate* p; +}; + +#endif + + diff --git a/src/Features/Way.cpp b/src/Features/Way.cpp new file mode 100644 index 0000000..98950cb --- /dev/null +++ b/src/Features/Way.cpp @@ -0,0 +1,1042 @@ +#include "Global.h" + +#include "Way.h" +#include "Node.h" + +#include "DocumentCommands.h" +#include "WayCommands.h" +#include "Coord.h" +#include "Painting.h" +#include "MapView.h" +#include "MapRenderer.h" +#include "LineF.h" +#include "MDiscardableDialog.h" +#include "Utils.h" + +#include <QApplication> +#include <QtGui/QPainter> +#include <QtGui/QPainterPath> +#include <QProgressDialog> + +#include <algorithm> +#include <QList> + +#define TEST_RFLAGS(x) theView->renderOptions().options.testFlag(x) + +class WayPrivate +{ + public: + WayPrivate(Way* aWay) + : theWay(aWay), BBoxUpToDate(false) + , Area(0), Distance(0) + , PathUpToDate(false), VirtualsUptodate(false) + , ProjectionRevision(0) + , BestSegment(-1) + , SimpleWidth(0) + { + } + Way* theWay; + + QList<Node*> Nodes; + QList<Node*> virtualNodes; + + bool BBoxUpToDate; + + qreal Area; + qreal Distance; + bool NotEverythingDownloaded; + bool PathUpToDate; + bool VirtualsUptodate; + QPainterPath thePath; + int ProjectionRevision; + int BestSegment; + qreal SimpleWidth; + QColor SimpleColor; + + RenderPriority theRenderPriority; // 10 (24) + + void CalculateWidth(); + void doUpdateVirtuals(); + void removeVirtuals(); + void addVirtuals(); +}; + +#define DEFAULTWIDTH 6 +#define LANEWIDTH 4 + +void WayPrivate::CalculateWidth() +{ + QString h = theWay->tagValue("highway",QString()); + if (h.isEmpty()) { + SimpleWidth = LANEWIDTH; + SimpleColor = QColor(128, 128, 128); + return; + } + + SimpleWidth = LANEWIDTH; + SimpleColor = QColor(0, 0, 0); + if ( (h == "motorway") || (h=="motorway_link") ) { + SimpleWidth = 4*LANEWIDTH; // 3 lanes plus emergency + SimpleColor = QColor(128, 155, 192); + } else if ( (h == "trunk") || (h=="trunk_link") ) { + SimpleWidth = 3*LANEWIDTH; // 2 lanes plus emergency + SimpleColor = QColor(127, 201, 127); + } else if ( (h == "primary") || (h=="primary_link") ) { + SimpleWidth = 2*LANEWIDTH; // 2 lanes + SimpleColor = QColor(228, 109, 113); + } else if (h == "secondary") { + SimpleWidth = 2*LANEWIDTH; // 2 lanes + SimpleColor = QColor(253, 191, 111); + } else if (h == "tertiary") { + SimpleWidth = 1.5*LANEWIDTH; // shared middle lane + SimpleColor = QColor(255, 229, 33); + } else if (h == "cycleway") { + SimpleWidth = LANEWIDTH; + SimpleColor = QColor(0, 0, 255); + } + + QString s(theWay->tagValue("width",QString())); + if (!s.isNull()) + SimpleWidth = s.toDouble(); +} + +void WayPrivate::removeVirtuals() +{ + while (virtualNodes.size()) { + virtualNodes[0]->unsetParentFeature(theWay); + g_backend.deallocVirtualNode(virtualNodes[0]); +// if (virtualNodes[0]->layer()) +// virtualNodes[0]->layer()->deleteFeature(virtualNodes[0]); +// delete p->virtualNodes[0]; + virtualNodes.erase(virtualNodes.begin()); + } +} + +void WayPrivate::addVirtuals() +{ + for (int i=1; i<Nodes.size(); ++i) { + QLineF l(Nodes[i-1]->position(), Nodes[i]->position()); + l.setLength(l.length()/2); + Node* v = g_backend.allocVirtualNode(l.p2()); + v->setVirtual(true); + v->setParentFeature(theWay); +// theWay->layer()->add(v); + virtualNodes.push_back(v); + } +} + +void WayPrivate::doUpdateVirtuals() +{ +// Q_ASSERT(!(theWay->layer()->isIndexingBlocked())); + + if (VirtualsUptodate) + return; + + removeVirtuals(); + if (theWay->canAddVirtualNodes()) + addVirtuals(); + + VirtualsUptodate = true; +} + +/**************************/ + +Way::Way(void) + : Feature() +{ + p = new WayPrivate(this); +} + +Way::Way(const Way& other) + : Feature(other) +{ + p = new WayPrivate(this); +} + +Way::~Way(void) +{ + // TODO Those cleanup shouldn't be necessary and lead to crashes + // Check for side effect of supressing them. +// while (p->virtualNodes.size()) { +// p->virtualNodes[0]->unsetParentFeature(this); +// delete p->virtualNodes[0]; +// p->virtualNodes.erase(p->virtualNodes.begin()); +// } +// for (unsigned int i=0; i<p->Nodes.size(); ++i) +// if (p->Nodes[i]) +// p->Nodes[i]->unsetParentFeature(this); + + delete p; +} + +char Way::getType() const +{ + if (isClosed()) + return (IFeature::LineString | IFeature::Polygon); + else + return IFeature::LineString; +} + + +void Way::setDeleted(bool delState) +{ + Feature::setDeleted(delState); + p->VirtualsUptodate = false; + if (p->Nodes.size()) + p->doUpdateVirtuals(); +} + +void Way::setLayer(Layer* L) +{ + if (L) { + for (int i=0; i<p->Nodes.size(); ++i) { + if (p->Nodes[i]) + p->Nodes[i]->setParentFeature(this); + } + } else { + for (int i=0; i<p->Nodes.size(); ++i) { + if (p->Nodes[i]) + p->Nodes[i]->unsetParentFeature(this); + } + } + Feature::setLayer(L); + p->VirtualsUptodate = false; +} + +void Way::partChanged(Feature* /*F*/, int ChangeId) +{ + if (isDeleted()) + return; + + p->BBoxUpToDate = false; + p->PathUpToDate = false; + MetaUpToDate = false; + p->VirtualsUptodate = false; + g_backend.sync(this); + + notifyParents(ChangeId); +} + +QString Way::description() const +{ + QString s(tagValue("name",QString())); + if (!s.isEmpty()) + return QString("%1 (%2)").arg(s).arg(id().numId); + return QString("%1").arg(id().numId); +} + +void Way::add(Node* Pt) +{ + add(Pt, p->Nodes.size()); +} + +void Way::add(Node* Pt, int Idx) +{ + QMutexLocker mutlock(&featMutex); + p->Nodes.insert(p->Nodes.begin() + Idx, Pt); +// p->Nodes.push_back(Pt); +// std::rotate(p->Nodes.begin()+Idx,p->Nodes.end()-1,p->Nodes.end()); + Pt->setParentFeature(this); + g_backend.sync(Pt); + p->BBoxUpToDate = false; + p->PathUpToDate = false; + MetaUpToDate = false; + p->VirtualsUptodate = false; + g_backend.sync(this); + + notifyChanges(); +} + +int Way::find(Feature* Pt) const +{ + for (int i=0; i<p->Nodes.size(); ++i) + if (p->Nodes[i] == Pt) + return i; + return p->Nodes.size(); +} + +int Way::findVirtual(Feature* Pt) const +{ + for (int i=0; i<p->virtualNodes.size(); ++i) + if (p->virtualNodes[i] == Pt) + return i; + return p->virtualNodes.size(); +} + +void Way::remove(int idx) +{ + QMutexLocker mutlock(&featMutex); + Node* Pt = p->Nodes[idx]; + // only remove as parent if the node is only included once + p->Nodes.erase(p->Nodes.begin()+idx); + if (Pt && (find(Pt) >= size())) + Pt->unsetParentFeature(this); + g_backend.sync(Pt); + p->BBoxUpToDate = false; + p->PathUpToDate = false; + MetaUpToDate = false; + p->VirtualsUptodate = false; + g_backend.sync(this); + + notifyChanges(); +} + +void Way::remove(Feature* F) +{ + for (int i=p->Nodes.size(); i; --i) + if (p->Nodes[i-1] == F) + remove(i-1); +} + +int Way::size() const +{ + return p->Nodes.size(); +} + +Node* Way::getNode(int idx) +{ + return p->Nodes.at(idx); +} + +const Node* Way::getNode(int idx) const +{ + return p->Nodes.at(idx); +} + +const QList<NodePtr>& Way::getNodes() const +{ + return p->Nodes; +} + +const QList<NodePtr>& Way::getVirtuals() const +{ + return p->virtualNodes; +} + + +Feature* Way::get(int idx) +{ + return p->Nodes.at(idx); +} + +const Feature* Way::get(int idx) const +{ + return p->Nodes.at(idx); +} + +bool Way::isNull() const +{ + return (p->Nodes.size() == 0); +} + +bool Way::notEverythingDownloaded() +{ + if (MetaUpToDate == false) + updateMeta(); + + return p->NotEverythingDownloaded; +} + +const CoordBox& Way::boundingBox(bool update) const +{ + if (!p->BBoxUpToDate && update) + { + if (p->Nodes.size()) + { + bool haveFirst = false; + for (int i=0; i<p->Nodes.size(); ++i) + if (!haveFirst && !p->Nodes[i]->position().isNull()) { + BBox = p->Nodes[i]->boundingBox(); + haveFirst = true; + } else + BBox.merge(p->Nodes[i]->position()); + } + else + BBox = CoordBox(Coord(0,0),Coord(0,0)); + p->BBoxUpToDate = true; + } + return BBox; +} + +void Way::drawSimple(QPainter &P, MapView *theView) +{ + QBrush theBrush(Qt::NoBrush); + QPen thePen(Qt::NoPen); + if (!M_PREFS->getUseStyledWireframe() || !hasPainter()) { +// if (p->Area > 0.0) { +// theBrush = QBrush(QColor(240, 240, 240, 127)); +// } + thePen = QPen(p->SimpleColor,(qreal)p->SimpleWidth/LANEWIDTH); + } else { + const FeaturePainter* thePainter = getCurrentPainter(); + if (thePainter->ForegroundFill && p->Area > 0.0) { + theBrush = thePainter->ForegroundFillFillColor; + if (thePainter->DrawForeground) + thePen = QPen(thePainter->ForegroundColor,thePainter->ForegroundOffset); + else if (thePainter->DrawBackground) + thePen = QPen(thePainter->BackgroundColor,thePainter->BackgroundOffset); + else + thePen = QPen(p->SimpleColor,(qreal)p->SimpleWidth/LANEWIDTH); + } else if (thePainter->DrawForeground) + thePen = QPen(thePainter->ForegroundColor,thePainter->ForegroundOffset >= 1 ? thePainter->ForegroundOffset : (qreal)p->SimpleWidth/LANEWIDTH); + else + thePen = QPen(p->SimpleColor,(qreal)p->SimpleWidth/LANEWIDTH); + } + + P.setBrush(theBrush); + P.setPen(thePen); + P.drawPath(theView->transform().map(p->thePath)); +} + +void Way::updateMeta() +{ + QMutexLocker mutlock(&featMutex); + if (MetaUpToDate) + return; + + Feature::updateMeta(); + + p->Area = 0; + p->Distance = 0; + p->CalculateWidth(); + + MetaUpToDate = true; + + p->NotEverythingDownloaded = false; + if (lastUpdated() == Feature::NotYetDownloaded) + p->NotEverythingDownloaded = true; + else + for (int i=0; i<p->Nodes.size(); ++i) + if (p->Nodes.at(i) && p->Nodes.at(i)->notEverythingDownloaded()) { + p->NotEverythingDownloaded = true; + break; + } + + if (p->Nodes.size() == 0) + return; + + bool isArea = false; + if (tagValue("highway", QString()).isEmpty() || !tagValue("area", QString()).isEmpty()) + isArea = (p->Nodes[0] == p->Nodes[p->Nodes.size()-1]); + + for (int i=0; (i+1)<p->Nodes.size(); ++i) + { + if (p->Nodes[i] && p->Nodes[i+1]) { + const Coord & here = p->Nodes[i]->position(); + const Coord & next = p->Nodes[i+1]->position(); + + p->Distance += next.distanceFrom(here); + } + } + + if (isArea) { + p->Area = p->Distance; + p->theRenderPriority = RenderPriority(RenderPriority::IsArea,-fabs(p->Area), 0); + } else { + qreal Priority = tagValue("layer","0").toInt(); + if (Priority >= 0) + Priority++; + int layer = Priority; + // dummy number to get a deterministic feature sort +// Priority += sin(intToRad(boundingBox().lonDiff())); + Priority += p->Distance / INT_MAX; + p->theRenderPriority = RenderPriority(RenderPriority::IsLinear,Priority, layer); + } + + p->doUpdateVirtuals(); +} + +qreal Way::distance() +{ + if (MetaUpToDate == false) + updateMeta(); + + return p->Distance; +} + +bool Way::isClosed() const +{ + // minimal closed way is a triangle, with 4 nodes (3 distinct) + return (p->Nodes.size() > 3 && p->Nodes[0] == p->Nodes[p->Nodes.size()-1]); +} + +qreal Way::area() +{ + if (MetaUpToDate == false) + updateMeta(); + + return p->Area; +} + +qreal Way::widthOf() +{ + if (MetaUpToDate == false) + updateMeta(); + + return p->SimpleWidth; +} + +void Way::drawTouchup(QPainter& P, MapView* theView) +{ + + if (isDirty() && isUploadable() && M_PREFS->getDirtyVisible()) { + QPen thePen(M_PREFS->getDirtyColor(),M_PREFS->getDirtyWidth()); + P.setPen(thePen); + P.drawPath(theView->transform().map(getPath())); + } + + qreal theWidth = theView->nodeWidth(); + bool Draw = (theWidth >= 1); + if (!Draw || !theView->renderOptions().options.testFlag(RendererOptions::VirtualNodesVisible) || !theView->renderOptions().options.testFlag(RendererOptions::NodesVisible) || isReadonly()) + return; + + theWidth /= 2; + P.setPen(QColor(0,0,0)); + foreach (NodePtr N, p->virtualNodes) { + if (theView->viewport().contains(N->position())) { + QPoint p = theView->toView(N); + P.drawLine(p+QPoint(-theWidth, -theWidth), p+QPoint(theWidth, theWidth)); + P.drawLine(p+QPoint(theWidth, -theWidth), p+QPoint(-theWidth, theWidth)); + } + } +} + +void Way::drawSpecial(QPainter& thePainter, QPen& Pen, MapView* theView) +{ + thePainter.setPen(Pen); + if (p->BestSegment != -1) + thePainter.drawLine(theView->transform().map(theView->projection().project(getSegment(p->BestSegment)))); + else { + buildPath(theView->projection()); + thePainter.drawPath(theView->transform().map(p->thePath)); + } +} + +void Way::drawParentsSpecial(QPainter& thePainter, QPen& Pen, MapView* theView) +{ + for (int i=0; i<sizeParents(); ++i) { + if (!getParent(i)->isDeleted()) { + Feature* f = CAST_FEATURE(getParent(i)); + if (f) + f->drawSpecial(thePainter, Pen, theView); + } + } +} + +void Way::drawChildrenSpecial(QPainter& thePainter, QPen& Pen, MapView* theView, int depth) +{ + Q_UNUSED(depth); + + QPen TP(Pen); + TP.setWidth(TP.width()*3); + TP.setCapStyle(Qt::RoundCap); + thePainter.setPen(TP); + + QPolygonF Pl; + if (p->BestSegment != -1) { + for (int i=p->BestSegment; i<=p->BestSegment+1; ++i) + if (getNode(i)->isVisible() && !getNode(i)->isVirtual()) + Pl.append(getNode(i)->projected()); + } else + buildPolygonFromRoad(this,theView->projection(),Pl); + + thePainter.drawPoints(theView->transform().map(Pl)); +} + + +qreal Way::pixelDistance(const QPointF& Target, qreal ClearEndDistance, const QList<Feature*>& NoSnap, MapView* theView) const +{ + qreal Best = 1000000; + p->BestSegment = -1; + +// if (selectNodes) { +// for (unsigned int i=0; i<p->Nodes.size(); ++i) +// { +// if (p->Nodes.at(i)) { +// qreal x = ::distance(Target, theView->toView(p->Nodes.at(i))); +// if (x<ClearEndDistance) +// return Best; +// } +// } +// } + for (int i=0; i<p->Nodes.size()-1; ++i) + { + if (NoSnap.contains(p->Nodes.at(i)) || NoSnap.contains(p->Nodes.at(i+1))) + continue; + + if (p->Nodes.at(i) && p->Nodes.at(i+1)) { + LineF F(theView->toView(p->Nodes.at(i)),theView->toView(p->Nodes.at(i+1))); + qreal D = F.capDistance(Target); + if (D < ClearEndDistance && D < Best) { + Best = D; + if (g_Merk_Segment_Mode) + p->BestSegment = i; + } + } + } + return Best; +} + +Node* Way::pixelDistanceNode(const QPointF& Target, qreal ClearEndDistance, MapView* theView, const QList<Feature*>& NoSnap, bool NoSelectVirtuals) const +{ + qreal Best = 1000000; + Node* ret = NULL; + + for (int i=0; i<p->Nodes.size(); ++i) + { + if (p->Nodes.at(i) && !NoSnap.contains(p->Nodes.at(i))) { + qreal D = ::distance(Target,theView->toView(p->Nodes.at(i))); + if (D < ClearEndDistance && D < Best) { + Best = D; + ret = p->Nodes.at(i); + } + } + } + if (!NoSelectVirtuals && M_PREFS->getVirtualNodesVisible()) { + for (int i=0; i<p->virtualNodes.size(); ++i) + { + if (p->virtualNodes.at(i)) { + p->virtualNodes.at(i)->buildPath(theView->projection()); + qreal D = ::distance(Target,theView->toView(p->virtualNodes.at(i))); + if (D < ClearEndDistance && D < Best) { + Best = D; + return p->virtualNodes.at(i); + } + } + } + } + return ret; +} + +void Way::cascadedRemoveIfUsing(Document* theDocument, Feature* aFeature, CommandList* theList, const QList<Feature*>& Proposals) +{ + for (int i=0; i<p->Nodes.size();) { + if (p->Nodes[i] == aFeature) + { + QList<Node*> Alternatives; + for (int j=0; j<Proposals.size(); ++j) + { + Node* Pt = dynamic_cast<Node*>(Proposals[j]); + if (Pt) + Alternatives.push_back(Pt); + } + for (int j=0; j<Alternatives.size(); ++j) + { + if (p->Nodes[i+j] != Alternatives[j]) + { + if ((i+j) == 0) + theList->add(new WayAddNodeCommand(this, Alternatives[j], 0,theDocument->getDirtyOrOriginLayer(layer()))); + else if (p->Nodes[i+j-1] != Alternatives[j] && (i+j+1 >= p->Nodes.size() || p->Nodes[i+j+1] != Alternatives[j])) + theList->add(new WayAddNodeCommand(this, Alternatives[j], i+j,theDocument->getDirtyOrOriginLayer(layer()))); + } + } + theList->add(new WayRemoveNodeCommand(this, (Node*)aFeature,theDocument->getDirtyOrOriginLayer(layer()))); + } + ++i; + } + if (p->Nodes.size() == 1) { + if (!isDeleted()) { + QList<Feature*> alt; + theList->add(new WayRemoveNodeCommand(this, p->Nodes[0], theDocument->getDirtyOrOriginLayer(layer()))); + theList->add(new RemoveFeatureCommand(theDocument,this,alt)); + } + } +} + +const QPainterPath& Way::getPath() const +{ + return p->thePath; +} + +void Way::addPathHole(const QPainterPath& pth) +{ + if (!p->PathUpToDate) + return; + + p->thePath = p->thePath.subtracted(pth); +} + +void Way::rebuildPath(const Projection &theProjection) +{ + p->PathUpToDate = false; + buildPath(theProjection); +} + +void Way::buildPath(const Projection &theProjection) +{ + QMutexLocker mutlock(&featMutex); + if (p->PathUpToDate && p->ProjectionRevision == theProjection.projectionRevision()) + return; + else { + p->thePath = QPainterPath(); + if (p->Nodes.size() < 2) { + p->PathUpToDate = true; + return; + } + + bool hasMoved = 0; + for (int i=0; i<p->Nodes.size(); ++i) { + if (!p->Nodes.at(i)->notEverythingDownloaded()) { + if (hasMoved) { + p->thePath.lineTo(p->Nodes.at(i)->projected(theProjection)); + } else { + p->thePath.moveTo(p->Nodes.at(i)->projected(theProjection)); + hasMoved = 1; + } + } + } + for (int i=0; i<p->virtualNodes.size(); ++i) { + p->virtualNodes[i]->buildPath(theProjection); + } + p->ProjectionRevision = theProjection.projectionRevision(); + p->PathUpToDate = true; + } +} + +bool Way::deleteChildren(Document* theDocument, CommandList* theList) +{ + if (lastUpdated() == Feature::OSMServerConflict) + return true; + + QList<Feature*> Alternatives; + QMap<Feature*, int> ToDelete; + for (int i=(int)p->Nodes.size()-1; i>=0; --i) { + Node* N = p->Nodes[i]; + if (!theDocument->isDownloadedSafe(N->boundingBox()) && N->hasOSMId()) + continue; + int sizeValidParents = 0; + for (int j=0; j<N->sizeParents(); ++j) + if (!N->getParent(j)->isDeleted()) + sizeValidParents++; + if (sizeValidParents == 1) { + ToDelete[N] = i; + } + } + QList<Feature*> ToDeleteKeys = ToDelete.uniqueKeys(); + for (int i=0; i<ToDeleteKeys.size(); ++i) { + if (!ToDeleteKeys[i]->isDeleted()) + theList->add(new RemoveFeatureCommand(theDocument, ToDeleteKeys[i], Alternatives)); + } + return true; +} + +bool Way::toGPX(QXmlStreamWriter& stream, QProgressDialog * progress, bool forExport) +{ + bool OK = true; + + stream.writeStartElement("rte"); + + if (!forExport) + stream.writeAttribute("xml:id", xmlId()); + QString s = tagValue("name",QString()); + if (!s.isEmpty()) { + stream.writeTextElement("name", s); + } + s = tagValue("_comment_",QString()); + if (!s.isEmpty()) { + stream.writeTextElement("cmt", s); + } + s = tagValue("_description_",QString()); + if (!s.isEmpty()) { + stream.writeTextElement("desc", s); + } + + for (int i=0; i<size(); ++i) { + if (!getNode(i)->isVirtual()) + getNode(i)->toGPX(stream, progress, "rtept", forExport); + } + stream.writeEndElement(); + + if (progress) + progress->setValue(progress->value()+1); + + return OK; +} + +bool Way::toXML(QXmlStreamWriter& stream, QProgressDialog * progress, bool strict, QString changetsetid) +{ + bool OK = true; + + stream.writeStartElement("way"); + Feature::toXML(stream, strict, changetsetid); + + // Has to be first to be picked up when reading back + if (!strict) + boundingBox().toXML("BoundingBox", stream); + + if (size()) { + stream.writeStartElement("nd"); + stream.writeAttribute("ref", get(0)->xmlId()); + stream.writeEndElement(); + + for (int i=1; i<size(); ++i) { + if (!getNode(i)->isVirtual()) + if (get(i)->xmlId() != get(i-1)->xmlId()) { + stream.writeStartElement("nd"); + stream.writeAttribute("ref", get(i)->xmlId()); + stream.writeEndElement(); + } + } + } + + tagsToXML(stream, strict); + + stream.writeEndElement(); + + if (progress) + progress->setValue(progress->value()+1); + + return OK; +} + +Way * Way::fromXML(Document* d, Layer * L, QXmlStreamReader& stream) +{ + bool hasBbox = false; + + QString sid = (stream.attributes().hasAttribute("id") ? stream.attributes().value("id").toString() : stream.attributes().value("xml:id").toString()); + IFeature::FId id(IFeature::LineString, sid.toLongLong()); + Way* R = CAST_WAY(d->getFeature(id)); + + if (!R) { + R = g_backend.allocWay(L); + R->setId(id); + L->add(R); + Feature::fromXML(stream, R); + } else { + Feature::fromXML(stream, R); + if (R->layer() != L) { + R->layer()->remove(R); + L->add(R); + } + while (R->p->Nodes.size()) + R->remove(0); + } + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "nd") { + QString sId = stream.attributes().value("ref").toString(); + IFeature::FId nId(IFeature::Point, sId.toLongLong()); + Node* Part = CAST_NODE(d->getFeature(nId)); + if (!Part) + { + Part = g_backend.allocNode(L, Coord(0,0)); + Part->setId(nId); + Part->setLastUpdated(Feature::NotYetDownloaded); + L->add(Part); + } + if (!hasBbox) { + R->add(Part); + } else { + R->p->Nodes.push_back(Part); + Part->setParentFeature(R); + } + stream.readNext(); + } else if (stream.name() == "tag") { + R->setTag(stream.attributes().value("k").toString(), stream.attributes().value("v").toString()); + stream.readNext(); + } else if (stream.name() == "BoundingBox") { + R->BBox = CoordBox::fromXML(stream); + R->p->BBoxUpToDate = true; + hasBbox = true; + stream.readNext(); + } else if (!stream.isWhitespace()) { + qDebug() << "Way: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + + stream.readNext(); + } + + if (hasBbox && !R->isDeleted()) + g_backend.indexAdd(L, R->BBox, R); + return R; +} + +Feature::TrafficDirectionType trafficDirection(const Way* R) +{ + // TODO some duplication with Way trafficDirection + QString d; + int idx=R->findKey("oneway"); + if (idx != -1) + { + d = R->tagValue(idx); + if ( (d == "yes") || (d == "1") || (d == "true")) return Feature::OneWay; + if (d == "-1") return Feature::OtherWay; + if ((d == "no") || (d == "false") || (d == "0")) return Feature::BothWays; + } + + idx=R->findKey("junction"); + if (idx != -1) + { + d = R->tagValue(idx); + if(d=="roundabout") return Feature::OneWay; + //TODO For motorway and motorway_link, this is still discussed on the wiki. + } + return Feature::UnknownDirection; +} + +int findSnapPointIndex(const Way* R, Coord& P) +{ + LineF L(R->getNode(0)->position(),R->getNode(1)->position()); + int BestIdx = 1; + qreal BestDistance = L.capDistance(P); + for (int i = 2; i<R->size(); ++i) + { + LineF L(R->getNode(i-1)->position(),R->getNode(i)->position()); + qreal Distance = L.capDistance(P); + if (Distance < BestDistance) + { + BestIdx = i; + BestDistance = Distance; + } + } + LineF F(R->getNode(BestIdx-1)->position(),R->getNode(BestIdx)->position()); + P = F.project(P); + return BestIdx; +} + +QString Way::toHtml() +{ + QString distanceLabel; + if (distance() < 1.0) + distanceLabel = QString("%1 m").arg(int(distance() * 1000)); + else + distanceLabel = QString("%1 km").arg(distance(), 0, 'f', 3); + + QString D; + + if (isClosed()) { + D += "<i>"+QApplication::translate("MapFeature", "Closed way")+"</i>"; + D += "<br/>"; + } + D += "<i>"+QApplication::translate("MapFeature", "Length")+": </i>" + distanceLabel; + D += "<br/>"; + D += "<i>"+QApplication::translate("MapFeature", "Size")+": </i>" + QApplication::translate("MapFeature", "%1 nodes").arg(size()); + CoordBox bb = boundingBox(); + D += "<br/>"; + D += "<i>"+QApplication::translate("MapFeature", "Topleft")+": </i>" + COORD2STRING(bb.topLeft().y()) + " / " + COORD2STRING(bb.topLeft().x()); + D += "<br/>"; + D += "<i>"+QApplication::translate("MapFeature", "Botright")+": </i>" + COORD2STRING(bb.bottomRight().y()) + " / " + COORD2STRING(bb.bottomRight().x()); + + QString type = isClosed() ? QApplication::translate("MapFeature", "Area") : QApplication::translate("MapFeature", "Way"); + + return Feature::toMainHtml(type, "way").arg(D); +} + +bool Way::isExtrimity(Node* node) +{ + if (p->Nodes[0] == node) + return true; + + if (p->Nodes[p->Nodes.size()-1] == node) + return true; + + return false; +} + +Way * Way::GetSingleParentRoad(Feature * mapFeature) +{ + Way * parentRoad = NULL; + + for (int i=0; i<mapFeature->sizeParents(); i++) + { + Way * road = CAST_WAY(mapFeature->getParent(i)); + + if (!road || road->isDeleted()) + continue; + + if (parentRoad && road != parentRoad) + return NULL; + + //FIXME This test shouldn't be necessary, but there is at least a case where the road has a NULL layer. The root cause must be found. + if (!(road->isDeleted()) && road->layer() && road->layer()->isEnabled()) + parentRoad = road; + } + + return parentRoad; +} + +Way * Way::GetSingleParentRoadInner(Feature * mapFeature) +{ + Way * parentRoad = NULL; + Node* trackPoint = CAST_NODE(mapFeature); + + for (int i=0; i<mapFeature->sizeParents(); i++) + { + Way * road = CAST_WAY(mapFeature->getParent(i)); + + if (!road || road->isDeleted()) + continue; + + if (road->isExtrimity(trackPoint) && !road->isClosed()) + continue; + + if (parentRoad && road != parentRoad) + return NULL; + + //FIXME This test shouldn't be necessary, but there is at least a case where the road has a NULL layer. The root cause must be found. + if (!(road->isDeleted()) && road->layer() && road->layer()->isEnabled()) + parentRoad = road; + } + + return parentRoad; +} + +int Way::createJunction(Document* theDocument, CommandList* theList, Way* R1, Way* R2, bool doIt) +{ + int numInter = 0; + + //TODO test that the junction do not already exists! + for (int i=0; i<R1->size()-1; ++i) { + QLineF S1(R1->getNode(i)->position(), R1->getNode(i+1)->position()); + + for (int j=0; j<R2->size()-1; ++j) { + QLineF S2(R2->getNode(j)->position(), R2->getNode(j+1)->position()); + QPointF intPoint; + if (S1.intersect(S2, &intPoint) == QLineF::BoundedIntersection) { + numInter++; + if (doIt) { + Node* pt = g_backend.allocNode(theDocument->getDirtyOrOriginLayer(R1->layer()), intPoint); + theList->add(new AddFeatureCommand(theDocument->getDirtyOrOriginLayer(R1->layer()),pt,true)); + theList->add(new WayAddNodeCommand(R1,pt,i+1,theDocument->getDirtyOrOriginLayer(R1->layer()))); + theList->add(new WayAddNodeCommand(R2,pt,j+1,theDocument->getDirtyOrOriginLayer(R2->layer()))); + } + ++i; ++j; + } + } + } + + return numInter; +} + +bool Way::canAddVirtualNodes() +{ + if (M_PREFS->getUseVirtualNodes() && layer() && !ReadOnly && !isDeleted()) + return true; + + return false; +} + +int Way::segmentCount() +{ + return p->Nodes.size()-1; +} + +QLineF Way::getSegment(int i) +{ + return QLineF(p->Nodes[i]->position(), p->Nodes[i+1]->position()); +} + +int Way::bestSegment() +{ + return p->BestSegment; +} + +const RenderPriority& Way::renderPriority() +{ + if (!MetaUpToDate) + updateMeta(); + return p->theRenderPriority; +} + diff --git a/src/Features/Way.h b/src/Features/Way.h new file mode 100644 index 0000000..a0d35e7 --- /dev/null +++ b/src/Features/Way.h @@ -0,0 +1,108 @@ +#ifndef MERKAARTOR_ROAD_H_ +#define MERKAARTOR_ROAD_H_ + +#include <QList> + +#include "Document.h" +#include "Feature.h" +#include "Layer.h" + +class WayPrivate; +class Node; +class QProgressDialog; +class MapRenderer; + +class Way : public Feature +{ + friend class WayPrivate; + friend class MemoryBackend; + +protected: + Way(void); + Way(const Way& other); + virtual ~Way(); + +public: + virtual QString getClass() const {return "Way";} + virtual char getType() const; + virtual void updateMeta(); + + virtual const CoordBox& boundingBox(bool update=true) const; + virtual void drawSimple(QPainter& P, MapView* theView); + virtual void drawTouchup(QPainter& P, MapView* theView); + + virtual void drawSpecial(QPainter& P, QPen& Pen, MapView* theView); + virtual void drawParentsSpecial(QPainter& P, QPen& Pen, MapView* theView); + virtual void drawChildrenSpecial(QPainter& P, QPen& Pen, MapView* theView, int depth); + + virtual qreal pixelDistance(const QPointF& Target, qreal ClearEndDistance, const QList<Feature*>& NoSnap, MapView* theView) const; + Node* pixelDistanceNode(const QPointF& Target, qreal ClearEndDistance, MapView* theView, const QList<Feature*>& NoSnap, bool NoSelectVirtuals) const; + virtual void cascadedRemoveIfUsing(Document* theDocument, Feature* aFeature, CommandList* theList, const QList<Feature*>& Alternatives); + virtual bool notEverythingDownloaded(); + virtual QString description() const; + + virtual void add(Node* Pt); + virtual void add(Node* Pt, int Idx); + virtual void remove(int Idx); + virtual void remove(Feature* F); + virtual int size() const; + virtual int find(Feature* Pt) const; + virtual int findVirtual(Feature* Pt) const; + virtual Feature* get(int idx); + virtual const Feature* get(int Idx) const; + virtual bool isNull() const; + virtual void setDeleted(bool delState); + + Node* getNode(int idx); + const Node* getNode(int idx) const; + const QList<NodePtr>& getNodes() const; + const QList<NodePtr>& getVirtuals() const; + + int segmentCount(); + QLineF getSegment(int i); + int bestSegment(); + + const RenderPriority& renderPriority(); + + bool isNodeAtEnd(Node* node); + + virtual void partChanged(Feature* F, int ChangeId); + virtual void setLayer(Layer* aLayer); + + qreal area(); + bool isClosed() const; + qreal distance(); + qreal widthOf(); + + virtual bool deleteChildren(Document* theDocument, CommandList* theList); + + const QPainterPath& getPath() const; + void addPathHole(const QPainterPath &pth); + void rebuildPath(const Projection &theProjection); + void buildPath(Projection const &theProjection); + + virtual bool toGPX(QXmlStreamWriter& stream, QProgressDialog * progress, bool forExport=false); + virtual bool toXML(QXmlStreamWriter& stream, QProgressDialog * progress, bool strict=false, QString changetsetid = QString()); + static Way* fromXML(Document* d, Layer* L, QXmlStreamReader& stream); + + virtual QString toHtml(); + + bool isExtrimity(Node* node); + static Way * GetSingleParentRoad(Feature * mapFeature); + static Way * GetSingleParentRoadInner(Feature * mapFeature); + + static int createJunction(Document* theDocument, CommandList* theList, Way* R1, Way* R2, bool doIt); + +protected: + bool canAddVirtualNodes(); + WayPrivate* p; +}; + +Q_DECLARE_METATYPE( Way * ); + +Feature::TrafficDirectionType trafficDirection(const Way* R); +int findSnapPointIndex(const Way* R, Coord& P); + +#endif + + diff --git a/src/GPS/GPS.pri b/src/GPS/GPS.pri new file mode 100644 index 0000000..97bdd04 --- /dev/null +++ b/src/GPS/GPS.pri @@ -0,0 +1,40 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/GPS +DEPENDPATH += $$MERKAARTOR_SRC_DIR/GPS + +FORMS += \ + qgpsmainwindowui.ui + +HEADERS += qgps.h \ + qgpssatellitetracker.h \ + qgpsdevice.h \ + SatelliteStrengthView.h + +SOURCES += qgps.cpp \ + qgpssatellitetracker.cpp \ + qgpsdevice.cpp \ + SatelliteStrengthView.cpp \ + +DEFINES += USE_GPS + +contains(GPSDLIB,1) { + DEFINES += USE_GPSD_LIB + win32 { + LIBS += -lQgpsmm + } + + unix|macx { + LIBS += -lgps + } +} + +!isEmpty(MOBILE) +{ + CONFIG += mobility + MOBILITY += location + +# HEADERS += \ +# GpsFix.h + +# SOURCES += \ +# GpsFix.cpp +} diff --git a/src/GPS/GpsFix.cpp b/src/GPS/GpsFix.cpp new file mode 100644 index 0000000..f899e5c --- /dev/null +++ b/src/GPS/GpsFix.cpp @@ -0,0 +1,75 @@ +#include "GpsFix.h" + +#ifndef _MOBILE +#include <QFile> +#include <QTimer> +#endif + +GpsFix::GpsFix(QObject *parent) : + QObject(parent) + , m_accuracy(999) + +{ +#ifdef _MOBILE + src = QGeoPositionInfoSource::createDefaultSource(this); +#else + src = new QNmeaPositionInfoSource(QNmeaPositionInfoSource::SimulationMode, this); + src->setDevice(new QFile("D:/srcS60/MerkLog/qml/MerkLog/nmealog.txt")); + QTimer::singleShot(5000, this, SLOT(onUpdateTimeout())); +#endif + if (src) { + src->setUpdateInterval(1000); + src->startUpdates(); + connect(src, SIGNAL(updateTimeout()), SLOT(onUpdateTimeout())); + connect(src, SIGNAL(positionUpdated(QGeoPositionInfo)), SLOT(onPositionUpdated(QGeoPositionInfo))); + } +} + +void GpsFix::onUpdateTimeout() +{ +#ifdef _MOBILE + m_accuracy = 999; +#else + m_accuracy = 100; +#endif + emit accuracyChanged(m_accuracy); +} + +void GpsFix::onPositionUpdated(const QtMobility::QGeoPositionInfo &update) +{ + m_timestamp = update.timestamp().toTime_t(); + emit timestampChanged(m_timestamp); + m_latitude = update.coordinate().latitude(); + emit latitudeChanged(m_latitude); + m_longitude = update.coordinate().longitude(); + emit longitudeChanged(m_longitude); + m_altitude = update.coordinate().altitude(); + emit altitudeChanged(m_altitude); + + if (update.hasAttribute(QGeoPositionInfo::GroundSpeed)) { + m_speed = update.attribute(QGeoPositionInfo::GroundSpeed); + emit speedChanged(m_speed); + } + if (update.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) { + m_accuracy = qRound(update.attribute(QGeoPositionInfo::HorizontalAccuracy)); + emit accuracyChanged(m_accuracy); + } + if (update.hasAttribute(QGeoPositionInfo::Direction)) { + m_heading = qRound(update.attribute(QGeoPositionInfo::Direction)); + emit headingChanged(m_heading); + } +} + +int GpsFix::getUpdateInterval() const +{ + if (src) + return src->updateInterval(); + else + return 0; +} + +void GpsFix::setUpdateInterval(int arg) +{ + if (src) + src->setUpdateInterval(arg); +} diff --git a/src/GPS/GpsFix.h b/src/GPS/GpsFix.h new file mode 100644 index 0000000..2d6fb2d --- /dev/null +++ b/src/GPS/GpsFix.h @@ -0,0 +1,102 @@ +#ifndef GPSFIX_H +#define GPSFIX_H + +#include <qmobilityglobal.h> +#include <qgeopositioninfosource.h> +#include <qgeosatelliteinfosource.h> +#include <qnmeapositioninfosource.h> +#include <QGeoPositionInfo> + +// Use the QtMobility namespace +QTM_USE_NAMESPACE + +class GpsFix : public QObject +{ + Q_OBJECT + Q_PROPERTY(int updateInterval READ getUpdateInterval WRITE setUpdateInterval) + Q_PROPERTY(int timestamp READ getTimtstamp NOTIFY timestampChanged) + Q_PROPERTY(qreal latitude READ getLatitude NOTIFY latitudeChanged) + Q_PROPERTY(qreal longitude READ getLongitude NOTIFY longitudeChanged) + Q_PROPERTY(qreal speed READ getSpeed NOTIFY speedChanged) + Q_PROPERTY(qreal altitude READ getAltitude NOTIFY altitudeChanged) + Q_PROPERTY(int accuracy READ getAccuracy NOTIFY accuracyChanged) + Q_PROPERTY(int heading READ getHeading NOTIFY headingChanged) + +public: + explicit GpsFix(QObject *parent = 0); + + int getUpdateInterval() const; + + qreal getLatitude() const + { + return m_latitude; + } + + qreal getLongitude() const + { + return m_longitude; + } + + qreal getSpeed() const + { + return m_speed; + } + + qreal getAltitude() const + { + return m_altitude; + } + + int getAccuracy() const + { + return m_accuracy; + } + + int getHeading() const + { + return m_heading; + } + + int getTimtstamp() const + { + return m_timestamp; + } + + signals: + + void latitudeChanged(qreal arg); + + void longitudeChanged(qreal arg); + + void speedChanged(qreal arg); + + void altitudeChanged(qreal arg); + + void accuracyChanged(int arg); + + void headingChanged(int arg); + + void timestampChanged(int arg); + + public slots: + void onUpdateTimeout(); + void onPositionUpdated ( const QGeoPositionInfo & update ) ; + + void setUpdateInterval(int arg); + + private: +#ifdef _MOBILE + QGeoPositionInfoSource* src; +#else + QNmeaPositionInfoSource* src; +#endif + int m_accuracy; + int m_heading; + qreal m_latitude; + qreal m_longitude; + qreal m_speed; + qreal m_altitude; + int m_timestamp; +}; + +#endif // GPSFIX_H diff --git a/src/GPS/SatelliteStrengthView.cpp b/src/GPS/SatelliteStrengthView.cpp new file mode 100644 index 0000000..6d1fd2f --- /dev/null +++ b/src/GPS/SatelliteStrengthView.cpp @@ -0,0 +1,51 @@ +#include "SatelliteStrengthView.h" + +#include <QtGui/QPainter> + +void sortSatellitesById(QList<Satellite>& List) +{ + for (int i=0; i<List.size(); ++i) + for (int j=i+1; j<List.size(); ++j) + if (List[i].Id>List[j].Id) + List.swap(i, j); +} + +SatelliteStrengthView::SatelliteStrengthView(QWidget* aParent) +: QWidget(aParent) +{ +} + +void SatelliteStrengthView::setSatellites(const QList<Satellite>& aList) +{ + List = aList; + update(); +} + +void SatelliteStrengthView::paintEvent(QPaintEvent* ev) +{ + Q_UNUSED(ev); + + QPainter p(this); + p.drawLine(0,height()-1,width()-1,height()-1); + if (List.size()) + { + int w=width()/List.size(); + p.setBrush(Qt::darkCyan); + for (int i=0; i<List.size(); ++i) + { + // typical s/r values seem to be 0-50? + // this may turn out higher, I tested it on a + // very rainy day... + int x = List[i].SignalStrength*height()/50; + x = height()-x; + if (x<0) x = 0; + p.setPen(QColor(0,0,0)); + p.drawRect(w*i,x,w,height()-x); + p.setPen(QColor(127,127,127)); + p.drawText(QRect(w*i,0,w,height()), + Qt::AlignCenter,QString::number(List[i].Id)); + } + } + else + p.drawText(rect(),Qt::AlignCenter,tr("No satellites")); +} diff --git a/src/GPS/SatelliteStrengthView.h b/src/GPS/SatelliteStrengthView.h new file mode 100644 index 0000000..b2943f8 --- /dev/null +++ b/src/GPS/SatelliteStrengthView.h @@ -0,0 +1,33 @@ +#ifndef MERKAARTOR_SATELLITEVIEW_H_ +#define MERKAARTOR_SATELLITEVIEW_H_ + +#include <QWidget> +#include <QList> + +class Satellite +{ + public: + int Id; + int Azimuth; + int Elevation; + int SignalStrength; +}; + +void sortSatellitesById(QList<Satellite>& List); + +class SatelliteStrengthView : public QWidget +{ + Q_OBJECT + + public: + SatelliteStrengthView(QWidget* aParent); + + void setSatellites(const QList<Satellite>& List); + + protected: + void paintEvent(QPaintEvent* ev); + + QList<Satellite> List; +}; + +#endif diff --git a/src/GPS/qgps.cpp b/src/GPS/qgps.cpp new file mode 100644 index 0000000..4dc3b9a --- /dev/null +++ b/src/GPS/qgps.cpp @@ -0,0 +1,241 @@ +/*************************************************************************** + * Copyright (C) 2005 by Robin Gingras * + * neozenkai@cox.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. * + ***************************************************************************/ + +#include <Qt> +#include <QStatusBar> +#include <QDateTime> + +#include "qgps.h" +#include "qgpsdevice.h" +#include "qgpssatellitetracker.h" +#include "SatelliteStrengthView.h" + +//#include "MerkaartorPreferences.h" + +QGPS::QGPS(QWidget *parent) + : MDockAncestor(parent), gpsDevice(0) +{ + setupUi(getWidget()); + setObjectName("GPSMainWindow"); + + int w = fontMetrics().width("360N 60'60\" W"); + txtLatitude->setFixedWidth(w); + txtLongitude->setFixedWidth(w); + txtAltitude->setFixedWidth(w); + txtSpeed->setFixedWidth(w); + txtNumSats->setFixedWidth(w); + txtFixType->setFixedWidth(w); + resetGpsStatus(); + + retranslateUi(); + + //loadSettings(); + +// gpsDevice = new QGPSDevice(serialPort); + + //connect(actStartGps, SIGNAL(activated()), gpsDevice, SLOT(startDevice())); + //connect(actStopGps, SIGNAL(activated()), gpsDevice, SLOT(stopDevice())); + + // The Qt documentation says that using signals and slots between + // threaded classes is not recommended! TODO: find a better way! +} + +void QGPS::setGpsDevice(QGPSDevice * aDevice) +{ + if (gpsDevice) + disconnect(gpsDevice, SIGNAL(updateStatus()), this, SLOT(updateGpsStatus())); + gpsDevice = aDevice; +} + +void QGPS::startGps() +{ + if (gpsDevice) { + if (isVisible()) + connect(gpsDevice, SIGNAL(updateStatus()), this, SLOT(updateGpsStatus())); + gpsDevice->startDevice(); + } +} + +void QGPS::stopGps() +{ + if (gpsDevice) { + gpsDevice->stopDevice(); + disconnect(gpsDevice, SIGNAL(updateStatus()), this, SLOT(updateGpsStatus())); + } +} + +void QGPS::resetGpsStatus() +{ + txtLatitude->setText(""); + txtLongitude->setText(""); + txtAltitude->setText(""); + txtSpeed->setText(""); + txtNumSats->setText(""); + txtFixType->setText(tr("Invalid")); + + lblFixStatus->setText(tr("No Fix")); + lblFixTime->setText(tr("No Time")); + + satTracker->setSatellites(QList<Satellite>()); +} + +void QGPS::updateGpsStatus() +{ + QString latCardinal, longCardinal, varCardinal; + + if(gpsDevice->latCardinal() == QGPSDevice::CardinalNorth) + latCardinal = "N"; + else + latCardinal = "S"; + + if(gpsDevice->longCardinal() == QGPSDevice::CardinalEast) + longCardinal = "E"; + else + longCardinal = "W"; + + if(gpsDevice->varCardinal() == QGPSDevice::CardinalEast) + varCardinal = "E"; + else + varCardinal = "W"; + + txtLatitude->setText( + QString("%1 %2\' %3\" %4") + .arg(gpsDevice->latDegrees()) + .arg(gpsDevice->latMinutes()) + .arg(gpsDevice->latSeconds()) + .arg(latCardinal)); + + txtLongitude->setText( + QString("%1 %2\' %3\" %4") + .arg(gpsDevice->longDegrees()) + .arg(gpsDevice->longMinutes()) + .arg(gpsDevice->longSeconds()) + .arg(longCardinal)); + + txtAltitude->setText( + QString("%1 %2") + .arg(gpsDevice->altitude()) + .arg(tr("Meters"))); + + txtSpeed->setText( + QString("%1 %2") + .arg(gpsDevice->speed()) + .arg(tr("km/h"))); + + txtNumSats->setText( + QString("%1").arg(gpsDevice->numSatellites())); + + switch (gpsDevice->fixType()) { + case QGPSDevice::FixUnavailable: + txtFixType->setText(tr("Unavailable")); + break; + case QGPSDevice::FixInvalid: + txtFixType->setText(tr("Invalid")); + break; + case QGPSDevice::Fix2D: + txtFixType->setText(tr("2D")); + break; + case QGPSDevice::Fix3D: + txtFixType->setText(tr("3D")); + break; + } + + switch (gpsDevice->fixStatus()) { + case QGPSDevice::StatusActive: + lblFixStatus->setText(tr("Fix OK")); + break; + case QGPSDevice::StatusVoid: + lblFixStatus->setText(tr("No Fix")); + break; + } + + if (!gpsDevice->dateTime().isValid()) + lblFixTime->setText(tr("No Time")); + else + lblFixTime->setText(gpsDevice->dateTime().toString() + " UTC"); + + QList<Satellite> List; + for(int i = 1; i < 50; i ++) + { + int b, x, y; + gpsDevice->satInfo(i, b, x, y); + if (y || b || x) + { + Satellite S; + S.Azimuth = x; + S.Elevation = b; + S.SignalStrength = y; + S.Id = i; + List.push_back(S); + } + } + StrengthView->setSatellites(List); + satTracker->setSatellites(List); + satTracker->setHeading((int)gpsDevice->heading()); +} + +void QGPS::showEvent ( QShowEvent * anEvent ) +{ + QWidget::showEvent(anEvent); + + if (gpsDevice) + connect(gpsDevice, SIGNAL(updateStatus()), this, SLOT(updateGpsStatus())); +} + +void QGPS::hideEvent ( QHideEvent * anEvent ) +{ + QWidget::hideEvent(anEvent); + + if (gpsDevice) + disconnect(gpsDevice, SIGNAL(updateStatus()), this, SLOT(updateGpsStatus())); +} + +void QGPS::changeEvent(QEvent * event) +{ + if (event->type() == QEvent::LanguageChange) + retranslateUi(); + MDockAncestor::changeEvent(event); +} + +void QGPS::retranslateUi() +{ + Ui_QGPSMainWindowUI::retranslateUi(getWidget()); + + setWindowTitle(tr("GPS")); + lblFixStatus->setText(tr("No Fix")); + lblFixTime->setText(tr("No Time")); +} + +void QGPS::resizeEvent(QResizeEvent */*anEvent*/) +{ + if (width() > height()) { + if (satLayoutH->indexOf(satTracker) == -1) { + satLayoutV->removeWidget(satTracker); + satLayoutH->insertWidget(0, satTracker); +// verticalSpacer->changeSize(20, 40, QSizePolicy::Minimum, QSizePolicy::Ignored); + } + } else { + if (satLayoutV->indexOf(satTracker) == -1) { + satLayoutH->removeWidget(satTracker); + satLayoutV->insertWidget(2, satTracker); +// verticalSpacer->changeSize(20, 40, QSizePolicy::Minimum, QSizePolicy::Ignored); + } + } +} diff --git a/src/GPS/qgps.h b/src/GPS/qgps.h new file mode 100644 index 0000000..1bc2dbb --- /dev/null +++ b/src/GPS/qgps.h @@ -0,0 +1,67 @@ +/*************************************************************************** + * Copyright (C) 2005 by Robin Gingras * + * neozenkai@cox.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. * + ***************************************************************************/ + + +#ifndef QGPS_H +#define QGPS_H + +#include "MDockAncestor.h" + +#include "ui_qgpsmainwindowui.h" + +class QGPSDevice; +class QLabel; +class QString; + +class QGPS : public MDockAncestor, public Ui_QGPSMainWindowUI +{ + Q_OBJECT + + public: + + QGPS(QWidget *parent = 0); + + void setGpsDevice(QGPSDevice * aDevice); + QGPSDevice* getGpsDevice() { return gpsDevice; } + void resetGpsStatus(); + + private: + + QGPSDevice *gpsDevice; + QString serialPort; + + void changeEvent(QEvent*); + void retranslateUi(); + + public slots: + + void updateGpsStatus(); + void startGps(); + void stopGps(); + + protected: + + virtual void showEvent ( QShowEvent * anEvent ); + virtual void hideEvent ( QHideEvent * anEvent ); + virtual void resizeEvent(QResizeEvent *anEvent); + +}; + +#endif diff --git a/src/GPS/qgpsdevice.cpp b/src/GPS/qgpsdevice.cpp new file mode 100644 index 0000000..be1eb83 --- /dev/null +++ b/src/GPS/qgpsdevice.cpp @@ -0,0 +1,1419 @@ +/*************************************************************************** + * Copyright (C) 2005 by Robin Gingras * + * neozenkai@cox.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. * + ***************************************************************************/ + +#include <QThread> +#include <QObject> +#include <QString> +#include <QMutex> +#include <QFile> +#include <QStringList> +#include <QMessageBox> +#include <QTcpSocket> +#include <QTimer> +#include <QHostAddress> + +#include "qgpsdevice.h" +#ifndef _MOBILE +#include "qextserialport.h" +#endif +#include <math.h> + +#ifdef USE_GPSD_LIB + #include <cerrno> + #include <cstring> // strerror() +#endif + +#include "MerkaartorPreferences.h" + +/* GPSSLOTFORWARDER */ + +GPSSlotForwarder::GPSSlotForwarder(QGPSDevice* aTarget) +: Target(aTarget) +{ +} + +void GPSSlotForwarder::onLinkReady() +{ + Target->onLinkReady(); +} + +void GPSSlotForwarder::onDataAvailable() +{ + Target->onDataAvailable(); +} + +void GPSSlotForwarder::onStop() +{ + Target->onStop(); +} + +void GPSSlotForwarder::checkDataAvailable() +{ + Target->checkDataAvailable(); +} + +/** + * QGPSDevice::QGPSDevice() + * + * Takes in an optional serialPort string and sets the serialPort property + * accordingly. + * + * @param char serialPort Serial port to listen to for GPS dat + */ + +QGPSDevice::QGPSDevice() + :LogFile(0) +{ + mutex = new QMutex(QMutex::Recursive); + + setLatitude(0); + setLongitude(0); + setAltitude(0); + setHeading(0); + setSpeed(0); + setVariation(0); + + setFixMode(QGPSDevice::FixAuto); + setFixType(QGPSDevice::FixUnavailable); + setFixStatus(QGPSDevice::StatusVoid); + + stopLoop = false; + + cur_numSatellites = 0; + for(int i = 0; i < 50; i ++) + { + satArray[i][0] = satArray[i][1] = satArray[i][2] = 0; + } +} + +/** + * Accessor functions + */ + +int QGPSDevice::latDegrees() { return (int) (fabs(latitude())); } +int QGPSDevice::latMinutes() +{ + qreal m = fabs(latitude()) - latDegrees(); + return int(m * 60); +} +int QGPSDevice::latSeconds() +{ + qreal m = fabs(latitude()) - latDegrees(); + qreal s = (m * 60) - int(m * 60); + return int(s * 60); +} +int QGPSDevice::longDegrees() { return (int) (fabs(longitude())); } +int QGPSDevice::longMinutes() +{ + qreal m = fabs(longitude()) - longDegrees(); + return int(m * 60); +} +int QGPSDevice::longSeconds() +{ + qreal m = fabs(longitude()) - longDegrees(); + qreal s = (m * 60) - int(m * 60); + return int(s * 60); +} + +bool QGPSDevice::isActiveSat(int prn) +{ + for (int i=0; i<12; i++) { + if (activeSats[i] == prn) + return true; + } + return false; +} + +void QGPSDevice::satInfo(int index, int &elev, int &azim, int &snr) +{ + mutex->lock(); + + elev = satArray[index][0]; + azim = satArray[index][1]; + snr = satArray[index][2]; + + mutex->unlock(); +} + +/** + * QGPSDevice::run() + * + * Begins the thread loop, reading data from the GPS and parsing + * full strings. + */ + +/** + * QGPSDevice::parseGGA() + * + * Parses a GPGGA string that contains fix information, such as + * latitude, longitude, etc. + * + * The format of the GPGGA String is as follows: + * + * $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47 + * ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + * 01234567890123456789012345678901234567890123456789012345678901234 + * | | | | | | | + * 0 10 20 30 40 50 60 + * + * GPGGA - Global Positioning System Fix Data + * 123519 - Fix taken at 12:35:19 UTC + * 4807.038,N - Latitude 48 deg 07.038' N + * 01131.000,E - Longitude 11 deg 31.000' E + * 1 - Fix quality: + * 0 = Invalid + * 1 = GPS fix (SPS) + * 2 = DGPS fix + * 3 = PPS fix + * 4 = Real time kinematic + * 5 = Float RTK + * 6 = Estimated (dead reckoning) + * 7 = Manual input mode + * 8 = Simulation mode + * 08 - Number of satellites being tracked + * 0.9 - Horizontal dissolution of precision + * 545.4,M - Altitude (meters) above sea level + * 46.9,M - Height of geoid (sea level) above WGS84 ellipsoid + * (empty) - Seconds since last DGPS update + * (empty) - DGPS station ID number + * *47 - Checksum, begins with * + * + * @param char ggaString The full NMEA GPGGA string, starting with + * the $ and ending with the checksum + */ + +void QGPSDevice::parseNMEA(const QByteArray& bufferString) +{ + if (bufferString.length() < 6) return; + if(bufferString[3] == 'G' && bufferString[4] == 'G' && bufferString[5] == 'A') + { + //strcpy(nmeastr_gga, bufferString); + parseGGA(bufferString.data()); + } + else if(bufferString[3] == 'G' && bufferString[4] == 'L' && bufferString[5] == 'L') + { + //strcpy(nmeastr_gga, bufferString); + parseGLL(bufferString.data()); + } + else if(bufferString[3] == 'G' && bufferString[4] == 'S' && bufferString[5] == 'V') + { + //strcpy(nmeastr_gsv, bufferString); + parseGSV(bufferString.data()); + } + else if(bufferString[3] == 'G' && bufferString[4] == 'S' && bufferString[5] == 'A') + { + //strcpy(nmeastr_gsa, bufferString); + parseGSA(bufferString.data()); + } + else if(bufferString[3] == 'R' && bufferString[4] == 'M' && bufferString[5] == 'C') + { + //strcpy(nmeastr_rmc, bufferString); + if (parseRMC(bufferString.data())) + if (fixStatus() == QGPSDevice::StatusActive && (fixType() == QGPSDevice::Fix3D || fixType() == QGPSDevice::FixUnavailable)) + emit updatePosition(latitude(), longitude(), dateTime(), altitude(), speed(), heading()); + } + emit updateStatus(); +} + +bool QGPSDevice::parseGGA(const char *ggaString) +{ + mutex->lock(); + + QString line(ggaString); + if (line.count('$') > 1) + return false; + + QStringList tokens = line.split(","); + + qreal lat = tokens[2].left(2).toDouble(); + qreal latmin = tokens[2].mid(2).toDouble(); + lat += latmin / 60.0; + if (tokens[3] != "N") + lat = -lat; + //cur_latitude = lat; + + if (!tokens[3].isEmpty()) + { + if (tokens[3].at(0) == 'N') + setLatCardinal(CardinalNorth); + else if (tokens[3].at(0) == 'S') + setLatCardinal(CardinalSouth); + else + setLatCardinal(CardinalNone); + } + + + qreal lon = tokens[4].left(3).toDouble(); + qreal lonmin = tokens[4].mid(3).toDouble(); + lon += lonmin / 60.0; + if (tokens[5] != "E") + lon = -lon; + //cur_longitude = lon; + + if (!tokens[5].isEmpty()) + { + if (tokens[5].at(0) == 'E') + setLatCardinal(CardinalEast); + else if (tokens[5].at(0) == 'W') + setLatCardinal(CardinalWest); + else + setLatCardinal(CardinalNone); + } + + int fix = tokens[6].toInt(); + setFixQuality(fix); + + int numSat = tokens[7].toInt(); + setNumSatellites(numSat); + + qreal dilut = tokens[8].toFloat(); + setDillution(dilut); + + qreal altitude = tokens[9].toFloat(); + setAltitude(altitude); + + mutex->unlock(); + + return true; +} // parseGGA() + +bool QGPSDevice::parseGLL(const char *ggaString) +{ + mutex->lock(); + + QString line(ggaString); + if (line.count('$') > 1) + return false; + + QStringList tokens = line.split(","); + + qreal lat = tokens[1].left(2).toDouble(); + qreal latmin = tokens[1].mid(2).toDouble(); + lat += latmin / 60.0; + if (tokens[2] != "N") + lat = -lat; + //cur_latitude = lat; + + if (!tokens[2].isEmpty()) + { + if (tokens[2].at(0) == 'N') + setLatCardinal(CardinalNorth); + else if (tokens[2].at(0) == 'S') + setLatCardinal(CardinalSouth); + else + setLatCardinal(CardinalNone); + } + + qreal lon = tokens[3].left(3).toDouble(); + qreal lonmin = tokens[3].mid(3).toDouble(); + lon += lonmin / 60.0; + if (tokens[4] != "E") + lon = -lon; + //cur_longitude = lon; + + if (!tokens[4].isEmpty()) + { + if (tokens[4].at(0) == 'E') + setLatCardinal(CardinalEast); + else if (tokens[4].at(0) == 'W') + setLatCardinal(CardinalWest); + else + setLatCardinal(CardinalNone); + } + + + if (tokens[6] == "A") + { + setFixStatus(StatusActive); + } + else + { + setFixStatus(StatusVoid); + } + + mutex->unlock(); + + return true; +} // parseGGA() + +/** + * QGPSDevice::parseGSA() + * + * Parses a GPGSA string that contains information about the nature + * of the fix, such as DOP (dillution of precision) and active satellites + * based on the viewing mask and almanac data of the reciever. + * + * The format of the GPGSA String is as follows: + * + * $GPGSA,A,3,04,05,,09,12,,,24,,,,,2.5,1.3,2.1*39 + * ||||||||||||||||||||||||||||||||||||||||||||||| + * 01234567890123456789012345678901234567890123456 + * | | | | | + * 0 10 20 30 40 + * + * GPGSA - Information about satellite status + * A - Fix mode, (A)utomatic or (M)anual + * 3 - Fix type: + * 1 = Invalid + * 2 = 2D + * 3 = 3D (4 or more satellites) + * 04,05,... - Satellites used in the solution (up to 12) + * 2.5 - DOP (dillution of precision) + * 1.3 - Horizontal DOP + * 2.1 - Vertical DOP + * *39 - Checksum + * + * @param char The full NMEA GPGSA string, from $ to checksum + */ + +bool QGPSDevice::parseGSA(const char *gsaString) +{ + mutex->lock(); + + QString line(gsaString); + if (line.count('$') > 1) + return false; + + QStringList tokens = line.split(","); + + QString autoSelectFix = tokens[1]; + if(autoSelectFix == "A") + setFixMode(FixAuto); + else + setFixMode(FixManual); + + int fix = tokens[2].toInt(); + if(fix == 1) + setFixType(FixInvalid); + else if(fix == 2) + setFixType(Fix2D); + else + setFixType(Fix3D); + + for(int index = 0; index < 12; index ++) { + activeSats[index] = tokens[index+3].toInt(); + } + + mutex->unlock(); + + return true; +} // parseGSA() + +/** + * QGPSDevice::parseRMC() + * + * Parses an RMC string, which contains the recommended minimum fix + * data, such as latitude, longitude, altitude, speed, track angle, + * date, and magnetic variation. Saves us some calculating :) + * + * The format of the GPRMC string is as follows: + * + * $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A + * |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + * 01234567890123456789012345678901234567890123456789012345678901234567 + * | | | | | | | + * 0 10 20 30 40 50 60 + * + * GPRMC - Recommended minimum fix data + * 123519 - Fix taken at 12:35:19 UTC + * A - Fix status, (A)ctive or (V)oid + * 4807.038,N - Latitude 48 degrees 07.038' N + * 01131.000,E - Longitude 11 degrees, 31.000' E + * 022.4 - Ground speed in knots + * 084.4 - Track angle in degrees (true north) + * 230394 - Date: 23 March 1994 + * 003.1,W - Magnetic Variation + * *6A - Checksum + * + * @param char Full RMC string, from $ to checksum + */ + +bool QGPSDevice::parseRMC(const char *rmcString) +{ + mutex->lock(); + + // Fix time + + QString line(rmcString); + if (line.count('$') > 1) + return false; + + QStringList tokens = line.split(","); + + QString strDate = tokens[9] + tokens[1]; + cur_datetime = QDateTime::fromString(strDate, "ddMMyyHHmmss.zzz"); + + if (cur_datetime.date().year() < 1970) + cur_datetime = cur_datetime.addYears(100); + + // Fix status + + if (tokens[2] == "A") + { + setFixStatus(StatusActive); + } + else + { + setFixStatus(StatusVoid); + } + + // Latitude + + qreal lat = tokens[3].left(2).toDouble(); + qreal latmin = tokens[3].mid(2).toDouble(); + lat += latmin / 60.0; + if (tokens[4] != "N") + lat = -lat; + cur_latitude = lat; + + if (!tokens[4].isEmpty()) + { + if (tokens[4].at(0) == 'N') + setLatCardinal(CardinalNorth); + else if (tokens[4].at(0) == 'S') + setLatCardinal(CardinalSouth); + else + setLatCardinal(CardinalNone); + } + + qreal lon = tokens[5].left(3).toDouble(); + qreal lonmin = tokens[5].mid(3).toDouble(); + lon += lonmin / 60.0; + if (tokens[6] != "E") + lon = -lon; + cur_longitude = lon; + + if (!tokens[6].isEmpty()) + { + if (tokens[6].at(0) == 'E') + setLatCardinal(CardinalEast); + else if (tokens[6].at(0) == 'W') + setLatCardinal(CardinalWest); + else + setLatCardinal(CardinalNone); + } + + // Ground speed in km/h + + qreal speed = QString::number(tokens[7].toDouble() * 1.852, 'f', 1).toDouble(); + setSpeed(speed); + + // Heading + + qreal heading = tokens[8].toDouble(); + setHeading(heading); + + // Magnetic variation + + qreal magvar = tokens[10].toDouble(); + setVariation(magvar); + + if (!tokens[11].isEmpty()) + { + if (tokens[11].at(0) == 'E') + setVarCardinal(CardinalEast); + else if (tokens[11].at(0) == 'W') + setVarCardinal(CardinalWest); + else + setVarCardinal(CardinalNone); + } + + mutex->unlock(); + + return true; +} // parseRMC() + +/** + * QGPSDevice::parseGSV() + * + * Parses a GPGSV string, which contains satellite position and signal + * strenght information. parseGSV() fills the satArray array with the + * PRNs, elevations, azimuths, and SNRs of the visible satellites. This + * array is based on the position of the satellite in the strings, not + * the order of the PRNs! (see README for info) + * + * The format of the GPGSV string is as follows: + * + * $GPGSV,2,1,08,01,40,083,46,02,17,308,41,12,07,344,39,14,22,228,45*75 + * |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + * 01234567890123456789012345678901234567890123456789012345678901234567 + * | | | | | | | + * 0 10 20 30 40 50 60 + * + * GPGSV - Satellite status + * 2 - Number of GPGSV sentences for full data + * 1 - Current sentence (1 of 2, etc) + * 08 - Number of satellites in view + * + * 01 - Satellite PRN + * 40 - Elevation, degrees + * 083 - Azimuth, degrees + * 46 - SNR (signal to noise ratio) + * (for up to four satellites per sentence) + * *75 - Checksum + */ + +bool QGPSDevice::parseGSV(const char *gsvString) +{ + mutex->lock(); + + int totalSentences; + int currentSentence; + int totalSatellites; + int prn, elev, azim, snr; + + QString line(gsvString); + if (line.count('$') > 1) + return false; + + QStringList tokens = line.split(","); + + totalSentences = tokens[1].toInt(); + currentSentence = tokens[2].toInt(); + totalSatellites = tokens[3].toInt(); + + qDebug() << "Parsing GSV string" << gsvString; + qDebug() << " --> sentence" << currentSentence << "of " << totalSentences << "," << totalSatellites << "total satellites in view"; + + for(int i = 0; (i < 4) && ((i*4)+4+3 < tokens.size()); i ++) { + prn = tokens[(i*4)+4].toInt(); + elev = tokens[(i*4)+4+1].toInt(); + azim = tokens[(i*4)+4+2].toInt(); + if (tokens[(i*4)+4+3].contains('*')) { + QStringList tok2 = tokens[(i*4)+4+3].split("*"); + snr = tok2[0].toInt(); + } else + snr = tokens[(i*4)+4+3].toInt(); + satArray[prn][0] = elev; + satArray[prn][1] = azim; + satArray[prn][2] = snr; + } + + mutex->unlock(); + + return true; +} + +/** + * QGPSDevice::startDevice() + * + * Calls start() to begin thread execution + */ + +void QGPSDevice::startDevice() +{ + mutex->lock(); + stopLoop = false; + mutex->unlock(); + + //printf("We're starting...\n"); + + start(); +} + +/** + * QGPSDevice::stopDevice() + * + * Stops execution of run() and ends thread execution + * This function will be called outside this thread + */ + +void QGPSDevice::stopDevice() +{ + // this is through a queued connection + emit doStopDevice(); +} + +#ifndef _MOBILE +/*** QGPSComDevice ***/ + +QGPSComDevice::QGPSComDevice(const QString &device) + : QGPSDevice() +{ +#ifdef Q_OS_WIN + if (!device.isNull() && !device.startsWith("\\\\.\\")) + setDevice("\\\\.\\" + device); + else +#endif + if(!device.isNull()) + { + setDevice(device); + } +} + +QGPSComDevice::~QGPSComDevice() +{ + if (LogFile) { + if (LogFile->isOpen()) + LogFile->close(); + delete LogFile; + } +} + +/** + * QGPSComDevice::openDevice() + * + * Opens the serial port and sets the parameters for data transfer: parity, + * stop bits, blocking, etc. + */ + +bool QGPSComDevice::openDevice() +{ + port = new QextSerialPort(device()); + port->setBaudRate(BAUD4800); + port->setFlowControl(FLOW_OFF); + port->setParity(PAR_NONE); + port->setDataBits(DATA_8); + port->setStopBits(STOP_2); + + if (port->open(QIODevice::ReadOnly)) { + if (M_PREFS->getGpsSaveLog()) { + QString fn = "log-" + QDateTime::currentDateTime().toString(Qt::ISODate) + ".nmea"; + fn.replace(':', '-'); + LogFile = new QFile(M_PREFS->getGpsLogDir() + "/"+fn); + if (!LogFile->open(QIODevice::WriteOnly)) { + QMessageBox::critical(NULL, tr("GPS log error"), + tr("Unable to create GPS log file: %1.").arg(M_PREFS->getGpsLogDir() + "/"+fn), QMessageBox::Ok); + delete LogFile; + LogFile = NULL; + } + } + return true; + } + return false; +} + +/** + * QGPSComDevice::closeDevice() + * + * Closes the serial port + */ + +bool QGPSComDevice::closeDevice() +{ + port->close(); + if (LogFile && LogFile->isOpen()) { + LogFile->close(); + delete LogFile; + } + LogFile = NULL; + + return true; +} + +void QGPSComDevice::onLinkReady() +{ +} + +void QGPSComDevice::onStop() +{ + quit(); +} + + +void QGPSComDevice::run() +{ + GPSSlotForwarder Forward(this); + + QTimer *timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), &Forward, SLOT(checkDataAvailable())); + timer->start(150); + +// connect(port,SIGNAL(readyRead()),&Forward,SLOT(onDataAvailable())); + connect(this,SIGNAL(doStopDevice()),&Forward,SLOT(onStop())); + exec(); + closeDevice(); +} + +void QGPSComDevice::checkDataAvailable() { + if (port->bytesAvailable() > 0) + onDataAvailable(); +} + +void QGPSComDevice::onDataAvailable() +{ + QByteArray ba(port->readAll()); + // filter out unwanted characters + for (int i=ba.count(); i; --i) + if(ba[i-1] == '\0' || + (!isalnum((quint8)ba[i-1]) && + !isspace((quint8)ba[i-1]) && + !ispunct((quint8)ba[i-1]))) + { + ba.remove(i-1,1); + } + if (LogFile) + LogFile->write(ba); + Buffer.append(ba); + if (Buffer.length() > 4096) + // safety valve + Buffer.remove(0,Buffer.length()-4096); + while (Buffer.count()) + { + // look for begin of sentence marker + int i = Buffer.indexOf('$'); + if (i<0) + { + Buffer.clear(); + return; + } + Buffer.remove(0,i); + // look for end of sentence marker + for (i=0; i<Buffer.count(); ++i) + if ( (Buffer[i] == (char)(0x0a)) || (Buffer[i] == (char)(0x0d)) ) + break; + if (i == Buffer.count()) + return; + parseNMEA(Buffer.mid(0,i-2)); + Buffer.remove(0,i); + } +} +#endif + +/*** QGPSFileDevice ***/ + +QGPSFileDevice::QGPSFileDevice(const QString &device) + : QGPSDevice() +{ + if(!device.isNull()) + { + setDevice(device); + } +} + +/** + * QGPSFileDevice::openDevice() + * + * Opens the serial port and sets the parameters for data transfer: parity, + * stop bits, blocking, etc. + */ + +bool QGPSFileDevice::openDevice() +{ + theFile = new QFile(device()); + + if (!theFile->open(QIODevice::ReadOnly | QIODevice::Text)) { + delete theFile; + theFile = NULL; + return false; + } + + return true; +} + +void QGPSFileDevice::onLinkReady() +{ +} + +void QGPSFileDevice::onStop() +{ + quit(); +} + +/** + * QGPSFileDevice::closeDevice() + * + * Closes the serial port + */ + +bool QGPSFileDevice::closeDevice() +{ + if (theFile) + theFile->close(); + + return true; +} + +void QGPSFileDevice::run() +{ + GPSSlotForwarder Forward(this); + QTimer* t = new QTimer; + connect(t,SIGNAL(timeout()),&Forward,SLOT(onDataAvailable())); + connect(this,SIGNAL(doStopDevice()),&Forward,SLOT(onStop())); + t->start(100); + exec(); + closeDevice(); +} + +void QGPSFileDevice::onDataAvailable() +{ + + int index = 0; + char bufferChar; + char bufferString[100]; + + while (theFile->read(&bufferChar, 1) && bufferChar != '$') {} + if(bufferChar == '$') + { + index = 0; + bufferString[index] = bufferChar; + + do + { + theFile->read(&bufferChar, 1); + if(bufferChar != '\0' && (isalnum(bufferChar) || isspace(bufferChar) || ispunct(bufferChar))) + { + index ++; + bufferString[index] = bufferChar; + } + } while(bufferChar != 0x0a && bufferChar != 0x0d); + + bufferString[index + 1] = '\0'; + + mutex->lock(); + + if(bufferString[3] == 'G' && bufferString[4] == 'G' && bufferString[5] == 'A') + { + //strcpy(nmeastr_gga, bufferString); + parseGGA(bufferString); + } + else if(bufferString[3] == 'G' && bufferString[4] == 'L' && bufferString[5] == 'L') + { + //strcpy(nmeastr_gga, bufferString); + parseGLL(bufferString); + } + else if(bufferString[3] == 'G' && bufferString[4] == 'S' && bufferString[5] == 'V') + { + //strcpy(nmeastr_gsv, bufferString); + parseGSV(bufferString); + } + else if(bufferString[3] == 'G' && bufferString[4] == 'S' && bufferString[5] == 'A') + { + //strcpy(nmeastr_gsa, bufferString); + parseGSA(bufferString); + } + else if(bufferString[3] == 'R' && bufferString[4] == 'M' && bufferString[5] == 'C') + { + //strcpy(nmeastr_rmc, bufferString); + if (parseRMC(bufferString)) + if (fixStatus() == QGPSDevice::StatusActive && (fixType() == QGPSDevice::Fix3D || fixType() == QGPSDevice::FixUnavailable)) + emit updatePosition(latitude(), longitude(), dateTime(), altitude(), speed(), heading()); + } + + mutex->unlock(); + + emit updateStatus(); + } +} + +#ifndef _MOBILE +/* GPSSDEVICE */ + +#ifdef USE_GPSD_LIB +QGPSDDevice::QGPSDDevice(const QString& device) +{ + setDevice(device); +} + +bool QGPSDDevice::openDevice() +{ +// if (M_PREFS->getGpsSaveLog()) { +// QString fn = "log-" + QDateTime::currentDateTime().toString(Qt::ISODate) + ".nmea"; +// fn.replace(':', '-'); +// LogFile = new QFile(M_PREFS->getGpsLogDir() + "/"+fn); +// if (!LogFile->open(QIODevice::WriteOnly)) { +// QMessageBox::critical(NULL, tr("GPS log error"), +// tr("Unable to create GPS log file: %1.").arg(M_PREFS->getGpsLogDir() + "/"+fn), QMessageBox::Ok); +// delete LogFile; +// LogFile = NULL; +// } +// } + return true; +} + +bool QGPSDDevice::closeDevice() +{ + delete Server; + return true; +} + +// this function will be called within this thread +void QGPSDDevice::onStop() +{ + quit(); +} + +void QGPSDDevice::run() +{ + GPSSlotForwarder Forward(this); +// QTcpSocket Link; +// Server = &Link; +// Link.connectToHost(M_PREFS->getGpsdHost(),M_PREFS->getGpsdPort()); +// connect(Server,SIGNAL(connected()),&Forward,SLOT(onLinkReady())); +// connect(Server,SIGNAL(readyRead()),&Forward,SLOT(onDataAvailable())); + connect(this,SIGNAL(doStopDevice()),&Forward,SLOT(onStop())); +// exec(); + QEventLoop l; +#if GPSD_API_MAJOR_VERSION < 5 + Server = new gpsmm(); + errno = 0; + gpsdata = Server->open(M_PREFS->getGpsdHost().toLatin1().data(),QString::number(M_PREFS->getGpsdPort()).toLatin1().data()); + if (!gpsdata) { + #ifndef Q_OS_WIN32 + QString msg( (errno<0) ? gps_errstr(errno) : strerror(errno) ); + #else + QString msg( (errno<0) ? "" : strerror(errno) ); + #endif + qDebug() << tr("Unable to connect to %1:%2").arg(M_PREFS->getGpsdHost()).arg(QString::number(M_PREFS->getGpsdPort())) + << ": " << msg; + return; + } +#else + Server = new gpsmm(M_PREFS->getGpsdHost().toLatin1().data(),QString::number(M_PREFS->getGpsdPort()).toLatin1().data()); +#endif + + if (! Server->is_open()) { + qDebug() << "GPSD connection not open. Is the daemon running?"; + } + + onLinkReady(); + l.processEvents(); + + forever { +#if GPSD_API_MAJOR_VERSION > 3 +#if GPSD_API_MAJOR_VERSION < 5 + if (Server->waiting()) +#else + /* Wait time in microseconds, 25000 = 25ms */ + if (Server->waiting(25000)) +#endif +#endif + { + /* Only process data if there is a chance the server is actually working. */ + if (Server->is_open() && serverOk) { + onDataAvailable(); + } + } + l.processEvents(); + } + + delete Server; +} + +void QGPSDDevice::onDataAvailable() +{ + #if GPSD_API_MAJOR_VERSION < 5 + gpsdata = Server->poll(); + if (!gpsdata) + return; + #else + gpsdata = Server->read(); + if (!gpsdata) + { + QString msg( (errno==0) ? "socket to gpsd was closed" : strerror(errno) ); + qDebug() << "gpsmm::read() failed:" << msg; + serverOk = false; + return; + } + #endif + + setFixStatus(StatusVoid); + switch (gpsdata->fix.mode) { + case MODE_NOT_SEEN: + setFixType(FixUnavailable); + return; + case MODE_NO_FIX: + setFixType(FixInvalid); + return; + case MODE_2D: + setFixType(Fix2D); + break; + case MODE_3D: + setFixType(Fix3D); + break; + } + + setFixStatus(StatusActive); + setLatitude(gpsdata->fix.latitude); + setLongitude(gpsdata->fix.longitude); + qreal Alt = gpsdata->fix.altitude; + if (!__isnan(Alt)) + setAltitude(Alt); + qreal Speed = gpsdata->fix.speed; + if (!__isnan(Speed)) + setSpeed(Speed); + qreal Heading = gpsdata->fix.track; + if (!__isnan(Heading)) + setHeading(Heading); +#if GPSD_API_MAJOR_VERSION >= 9 +#define FIX_TIME fix.time.tv_sec +#else +#define FIX_TIME fix.time +#endif + if (gpsdata->FIX_TIME) + cur_datetime = QDateTime::fromTime_t(gpsdata->FIX_TIME); +#undef FIX_TIME + emit updatePosition(gpsdata->fix.latitude, + gpsdata->fix.longitude, + cur_datetime, + cur_altitude, cur_speed, cur_heading); + +#if GPSD_API_MAJOR_VERSION > 3 + int num_sat = gpsdata->satellites_visible; +#else + int num_sat = gpsdata->satellites; +#endif + for(int i = 0; i < 50; i ++) + satArray[i][0] = satArray[i][1] = satArray[i][2] = 0; + for (int i=0; i<num_sat; ++i) + { +#if GPSD_API_MAJOR_VERSION > 5 + int id = gpsdata->skyview[i].PRN; + satArray[id][0] = gpsdata->skyview[i].elevation; + satArray[id][1] = gpsdata->skyview[i].azimuth; + satArray[id][2] = gpsdata->skyview[i].ss; +#else + int id = gpsdata->PRN[i]; + satArray[id][0] = gpsdata->elevation[i]; + satArray[id][1] = gpsdata->azimuth[i]; + satArray[id][2] = gpsdata->ss[i]; +#endif + } + setNumSatellites(num_sat); + + emit updateStatus(); +} + +void QGPSDDevice::onLinkReady() +{ + if (!Server) return; +#if GPSD_API_MAJOR_VERSION > 3 + gpsdata = Server->stream(WATCH_ENABLE); +#ifndef Q_OS_WIN32 + if ( gpsdata == 0 ) + qDebug() << "gpsmm::stream() failed:" << gps_errstr(errno) << '\n'; +#endif +#else + gpsdata = Server->query("w+x\n"); +#endif +} +#else /*USE_GPSD_LIB*/ +QGPSDDevice::QGPSDDevice(const QString& device) +{ + setDevice(device); +} + +bool QGPSDDevice::openDevice() +{ + if (M_PREFS->getGpsSaveLog()) { + QString fn = "log-" + QDateTime::currentDateTime().toString(Qt::ISODate) + ".nmea"; + fn.replace(':', '-'); + LogFile = new QFile(M_PREFS->getGpsLogDir() + "/"+fn); + if (!LogFile->open(QIODevice::WriteOnly)) { + QMessageBox::critical(NULL, tr("GPS log error"), + tr("Unable to create GPS log file: %1.").arg(M_PREFS->getGpsLogDir() + "/"+fn), QMessageBox::Ok); + delete LogFile; + LogFile = NULL; + } + } + return true; +} + +bool QGPSDDevice::closeDevice() +{ + return true; +} + +// this function will be called within this thread +void QGPSDDevice::onStop() +{ + quit(); +} + +void QGPSDDevice::run() +{ + GPSSlotForwarder Forward(this); + QTcpSocket Link; + Server = &Link; + connect(Server,SIGNAL(connected()),&Forward,SLOT(onLinkReady())); + connect(Server,SIGNAL(readyRead()),&Forward,SLOT(onDataAvailable())); + connect(this,SIGNAL(doStopDevice()),&Forward,SLOT(onStop())); + Link.connectToHost(M_PREFS->getGpsdHost(),M_PREFS->getGpsdPort()); + exec(); +} + +void QGPSDDevice::onDataAvailable() +{ + QByteArray ba(Server->readAll()); + // filter out unwanted characters + for (int i=ba.count(); i; --i) + if(ba[i-1] == '\0' || + (!isalnum((quint8)ba[i-1]) && + !isspace((quint8)ba[i-1]) && + !ispunct((quint8)ba[i-1]))) + { + ba.remove(i-1,1); + } + if (LogFile) + LogFile->write(ba); + Buffer.append(ba); + if (Buffer.length() > 4096) + // safety valve + Buffer.remove(0,Buffer.length()-4096); + while (Buffer.count()) + { + // look for begin of sentence marker + int i = Buffer.indexOf('$'); + if (i<0) + { + Buffer.clear(); + return; + } + Buffer.remove(0,i); + // look for end of sentence marker + for (i=0; i<Buffer.count(); ++i) + if ( (Buffer[i] == (char)(0x0a)) || (Buffer[i] == (char)(0x0d)) ) + break; + if (i == Buffer.count()) + return; + parseNMEA(Buffer.mid(0,i-2)); + Buffer.remove(0,i); + } +} + +void QGPSDDevice::parse(const QString& s) +{ + qDebug() << "parsing" << s.toUtf8().data() << "*"; + QStringList Args(s.split(',',QString::SkipEmptyParts)); + for (int i=0; i<Args.count(); ++i) + { + QString Left(Args[i].left(2)); + if (Left == "O=") + parseO(Args[i].right(Args[i].length()-2)); + if (Left == "Y=") + parseY(Args[i].right(Args[i].length()-2)); + } +} + +void QGPSDDevice::parseY(const QString& s) +{ + for(int i = 0; i < 50; i ++) + satArray[i][0] = satArray[i][1] = satArray[i][2] = 0; + QStringList Sats(s.split(':',QString::SkipEmptyParts)); + for (int i=1; i<Sats.size(); ++i) + { + QStringList Items(Sats[i].split(' ',QString::SkipEmptyParts)); + if (Items.count() < 5) + continue; + int id = Items[0].toInt(); + if ( (id >= 0) && (id<50) ) + { + satArray[id][0] = int(Items[1].toDouble()); + satArray[id][1] = int(Items[2].toDouble()); + satArray[id][2] = int(Items[3].toDouble()); + } + } + setNumSatellites(Sats.size()); + emit updateStatus(); +} + +void QGPSDDevice::parseO(const QString& s) +{ + if (s.isEmpty()) return; + setFixType(FixInvalid); + if (s[0] == '?') return; + QStringList Args(s.split(' ',QString::SkipEmptyParts)); + if (Args.count() < 5) return; + setFixType(Fix3D); + setFixStatus(StatusActive); + setLatitude(Args[3].toDouble()); + setLongitude(Args[4].toDouble()); + qreal Alt = 0; + if (Args.count() > 5) + Alt = Args[5].toDouble(); + qreal Speed = 0; + if (Args.count() > 9) + Speed = Args[9].toDouble(); + qreal Heading = 0; + if (Args.count() > 7) + Heading = Args[7].toDouble(); + emit updatePosition(Args[3].toDouble(), + Args[4].toDouble(), + QDateTime::currentDateTime(), + Alt, Speed, Heading); + setHeading(Heading); + setAltitude(Alt); + setSpeed(Speed); + emit updateStatus(); + +} + +void QGPSDDevice::onLinkReady() +{ + if (!Server) return; + Server->write("?WATCH={\"enable\":true,\"nmea\":true}"); +} +#endif /*USE_GPSD_LIB*/ + +#endif + +#if defined Q_OS_SYMBIAN || defined(Q_WS_SIMULATOR) + +/* QtMobility */ + +// Use the QtMobility namespace +QTM_USE_NAMESPACE + +QGPSMobileDevice::QGPSMobileDevice() +{ +} + +bool QGPSMobileDevice::openDevice() +{ + src = QGeoPositionInfoSource::createDefaultSource(this); + if (!src) { + return false; + } + src->setUpdateInterval(1000); + src->startUpdates(); + + connect(src, SIGNAL(updateTimeout()), SLOT(onUpdateTimeout())); + connect(src, SIGNAL(positionUpdated(const QGeoPositionInfo&)), SLOT(onPositionUpdated(const QGeoPositionInfo&))); + + satsrc = QGeoSatelliteInfoSource::createDefaultSource(this); + if (satsrc) { + connect(satsrc, SIGNAL(satellitesInViewUpdated(QList<QGeoSatelliteInfo>)), SLOT(on_satellitesInViewUpdated(QList<QGeoSatelliteInfo>))); + connect(satsrc, SIGNAL(satellitesInUseUpdated(QList<QGeoSatelliteInfo>)), SLOT(on_satellitesInUseUpdated(QList<QGeoSatelliteInfo>))); + connect(satsrc, SIGNAL(requestTimeout()), SLOT(on_satRequestTimeout())); + + satsrc->startUpdates(); + } + return true; +} + +bool QGPSMobileDevice::closeDevice() +{ + return true; +} + +// this function will be called within this thread +void QGPSMobileDevice::onStop() +{ + quit(); +} + +void QGPSMobileDevice::run() +{ + GPSSlotForwarder Forward(this); + connect(this,SIGNAL(doStopDevice()),&Forward,SLOT(onStop())); + + exec(); + + src->stopUpdates(); +} + +void QGPSMobileDevice::onUpdateTimeout() +{ + setFixType(FixUnavailable); +} + +void QGPSMobileDevice::onPositionUpdated(const QGeoPositionInfo &update) +{ + cur_datetime = update.timestamp(); + cur_latitude = update.coordinate().latitude(); + cur_longitude = update.coordinate().longitude(); + + cur_altitude = update.coordinate().altitude(); + + if (update.hasAttribute(QGeoPositionInfo::GroundSpeed)) { + cur_speed = update.attribute(QGeoPositionInfo::GroundSpeed); + } + if (update.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) { + m_accuracy = qRound(update.attribute(QGeoPositionInfo::HorizontalAccuracy)); + } + if (update.hasAttribute(QGeoPositionInfo::Direction)) { + cur_heading = qRound(update.attribute(QGeoPositionInfo::Direction)); + } + + if (m_accuracy > 500) { + setFixStatus(StatusVoid); + setFixType(FixUnavailable); + } else if (m_accuracy < 100) { + setFixStatus(StatusActive); + setFixType(Fix3D); + } else { + setFixStatus(StatusActive); + setFixType(Fix2D); + } + + emit updatePosition(latitude(), longitude(), dateTime(), altitude(), speed(), heading()); + emit updateStatus(); +} + +//int QGPSMobileDevice::getUpdateInterval() const +//{ +// if (src) +// return src->updateInterval(); +// else +// return 0; +//} + +//void QGPSMobileDevice::setUpdateInterval(int arg) +//{ +// if (src) +// src->setUpdateInterval(arg); +//} + +void QGPSMobileDevice::on_satellitesInViewUpdated(QList<QGeoSatelliteInfo> satList) +{ + qDebug() << "Sat updated"; + m_List = satList; + emit updateStatus(); +} + +void QGPSMobileDevice::on_satellitesInUseUpdated(QList<QGeoSatelliteInfo> satList) +{ + m_UseList = satList; + emit updateStatus(); +} + +void QGPSMobileDevice::on_satRequestTimeout() +{ + m_List.clear(); + m_UseList.clear(); + emit updateStatus(); +} + +void QGPSMobileDevice::satInfo(int index, int &elev, int &azim, int &snr) +{ + elev = 0; + azim = 0; + snr = 0; + + foreach (QGeoSatelliteInfo gi, m_List) { + if (gi.prnNumber() == index) { + elev = gi.attribute(QGeoSatelliteInfo::Elevation); + azim = gi.attribute(QGeoSatelliteInfo::Azimuth); + snr = gi.signalStrength(); + return; + } + } +} + +void QGPSMobileDevice::onLinkReady() +{ +} + +void QGPSMobileDevice::onDataAvailable() +{ +} + + +#endif diff --git a/src/GPS/qgpsdevice.h b/src/GPS/qgpsdevice.h new file mode 100644 index 0000000..ecdf872 --- /dev/null +++ b/src/GPS/qgpsdevice.h @@ -0,0 +1,380 @@ +/*************************************************************************** + * Copyright (C) 2005 by Robin Gingras * + * neozenkai@cox.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. * + ***************************************************************************/ + +#ifndef QGPS_DEVICE_H +#define QGPS_DEVICE_H + +#include <QObject> +#include <QThread> +#include <QDateTime> +#include <QFile> + +class QString; +class QMutex; +class QextSerialPort; +class QFile; + +class QGPSDevice; +// We want these slots to be executed within the thread represented by +// QGPSDDevice. Since that class itself lives in the main thread, we need +// a forwarder that does live there as the receiver. + +class GPSSlotForwarder : public QObject +{ + Q_OBJECT + +public: + GPSSlotForwarder(QGPSDevice* Target); + + +public slots: + void onLinkReady(); + void onDataAvailable(); + void onStop(); + void checkDataAvailable(); + +private: + QGPSDevice* Target; +}; + +class QGPSDevice : public QThread +{ + Q_OBJECT + +public: + + QGPSDevice(); + + virtual bool openDevice() = 0; + virtual bool closeDevice() = 0; + + enum FixMode + { + FixAuto, + FixManual + }; + + enum FixStatus + { + StatusActive, + StatusVoid + }; + + enum FixType + { + FixUnavailable, + FixInvalid, + Fix2D, + Fix3D + }; + + enum CardinalDirection + { + CardinalNorth, + CardinalSouth, + CardinalEast, + CardinalWest, + CardinalNone + }; + + void setDevice(QString new_device) { cur_device = new_device; } + + QString device() { return cur_device; } + + QDateTime dateTime() { return cur_datetime; } + + int fixQuality() { return cur_fixQuality; } + int numSatellites() { return cur_numSatellites; } + FixType fixType() { return cur_fixType; } + FixMode fixMode() { return cur_fixMode; } + FixStatus fixStatus() { return cur_fixStatus; } + + qreal latitude() { return cur_latitude; } + qreal longitude() { return cur_longitude; } + qreal altitude() { return cur_altitude; } + qreal heading() { return cur_heading; } + qreal speed() { return cur_speed; } + qreal variation() { return cur_variation; } + qreal dillution() { return cur_dillution; } + + CardinalDirection latCardinal() { return cur_latCardinal; } + CardinalDirection longCardinal() { return cur_longCardinal; } + CardinalDirection varCardinal() { return cur_varCardinal; } + + bool isActiveSat(int prn); + void satInfo(int index, int &elev, int &azim, int &snr); + + // some convinience functions + + int latDegrees(); + int latMinutes(); + int latSeconds(); + + int longDegrees(); + int longMinutes(); + int longSeconds(); + +public slots: + + virtual void startDevice(); + virtual void stopDevice(); + +signals: + + void updatePosition(qreal latitude, qreal longitude, QDateTime time, qreal altitude, qreal speed, qreal heading); + void updateStatus(); + void doStopDevice(); + + +protected: + + virtual void checkDataAvailable() {}; + virtual void run() = 0; + + int fd; + bool stopLoop; + + QMutex *mutex; + + // functions to set various properties - private + + void setLatitude(qreal new_latitude) { cur_latitude = new_latitude; } + void setLongitude(qreal new_longitude) { cur_longitude = new_longitude; } + void setAltitude(qreal new_altitude) { cur_altitude = new_altitude; } + void setHeading(qreal new_heading) { cur_heading = new_heading; } + void setSpeed(qreal new_speed) { cur_speed = new_speed; } + void setVariation(qreal new_variation) { cur_variation = new_variation; } + void setLatCardinal(CardinalDirection new_direction) { cur_latCardinal = new_direction; } + void setLongCardinal(CardinalDirection new_direction) { cur_longCardinal = new_direction; } + void setVarCardinal(CardinalDirection new_direction) { cur_varCardinal = new_direction; } + void setFixQuality(int new_fixQuality) { cur_fixQuality = new_fixQuality; } + void setDillution(qreal new_dillution) { cur_dillution = new_dillution; } + void setNumSatellites(int new_numSatellites) { cur_numSatellites = new_numSatellites;} + void setFixType(FixType new_fixType) { cur_fixType = new_fixType; } + void setFixMode(FixMode new_fixMode) { cur_fixMode = new_fixMode; } + void setFixStatus(FixStatus new_fixStatus) { cur_fixStatus = new_fixStatus; } + + QString cur_device; + + QDateTime cur_datetime; + + qreal cur_latitude; + qreal cur_longitude; + qreal cur_altitude; + qreal cur_heading; + qreal cur_speed; + qreal cur_variation; + qreal cur_dillution; + + CardinalDirection cur_latCardinal; + CardinalDirection cur_longCardinal; + CardinalDirection cur_varCardinal; + + int cur_fixQuality; + int cur_numSatellites; + + int satArray[50][3]; + int activeSats[12]; + + FixType cur_fixType; + FixMode cur_fixMode; + FixStatus cur_fixStatus; + + QFile* LogFile; + void parseNMEA(const QByteArray& array); + bool parseGGA(const char *ggaString = 0); + bool parseGLL(const char *ggaString = 0); + bool parseGSA(const char *gsaString = 0); + bool parseGSV(const char *gsvString = 0); + bool parseRMC(const char *gsvString = 0); + +private: + virtual void onLinkReady() = 0; + virtual void onDataAvailable() = 0; + virtual void onStop() = 0; + + friend class GPSSlotForwarder; +}; + +#ifndef _MOBILE +class QGPSComDevice : public QGPSDevice +{ + Q_OBJECT + +public: + QGPSComDevice(const QString &device); + virtual ~QGPSComDevice(); + + virtual bool openDevice(); + virtual bool closeDevice(); + +private: + virtual void onLinkReady(); + virtual void onDataAvailable(); + virtual void onStop(); + + QextSerialPort *port; + QByteArray Buffer; + + virtual void run(); + +protected: + virtual void checkDataAvailable(); +}; +#endif + +class QGPSFileDevice : public QGPSDevice +{ + Q_OBJECT + +public: + QGPSFileDevice(const QString &device); + + virtual bool openDevice(); + virtual bool closeDevice(); + +private: + virtual void onLinkReady(); + virtual void onDataAvailable(); + virtual void onStop(); + + QFile* theFile; + + virtual void run(); +}; + +#ifndef _MOBILE + +#ifdef USE_GPSD_LIB +#include "libgpsmm.h" + +class QGPSDDevice; +class QGPSDDevice : public QGPSDevice +{ + Q_OBJECT + +public: + QGPSDDevice(const QString& device); + + virtual bool openDevice(); + virtual bool closeDevice(); + +protected: + virtual void run(); + +private: + void onLinkReady(); + void onDataAvailable(); + void onStop(); + + gpsmm* Server; + struct gps_data_t* gpsdata; + QByteArray Buffer; + + bool serverOk = true; + + friend class GPSSlotForwarder; +}; +#else /*USE_GPSD_LIB*/ +class QTcpSocket; + +class QGPSDDevice; +class QGPSDDevice : public QGPSDevice +{ + Q_OBJECT + +public: + QGPSDDevice(const QString& device); + + virtual bool openDevice(); + virtual bool closeDevice(); + +protected: + virtual void run(); + +private: + void onLinkReady(); + void onDataAvailable(); + void onStop(); + + void parse(const QString& s); + void parseO(const QString& s); + void parseY(const QString& s); + QTcpSocket* Server; + QByteArray Buffer; + + friend class GPSSlotForwarder; +}; +#endif /*USE_GPSD_LIB*/ + +#endif + +#if defined Q_OS_SYMBIAN || defined(Q_WS_SIMULATOR) +#include <QGeoPositionInfo> +#include <QGeoPositionInfoSource> +#include <QGeoSatelliteInfo> +#include <QGeoSatelliteInfoSource> + +// Use the QtMobility namespace +QTM_USE_NAMESPACE + +class QGPSMobileDevice : public QGPSDevice +{ + Q_OBJECT + +public: + QGPSMobileDevice(); + + virtual bool openDevice(); + virtual bool closeDevice(); + + void satInfo(int index, int &elev, int &azim, int &snr); + +protected: + virtual void run(); + +private slots: + void onUpdateTimeout(); + void onPositionUpdated ( const QGeoPositionInfo & update ) ; +// void setUpdateInterval(int arg); + + void on_satRequestTimeout(); + void on_satellitesInViewUpdated(QList<QGeoSatelliteInfo>); + void on_satellitesInUseUpdated(QList<QGeoSatelliteInfo>); + + +private: + void onLinkReady(); + void onDataAvailable(); + void onStop(); + + friend class GPSSlotForwarder; + +private: + QGeoPositionInfoSource* src; + QGeoSatelliteInfoSource* satsrc; + + QList<QGeoSatelliteInfo> m_List; + QList<QGeoSatelliteInfo> m_UseList; + int m_accuracy; +}; +#endif + +#endif // QGPS_DEVICE_H diff --git a/src/GPS/qgpsmainwindowui.ui b/src/GPS/qgpsmainwindowui.ui new file mode 100644 index 0000000..b0b5d01 --- /dev/null +++ b/src/GPS/qgpsmainwindowui.ui @@ -0,0 +1,207 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>QGPSMainWindowUI</class> + <widget class="QWidget" name="QGPSMainWindowUI"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>350</width> + <height>268</height> + </rect> + </property> + <property name="windowTitle"> + <string>GPS</string> + </property> + <layout class="QVBoxLayout" name="satLayoutV"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QLabel" name="lblFixStatus"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="lblFixTime"> + <property name="text"> + <string>TextLabel</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="satLayoutH"> + <item> + <widget class="QGPSSatelliteTracker" name="satTracker" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>50</width> + <height>50</height> + </size> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="1"> + <widget class="QLabel" name="txtLatitude"> + <property name="text"> + <string>99 99' 99"</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="textLabel2"> + <property name="text"> + <string>Longitude</string> + </property> + <property name="wordWrap"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="txtLongitude"> + <property name="text"> + <string>99 99' 99"</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="textLabel3"> + <property name="text"> + <string>Altitude</string> + </property> + <property name="wordWrap"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="txtAltitude"> + <property name="text"> + <string>1000 meter</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="textLabel1_2"> + <property name="text"> + <string># Satellites</string> + </property> + <property name="wordWrap"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="txtNumSats"> + <property name="text"> + <string>00</string> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="textLabel2_2"> + <property name="text"> + <string>Fix Type</string> + </property> + <property name="wordWrap"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QLabel" name="txtFixType"> + <property name="text"> + <string>Invalid</string> + </property> + </widget> + </item> + <item row="5" column="0"> + <widget class="QLabel" name="textLabel4"> + <property name="text"> + <string>Speed</string> + </property> + <property name="wordWrap"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="5" column="1"> + <widget class="QLabel" name="txtSpeed"> + <property name="text"> + <string>000 km/h</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="textLabel1"> + <property name="text"> + <string>Latitude</string> + </property> + <property name="wordWrap"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </item> + <item> + <widget class="SatelliteStrengthView" name="StrengthView" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>40</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>60</height> + </size> + </property> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>QGPSSatelliteTracker</class> + <extends>QWidget</extends> + <header>qgpssatellitetracker.h</header> + </customwidget> + <customwidget> + <class>SatelliteStrengthView</class> + <extends>QWidget</extends> + <header>SatelliteStrengthView.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> diff --git a/src/GPS/qgpssatellitetracker.cpp b/src/GPS/qgpssatellitetracker.cpp new file mode 100644 index 0000000..0d912e0 --- /dev/null +++ b/src/GPS/qgpssatellitetracker.cpp @@ -0,0 +1,142 @@ +/*************************************************************************** + * Copyright (C) 2005 by Robin Gingras * + * neozenkai@cox.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. * + ***************************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#include <QPainter> +#include <QPen> +#include <QBrush> + +#include "qgpssatellitetracker.h" + +QGPSSatelliteTracker::QGPSSatelliteTracker(QWidget *parent) + : QWidget(parent), Heading(0) +{ +} + +void QGPSSatelliteTracker::setSatellites(const QList<Satellite>& aList) +{ + List = aList; + update(); +} + +void QGPSSatelliteTracker::setHeading(int x) +{ + Heading = x; + update(); +} + +/** + * private void QGPSSatelliteTracker::paintEvent() + * + * Does the actual drawing of the widget. Reads the satArray array to + * get satellite positions and PRNs. Reads the satActive array to get + * which satellites are being used. + * + * @param QPaintEvent * Ignored by this function + */ + +void QGPSSatelliteTracker::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + painter.translate(width()/2,height()/2); + + int rad = width(); + if (height() < rad) + rad = height(); + rad /= 2; + rad -= 2; + + painter.setPen(QPen(palette().text(), 1, Qt::SolidLine)); + painter.setBrush(Qt::NoBrush); + + // first paint the two reference circles, one at 0 degrees, and + // the other at 45 degrees + painter.drawEllipse(-rad,-rad, rad*2,rad*2); + painter.drawEllipse(-rad/2,-rad/2,rad,rad); + + // now the reference lines, one vertical and the other horizontal + painter.drawLine(-rad,0,rad,0); + painter.drawLine(0,-rad,0,rad); + + // plot heading + if (List.size()) + { + painter.setPen(QPen(QColor(240,32,32),3,Qt::SolidLine,Qt::RoundCap)); + qreal Alfa = Heading-90; + Alfa = Alfa*3.141592/180; + qreal fx = cos(Alfa)*rad*3/4; + qreal fy = sin(Alfa)*rad*3/4; + painter.drawLine(0,0,int(fx),int(fy)); + painter.drawLine(int(fx),int(fy), + int(fx+cos(Alfa+3.1415*5/6)*8),int(fy+sin(Alfa+3.1415*5/6)*8)); + painter.drawLine(int(fx),int(fy), + int(fx+cos(Alfa-3.1415*5/6)*8),int(fy+sin(Alfa-3.1415*5/6)*8)); + } + + + // now plot the satellites + painter.setPen(QPen(palette().foreground(), 2, Qt::SolidLine)); + painter.setBrush(QBrush(palette().foreground())); + + int x,y; + for (int i=0; i<List.size(); ++i) + { + if(List[i].SignalStrength > 0) + { + getCoordsFromPos(rad,List[i].Elevation,List[i].Azimuth, x, y); + + painter.drawEllipse(x - 2, y - 2, 4, 4); + painter.drawText(x + 5, y - 1, QString("%1").arg(List[i].Id)); + } + } +} + +/** + * private void QGPSSatelliteTracker::getCoordsFromPos() + * + * Inputs and elevation and azimuth, and translates them to coordinates + * that QPainter can use. This one took some thought, but I think it's + * correct. Satellites jump around, maybe a problem? + * + * @param int elevation Elevation of the satellite in degrees, 0 - 90 + * @param int azimuth Azimuth of the satellite in degrees, 0 - 360 + * @param int &x Pointer to x-coordinate + * @param int &y Pointer to y-coordinate + */ + +void QGPSSatelliteTracker::getCoordsFromPos(int rad, int elevation, int azimuth, int &x, int &y) +{ + int theta = azimuth-90; + + // since the "origin" of the sky is 90 (directly overhead), reverse + // elevation to make the origin 0 (an elevation of 90 becomes 0, etc) + elevation = 90 - elevation; + + // you should know this (slept too much in trig) + x = int(cos(theta*M_PI/180) * elevation * rad / 90); + y = int(sin(theta*M_PI/180) * elevation * rad / 90); +} diff --git a/src/GPS/qgpssatellitetracker.h b/src/GPS/qgpssatellitetracker.h new file mode 100644 index 0000000..f918921 --- /dev/null +++ b/src/GPS/qgpssatellitetracker.h @@ -0,0 +1,49 @@ +/*************************************************************************** + * Copyright (C) 2005 by Robin Gingras * + * neozenkai@cox.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. * + ***************************************************************************/ + +#ifndef QGPSSATELLITETRACKER_H +#define QGPSSATELLITETRACKER_H + +#include <QWidget> +#include <QVector> + +#include "SatelliteStrengthView.h" + +class QGPSSatelliteTracker : public QWidget +{ + Q_OBJECT + + public: + + QGPSSatelliteTracker(QWidget *parent = 0); + + void paintEvent(QPaintEvent *); + + void setSatellites(const QList<Satellite>& aList); + void setHeading(int x); + + private: + void getCoordsFromPos(int rad, int elevation, int azimuth, int &x, int &y); + + QList<Satellite> List; + int Heading; +}; + +#endif diff --git a/src/ImportExport/ExportDialog.ui b/src/ImportExport/ExportDialog.ui new file mode 100644 index 0000000..0e6efeb --- /dev/null +++ b/src/ImportExport/ExportDialog.ui @@ -0,0 +1,106 @@ +<ui version="4.0" > + <class>ExportDialog</class> + <widget class="QDialog" name="ExportDialog" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>191</width> + <height>139</height> + </rect> + </property> + <property name="windowTitle" > + <string>Export</string> + </property> + <layout class="QVBoxLayout" > + <property name="spacing" > + <number>4</number> + </property> + <property name="margin" > + <number>3</number> + </property> + <item> + <widget class="QLabel" name="label" > + <property name="text" > + <string>What do you want to export?</string> + </property> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox" > + <property name="title" > + <string/> + </property> + <layout class="QVBoxLayout" > + <item> + <widget class="QRadioButton" name="rbAll" > + <property name="text" > + <string>All visible (i.e. not hidden)</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="rbViewport" > + <property name="text" > + <string>Viewport</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="rbSelected" > + <property name="text" > + <string>Selected</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox" > + <property name="orientation" > + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons" > + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>ExportDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel" > + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel" > + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>ExportDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel" > + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel" > + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/ImportExport/ExportGPX.cpp b/src/ImportExport/ExportGPX.cpp new file mode 100644 index 0000000..74553d0 --- /dev/null +++ b/src/ImportExport/ExportGPX.cpp @@ -0,0 +1,99 @@ +// +// C++ Implementation: ExportGPX +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include <QtGui> +#include <QApplication> + +#include "../ImportExport/ExportGPX.h" + + +ExportGPX::ExportGPX(Document* doc) + : IImportExport(doc) +{ +} + + +ExportGPX::~ExportGPX() +{ +} + +// export +bool ExportGPX::export_(const QList<Feature *>& featList) +{ + QList<Node*> waypoints; + QList<TrackSegment*> segments; + QList<Layer*> tracks; + QList<Way*> routes; + + if(! IImportExport::export_(featList) ) return false; + + bool OK = true; + + QXmlStreamWriter stream(Device); + stream.setAutoFormatting(true); + stream.setAutoFormattingIndent(2); + stream.writeStartDocument(); + + QProgressDialog progress(QApplication::tr("Exporting GPX..."), QApplication::tr("Cancel"), 0, 0); + progress.setWindowModality(Qt::WindowModal); + progress.setMaximum(progress.maximum() + featList.count()); + + stream.writeStartElement("gpx"); + stream.writeAttribute("version", "1.1"); + stream.writeAttribute("creator", QString("%1 v%2%3").arg(STRINGIFY(PRODUCT)).arg(STRINGIFY(VERSION)).arg(STRINGIFY(REVISION))); + stream.writeAttribute("xmlns", "http://www.topografix.com/GPX/1/1"); + + for (int i=0; i<theFeatures.size(); ++i) { + if (TrackSegment* S = dynamic_cast<TrackSegment*>(theFeatures[i])) { + segments.push_back(S); + if (!tracks.contains(S->layer())) + tracks.push_back(S->layer()); + } else + if (Node* P = CAST_NODE(theFeatures[i])) { + if (!P->tagValue("_waypoint_","").isEmpty()) + waypoints.push_back(P); + if (!P->tagValue("name","").isEmpty() && !P->sizeParents()) + waypoints.push_back(P); + } else + if (Way* R = CAST_WAY(theFeatures[i])) { + if (R->size()) + routes.push_back(R); + } + } + + for (int i=0; i < waypoints.size(); ++i) { + waypoints[i]->toGPX(stream, &progress, "wpt", true); + } + + for (int i=0; i < routes.size(); ++i) { + routes[i]->toGPX(stream, &progress, true); + } + + for (int i=0; i<tracks.size(); ++i) { + stream.writeStartElement("trk"); + stream.writeTextElement("name", tracks[i]->name()); + + for (int j=0; j < segments.size(); ++j) + if (tracks[i]->exists(segments[j])) + segments[j]->toGPX(stream, &progress, true); + stream.writeEndElement(); + } + stream.writeEndElement(); + stream.writeEndDocument(); + + progress.setValue(progress.maximum()); + if (progress.wasCanceled()) + return false; + + return OK; +} + diff --git a/src/ImportExport/ExportGPX.h b/src/ImportExport/ExportGPX.h new file mode 100644 index 0000000..8c6befc --- /dev/null +++ b/src/ImportExport/ExportGPX.h @@ -0,0 +1,31 @@ +// +// C++ Interface: ExportGPX +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef ExportGPX_H +#define ExportGPX_H + +#include "IImportExport.h" + +/** + @author cbro <cbro@semperpax.com> +*/ +class ExportGPX : public IImportExport +{ +public: + ExportGPX(Document* doc); + + ~ExportGPX(); + + //export + virtual bool export_(const QList<Feature *>& featList); +}; + +#endif diff --git a/src/ImportExport/ExportOSM.cpp b/src/ImportExport/ExportOSM.cpp new file mode 100644 index 0000000..85a3fad --- /dev/null +++ b/src/ImportExport/ExportOSM.cpp @@ -0,0 +1,104 @@ +#include "ExportOSM.h" +#include "Utils.h" + +#include "Features.h" + +#include "MerkaartorPreferences.h" + +static QString stripToOSMId(const IFeature::FId& id) +{ + return QString::number(id.numId); +} + +static QString tagOSM(const Feature& F) +{ + QString S; + for (int i=0; i<F.tagSize(); ++i) + { + if (F.tagKey(i).startsWith('_') && (F.tagKey(i).endsWith('_'))) + continue; + + const QString & tagKey = Utils::encodeAttributes( F.tagKey(i) ); + const QString & tagValue = Utils::encodeAttributes( F.tagValue(i) ); + + S += QString("<tag k=\"%1\" v=\"%2\"/>").arg( tagKey ).arg( tagValue ); + } + return S; +} + +QString versionAttribute(const Feature& F) +{ +#ifndef FRISIUS_BUILD + return QString(" version=\"%1\"").arg(F.versionNumber()); +#endif +} + +QString exportOSM(const Node& Pt, const QString& ChangesetId) +{ + if (Pt.isVirtual()) + return QString(); + + QString S; + if (ChangesetId.isEmpty()) + S += QString("<node id=\"%1\" lat=\"%2\" lon=\"%3\"%4>") + .arg(stripToOSMId(Pt.id())).arg(Pt.position().y(),0,'f',8).arg(Pt.position().x(),0,'f',8).arg(versionAttribute(Pt)); + else + S += QString("<node id=\"%1\" lat=\"%2\" lon=\"%3\"%4 changeset=\"%5\">") + .arg(stripToOSMId(Pt.id())).arg(Pt.position().y(),0,'f',8).arg(Pt.position().x(),0,'f',8).arg(versionAttribute(Pt)) + .arg(ChangesetId); + S+=tagOSM(Pt); + S+="</node>"; + return S; +} + +QString exportOSM(const Way& R, const QString& ChangesetId) +{ + QString S; + if (ChangesetId.isEmpty()) + S += QString("<way id=\"%1\"%2>").arg(stripToOSMId(R.id())).arg(versionAttribute(R)); + else + S += QString("<way id=\"%1\"%2 changeset=\"%3\">").arg(stripToOSMId(R.id())).arg(versionAttribute(R)).arg(ChangesetId); + if (R.size()) { + S+=QString("<nd ref=\"%1\"/>").arg(stripToOSMId(R.get(0)->id())); + for (int i=1; i<R.size(); ++i) + if (!R.getNode(i)->isVirtual()) + if (R.get(i)->id().numId != R.get(i-1)->id().numId) + S+=QString("<nd ref=\"%1\"/>").arg(stripToOSMId(R.get(i)->id())); + } + S += tagOSM(R); + S += "</way>"; + return S; +} + +QString exportOSM(const Relation& R, const QString& ChangesetId) +{ + QString S; + if (ChangesetId.isEmpty()) + S += QString("<relation id=\"%1\"%2>").arg(stripToOSMId(R.id())).arg(versionAttribute(R)); + else + S += QString("<relation id=\"%1\"%2 changeset=\"%3\">").arg(stripToOSMId(R.id())).arg(versionAttribute(R)).arg(ChangesetId); + for (int i=0; i<R.size(); ++i) + { + QString Type("node"); + if (dynamic_cast<const Way*>(R.get(i))) + Type="way"; + else if (dynamic_cast<const Relation*>(R.get(i))) + Type="relation"; + S+=QString("<member type=\"%1\" ref=\"%2\" role=\"%3\"/>").arg(Type).arg(stripToOSMId(R.get(i)->id())).arg(R.getRole(i)); + } + S += tagOSM(R); + S += "</relation>"; + return S; +} + + +QString wrapOSM(const QString& S, const QString& ChangeSetId) +{ + if (ChangeSetId.isEmpty()) + return "<osm version=\"0.5\">"+S+"</osm>"+QChar(0); + else + return "<osm>"+S+"</osm>"+QChar(0); + //return "<osm version=\"0.6\" changeset=\""+ChangeSetId+"\">"+S+"</osm>"+QChar(0); +} + + diff --git a/src/ImportExport/ExportOSM.h b/src/ImportExport/ExportOSM.h new file mode 100644 index 0000000..49a2772 --- /dev/null +++ b/src/ImportExport/ExportOSM.h @@ -0,0 +1,17 @@ +#ifndef MERKAARTOR_EXPORTOSM_H_ +#define MERKAARTOR_EXPORTOSM_H_ + +class Relation; +class Way; +class Node; + +#include <QtCore/QString> + +QString exportOSM(const Node& Pt, const QString& ChangesetId); +QString exportOSM(const Way& R, const QString& ChangesetId); +QString exportOSM(const Relation& R, const QString& ChangesetId); + +QString wrapOSM(const QString& S, const QString& ChangeSetId); +#endif + + diff --git a/src/ImportExport/IImportExport.cpp b/src/ImportExport/IImportExport.cpp new file mode 100644 index 0000000..0f9e2be --- /dev/null +++ b/src/ImportExport/IImportExport.cpp @@ -0,0 +1,70 @@ +// +// C++ Implementation: IImportExport +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include <QtGui> + +#include "../ImportExport/IImportExport.h" + +IImportExport::IImportExport(Document* doc) + : theDoc(doc), Device(0), ownDevice(false) +{ +} + +IImportExport::~IImportExport() +{ + if (ownDevice) { + if (Device && Device->isOpen()) + Device->close(); + delete Device; + } +} + +// Specify the input as a QIODevice +bool IImportExport::setDevice(QIODevice* aDevice) +{ + Device = aDevice; + return true; +} + +// Specify the input as a QFile +bool IImportExport::loadFile(QString filename) +{ + FileName = filename; + Device = new QFile(filename); + ownDevice = true; + return Device->open(QIODevice::ReadOnly); +} + +bool IImportExport::saveFile(QString filename) +{ + FileName = filename; + Device = new QFile(filename); + ownDevice = true; + return Device->open(QIODevice::WriteOnly | QIODevice::Truncate); +} + +bool IImportExport::export_(const QList<Feature *>& featList) +{ + theFeatures = featList; + + return true; +} + +CommandList* IImportExport::getCommandList() +{ + return theList; +} + +const QString& IImportExport::getFilename() const +{ + return FileName; +} diff --git a/src/ImportExport/IImportExport.h b/src/ImportExport/IImportExport.h new file mode 100644 index 0000000..e3391e4 --- /dev/null +++ b/src/ImportExport/IImportExport.h @@ -0,0 +1,59 @@ +// +// C++ Interface: IImportExport +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef IIMPORTEXPORT_H +#define IIMPORTEXPORT_H + +class QString; +class QIODevice; + +#include "Features.h" +#include "Layer.h" +#include "Command.h" +#include "DocumentCommands.h" + +/** +Interface for Import/Export + + @author cbro <cbro@semperpax.com> +*/ +class IImportExport{ +public: + IImportExport(Document* doc); + virtual ~IImportExport(); + +public: + // Specify the input as a QIODevice + virtual bool setDevice(QIODevice* aDevice); + // Specify the input as a QFile + virtual bool loadFile(QString filename); + // Specify the output as a QFile + virtual bool saveFile(QString filename); + // import the input + virtual bool import(Layer* /* aLayer */) { return false; } + // export + virtual bool export_(const QList<Feature *>& featList = QList<Feature *>()); + + // Return the filename + const QString& getFilename() const; + + virtual CommandList* getCommandList(); + +protected: + Document* theDoc; + QIODevice* Device; + CommandList* theList; + QList<Feature*> theFeatures; + QString FileName; + bool ownDevice; +}; + +#endif diff --git a/src/ImportExport/ImportCSVDialog.cpp b/src/ImportExport/ImportCSVDialog.cpp new file mode 100644 index 0000000..daf5f39 --- /dev/null +++ b/src/ImportExport/ImportCSVDialog.cpp @@ -0,0 +1,565 @@ +//*************************************************************** +// CLass: %CLASS% +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com> (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +//****************************************************************** + +#include "ImportCSVDialog.h" +#include "ui_ImportCSVDialog.h" +#include "Features.h" +#include "Layer.h" +#include "Global.h" + +#include <QTimer> +#include <QMessageBox> +#include <QDomDocument> +#include <QFileDialog> + +ImportCSVDialog::ImportCSVDialog(QIODevice* aDev, QWidget *parent) : + QDialog(parent), + ui(new Ui::ImportCSVDialog) + , m_dev(aDev) + , m_selField(-1) +{ + ui->setupUi(this); + ui->edCustomDelim->setEnabled(false); + ui->cbFieldType->addItem(tr("String"), CSVString); + ui->cbFieldType->addItem(tr("Integer"), CSVInt); + ui->cbFieldType->addItem(tr("Float"), CSVFloat); + ui->cbFieldType->addItem(tr("Longitude"), CSVLongitude); + ui->cbFieldType->addItem(tr("Latitude"), CSVLatitude); + + CSVProjection.setProjectionType("EPSG:4326"); + + QTimer::singleShot(0, this, SLOT(initialize())); +} + +ImportCSVDialog::~ImportCSVDialog() +{ + delete ui; +} + +void ImportCSVDialog::initialize() +{ + m_dev->seek(0); + int l=0; + QString previewText; + while (l<4 && !m_dev->atEnd()) { + QString line = m_dev->readLine(); + previewText += line; + ++l; + } + ui->txInput->setText(previewText); + + analyze(); + generatePreview(); +} + +void ImportCSVDialog::analyze() +{ + m_dev->seek(0); + QString l; + QStringList hdr; + bool ok; + + l = m_dev->readLine(); + + QStringList slc = l.split(","); + int best = slc.size(); + ui->rbCommaDelim->setChecked(true); + m_delim = ","; + + QStringList sls = l.split(";"); + if (sls.size() > best) { + best = sls.size(); + ui->rbSemiDelim->setChecked(true); + m_delim = ";"; + } + + QStringList slt = l.split("\t"); + if (slt.size() > best) { + best = slt.size(); + ui->rbTabDelim->setChecked(true); + m_delim = "\t"; + } + + ui->cbHasHeader->setChecked(true); + QStringList sl = l.split(m_delim); + for (int i=0; i<sl.size(); ++i) { + sl[i].toDouble(&ok); + if (ok) { + ui->cbHasHeader->setChecked(false); + break; + } + } + + QRegExp rx(QString("%1\\s*\".*\"\\s*%1").arg(m_delim)); + if (rx.indexIn(l)) { + m_quote = "\""; + ui->rbStringDouble->setChecked(true); + } else { + rx = QRegExp(QString("%1\\s*'.*'\\s*%1").arg(m_delim)); + if (rx.indexIn(l)) { + m_quote = "'"; + ui->rbStringSingle->setChecked(true); + } else { + m_quote.clear(); + ui->rbStringNone->setChecked(true); + } + + } + m_dev->seek(0); + if (ui->cbHasHeader->isChecked()) { + l = m_dev->readLine(); + hdr = l.split(m_delim); + } + l = m_dev->readLine(); + QStringList flds = l.split(m_delim); + + Fields.clear(); + int hdrIdx = 0; + for (int i=0; i<flds.size(); ++i) { + CSVField f; + QString fld = flds[i]; + if (!m_quote.isEmpty()) { + if (flds[i].trimmed().startsWith(m_quote)) { + while (i<flds.size()-1 && !flds[i].trimmed().endsWith(m_quote)) { + ++i; + fld += m_delim + flds[i]; + } + fld.remove(0, 1); + fld.chop(1); + } + } + if (ui->cbHasHeader->isChecked()) { + if (hdrIdx<hdr.size()) + f.name = hdr[hdrIdx].simplified(); + } else + f.name = "field_" + QString::number(i); + flds[i].toDouble(&ok); + if (ok) { + if (f.name.startsWith("lat", Qt::CaseInsensitive)) { + f.type = CSVLatitude; + } else if (f.name.startsWith("lon", Qt::CaseInsensitive)) { + f.type = CSVLongitude; + } else + f.type = CSVFloat; + } else { + flds[i].toInt(&ok); + if (ok) + f.type = CSVInt; + else + f.type = CSVString; + } + f.import = true; + Fields << f; + hdrIdx++; + } + + ui->lvFields->clear(); + for (int i=0; i< Fields.size(); ++i) { + QListWidgetItem* item = new QListWidgetItem(Fields[i].name); + item->setData(Qt::UserRole, i); + ui->lvFields->addItem(item); + } + +} + +Feature* ImportCSVDialog::generateOSM(Layer* l, QString line) +{ + bool ok; + QPointF p; + qreal t; + bool hasLat = false, hasLon = false; + + QStringList flds = line.split(m_delim); + if (flds.size() < 2) + return NULL; + + Node *N = g_backend.allocNode(l, Coord(0, 0)); + int lidx=0; + for (int i=0; i<Fields.size(); ++i) { + CSVField f = Fields[i]; + + switch (f.type) { + case CSVLatitude: + if (f.import) { + t = flds[lidx].toDouble(&ok); + if (ok) { + p.setY(t); + hasLat = true; + } + } + break; + case CSVLongitude: + if (f.import) { + t = flds[lidx].toDouble(&ok); + if (ok) { + p.setX(t); + hasLon = true; + } + } + break; + case CSVString: { + QString fld = flds[lidx]; + if (!m_quote.isEmpty()) { + if (flds[lidx].trimmed().startsWith(m_quote)) { + while (lidx<flds.size()-1 && !flds[lidx].trimmed().endsWith(m_quote)) { + ++lidx; + fld += m_delim + flds[lidx]; + } + fld.remove(0, 1); + fld.chop(1); + } + } + if (f.import) + N->setTag(f.name, fld); + break; + } + + default: + if (f.import) + N->setTag(f.name, flds[lidx].trimmed()); + break; + } + ++lidx; + } + if (!hasLat || !hasLon) { + g_backend.deallocFeature(l, N); + return NULL; + } + if (CSVProjection.projIsLatLong()) + N->setPosition(p); + else + N->setPosition(CSVProjection.inverse(p)); + return N; +} + +void ImportCSVDialog::generatePreview(int /*sel*/) +{ + m_dev->seek(0); + QString line; + QString previewText; + + if (ui->cbHasHeader) + line = m_dev->readLine(); + + int l=0; + while (l<4 && !m_dev->atEnd()) { + line = m_dev->readLine().trimmed(); + Feature* F = generateOSM(NULL, line); + if (F) { + previewText += F->toXML(2); + delete F; + } + ++l; + } + ui->txPreview->setText(previewText); +} + +void ImportCSVDialog::changeEvent(QEvent *e) +{ + QDialog::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + +void ImportCSVDialog::on_lvFields_itemSelectionChanged() +{ + QListWidgetItem* it = ui->lvFields->item(ui->lvFields->currentRow()); + m_selField = -1; + + int idx = it->data(Qt::UserRole).toInt(); + if (idx >= Fields.size()) { + return; + } + + CSVField f(Fields[idx]); + ui->edFieldName->setText(f.name); + ui->cbFieldType->setCurrentIndex(f.type); + ui->cbFieldImport->setChecked(f.import); + + m_selField = idx; +} + +void ImportCSVDialog::on_rbCommaDelim_clicked() +{ + m_delim = ","; + generatePreview(); +} + +void ImportCSVDialog::on_rbSemiDelim_clicked() +{ + m_delim = ";"; + generatePreview(); +} + +void ImportCSVDialog::on_rbTabDelim_clicked() +{ + m_delim = "\t"; + generatePreview(); +} + +void ImportCSVDialog::on_edCustomDelim_textEdited() +{ + m_delim = ui->edCustomDelim->text(); + generatePreview(); +} + +void ImportCSVDialog::on_rbStringNone_clicked() +{ + m_quote.clear(); + generatePreview(); +} + +void ImportCSVDialog::on_rbStringSingle_clicked() +{ + m_quote = "'"; + generatePreview(); +} + +void ImportCSVDialog::on_rbStringDouble_clicked() +{ + m_quote = "\""; + generatePreview(); +} + +void ImportCSVDialog::on_edFieldName_textEdited() +{ + if (m_selField == -1) + return; + + Fields[m_selField].name = ui->edFieldName->text(); + + QListWidgetItem* it = ui->lvFields->item(ui->lvFields->currentRow()); + it->setText(ui->edFieldName->text()); + + generatePreview(); +} + +void ImportCSVDialog::on_cbFieldType_currentIndexChanged(int index) +{ + if (m_selField == -1) + return; + + Fields[m_selField].type = (CSVFieldType)index; + + generatePreview(); +} + +void ImportCSVDialog::on_cbFieldImport_clicked(bool b) +{ + if (m_selField == -1) + return; + + Fields[m_selField].import = b; + + generatePreview(); +} + +void ImportCSVDialog::on_edProjection_editingFinished() +{ + if (ui->edProjection->text().isEmpty()) + CSVProjection.setProjectionType("EPSG:4326"); + else if (!CSVProjection.setProjectionType(ui->edProjection->text())) { + QMessageBox::critical(0, tr("Invalid projection"), tr("Unable to set projection.")); + CSVProjection.setProjectionType("EPSG:4326"); + } + + generatePreview(); +} + +void ImportCSVDialog::on_buttonBox_accepted() +{ + bool hasLat = false; + bool hasLon = false; + foreach (CSVField f, Fields) { + if (f.type == CSVLatitude) + hasLat = true; + if (f.type == CSVLongitude) + hasLon = true; + } + + if (!hasLat || !hasLon) { + if (QMessageBox::critical(this, tr("No coordinates"), + tr("Latitude or Longitude field missing. It will be impossible to import the file.\nDo you really want to exit?") + , QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) + return; + else + reject(); + } + + accept(); +} + +bool ImportCSVDialog::import(Layer *aLayer) +{ + QString line; + + m_dev->seek(0); + if (ui->cbHasHeader->isChecked()) + m_dev->readLine(); + + int l = 0; + while (l < ui->sbFrom->value() && !m_dev->atEnd()) { + m_dev->readLine(); + ++l; + } + + while ((l < ui->sbTo->value() || ui->sbTo->value() == 0) && !m_dev->atEnd()) { + line = m_dev->readLine().trimmed(); + Feature* F = generateOSM(aLayer, line); + if (F) + aLayer->add(F); + + ++l; + } + return true; +} + +void ImportCSVDialog::on_btLoad_clicked() +{ + QString f = QFileDialog::getOpenFileName(this, tr("Load CSV import settings"), QString(), tr("Merkaartor import settings (*.mis)")); + if (f.isEmpty()) + return; + + QFile file(f); + if (!file.open(QIODevice::ReadOnly)) { + QMessageBox::critical(this, tr("Invalid file"), tr("%1 could not be opened.").arg(f)); + return; + } + + QDomDocument theXmlDoc; + if (!theXmlDoc.setContent(&file)) { + file.close(); + return; + } + file.close(); + + QDomElement docElem = theXmlDoc.documentElement(); + if (docElem.tagName() != "CSVImportSettings") { + QMessageBox::critical(this, tr("Invalid file"), tr("%1 is not a CSV import settings file").arg(f)); + return; + } + + m_delim = docElem.attribute("delimiter"); + if (m_delim == ",") + ui->rbCommaDelim->setChecked(true); + else if (m_delim == ";") + ui->rbSemiDelim->setChecked(true); + else if (m_delim == "tab") { + m_delim = "\t"; + ui->rbTabDelim->setChecked(true); + } else { + ui->rbCustomDelim->setChecked(true); + ui->edCustomDelim->setText(m_delim); + } + + ui->cbHasHeader->setChecked(docElem.attribute("header") == "true" ? true : false); + ui->sbFrom->setValue(docElem.attribute("from").toInt()); + ui->sbTo->setValue(docElem.attribute("to").toInt()); + + Fields.clear(); + QDomElement e = docElem.firstChildElement(); + while(!e.isNull()) { + if (e.tagName() == "Fields") { + QDomElement c = e.firstChildElement(); + while(!c.isNull()) { + if (c.tagName() == "Field") { + CSVField f; + f.name = c.attribute("name"); + f.type = (CSVFieldType)c.attribute("type").toInt(); + f.import = c.attribute("import") == "false" ? false : true; + + Fields << f; + } + + c = c.nextSiblingElement(); + } + } + else if (e.tagName() == "Projection") { + ui->edProjection->setText(e.text().trimmed()); + } + e = e.nextSiblingElement(); + } + + ui->lvFields->clear(); + for (int i=0; i< Fields.size(); ++i) { + QListWidgetItem* item = new QListWidgetItem(Fields[i].name); + item->setData(Qt::UserRole, i); + ui->lvFields->addItem(item); + } + ui->edFieldName->setText(QString()); + + on_edProjection_editingFinished(); +} + +void ImportCSVDialog::on_btSave_clicked() +{ + QDomDocument theXmlDoc; + + theXmlDoc.appendChild(theXmlDoc.createProcessingInstruction("xml", "version=\"1.0\"")); + + QDomElement root = theXmlDoc.createElement("CSVImportSettings"); + theXmlDoc.appendChild(root); + root.setAttribute("creator", QString("%1 v%2%3").arg(qApp->applicationName()).arg(STRINGIFY(VERSION)).arg(STRINGIFY(REVISION))); + + QString tDelim = m_delim; + if (tDelim == "\t") + tDelim = "tab"; + root.setAttribute("delimiter", tDelim); + root.setAttribute("header", ui->cbHasHeader->isChecked() ? "true" : "false"); + root.setAttribute("from", QString::number(ui->sbFrom->value())); + root.setAttribute("to", QString::number(ui->sbTo->value())); + + QDomElement p = theXmlDoc.createElement("Projection"); + root.appendChild(p); + QDomText t = theXmlDoc.createTextNode(ui->edProjection->text()); + p.appendChild(t); + + QDomElement flds = theXmlDoc.createElement("Fields"); + root.appendChild(flds); + + foreach(CSVField f, Fields) { + QDomElement fld = theXmlDoc.createElement("Field"); + flds.appendChild(fld); + + fld.setAttribute("name", f.name); + fld.setAttribute("type", QString::number(f.type)); + fld.setAttribute("import", f.import ? "true" : "false"); + } + + QString f; + QFileDialog dlg(this, tr("Save CSV import settings"), QString("%1/%2.mis").arg(M_PREFS->getworkingdir()).arg(tr("untitled")), tr("Merkaartor import settings (*.mis)") + "\n" + tr("All Files (*)")); + dlg.setFileMode(QFileDialog::AnyFile); + dlg.setDefaultSuffix("mis"); + dlg.setAcceptMode(QFileDialog::AcceptSave); + + if (dlg.exec()) { + if (dlg.selectedFiles().size()) + f = dlg.selectedFiles()[0]; + } +// f = QFileDialog::getSaveFileName(this, tr("Save CSV import settings"), "", tr("Merkaartor import settings (*.mis)")); + + if (f.isEmpty()) + return; + + QFile file(f); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QMessageBox::critical(this, tr("Unable to open save import settings"), tr("%1 could not be opened for writing.").arg(f)); + return; + } + file.write(theXmlDoc.toString().toUtf8()); + file.close(); +} diff --git a/src/ImportExport/ImportCSVDialog.h b/src/ImportExport/ImportCSVDialog.h new file mode 100644 index 0000000..581cc0b --- /dev/null +++ b/src/ImportExport/ImportCSVDialog.h @@ -0,0 +1,95 @@ +//*************************************************************** +// CLass: %CLASS% +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com> (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +//****************************************************************** + +#ifndef IMPORTCSVDIALOG_H +#define IMPORTCSVDIALOG_H + +#include <QDialog> +#include <QIODevice> + +#include "Projection.h" + +class Feature; +class Layer; + +namespace Ui { + class ImportCSVDialog; +} + +enum CSVFieldType { + CSVString, + CSVInt, + CSVFloat, + CSVLongitude, + CSVLatitude +}; + +struct CSVField { + QString name; + CSVFieldType type; + bool import; +}; + +typedef QList<CSVField> CSVFields; + +class ImportCSVDialog : public QDialog { + Q_OBJECT +public: + explicit ImportCSVDialog(QIODevice* aDev, QWidget *parent = 0); + ~ImportCSVDialog(); + + bool import(Layer* aLayer); + +protected slots: + void initialize(); + + void on_rbCommaDelim_clicked(); + void on_rbSemiDelim_clicked(); + void on_rbTabDelim_clicked(); + void on_edCustomDelim_textEdited(); + + void on_rbStringNone_clicked(); + void on_rbStringSingle_clicked(); + void on_rbStringDouble_clicked(); + + void on_lvFields_itemSelectionChanged(); + void on_edFieldName_textEdited(); + void on_cbFieldType_currentIndexChanged (int index); + void on_cbFieldImport_clicked(bool b); + void on_edProjection_editingFinished(); + + void on_btLoad_clicked(); + void on_btSave_clicked(); + + void on_buttonBox_accepted(); + +protected: + void changeEvent(QEvent *e); + + void analyze(); + void generatePreview(int sel=-1); + Feature* generateOSM(Layer* l, QString line); + +private: + Ui::ImportCSVDialog *ui; + + QIODevice* m_dev; + QString m_delim; + QString m_quote; + int m_selField; + +public: + CSVFields Fields; + Projection CSVProjection; +}; + +#endif // IMPORTCSVDIALOG_H diff --git a/src/ImportExport/ImportCSVDialog.ui b/src/ImportExport/ImportCSVDialog.ui new file mode 100644 index 0000000..fea5ddb --- /dev/null +++ b/src/ImportExport/ImportCSVDialog.ui @@ -0,0 +1,427 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ImportCSVDialog</class> + <widget class="QDialog" name="ImportCSVDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>480</width> + <height>723</height> + </rect> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Input</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <widget class="QTextEdit" name="txInput"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="font"> + <font> + <family>Courier New</family> + </font> + </property> + <property name="lineWrapMode"> + <enum>QTextEdit::NoWrap</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + <property name="html"> + <string notr="true"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Courier New'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></string> + </property> + <property name="acceptRichText"> + <bool>false</bool> + </property> + <property name="textInteractionFlags"> + <set>Qt::TextSelectableByMouse</set> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_5"> + <property name="title"> + <string>OSM Preview</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <widget class="QTextEdit" name="txPreview"/> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Specifications</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <widget class="QCheckBox" name="cbHasHeader"> + <property name="text"> + <string>First line contains headers</string> + </property> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_3"> + <property name="title"> + <string>Delimiter</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <widget class="QRadioButton" name="rbCommaDelim"> + <property name="text"> + <string>Comma (,)</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="rbSemiDelim"> + <property name="text"> + <string>Semicolon (;)</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="rbTabDelim"> + <property name="text"> + <string>Tab</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="rbCustomDelim"> + <property name="text"> + <string>Other:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edCustomDelim"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>40</width> + <height>16777215</height> + </size> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_6"> + <property name="title"> + <string>String Quote</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QRadioButton" name="rbStringNone"> + <property name="text"> + <string>None</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="rbStringSingle"> + <property name="text"> + <string>Single quote (')</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="rbStringDouble"> + <property name="text"> + <string>Double quote (")</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Projection (in PROJ4 format; leave blank for latitude/longitude)</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edProjection"/> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="grpWmsServers"> + <property name="title"> + <string>Fields</string> + </property> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <widget class="QFrame" name="frame_2"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout" name="_2"> + <property name="spacing"> + <number>5</number> + </property> + <property name="margin"> + <number>5</number> + </property> + <item> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Field list:</string> + </property> + </widget> + </item> + <item> + <widget class="QListWidget" name="lvFields"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QFrame" name="frame"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout" name="_3"> + <item> + <widget class="QLabel" name="label_11"> + <property name="text"> + <string>Field Name (= tag key) :</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edFieldName"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Field Type:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="cbFieldType"/> + </item> + <item> + <widget class="QCheckBox" name="cbFieldImport"> + <property name="text"> + <string>Import</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_4"> + <property name="title"> + <string>Import range</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>From (0 from start):</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="sbFrom"/> + </item> + <item> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>To (0 to End):</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="sbTo"/> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QPushButton" name="btLoad"> + <property name="text"> + <string>Load settings...</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btSave"> + <property name="text"> + <string>Save settings...</string> + </property> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>ImportCSVDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>469</x> + <y>585</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>rbCustomDelim</sender> + <signal>clicked(bool)</signal> + <receiver>edCustomDelim</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>331</x> + <y>278</y> + </hint> + <hint type="destinationlabel"> + <x>447</x> + <y>278</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/ImportExport/ImportExport.pri b/src/ImportExport/ImportExport.pri new file mode 100644 index 0000000..46505c6 --- /dev/null +++ b/src/ImportExport/ImportExport.pri @@ -0,0 +1,62 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/ImportExport +DEPENDPATH += $$MERKAARTOR_SRC_DIR/ImportExport + +#Header files +HEADERS += \ + ExportOSM.h \ + ImportGPX.h \ + ImportNGT.h \ + ImportOSM.h \ + ImportNGT.h \ + IImportExport.h \ + ImportNMEA.h \ + ExportGPX.h \ + ImportExportKML.h \ + ImportExportCSV.h \ + ImportCSVDialog.h + +#Source files +SOURCES += \ + ExportOSM.cpp \ + ImportGPX.cpp \ + ImportOSM.cpp \ + ImportNGT.cpp \ + IImportExport.cpp \ + ImportNMEA.cpp \ + ExportGPX.cpp \ + ImportExportKML.cpp \ + ImportExportCSV.cpp \ + ImportCSVDialog.cpp + +FORMS += \ + ExportDialog.ui \ + ImportCSVDialog.ui + +isEmpty(MOBILE) { + HEADERS += \ + ImportExportGdal.h + SOURCES += \ + ImportExportGdal.cpp +} + +contains (PROTOBUF, 1) { +#PBF +HEADERS += \ + ImportExportPBF.h \ + fileformat.pb.h \ + osmformat.pb.h + +SOURCES += \ + ImportExportPBF.cpp \ + fileformat.pb.cc \ + osmformat.pb.cc + +LIBS += -lz -lbz2 -lprotobuf +} + +!contains(FRISIUS,1) { + HEADERS += \ + ImportExportOSC.h + SOURCES += \ + ImportExportOSC.cpp +} diff --git a/src/ImportExport/ImportExportCSV.cpp b/src/ImportExport/ImportExportCSV.cpp new file mode 100644 index 0000000..99572af --- /dev/null +++ b/src/ImportExport/ImportExportCSV.cpp @@ -0,0 +1,50 @@ +// +// C++ Implementation: ImportExportCSV +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include <QtGui> +#include <QMessageBox> + +#include "../ImportExport/ImportExportCSV.h" +#include "ImportCSVDialog.h" +#include "Projection.h" + +bool parseContainer(QDomElement& e, Layer* aLayer); + +ImportExportCSV::ImportExportCSV(Document* doc) + : IImportExport(doc) +{ +} + + +ImportExportCSV::~ImportExportCSV() +{ +} + + +// export +bool ImportExportCSV::export_(const QList<Feature *>& /*featList*/) +{ + return false; +} + +// import the input +bool ImportExportCSV::import(Layer* aLayer) +{ + ImportCSVDialog* dlg = new ImportCSVDialog(Device); + if (dlg->exec() == QDialog::Rejected) + return false; + bool ret = dlg->import(aLayer); + delete dlg; + + return ret; +} + diff --git a/src/ImportExport/ImportExportCSV.h b/src/ImportExport/ImportExportCSV.h new file mode 100644 index 0000000..6fe8960 --- /dev/null +++ b/src/ImportExport/ImportExportCSV.h @@ -0,0 +1,35 @@ +// +// C++ Interface: ImportExportKML +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef ImportExportCSV_H +#define ImportExportCSV_H + +#include "IImportExport.h" + +class QDomDocument; +/** + @author cbro <cbro@semperpax.com> +*/ +class ImportExportCSV : public IImportExport +{ +public: + ImportExportCSV(Document* doc); + + ~ImportExportCSV(); + + // import the input + virtual bool import(Layer* aLayer); + + //export + virtual bool export_(const QList<Feature *>& featList); +}; + +#endif diff --git a/src/ImportExport/ImportExportGdal.cpp b/src/ImportExport/ImportExportGdal.cpp new file mode 100644 index 0000000..b6c6750 --- /dev/null +++ b/src/ImportExport/ImportExportGdal.cpp @@ -0,0 +1,498 @@ +// +// C++ Implementation: ImportExportGdal +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "ImportExportGdal.h" +#include "Projection.h" +#include "Features.h" +#include "ProjectionChooser.h" +#include "Global.h" + +#include <QtGui> +#include <QApplication> +#include <gdal.h> +#include <cpl_vsi.h> + +#include <QDebug> +#include <QLoggingCategory> + +QLoggingCategory lc_importExportGdal("merk.ImportExport.GDAL"); + +bool parseContainer(QDomElement& e, Layer* aLayer); + +ImportExportGdal::ImportExportGdal(Document* doc) + : IImportExport(doc) +{ +#if defined(Q_OS_WIN32) + // Projection.h defines the list of search paths for Windows. Other platforms will search correctly on their own. + ProjDirs dirs; + OSRSetPROJSearchPaths(dirs.dirs); +#endif +} + + +ImportExportGdal::~ImportExportGdal() +{ +} + +// Specify the input as a QFile +bool ImportExportGdal::loadFile(QString filename) +{ + FileName = filename; + + return true; +} + +bool ImportExportGdal::saveFile(QString) +{ + return false; +} + + +// export +bool ImportExportGdal::export_(const QList<Feature *>& featList) +{ + const char *pszDriverName = "SQLite"; + QString fileName(HOMEDIR + "/test.sqlite"); +#ifdef GDAL2 + GDALDriver *poDriver; + GDALDriverManager *driverManager = GetGDALDriverManager(); + GDALAllRegister(); + driverManager->AutoLoadDrivers(); + + poDriver = driverManager->GetDriverByName(pszDriverName); + if( poDriver == NULL ) + { + qDebug(lc_importExportGdal) << pszDriverName << "driver not available."; + return false; + } + + /* Create create options */ + char **createOptions = NULL; + createOptions = CSLSetNameValue( createOptions, "SPATIALITE", "YES" ); + + /* Open new dataset */ + GDALDataset *poDS; + + QFile::remove(fileName); + poDS = poDriver->Create( fileName.toUtf8().constData(), 0, 0, 0, GDT_Unknown, createOptions ); + if( poDS == NULL ) + { + qDebug(lc_importExportGdal) << "Creation of output file failed."; + return false; + } + poDS->ExecuteSQL("PRAGMA synchronous = OFF", NULL, NULL); + + /* Create Spatial reference object */ + OGRSpatialReference *poSRS; + poSRS = new OGRSpatialReference(); + poSRS->importFromEPSG(4326); + + /* Create layer options */ + char **layerOptions = NULL; + layerOptions = CSLSetNameValue( layerOptions, "FORMAT", "SPATIALITE" ); + layerOptions = CSLSetNameValue( layerOptions, "SPATIAL_INDEX", "YES" ); + + /* Create layer */ + OGRLayer *poLayer; + poLayer = poDS->CreateLayer( "osm", poSRS, wkbUnknown, layerOptions); + + /* Free the options */ + CSLDestroy( createOptions ); + CSLDestroy( layerOptions ); +#else + /* This is legacy code, and is not tested at all */ + OGRSFDriver *poDriver; + + OGRRegisterAll(); + + poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName); + if( poDriver == NULL ) + { + qDebug( "%s driver not available.", pszDriverName ); + return false; + } + + OGRDataSource *poDS; + + QFile::remove(fileName); + poDS = poDriver->CreateDataSource( fileName.toUtf8().constData(), NULL ); + if( poDS == NULL ) + { + qDebug( "Creation of output file failed." ); + return false; + } + poDS->ExecuteSQL("PRAGMA synchronous = OFF", NULL, NULL); + + OGRSpatialReference *poSRS; + poSRS = new OGRSpatialReference(); + poSRS->importFromEPSG(4326); + + char **papszOptions = NULL; + papszOptions = CSLSetNameValue( papszOptions, "SPATIALITE", "YES" ); + papszOptions = CSLSetNameValue( papszOptions, "FORMAT", "SPATIALITE" ); + papszOptions = CSLSetNameValue( papszOptions, "SPATIAL_INDEX", "YES" ); + + OGRLayer *poLayer; + poLayer = poDS->CreateLayer( "osm", poSRS, wkbUnknown, papszOptions); + CSLDestroy( papszOptions ); +#endif + + + if( poLayer == NULL ) + { + qDebug( "Layer creation failed." ); + return false; + } + + OGRFieldDefn oField("osm_id", OFTReal); + if( poLayer->CreateField( &oField ) != OGRERR_NONE ) + { + qDebug( "Creating field failed." ); + return false; + } + oField.Set("osm_version", OFTInteger ); + poLayer->CreateField( &oField ); + oField.Set("osm_timestamp", OFTInteger ); + poLayer->CreateField( &oField ); + + OGRFeature *poFeature; + foreach (Feature* F, featList) { + poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() ); + poFeature->SetField( "osm_id", (qreal)(F->id().numId)); +#ifndef FRISIUS_BUILD + poFeature->SetField( "osm_version", F->versionNumber()); + poFeature->SetField( "osm_timestamp", (int)F->time().toTime_t()); +#endif + + if (CHECK_NODE(F)) { + Node* N = STATIC_CAST_NODE(F); + + OGRPoint pt; + pt.setX(N->position().x()); + pt.setY(N->position().y()); + + poFeature->SetGeometry( &pt ); + } else if (CHECK_WAY(F)) { + Way* W = STATIC_CAST_WAY(F); + + OGRLineString ls; + ls.setNumPoints(W->size()); + for (int i=0; i<W->size(); ++i) { + ls.setPoint(i, W->getNode(i)->position().x(), W->getNode(i)->position().y(), 0); + } + poFeature->SetGeometry( &ls ); + } + + if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE ) + { + qDebug( "Failed to create feature in output." ); + return false; + } + OGRFeature::DestroyFeature( poFeature ); + } +#ifdef GDAL2 + GDALClose( (GDALDatasetH) poDS ); +#else + OGRDataSource::DestroyDataSource( poDS ); +#endif + return true; +} + +/***************/ + +// Make OGRPoint usable in a QHash<> +static bool operator==(const OGRPoint a, const OGRPoint b) +{ + return a.getX() == b.getX() + && a.getY() == b.getY() + && a.getDimension() == b.getDimension() + && (a.getDimension() < 3 || a.getZ() == b.getZ()); +} +static uint qHash(const OGRPoint o) +{ + // A good algorithm depends strongly on the data. In particular, + // on the projection and extent of the map. This is written for + // EPSG:27700 10kmx10km at 1m resolution (i.e. OS OpenData tiles). + return (uint)(o.getX() * 100000 + o.getY() * 1000000000); +} + + +Node *ImportExportGdal::nodeFor(Layer* aLayer, const OGRPoint p) +{ + if (pointHash.contains(p)) { + return pointHash[p]; + } + + pointHash[p] = g_backend.allocNode(aLayer, Coord(p.getY(), p.getX())); + aLayer->add(pointHash[p]); + return pointHash[p]; +} + +// IMPORT + +Way *ImportExportGdal::readWay(Layer* aLayer, OGRLineString *poRing) +{ + int numNode = poRing->getNumPoints(); + + if (!numNode) return NULL; + + OGRPoint p; + + Way* w = g_backend.allocWay(aLayer); + aLayer->add(w); + for(int i = 0; i < numNode; i++) { + poRing->getPoint(i, &p); + Node *n = nodeFor(aLayer, p); + w->add(n); + } + return w; +} + +Feature* ImportExportGdal::parseGeometry(Layer* aLayer, OGRGeometry *poGeometry) +{ + OGRwkbGeometryType type = wkbFlatten(poGeometry->getGeometryType()); + + switch(type) { + case wkbPoint: { + OGRPoint *p = (OGRPoint*)(poGeometry); + if (p->getDimension() > 2) + return nodeFor(aLayer, OGRPoint(p->getX(), p->getY(), p->getZ())); + else + return nodeFor(aLayer, OGRPoint(p->getX(), p->getY())); + } + + case wkbPolygon: { + OGRPolygon *poPoly = (OGRPolygon*)poGeometry; + OGRLinearRing *poRing = poPoly->getExteriorRing(); + Way *outer = readWay(aLayer, poRing); + if (outer) { + if (int numHoles = poPoly->getNumInteriorRings()) { + Relation* rel = g_backend.allocRelation(aLayer); + aLayer->add(rel); + rel->setTag("type", "multipolygon"); + rel->add("outer", outer); + for (int i=0; i<numHoles; i++) { + poRing = poPoly->getInteriorRing(i); + Way *inner = readWay(aLayer, poRing); + if (inner) { + rel->add("inner", inner); + } + } + return rel; + } + } + return outer; + } + + case wkbLineString: { + return readWay(aLayer, (OGRLineString*)poGeometry); + } + + case wkbMultiPolygon: + // TODO - merge multipolygon relations if members have holes; for now, fallthrough + case wkbMultiLineString: + case wkbMultiPoint: + { + OGRGeometryCollection *poCol = (OGRGeometryCollection*) poGeometry; + if(int numCol = poCol->getNumGeometries()) { + Relation* R = g_backend.allocRelation(aLayer); + aLayer->add(R); + for(int i=0; i<numCol; i++) { + Feature* F = parseGeometry(aLayer, poCol->getGeometryRef(i)); + if (F ) { + R->add("", F); + } + } + return R; + } else { + return NULL; + } + } + default: + qWarning("SHP: Unrecognised Geometry type %d, ignored", type); + return NULL; + } +} + +// import the input + +#ifndef GDAL2 +#define GDALDataset OGRDataSource +#endif +bool ImportExportGdal::importGDALDataset(GDALDataset* poDS, Layer* aLayer, bool confirmProjection) +#undef GDALDataset +{ + int ogrError; + + OGRSpatialReference wgs84srs; + if (wgs84srs.SetWellKnownGeogCS("WGS84") != OGRERR_NONE) { + qDebug("GDAL: couldn't initialise WGS84: %s", CPLGetLastErrorMsg()); + return false; + } + + qDebug(lc_importExportGdal) << "Layers #" << poDS->GetLayerCount(); + OGRLayer *poLayer = poDS->GetLayer(0); + + OGRSpatialReference * theSrs = poLayer->GetSpatialRef(); // Note: Contrary to other OGR objects, the spatial ref must NOT be released by our code! + toWGS84 = NULL; + + if (theSrs) { + // Workaround for OSGB - otherwise its datum is ignored (TODO: why?) + // TODO: Is it necessary with current GDAL versions? The hack is pretty ancient. + QString gcs = theSrs->GetAttrValue("GEOGCS"); + if (gcs == "GCS_OSGB_1936" || gcs == "OSGB 1936") { + qDebug(lc_importExportGdal) << "GDAL: substituting GCS_OSGB_1936 with EPSG:27700"; + OGRSpatialReference * the27700Srs = new OGRSpatialReference(); + if ((ogrError = the27700Srs->importFromEPSG(27700)) != OGRERR_NONE) { + qDebug("GDAL: couldn't initialise EPSG:27700: %d: %s", ogrError, CPLGetLastErrorMsg()); + the27700Srs->Release(); + } else { + theSrs->Release(); + theSrs = the27700Srs; + } + } + } + + theSrs = poLayer->GetSpatialRef(); + toWGS84 = OGRCreateCoordinateTransformation(theSrs, &wgs84srs); + if (!toWGS84) + return false; + + QProgressDialog progress(QApplication::tr("Importing..."), QApplication::tr("Cancel"), 0, 0); + progress.setWindowModality(Qt::WindowModal); + progress.setRange(0, 0); + progress.show(); + + int totimported = 0; + OGRFeature *poFeature; + for (int l=0; l<poDS->GetLayerCount() && !progress.wasCanceled(); ++l) { + poLayer = poDS->GetLayer(l); + + int sz = poLayer->GetFeatureCount(FALSE); + if (sz != -1) + progress.setMaximum(progress.maximum()+sz); + + int curImported = 0; + while( (poFeature = poLayer->GetNextFeature()) != NULL && !progress.wasCanceled()) + { + OGRGeometry *poGeometry; + + poGeometry = poFeature->GetGeometryRef(); + if( poGeometry != NULL) { + // qDebug( "GeometryType : %d,", poGeometry->getGeometryType() ); + + poGeometry->transform(toWGS84); + + Feature* F = parseGeometry(aLayer, poGeometry); + if (F) { + for (int i=0; i<poFeature->GetFieldCount(); ++i) { + OGRFieldDefn *fd = poFeature->GetFieldDefnRef(i); + QString k = QString::fromUtf8(fd->GetNameRef()); + if (k == "osm_id") { + F->setId(IFeature::FId(F->getType(), (qint64)poFeature->GetFieldAsDouble(i))); +#ifndef FRISIUS_BUILD + } else if (k == "osm_version") { + F->setVersionNumber(poFeature->GetFieldAsInteger(i)); + } else if (k == "osm_timestamp") { + F->setTime(QDateTime::fromTime_t(poFeature->GetFieldAsInteger(i))); +#endif + } else { + if (!g_Merk_NoGuardedTagsImport) { + k.prepend("_"); + k.append("_"); + } + F->setTag(k, QString::fromUtf8(poFeature->GetFieldAsString(i))); + } + } + } + ++curImported; + ++totimported; + progress.setLabelText(QApplication::tr("Imported: %1").arg(totimported)); + if (progress.maximum() > 0) + progress.setValue(totimported); + qApp->processEvents(); + } + else + { + qDebug( "no geometry" ); + } +// if (progress.maximum() != 0) +// progress.setValue(progress.value()+1); + } + qDebug() << "Layer #" << l << "Features#:" << curImported; + } + + pointHash.clear(); + +#ifndef _MOBILE + QApplication::restoreOverrideCursor(); +#endif + + delete toWGS84; + + if (progress.wasCanceled()) + return false; + else + return true; +} + +bool ImportExportGdal::import(Layer* aLayer) +{ +#ifdef GDAL2 + GDALAllRegister(); + GDALDataset *poDS; + poDS = (GDALDataset *) GDALOpenEx( FileName.toUtf8().constData(), GDAL_OF_VECTOR | GDAL_OF_RASTER | GDAL_OF_VERBOSE_ERROR, NULL, NULL, NULL ); +#else + OGRRegisterAll(); + OGRDataSource *poDS; + poDS = OGRSFDriverRegistrar::Open( FileName.toUtf8().constData(), FALSE ); +#endif + + if( poDS == NULL ) { + //qDebug() << "GDAL Open failed from file" << FileName.toUtf8().constData(); + return false; + } + + importGDALDataset(poDS, aLayer, M_PREFS->getGdalConfirmProjection()); + + GDALClose( (GDALDatasetH) poDS ); + + return true; +} + +bool ImportExportGdal::import(Layer* aLayer, const QByteArray& ba, bool confirmProjection) +{ + GByte* content = (GByte*)(ba.constData()); + VSILFILE* f = VSIFileFromMemBuffer("/vsimem/temp", content, ba.size(), FALSE); + +#ifdef GDAL2 + GDALAllRegister(); + GDALDataset *poDS; + poDS = (GDALDataset *) GDALOpen( "/vsimem/temp", GA_ReadOnly ); +#else + OGRRegisterAll(); + OGRDataSource *poDS; + poDS = OGRSFDriverRegistrar::Open( "/vsimem/temp", FALSE ); +#endif + + if( poDS == NULL ) + { + qDebug( "GDAL Open failed." ); + return false; + } + importGDALDataset(poDS, aLayer, confirmProjection); + + GDALClose( (GDALDatasetH) poDS ); + VSIFCloseL(f); + + return true; +} diff --git a/src/ImportExport/ImportExportGdal.h b/src/ImportExport/ImportExportGdal.h new file mode 100644 index 0000000..e2ee63e --- /dev/null +++ b/src/ImportExport/ImportExportGdal.h @@ -0,0 +1,72 @@ +// +// C++ Interface: ImportExportGdal +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef ImportExportGDAL_H +#define ImportExportGDAL_H + +#include "IImportExport.h" + +#include <ogrsf_frmts.h> +#include <gdal.h> +#include <gdal_version.h> + +#if GDAL_VERSION_MAJOR >= 2 +#define GDAL2 +#endif + +class Projection; +class Layer; +class OGRGeometry; +class OGRLineString; +class OGRPoint; +class OGRCoordinateTransformation; + + +/** + @author cbro <cbro@semperpax.com> +*/ +class ImportExportGdal : public IImportExport +{ +public: + ImportExportGdal(Document* doc); + + ~ImportExportGdal(); + + // Specify the input as a QFile + virtual bool loadFile(QString filename); + // Specify the output as a QFile + virtual bool saveFile(QString filename); + // import the input + virtual bool import(Layer* aLayer); + bool import(Layer *aLayer, const QByteArray &ba, bool confirmProjection); + + //export + virtual bool export_(const QList<Feature *>& featList); + +protected: + OGRCoordinateTransformation *toWGS84; + + Feature* parseGeometry(Layer* aLayer, OGRGeometry *poGeometry); + + Node *nodeFor(Layer* aLayer, OGRPoint point); + Way *readWay(Layer* aLayer, OGRLineString *poRing); + +#ifndef GDAL2 +#define GDALDataset OGRDataSource +#endif + bool importGDALDataset(GDALDataset *poDs, Layer *aLayer, bool confirmProjection); +#undef GDALDataset + +private: + QHash<OGRPoint, Node*> pointHash; +}; + +#endif diff --git a/src/ImportExport/ImportExportKML.cpp b/src/ImportExport/ImportExportKML.cpp new file mode 100644 index 0000000..c88d99a --- /dev/null +++ b/src/ImportExport/ImportExportKML.cpp @@ -0,0 +1,320 @@ +// +// C++ Implementation: ImportExportKML +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include <QtGui> + +#include "../ImportExport/ImportExportKML.h" +#include "Global.h" + +bool parseContainer(QDomElement& e, Layer* aLayer); + +ImportExportKML::ImportExportKML(Document* doc) + : IImportExport(doc) +{ +} + + +ImportExportKML::~ImportExportKML() +{ +} + + +// export +bool ImportExportKML::export_(const QList<Feature *>& featList) +{ + QList<Node*> waypoints; + QList<TrackSegment*> segments; + QDomElement k; + QDomText v; + + if(! IImportExport::export_(featList) ) return false; + + bool OK = true; + + QDomDocument theXmlDoc; + theXmlDoc.appendChild(theXmlDoc.createProcessingInstruction("xml", "version=\"1.0\"")); + + QDomElement kml = theXmlDoc.createElement("kml"); + theXmlDoc.appendChild(kml); + kml.setAttribute("xmlns", "http://earth.google.com/kml/2.2"); + + QDomElement d = theXmlDoc.createElement("Document"); + kml.appendChild(d); + + + //QDomElement g = theXmlDoc.createElement("MultiGeometry"); + //p.appendChild(g); + + for (int i=0; i<theFeatures.size(); ++i) { + if (Way* R = dynamic_cast<Way*>(theFeatures[i])) { + QDomElement p = theXmlDoc.createElement("Placemark"); + d.appendChild(p); + + k = theXmlDoc.createElement("name"); + p.appendChild(k); + v = theXmlDoc.createTextNode(R->description()); + k.appendChild(v); + + k = theXmlDoc.createElement("description"); + p.appendChild(k); + QString desc; + for (int j=0; j<R->tagSize(); ++j) { + desc += R->tagKey(j); + desc += "="; + desc += R->tagValue(j); + desc += "<br/>"; + } + v = theXmlDoc.createTextNode(desc); + k.appendChild(v); + + k = theXmlDoc.createElement("Style"); + p.appendChild(k); + + QDomElement ls = theXmlDoc.createElement("LineStyle"); + k.appendChild(ls); + + const FeaturePainter* fp = R->getCurrentPainter(); + if (fp) { + QDomElement color = theXmlDoc.createElement("color"); + ls.appendChild(color); + QRgb kcolor = fp->ForegroundColor.rgba(); + v = theXmlDoc.createTextNode(QString::number(qRgba(qBlue(kcolor), qGreen(kcolor), qRed(kcolor), /*qAlpha(kcolor)*/ 192), 16)); + color.appendChild(v); + } + QDomElement width = theXmlDoc.createElement("width"); + ls.appendChild(width); + v = theXmlDoc.createTextNode(QString::number(R->widthOf())); + width.appendChild(v); + + QDomElement l = theXmlDoc.createElement("LineString"); + p.appendChild(l); + + QDomElement c = theXmlDoc.createElement("coordinates"); + l.appendChild(c); + + QString s; + for (int j=0; j<R->size(); ++j) { + Node* N = dynamic_cast<Node*>(R->get(j)); + s += QString(" %1,%2").arg(COORD2STRING(N->position().x())).arg(COORD2STRING(N->position().y())); + } + + QDomText v = theXmlDoc.createTextNode(s); + c.appendChild(v); + } + else if (Node* N = dynamic_cast<Node*>(theFeatures[i])) { + if (N->sizeParents()) continue; + + QDomElement p = theXmlDoc.createElement("Placemark"); + d.appendChild(p); + + k = theXmlDoc.createElement("name"); + p.appendChild(k); + v = theXmlDoc.createTextNode(N->description()); + k.appendChild(v); + + k = theXmlDoc.createElement("description"); + p.appendChild(k); + QString desc; + for (int j=0; j<N->tagSize(); ++j) { + desc += N->tagKey(j); + desc += "="; + desc += N->tagValue(j); + desc += "<br/>"; + } + v = theXmlDoc.createTextNode(desc); + k.appendChild(v); + + //k = theXmlDoc.createElement("Style"); + //p.appendChild(k); + + //QDomElement ls = theXmlDoc.createElement("LineStyle"); + //k.appendChild(ls); + + //FeaturePainter* fp = R->getCurrentEditPainter(); + //if (fp) { + // QDomElement color = theXmlDoc.createElement("color"); + // ls.appendChild(color); + // QRgb kcolor = fp->ForegroundColor.rgba(); + // v = theXmlDoc.createTextNode(QString::number(qRgba(qBlue(kcolor), qGreen(kcolor), qRed(kcolor), /*qAlpha(kcolor)*/ 164), 16)); + // color.appendChild(v); + //} + //QDomElement width = theXmlDoc.createElement("width"); + //ls.appendChild(width); + //v = theXmlDoc.createTextNode(QString::number(widthOf(R))); + //width.appendChild(v); + + QDomElement l = theXmlDoc.createElement("Point"); + p.appendChild(l); + + QDomElement c = theXmlDoc.createElement("coordinates"); + l.appendChild(c); + + QString s; + s += QString(" %1,%2").arg(COORD2STRING(N->position().x())).arg(COORD2STRING(N->position().y())); + + QDomText v = theXmlDoc.createTextNode(s); + c.appendChild(v); + } + } + + Device->write(theXmlDoc.toString().toUtf8()); + return OK; + +} + +// IMPORT + +QString kmlId; + +Feature* parsePoint(QDomElement& e, Layer* aLayer) +{ + Node* P = NULL; + + QDomElement c = e.firstChildElement(); + while(!c.isNull() && !P) { + if (c.tagName() == "coordinates") { + QDomText t = c.firstChild().toText(); + QString s = t.nodeValue(); + QStringList tokens = s.split(","); + qreal lon = tokens[0].toDouble(); + qreal lat = tokens[1].toDouble(); + Coord p(lon,lat); + + P = g_backend.allocNode(aLayer, p); + aLayer->add(P); + P->setTag("%kml:guid", kmlId); + } + + c = c.nextSiblingElement(); + } + + return P; +} + +Feature* parseGeometry(QDomElement& e, Layer* aLayer) +{ + Feature* F = NULL; + if (e.tagName() == "Point") { + F = parsePoint(e, aLayer); + } + + return F; +} + +bool parsePlacemark(QDomElement& e, Layer* aLayer) +{ + Feature* F = NULL; + QDomElement c = e.firstChildElement(); + QString name; + QString address; + QString description; + QString phone; + + while(!c.isNull()) { + if (c.tagName() == "name") + name = c.firstChild().toText().nodeValue(); + else + if (c.tagName() == "address") + address = c.firstChild().toText().nodeValue(); + else + if (c.tagName() == "description") + description = c.firstChild().toText().nodeValue(); + else + if (c.tagName() == "phoneNumber") + phone = c.firstChild().toText().nodeValue(); + else + F = parseGeometry(c, aLayer); + + c = c.nextSiblingElement(); + } + + if (F) { + if (!name.isEmpty()) + F->setTag("name", name); + if (!address.isEmpty()) + F->setTag("addr:full", address); + if (!phone.isEmpty()) + F->setTag("addr:phone_number", phone); + if (!description.isEmpty()) + F->setTag("description", description); + return true; + } else + return false; +} + +bool parseFeature(QDomElement& e, Layer* aLayer) +{ + bool ret= false; + QDomElement c = e.cloneNode().toElement(); + + while(!c.isNull()) { + if (c.tagName() == "Placemark") + ret = parsePlacemark(c, aLayer); + else + ret = parseContainer(c, aLayer); + + c = c.nextSiblingElement(); + } + return ret; +} + +bool parseContainer(QDomElement& e, Layer* aLayer) +{ + if ((e.tagName() != "Document") && (e.tagName() != "Folder")) + return false; + + bool ret= false; + QDomElement c = e.firstChildElement(); + + while(!c.isNull()) { + ret = parseFeature(c, aLayer); + + c = c.nextSiblingElement(); + } + return ret; +} + +bool parseKML(QDomElement& e, Layer* aLayer) +{ + bool ret= false; + QDomElement c = e.firstChildElement(); + + while(!c.isNull()) { + ret = parseFeature(c, aLayer); + if (!ret) + ret = parseGeometry(c, aLayer); + + c = c.nextSiblingElement(); + } + return ret; +} + +// import the input +bool ImportExportKML::import(Layer* aLayer) +{ + QDomDocument theXmlDoc; + if (!theXmlDoc.setContent(Device)) { + //QMessageBox::critical(this, tr("Invalid file"), tr("%1 is not a valid XML file.").arg(fn)); + Device->close(); + return false; + } + Device->close(); + + QDomElement docElem = theXmlDoc.documentElement(); + if (docElem.tagName() != "kml") { + //QMessageBox::critical(this, tr("Invalid file"), tr("%1 is not a valid KML document.").arg(fn)); + return false; + } + kmlId = QUuid::createUuid().toString(); + return parseKML(docElem, aLayer); +} + diff --git a/src/ImportExport/ImportExportKML.h b/src/ImportExport/ImportExportKML.h new file mode 100644 index 0000000..b8c5edc --- /dev/null +++ b/src/ImportExport/ImportExportKML.h @@ -0,0 +1,35 @@ +// +// C++ Interface: ImportExportKML +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef ImportExportKML_H +#define ImportExportKML_H + +#include "IImportExport.h" + +class QDomDocument; +/** + @author cbro <cbro@semperpax.com> +*/ +class ImportExportKML : public IImportExport +{ +public: + ImportExportKML(Document* doc); + + ~ImportExportKML(); + + // import the input + virtual bool import(Layer* aLayer); + + //export + virtual bool export_(const QList<Feature *>& featList); +}; + +#endif diff --git a/src/ImportExport/ImportExportOSC.cpp b/src/ImportExport/ImportExportOSC.cpp new file mode 100644 index 0000000..9f548db --- /dev/null +++ b/src/ImportExport/ImportExportOSC.cpp @@ -0,0 +1,170 @@ +// +// C++ Implementation: ImportExportKML +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include <QtGui> + +#include "../ImportExport/ImportExportOSC.h" + +#include "DirtyListExecutorOSC.h" + +#include "DownloadOSM.h" + +ImportExportOSC::ImportExportOSC(Document* doc) + : IImportExport(doc) +{ +} + + +ImportExportOSC::~ImportExportOSC() +{ +} + + +// export +bool ImportExportOSC::export_(const QList<Feature *>&) +{ + DirtyListBuild Future; + theDoc->history().buildDirtyList(Future); + + Future.resetUpdates(); + DirtyListExecutorOSC Exec(theDoc, Future); + QByteArray doc = Exec.getChanges(); + + return (Device->write(doc) != -1); +} + +// IMPORT + + +// import the input +bool ImportExportOSC::import(Layer* aLayer) +{ + QXmlStreamReader stream(Device); + + while (stream.readNext() && stream.tokenType() != QXmlStreamReader::Invalid && stream.tokenType() != QXmlStreamReader::StartElement) + ; + if (stream.name() != "osmChange" && stream.name() != "osmchange") { +// QMessageBox::critical(this, tr("Invalid file"), tr("%1 is not a valid osmChange file.").arg(fn)); + return false; + } + + CommandList* theList = new CommandList(QApplication::tr("Import osmChange"), NULL); + + Layer* dLayer = theDoc->getLastDownloadLayer(); + if (!dLayer) { + dLayer = new DrawingLayer(QApplication::translate("Downloader","%1 download").arg(QDateTime::currentDateTime().toString(Qt::ISODate))); + theDoc->add(dLayer); + } + + QList<IFeature::FId> featIdList; + Feature* F = NULL; + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "create") { + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "node") { + F = Node::fromXML(theDoc, aLayer, stream); + theList->add(new AddFeatureCommand(aLayer, F, true)); + } else if (stream.name() == "way") { + F = Way::fromXML(theDoc, aLayer, stream); + theList->add(new AddFeatureCommand(aLayer, F, true)); + } else if (stream.name() == "relation") { + F = Relation::fromXML(theDoc, aLayer, stream); + theList->add(new AddFeatureCommand(aLayer, F, true)); + } else if (!stream.isWhitespace()) { + qDebug() << "OSC: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + if (F) { + for (int i=0; i<F->size(); ++i) { + if (F->get(i)->notEverythingDownloaded() && F->get(i)->hasOSMId()) + featIdList << F->get(i)->id(); + } + } + + stream.readNext(); + } + } else if (stream.name() == "modify") { + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + QString sid = (stream.attributes().hasAttribute("id") ? stream.attributes().value("id").toString() : stream.attributes().value("xml:id").toString()); + if (stream.name() == "node") { + IFeature::FId id(Feature::Point, sid.toLongLong()); + F = theDoc->getFeature(id); + if (!F || F->notEverythingDownloaded()) + downloadFeature(0, id, theDoc, dLayer); + F = Node::fromXML(theDoc, aLayer, stream); + theList->add(new AddFeatureCommand(aLayer, F, true)); + } else if (stream.name() == "way") { + IFeature::FId id(Feature::LineString, sid.toLongLong()); + F = theDoc->getFeature(id); + if (!F || F->notEverythingDownloaded()) + downloadFeature(0, id, theDoc, dLayer); + F = Way::fromXML(theDoc, aLayer, stream); + theList->add(new AddFeatureCommand(aLayer, F, true)); + } else if (stream.name() == "relation") { + IFeature::FId id(Feature::OsmRelation, sid.toLongLong()); + F = theDoc->getFeature(id); + if (!F || F->notEverythingDownloaded()) + downloadFeature(0, id, theDoc, dLayer); + F = Relation::fromXML(theDoc, aLayer, stream); + theList->add(new AddFeatureCommand(aLayer, F, true)); + } else if (!stream.isWhitespace()) { + qDebug() << "OSC: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + if (F) { + for (int i=0; i<F->size(); ++i) { + if (F->get(i)->notEverythingDownloaded() && F->get(i)->hasOSMId()) + featIdList << F->get(i)->id(); + } + } + stream.readNext(); + } + } else if (stream.name() == "delete") { + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "node") { + Node* N = Node::fromXML(theDoc, aLayer, stream); + theList->add(new RemoveFeatureCommand(theDoc, N)); + } else if (stream.name() == "way") { + Way* W = Way::fromXML(theDoc, aLayer, stream); + theList->add(new RemoveFeatureCommand(theDoc, W)); + } else if (stream.name() == "relation") { + Relation* R = Relation::fromXML(theDoc, aLayer, stream); + theList->add(new RemoveFeatureCommand(theDoc, R)); + } else if (!stream.isWhitespace()) { + qDebug() << "OSC: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + stream.readNext(); + } + } + + stream.readNext(); + } + downloadFeatures(0, featIdList, theDoc, dLayer); + + if (dLayer->size() == 0 && dLayer != theDoc->getLastDownloadLayer()) { + theDoc->remove(dLayer); + delete dLayer; + } + if (theList->empty()) { + delete theList; + } else { + theDoc->addHistory(theList); + } + + return true; +} + diff --git a/src/ImportExport/ImportExportOSC.h b/src/ImportExport/ImportExportOSC.h new file mode 100644 index 0000000..c76bcaf --- /dev/null +++ b/src/ImportExport/ImportExportOSC.h @@ -0,0 +1,35 @@ +// +// C++ Interface: ImportExportKML +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef ImportExportOSC_H +#define ImportExportOSC_H + +#include "IImportExport.h" + +class QDomDocument; +/** + @author cbro <cbro@semperpax.com> +*/ +class ImportExportOSC : public IImportExport +{ +public: + ImportExportOSC(Document* doc); + + ~ImportExportOSC(); + + // import the input + virtual bool import(Layer* aLayer); + + //export + virtual bool export_(const QList<Feature *>& featList = QList<Feature *>()); +}; + +#endif diff --git a/src/ImportExport/ImportExportPBF.cpp b/src/ImportExport/ImportExportPBF.cpp new file mode 100644 index 0000000..dcacac0 --- /dev/null +++ b/src/ImportExport/ImportExportPBF.cpp @@ -0,0 +1,602 @@ +// +// C++ Implementation: ImportExportPBF +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2010 +// Stefan de Konink <stefan at konink dot de> +// Roeland Douma <contact at rullzer dot com> +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include <QApplication> +#include <QMessageBox> +#include <QDateTime> + +#include "ImportExportPBF.h" +#include "Global.h" + +#include "zlib.h" +//#include "bzlib.h" + +#define NANO ( 1000.0 * 1000.0 * 1000.0 ) +#define MAX_BLOCK_HEADER_SIZE ( 64 * 1024 ) +#define MAX_BLOB_SIZE ( 32 * 1024 * 1024 ) + +ImportExportPBF::ImportExportPBF(Document* doc) + : IImportExport(doc) +{ + GOOGLE_PROTOBUF_VERIFY_VERSION; +} + +ImportExportPBF::~ImportExportPBF() +{ +} + +// export +bool ImportExportPBF::export_(const QList<Feature *>& /*featList*/) +{ + return false; +} + +/***************************************************/ +/* +Copyright 2010 Christian Vetter veaac.fdirct@gmail.com + +This ripped code is part of MoNav. +*/ + +int convertNetworkByteOrder( char data[4] ) +{ + return ( ( ( unsigned ) data[0] ) << 24 ) | ( ( ( unsigned ) data[1] ) << 16 ) | ( ( ( unsigned ) data[2] ) << 8 ) | ( unsigned ) data[3]; +} + +static void *SzAlloc( void *p, size_t size) +{ + p = p; + return malloc( size ); +} + +static void SzFree( void *p, void *address) +{ + p = p; + free( address ); +} + +void ImportExportPBF::loadGroup() +{ + const OSMPBF::PrimitiveGroup& group = m_primitiveBlock.primitivegroup( m_currentGroup ); + if ( group.nodes_size() != 0 ) { + m_mode = ModeNode; + } else if ( group.ways_size() != 0 ) { + m_mode = ModeWay; + } else if ( group.relations_size() != 0 ) { + m_mode = ModeRelation; + } else if ( group.has_dense() ) { + m_mode = ModeDense; + m_lastDenseID = 0; + m_lastDenseTag = 0; + m_lastDenseLatitude = 0; + m_lastDenseLongitude = 0; + m_lastDenseTimestamp = 0; + m_lastDenseChangeset = 0; + m_lastDenseUId = 0; + m_lastDenseUserSid = 0; + assert( group.dense().id_size() != 0 ); + } else + assert( false ); +} + +void ImportExportPBF::loadBlock() +{ + m_loadBlock = false; + m_currentGroup = 0; + m_currentEntity = 0; + int stringCount = m_primitiveBlock.stringtable().s_size(); + // precompute all strings that match a necessary tag + m_nodeTagIDs.resize( m_primitiveBlock.stringtable().s_size() ); + for ( int i = 1; i < stringCount; i++ ) + m_nodeTagIDs[i] = m_nodeTags.value( m_primitiveBlock.stringtable().s( i ).data(), -1 ); + m_wayTagIDs.resize( m_primitiveBlock.stringtable().s_size() ); + for ( int i = 1; i < stringCount; i++ ) + m_wayTagIDs[i] = m_wayTags.value( m_primitiveBlock.stringtable().s( i ).data(), -1 ); + m_relationTagIDs.resize( m_primitiveBlock.stringtable().s_size() ); + for ( int i = 1; i < stringCount; i++ ) + m_relationTagIDs[i] = m_relationTags.value( m_primitiveBlock.stringtable().s( i ).data(), -1 ); +} + +bool ImportExportPBF::readNextBlock() +{ + if ( !readBlockHeader() ) + return false; + + if ( m_blockHeader.type() != "OSMData" ) { + qCritical() << "invalid block type, found" << m_blockHeader.type().data() << "instead of OSMData"; + return false; + } + + if ( !readBlob() ) + return false; + + if ( !m_primitiveBlock.ParseFromArray( m_buffer.data(), m_buffer.size() ) ) { + qCritical() << "failed to parse PrimitiveBlock"; + return false; + } + return true; +} + +bool ImportExportPBF::readBlockHeader() +{ + char sizeData[4]; + if ( m_file.read( sizeData, 4 * sizeof( char ) ) != 4 * sizeof( char ) ) + return false; // end of stream? + + int size = convertNetworkByteOrder( sizeData ); + if ( size > MAX_BLOCK_HEADER_SIZE || size < 0 ) { + qCritical() << "BlockHeader size invalid:" << size; + return false; + } + m_buffer.resize( size ); + int readBytes = m_file.read( m_buffer.data(), size ); + if ( readBytes != size ) { + qCritical() << "failed to read BlockHeader"; + return false; + } + if ( !m_blockHeader.ParseFromArray( m_buffer.constData(), size ) ) { + qCritical() << "failed to parse BlockHeader"; + return false; + } + return true; +} + +bool ImportExportPBF::readBlob() +{ + int size = m_blockHeader.datasize(); + if ( size < 0 || size > MAX_BLOB_SIZE ) { + qCritical() << "invalid Blob size:" << size; + return false; + } + m_buffer.resize( size ); + int readBytes = m_file.read( m_buffer.data(), size ); + if ( readBytes != size ) { + qCritical() << "failed to read Blob"; + return false; + } + if ( !m_blob.ParseFromArray( m_buffer.constData(), size ) ) { + qCritical() << "failed to parse blob"; + return false; + } + + if ( m_blob.has_raw() ) { + const std::string& data = m_blob.raw(); + m_buffer.resize( data.size() ); + for ( unsigned i = 0; i < data.size(); i++ ) + m_buffer[i] = data[i]; + } else if ( m_blob.has_zlib_data() ) { + if ( !unpackZlib() ) + return false; +// } else if ( m_blob.has_bzip2_data() ) { +// if ( !unpackBzip2() ) +// return false; + } else if ( m_blob.has_lzma_data() ) { + if ( !unpackLzma() ) + return false; + } else { + qCritical() << "Blob contains no data"; + return false; + } + + return true; +} + +bool ImportExportPBF::unpackZlib() +{ + m_buffer.resize( m_blob.raw_size() ); + z_stream compressedStream; + compressedStream.next_in = ( unsigned char* ) m_blob.zlib_data().data(); + compressedStream.avail_in = m_blob.zlib_data().size(); + compressedStream.next_out = ( unsigned char* ) m_buffer.data(); + compressedStream.avail_out = m_blob.raw_size(); + compressedStream.zalloc = Z_NULL; + compressedStream.zfree = Z_NULL; + compressedStream.opaque = Z_NULL; + int ret = inflateInit( &compressedStream ); + if ( ret != Z_OK ) { + qCritical() << "failed to init zlib stream"; + return false; + } + ret = inflate( &compressedStream, Z_FINISH ); + if ( ret != Z_STREAM_END ) { + qCritical() << "failed to inflate zlib stream"; + return false; + } + ret = inflateEnd( &compressedStream ); + if ( ret != Z_OK ) { + qCritical() << "failed to deinit zlib stream"; + return false; + } + return true; +} + +bool ImportExportPBF::unpackBzip2() +{ +// unsigned size = m_blob.raw_size(); +// m_buffer.resize( size ); +// m_bzip2Buffer.resize( m_blob.bzip2_data().size() ); +// for ( unsigned i = 0; i < m_blob.bzip2_data().size(); i++ ) +// m_bzip2Buffer[i] = m_blob.bzip2_data()[i]; +// int ret = BZ2_bzBuffToBuffDecompress( m_buffer.data(), &size, m_bzip2Buffer.data(), m_bzip2Buffer.size(), 0, 0 ); +// if ( ret != BZ_OK ) { +// qCritical() << "failed to unpack bzip2 stream"; +// return false; +// } + return true; +} + +bool ImportExportPBF::unpackLzma() +{ +// ISzAlloc alloc = { SzAlloc, SzFree }; +// ELzmaStatus status; +// SizeT destinationLength = m_blob.raw_size(); +// SizeT sourceLength = m_blob.lzma_data().size() - LZMA_PROPS_SIZE + 8; +// int ret = LzmaDecode( +// ( unsigned char* ) m_buffer.data(), +// &destinationLength, +// ( const unsigned char* ) m_blob.lzma_data().data() + LZMA_PROPS_SIZE + 8, +// &sourceLength, +// ( const unsigned char* ) m_blob.lzma_data().data(), +// LZMA_PROPS_SIZE + 8, +// LZMA_FINISH_END, +// &status, +// &alloc ); + +// if ( ret != SZ_OK ) +// return false; + + return true; +} + +void ImportExportPBF::parseNode( Layer* aLayer ) +{ + const OSMPBF::Node& inputNode = m_primitiveBlock.primitivegroup( m_currentGroup ).nodes( m_currentEntity ); + + Node* N = STATIC_CAST_NODE(theDoc->getFeature(IFeature::FId(IFeature::Point, inputNode.id()))); + if (!N) { + N = g_backend.allocNode(aLayer, Coord( + ( ( qreal ) inputNode.lon() * m_primitiveBlock.granularity() + m_primitiveBlock.lon_offset() ) / NANO, + ( ( qreal ) inputNode.lat() * m_primitiveBlock.granularity() + m_primitiveBlock.lat_offset() ) / NANO + )); + N->setId(IFeature::FId(IFeature::Point, inputNode.id())); + aLayer->add(N); + } else { + N->setPosition(Coord( + ( ( qreal ) inputNode.lon() * m_primitiveBlock.granularity() + m_primitiveBlock.lon_offset() ) / NANO, + ( ( qreal ) inputNode.lat() * m_primitiveBlock.granularity() + m_primitiveBlock.lat_offset() ) / NANO + )); + N->setLastUpdated(Feature::OSMServer); + } + +#ifndef FRISIUS_BUILD + if (inputNode.has_info()) { + OSMPBF::Info info = inputNode.info(); + if (info.has_version()) + N->setVersionNumber(info.version()); + if (info.has_timestamp()) + N->setTime(QDateTime::fromTime_t(info.timestamp())); + if (info.has_user_sid()) + N->setUser(m_primitiveBlock.stringtable().s(info.user_sid()).data()); + } +#endif + + for ( int tag = 0; tag < inputNode.keys_size(); tag++ ) { + QString key = QString::fromUtf8( m_primitiveBlock.stringtable().s( inputNode.keys( tag ) ).data() ); + QString value = QString::fromUtf8( m_primitiveBlock.stringtable().s( inputNode.vals( tag ) ).data() ); + N->setTag(key, value); + } + + m_currentEntity++; + if ( m_currentEntity >= m_primitiveBlock.primitivegroup( m_currentGroup ).nodes_size() ) { + m_currentEntity = 0; + m_currentGroup++; + if ( m_currentGroup >= m_primitiveBlock.primitivegroup_size() ) + m_loadBlock = true; + else + loadGroup(); + } +} + +void ImportExportPBF::parseWay( Layer* aLayer ) +{ + const OSMPBF::Way& inputWay = m_primitiveBlock.primitivegroup( m_currentGroup ).ways( m_currentEntity ); + + Way* W = STATIC_CAST_WAY(theDoc->getFeature(IFeature::FId(IFeature::LineString, inputWay.id()))); + if (!W) { + W = g_backend.allocWay(aLayer); + W->setId(IFeature::FId(IFeature::LineString, inputWay.id())); + aLayer->add(W); + } else { + W->setLastUpdated(Feature::OSMServer); + } + +#ifndef FRISIUS_BUILD + if (inputWay.has_info()) { + OSMPBF::Info info = inputWay.info(); + if (info.has_version()) + W->setVersionNumber(info.version()); + if (info.has_timestamp()) + W->setTime(QDateTime::fromTime_t(info.timestamp())); + if (info.has_user_sid()) + W->setUser(m_primitiveBlock.stringtable().s(info.user_sid()).data()); + } +#endif + + for ( int tag = 0; tag < inputWay.keys_size(); tag++ ) { + QString key = QString::fromUtf8( m_primitiveBlock.stringtable().s( inputWay.keys( tag ) ).data() ); + QString value = QString::fromUtf8( m_primitiveBlock.stringtable().s( inputWay.vals( tag ) ).data() ); + W->setTag(key, value); + } + + long long lastRef = 0; + for ( int i = 0; i < inputWay.refs_size(); i++ ) { + lastRef += inputWay.refs( i ); + + Node* N = STATIC_CAST_NODE(theDoc->getFeature(IFeature::FId(IFeature::Point, lastRef))); + if (!N) { + N = g_backend.allocNode(aLayer, Coord(0, 0)); + N->setId(IFeature::FId(IFeature::Point, lastRef)); + N->setLastUpdated(Feature::NotYetDownloaded); + aLayer->add(N); + } + W->add(N); + } + + m_currentEntity++; + if ( m_currentEntity >= m_primitiveBlock.primitivegroup( m_currentGroup ).ways_size() ) { + m_currentEntity = 0; + m_currentGroup++; + if ( m_currentGroup >= m_primitiveBlock.primitivegroup_size() ) + m_loadBlock = true; + else + loadGroup(); + } +} + +void ImportExportPBF::parseRelation( Layer* aLayer ) +{ + const OSMPBF::Relation& inputRelation = m_primitiveBlock.primitivegroup( m_currentGroup ).relations( m_currentEntity ); + + Relation* R = STATIC_CAST_RELATION(theDoc->getFeature(IFeature::FId(IFeature::OsmRelation, inputRelation.id()))); + if (!R) { + R = g_backend.allocRelation(aLayer); + R->setId(IFeature::FId(IFeature::OsmRelation, inputRelation.id())); + aLayer->add(R); + } else { + R->setLastUpdated(Feature::OSMServer); + } + +#ifndef FRISIUS_BUILD + if (inputRelation.has_info()) { + OSMPBF::Info info = inputRelation.info(); + if (info.has_version()) + R->setVersionNumber(info.version()); + if (info.has_timestamp()) + R->setTime(QDateTime::fromTime_t(info.timestamp())); + if (info.has_user_sid()) + R->setUser(m_primitiveBlock.stringtable().s(info.user_sid()).data()); + } +#endif + + for ( int tag = 0; tag < inputRelation.keys_size(); tag++ ) { + QString key = QString::fromUtf8( m_primitiveBlock.stringtable().s( inputRelation.keys( tag ) ).data() ); + QString value = QString::fromUtf8( m_primitiveBlock.stringtable().s( inputRelation.vals( tag ) ).data() ); + R->setTag(key, value); + } + + long long lastRef = 0; + for ( int i = 0; i < inputRelation.types_size(); i++ ) { + lastRef += inputRelation.memids( i ); + QString role = QString::fromUtf8(m_primitiveBlock.stringtable().s( inputRelation.roles_sid( i ) ).data()); + + switch (inputRelation.types( i )) { + case OSMPBF::Relation::NODE: { + Node* N = STATIC_CAST_NODE(theDoc->getFeature(IFeature::FId(IFeature::Point, lastRef))); + if (!N) { + N = g_backend.allocNode(aLayer, Coord(0, 0)); + N->setId(IFeature::FId(IFeature::Point, lastRef)); + N->setLastUpdated(Feature::NotYetDownloaded); + aLayer->add(N); + } + R->add(role, N); + break; + } + case OSMPBF::Relation::WAY: { + Way* W = STATIC_CAST_WAY(theDoc->getFeature(IFeature::FId(IFeature::LineString, lastRef))); + if (!W) { + W = g_backend.allocWay(aLayer); + W->setId(IFeature::FId(IFeature::LineString, lastRef)); + W->setLastUpdated(Feature::NotYetDownloaded); + aLayer->add(W); + } + R->add(role, W); + break; + } + case OSMPBF::Relation::RELATION: { + Relation* Rl = STATIC_CAST_RELATION(theDoc->getFeature(IFeature::FId(IFeature::OsmRelation, lastRef))); + if (!Rl) { + Rl = g_backend.allocRelation(aLayer); + Rl->setId(IFeature::FId(IFeature::OsmRelation, lastRef)); + Rl->setLastUpdated(Feature::NotYetDownloaded); + aLayer->add(Rl); + } + R->add(role, Rl); + break; + } + } + } + + m_currentEntity++; + if ( m_currentEntity >= m_primitiveBlock.primitivegroup( m_currentGroup ).relations_size() ) { + m_currentEntity = 0; + m_currentGroup++; + if ( m_currentGroup >= m_primitiveBlock.primitivegroup_size() ) + m_loadBlock = true; + else + loadGroup(); + } +} + +void ImportExportPBF::parseDense( Layer* aLayer ) +{ + const OSMPBF::DenseNodes& dense = m_primitiveBlock.primitivegroup( m_currentGroup ).dense(); + + m_lastDenseID += dense.id( m_currentEntity ); + m_lastDenseLatitude += dense.lat( m_currentEntity ); + m_lastDenseLongitude += dense.lon( m_currentEntity ); + + Node* N = STATIC_CAST_NODE(theDoc->getFeature(IFeature::FId(IFeature::Point, m_lastDenseID))); + if (!N) { + N = g_backend.allocNode(aLayer, Coord( + ( ( qreal ) m_lastDenseLongitude * m_primitiveBlock.granularity() + m_primitiveBlock.lon_offset() ) / NANO, + ( ( qreal ) m_lastDenseLatitude * m_primitiveBlock.granularity() + m_primitiveBlock.lat_offset() ) / NANO + )); + N->setId(IFeature::FId(IFeature::Point, m_lastDenseID)); + aLayer->add(N); + } else { + N->setPosition(Coord( + ( ( qreal ) m_lastDenseLongitude * m_primitiveBlock.granularity() + m_primitiveBlock.lon_offset() ) / NANO, + ( ( qreal ) m_lastDenseLatitude * m_primitiveBlock.granularity() + m_primitiveBlock.lat_offset() ) / NANO + )); + N->setLastUpdated(Feature::OSMServer); + } + + if (dense.has_denseinfo()) { + m_lastDenseTimestamp += dense.denseinfo().timestamp(m_currentEntity); + m_lastDenseChangeset += dense.denseinfo().changeset(m_currentEntity); + m_lastDenseUId += dense.denseinfo().uid(m_currentEntity); + m_lastDenseUserSid += dense.denseinfo().user_sid(m_currentEntity); + +#ifndef FRISIUS_BUILD + N->setVersionNumber(dense.denseinfo().version(m_currentEntity)); + N->setTime(m_lastDenseTimestamp); + N->setUser(m_primitiveBlock.stringtable().s(m_lastDenseUserSid).data()); +#endif + } + + while ( true ){ + if ( m_lastDenseTag >= dense.keys_vals_size() ) + break; + + int tagValue = dense.keys_vals( m_lastDenseTag ); + if ( tagValue == 0 ) { + m_lastDenseTag++; + break; + } + + QString key = QString::fromUtf8( m_primitiveBlock.stringtable().s( dense.keys_vals( m_lastDenseTag ) ).data() ); + QString value = QString::fromUtf8( m_primitiveBlock.stringtable().s( dense.keys_vals( m_lastDenseTag + 1 ) ).data() ); + N->setTag(key, value); + + m_lastDenseTag += 2; + } + + m_currentEntity++; + if ( m_currentEntity >= dense.id_size() ) { + m_currentEntity = 0; + m_currentGroup++; + if ( m_currentGroup >= m_primitiveBlock.primitivegroup_size() ) + m_loadBlock = true; + else + loadGroup(); + } +} + +/* End of MoNav rip */ +/***************************************************/ + +// Specify the input as a QFile +bool ImportExportPBF::loadFile(QString filename) +{ + FileName = filename; + ownDevice = true; + + m_file.setFileName( FileName ); + + if ( !m_file.open(QIODevice::ReadOnly)) + return false; + + if ( !readBlockHeader() ) + return false; + + if ( m_blockHeader.type() != "OSMHeader" ) { + qCritical() << "OSMHeader missing, found" << m_blockHeader.type().data() << "instead"; + return false; + } + + if ( !readBlob() ) + return false; + + if ( !m_headerBlock.ParseFromArray( m_buffer.data(), m_buffer.size() ) ) { + qCritical() << "failed to parse HeaderBlock"; + return false; + } + for ( int i = 0; i < m_headerBlock.required_features_size(); i++ ) { + const std::string& feature = m_headerBlock.required_features( i ); + bool supported = false; + if ( feature == "OsmSchema-V0.6" ) + supported = true; + else if ( feature == "DenseNodes" ) + supported = true; + + if ( !supported ) { + qCritical() << "required feature not supported:" << feature.data(); + return false; + } + } + m_loadBlock = true; + return true; +} + +// import the input +bool ImportExportPBF::import(Layer* aLayer) +{ + QProgressDialog progress(QApplication::tr("Importing..."), QApplication::tr("Cancel"), 0, 0); + progress.setWindowModality(Qt::WindowModal); + progress.setRange(0, m_file.size()); + progress.show(); + + while (true && !progress.wasCanceled()) { + if ( m_loadBlock ) { + if ( !readNextBlock() ) + break; + loadBlock(); + loadGroup(); + } + + switch ( m_mode ) { + case ModeNode: + parseNode( aLayer ); + break; + case ModeWay: + parseWay( aLayer ); + break; + case ModeRelation: + parseRelation( aLayer ); + break; + case ModeDense: + parseDense( aLayer ); + break; + } + progress.setValue(m_file.pos()); + qApp->processEvents(); +//#ifndef NDEBUG +// if (aLayer->size() > 1000000) +// break; +//#endif + } + progress.reset(); + + return true; +} diff --git a/src/ImportExport/ImportExportPBF.h b/src/ImportExport/ImportExportPBF.h new file mode 100644 index 0000000..ac42d56 --- /dev/null +++ b/src/ImportExport/ImportExportPBF.h @@ -0,0 +1,94 @@ +// +// C++ Interface: ImportExportPBF +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef ImportExportPBF_H +#define ImportExportPBF_H + +#include "IImportExport.h" + +#include "fileformat.pb.h" +#include "osmformat.pb.h" + +class QDomDocument; +/** + @author cbro <cbro@semperpax.com> +*/ +class ImportExportPBF : public IImportExport +{ +protected: + enum Mode { + ModeNode, ModeWay, ModeRelation, ModeDense + }; + +public: + ImportExportPBF(Document* doc); + + ~ImportExportPBF(); + + // Specify the input + virtual bool loadFile(QString filename); + // import the input + virtual bool import(Layer* aLayer); + + //export + virtual bool export_(const QList<Feature *>& featList); + +protected: + OSMPBF::BlobHeader m_blockHeader; + OSMPBF::Blob m_blob; + + OSMPBF::HeaderBlock m_headerBlock; + OSMPBF::PrimitiveBlock m_primitiveBlock; + + int m_currentGroup; + int m_currentEntity; + bool m_loadBlock; + + Mode m_mode; + + QHash< QString, int > m_nodeTags; + QHash< QString, int > m_wayTags; + QHash< QString, int > m_relationTags; + + std::vector< int > m_nodeTagIDs; + std::vector< int > m_wayTagIDs; + std::vector< int > m_relationTagIDs; + + long long m_lastDenseID; + long long m_lastDenseLatitude; + long long m_lastDenseLongitude; + long long m_lastDenseTimestamp; + long long m_lastDenseChangeset; + long long m_lastDenseUId; + long long m_lastDenseUserSid; + int m_lastDenseTag; + + QFile m_file; + QByteArray m_buffer; + QByteArray m_bzip2Buffer; + +protected: + void loadGroup(); + void loadBlock(); + bool readNextBlock(); + bool readBlockHeader(); + bool readBlob(); + bool unpackZlib(); + bool unpackBzip2(); + bool unpackLzma(); + + void parseNode( Layer* aLayer ); + void parseWay( Layer* aLayer ); + void parseRelation( Layer* aLayer ); + void parseDense( Layer* aLayer ); +}; + +#endif diff --git a/src/ImportExport/ImportGPX.cpp b/src/ImportExport/ImportGPX.cpp new file mode 100644 index 0000000..b196bd1 --- /dev/null +++ b/src/ImportExport/ImportGPX.cpp @@ -0,0 +1,350 @@ +#include "ImportGPX.h" + +#include "Command.h" +#include "DocumentCommands.h" +#include "Document.h" +#include "Node.h" +#include "TrackSegment.h" +#include "Global.h" + +#include <QBuffer> +#include <QDateTime> +#include <QFile> +#include <QMessageBox> +#include <QDomDocument> +#include <QProgressDialog> + + +static TrackNode* importTrkPt(const QDomElement& Root, Document* /* theDocument */, Layer* theLayer) +{ + qreal Lat = Root.attribute("lat").toDouble(); + qreal Lon = Root.attribute("lon").toDouble(); + + TrackNode* Pt = g_backend.allocTrackNode(theLayer, Coord(Lon,Lat)); + Pt->setLastUpdated(Feature::Log); + if (Root.hasAttribute("xml:id")) + Pt->setId(IFeature::FId(IFeature::Point, Root.attribute("xml:id").toLongLong())); + + theLayer->add(Pt); + + if (Root.tagName() == "wpt") + Pt->setTag("_waypoint_", "yes"); + + bool hasTimestamp = false; + for(QDomNode n = Root.firstChild(); !n.isNull(); n = n.nextSibling()) + { + QDomElement t = n.toElement(); + + if (t.isNull()) + continue; + + if (t.tagName() == "time") + { + QString Value; + for (QDomNode s = t.firstChild(); !s.isNull(); s = s.nextSibling()) + { + QDomText ss = s.toText(); + if (!ss.isNull()) + Value += ss.data(); + } + if (!Value.isEmpty()) + { + QDateTime dt(QDateTime::fromString(Value.left(19), Qt::ISODate)); + dt.setTimeSpec(Qt::UTC); + Pt->setTime(dt); + hasTimestamp = true; + } + } + else if (t.tagName() == "ele") + { + Pt->setElevation( t.text().toDouble() ); + } + else if (t.tagName() == "speed") + { + Pt->setSpeed( t.text().toDouble() ); + } + else if (t.tagName() == "name") + { + Pt->setTag("name", t.text()); + } + else if (t.tagName() == "desc") + { + Pt->setTag("_description_", t.text()); + } + else if (t.tagName() == "cmt") + { + Pt->setTag("_comment_", t.text()); + } + else if (t.tagName() == "extensions") // for OpenStreetBugs + { + QDomNodeList li = t.elementsByTagName("id"); + if (li.size()) { + QString id = li.at(0).toElement().text(); + Pt->setId(IFeature::FId(IFeature::Point | IFeature::Special, id.toLongLong())); + Pt->setTag("_special_", "yes"); // Assumed to be OpenstreetBugs as they don't use their own namesoace + Pt->setSpecial(true); + } + } + } + if (!hasTimestamp) { + /* If a point does not have timestamp, make sure this is reflected in + * our representation (by default, a Feature has time of creation as a + * timestamp). + */ + Pt->setTime(0); + } + + return Pt; +} + + +static void importTrkSeg(const QDomElement& Root, Document* theDocument, Layer* theLayer, ImportGPX::Options importOptions, QProgressDialog & progress) +{ + TrackSegment* S = g_backend.allocSegment(theLayer); + theLayer->add(S); + + if (Root.hasAttribute("xml:id")) + S->setId(IFeature::FId(IFeature::GpxSegment, Root.attribute("xml:id").toLongLong())); + + Node* lastPoint = NULL; + + /* Counters to keep the number of found normal and anonymized (if detection is enabled) points. */ + int nAnon = 0, nNormal = 0; + + for(QDomNode n = Root.firstChild(); !n.isNull(); n = n.nextSibling()) + { + QDomElement t = n.toElement(); + if (t.isNull() || t.tagName() != "trkpt") + continue; + + progress.setValue(progress.value()+1); + if (progress.wasCanceled()) + return; + + TrackNode* Pt = importTrkPt(t,theDocument, theLayer); + + if (importOptions.testFlag( ImportGPX::Option::MakeSegmented ) && lastPoint) + { + qreal kilometer = Pt->position().distanceFrom( lastPoint->position() ); + + if (M_PREFS->getMaxDistNodes() != 0.0 && kilometer > M_PREFS->getMaxDistNodes()) + { + /* FIXME: This code should never trigger, as we always add a point to each created + * segment (and we won't execute in the first pass due to lastPoint == nullptr). + * Add Q_ASSERT(S.size()) instead?) */ + if (!S->size()) { + theLayer->remove(S); + g_backend.deallocFeature(theLayer, S); + } + + S = g_backend.allocSegment(theLayer); + theLayer->add(S); + } + } + + /* If the point is marked as anonymized, don't add it to a segment. + * These are sorted by coordinates and are not proper segments. */ + if ( importOptions.testFlag(ImportGPX::Option::DetectAnonymizedSegments) + && (Pt->time().toTime_t() == 0) + ) { + theLayer->add(Pt); + nAnon++; + } else { + S->add(Pt); + lastPoint = Pt; + nNormal++; + } + } + + if (!S->size()) { + theLayer->remove(S); + g_backend.deallocFeature(theLayer, S); + } + + /* If some anonymized points were found, mark the layer as "Anonymized + * trackpoints". If some non-anonymized points were found as well, report a + * warning, because that means our heuristicks failed on these points. + * + * Can only trigger if anonymization detection was enabled using the + * Option::DetectAnonymizedSegments (otherwise, nAnon always stays 0, + * regardless of the data). + * */ + if (nAnon) { + theLayer->setName(ImportGPX::tr("Anonymized trackpoints", "OSM trackpoints import")); + if (nNormal) { + qWarning() << "BUG: Mixed anonymized ( " << nAnon << ") and non-anonymized points (" << nNormal << ") found. Please report a bug."; + } + } +} + +static void importRte(const QDomElement& Root, Document* theDocument, Layer* theLayer, ImportGPX::Options importOptions, QProgressDialog & progress) +{ + TrackSegment* S = g_backend.allocSegment(theLayer); + theLayer->add(S); + + if (Root.hasAttribute("xml:id")) + S->setId(IFeature::FId(IFeature::GpxSegment, Root.attribute("xml:id").toLongLong())); + + TrackNode* lastPoint = NULL; + + for(QDomNode n = Root.firstChild(); !n.isNull(); n = n.nextSibling()) + { + QDomElement t = n.toElement(); + if (!t.isNull() && t.tagName() == "name") { + theLayer->setName(t.text()); + } else + if (!t.isNull() && t.tagName() == "desc") { + theLayer->setDescription(t.text()); + } else + if (!t.isNull() && t.tagName() == "rtept") { + + progress.setValue(progress.value()+1); + if (progress.wasCanceled()) + return; + + TrackNode* Pt = importTrkPt(t,theDocument, theLayer); + + if (! importOptions.testFlag( ImportGPX::Option::MakeSegmented )) + continue; + + if (lastPoint) + { + qreal kilometer = Pt->position().distanceFrom( lastPoint->position() ); + + if (M_PREFS->getMaxDistNodes() != 0.0 && kilometer > M_PREFS->getMaxDistNodes()) + { + if (!S->size()) + g_backend.deallocFeature(theLayer, S); + + S = g_backend.allocSegment(theLayer); + } + } + S->add(Pt); + lastPoint = Pt; + } + } + + if (!S->size()) + g_backend.deallocFeature(theLayer, S); +} + +static void importTrk(const QDomElement& Root, Document* theDocument, Layer* theLayer, ImportGPX::Options importOptions, QProgressDialog & progress) +{ + QDomElement trkSegElement; + for(QDomNode n = Root.firstChild(); !n.isNull(); n = n.nextSibling()) + { + QDomElement t = n.toElement(); + if (!t.isNull() && t.tagName() == "trkseg") { + trkSegElement = t; + } else + if (!t.isNull() && t.tagName() == "name") { + theLayer->setName(t.text()); + } else + if (!t.isNull() && t.tagName() == "desc") { + theLayer->setDescription(t.text()); + } + } + + if (!trkSegElement.isNull()) { + importTrkSeg(trkSegElement, theDocument, theLayer, importOptions, progress); + if (progress.wasCanceled()) + return; + } +} + +static void importGPX(const QDomElement& Root, Document* theDocument, QList<TrackLayer*>& theTracklayers, ImportGPX::Options importOptions, QProgressDialog & progress) +{ + for(QDomNode n = Root.firstChild(); !n.isNull(); n = n.nextSibling()) + { + QDomElement t = n.toElement(); + if (t.isNull()) + continue; + + if (t.tagName() == "trk") + { + TrackLayer* newLayer = new TrackLayer(); + theDocument->add(newLayer); + importTrk(t,theDocument, newLayer, importOptions, progress); + if (!newLayer->size()) { + theDocument->remove(newLayer); + delete newLayer; + } else { + theTracklayers.append(newLayer); + } + } + else if (t.tagName() == "rte") + { + TrackLayer* newLayer = new TrackLayer(); + theDocument->add(newLayer); + importRte(t,theDocument, newLayer, importOptions, progress); + if (!newLayer->size()) { + theDocument->remove(newLayer); + delete newLayer; + } else { + theTracklayers.append(newLayer); + } + } + else if (t.tagName() == "wpt") + { + importTrkPt(t,theDocument, theTracklayers[0]); + progress.setValue(progress.value()+1); + } + if (progress.wasCanceled()) + return; + } +} + +static bool importGPX(QWidget* aParent, QIODevice& File, Document* theDocument, QList<TrackLayer*>& theTracklayers, ImportGPX::Options importOptions) +{ + // TODO remove debug messageboxes + QDomDocument DomDoc; + QString ErrorStr; + int ErrorLine; + int ErrorColumn; + if (!DomDoc.setContent(&File, true, &ErrorStr, &ErrorLine,&ErrorColumn)) + { + File.close(); + QMessageBox::warning(aParent,"Parse error", + QString("Parse error at line %1, column %2:\n%3") + .arg(ErrorLine) + .arg(ErrorColumn) + .arg(ErrorStr)); + return false; + } + QDomElement root = DomDoc.documentElement(); + if (root.tagName() != "gpx") + { + QMessageBox::information(aParent, "Parse error","Root is not a gpx node"); + return false; + } + + QProgressDialog progress("Importing GPX...", "Cancel", 0, 0); + progress.setWindowModality(Qt::WindowModal); + progress.setMaximum(progress.maximum() + DomDoc.elementsByTagName("trkpt").count()); + progress.setMaximum(progress.maximum() + DomDoc.elementsByTagName("wpt").count()); + + importGPX(root, theDocument, theTracklayers, importOptions, progress); + + progress.setValue(progress.maximum()); + if (progress.wasCanceled()) + return false; + + return true; +} + + +bool ImportGPX::import(QWidget* aParent, const QString& aFilename, Document* theDocument, QList<TrackLayer*>& theTracklayers) +{ + QFile File(aFilename); + if (!File.open(QIODevice::ReadOnly)) + { + return false; + } + return importGPX(aParent, File, theDocument, theTracklayers, Option::MakeSegmented); +} + +bool ImportGPX::import(QWidget* aParent, QByteArray& aFile, Document* theDocument, QList<TrackLayer*>& theTracklayers, ImportGPX::Options importOptions) +{ + QBuffer buf(&aFile); + return importGPX(aParent,buf, theDocument, theTracklayers, importOptions); +} diff --git a/src/ImportExport/ImportGPX.h b/src/ImportExport/ImportGPX.h new file mode 100644 index 0000000..604d7d2 --- /dev/null +++ b/src/ImportExport/ImportGPX.h @@ -0,0 +1,34 @@ +#ifndef MERKATOR_IMPORTGPX_H_ +#define MERKATOR_IMPORTGPX_H_ + +#include <QList> +#include <QObject> +#include <QFlags> + +class Document; +class TrackLayer; + +class QByteArray; +class QString; +class QWidget; + +class ImportGPX : public QObject { + Q_OBJECT + public: + enum class Option { + NoOptions = 0x0, + MakeSegmented = 0x1, + DetectAnonymizedSegments = 0x2, + ForceWaypoints = 0x4, + }; + Q_DECLARE_FLAGS(Options,Option) + + static bool import(QWidget* aParent, const QString& aFilename, Document* theDocument, QList<TrackLayer*>& theTracklayers); + static bool import(QWidget* aParent, QByteArray& aFile, Document* theDocument, QList<TrackLayer*>& theTracklayers, Options importOptions); +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(ImportGPX::Options) + +#endif + + diff --git a/src/ImportExport/ImportNGT.cpp b/src/ImportExport/ImportNGT.cpp new file mode 100644 index 0000000..6946eaf --- /dev/null +++ b/src/ImportExport/ImportNGT.cpp @@ -0,0 +1,48 @@ +#include "ImportNGT.h" +#include "DocumentCommands.h" +#include "Document.h" +#include "Node.h" +#include "TrackSegment.h" +#include "Global.h" + +#include <QApplication> +#include <QtCore/QFile> +#include <QtCore/QStringList> +#include <QtCore/QTextStream> + +#include <math.h> + +bool importNGT(QWidget* /* aParent */, const QString& aFilename, Document* theDocument, Layer* theLayer) +{ + QFile f(aFilename); + if (f.open(QIODevice::ReadOnly)) + { + QTextStream s(&f); + CommandList* theList = new CommandList(QApplication::tr("Import NGT"), NULL); + TrackSegment* theSegment = g_backend.allocSegment(theLayer); + while (!f.atEnd()) + { + QString Line(f.readLine()); + QStringList Items(Line.split('|')); + if (Items.count() >= 5) + { + TrackNode* Pt = g_backend.allocTrackNode(theLayer, Coord(Items[3].toDouble()*COORD_MAX, Items[4].toDouble()*COORD_MAX)); + Pt->setLastUpdated(Feature::Log); + theList->add(new AddFeatureCommand(theLayer,Pt, true)); + theSegment->add(Pt); + } + } + if (theList->empty()) + { + delete theList; + g_backend.deallocFeature(theLayer, theSegment); + } + else + { + theList->add(new AddFeatureCommand(theLayer,theSegment,true)); + theDocument->addHistory(theList); + } + return true; + } + return false; +} diff --git a/src/ImportExport/ImportNGT.h b/src/ImportExport/ImportNGT.h new file mode 100644 index 0000000..02c3918 --- /dev/null +++ b/src/ImportExport/ImportNGT.h @@ -0,0 +1,12 @@ +#ifndef MERKAARTOR_IMPORTNGT_H_ +#define MERKAARTOR_IMPORTNGT_H_ + +class Layer; +class Document; +class QString; +class QWidget; + +bool importNGT(QWidget* aParent, const QString& aFilename, Document* theDocument, Layer* theLayer); + +#endif + diff --git a/src/ImportExport/ImportNMEA.cpp b/src/ImportExport/ImportNMEA.cpp new file mode 100644 index 0000000..44d0138 --- /dev/null +++ b/src/ImportExport/ImportNMEA.cpp @@ -0,0 +1,230 @@ +// +// C++ Implementation: ImportNMEA +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include <QtGui> +#include <QApplication> + +#include "../ImportExport/ImportNMEA.h" +#include "Global.h" + + +ImportNMEA::ImportNMEA(Document* doc) + : IImportExport(doc), curAltitude(0.0) +{ +} + + +ImportNMEA::~ImportNMEA() +{ +} + +// no export +bool ImportNMEA::export_(const QList<Feature *>& featList) +{ + IImportExport::export_(featList); + + return false; +} + +// import the input +bool ImportNMEA::import(Layer* aLayer) +{ + bool goodFix = false; + bool goodFix3D = true; + QTextStream in(Device); + + theLayer = dynamic_cast <TrackLayer *> (aLayer); + theList = new CommandList(QApplication::tr("Import NMEA"), NULL); + + TrackSegment* TS = g_backend.allocSegment(aLayer); + + while (!in.atEnd()) { + QString line = in.readLine(); + + if (line.left(3) != "$GP") + continue; + + QString command = line.mid(3, 3); + if (command == "GSA") { + bool prevGoodFix = goodFix3D; + goodFix3D = importGSA(line); + if (!goodFix3D && prevGoodFix) { + if (TS->size()) + theLayer->add(TS); + else + g_backend.deallocFeature(aLayer, TS); + TS = g_backend.allocSegment(aLayer); + } + } else + if (command == "GSV") { + if (goodFix && goodFix3D) + importGSV(line); + } else + if (command == "GGA") { + bool prevGoodFix = goodFix; + goodFix = importGGA(line); + if (!goodFix && prevGoodFix) { + if (TS->size()) + theLayer->add(TS); + else + g_backend.deallocFeature(aLayer, TS); + TS = g_backend.allocSegment(aLayer); + } + } else + if (command == "GLL") { + bool prevGoodFix = goodFix; + goodFix = importGLL(line); + if (!goodFix && prevGoodFix) { + if (TS->size()) + theLayer->add(TS); + else + g_backend.deallocFeature(aLayer, TS); + TS = g_backend.allocSegment(aLayer); + } + } else + if (command == "RMC") { + if (goodFix && goodFix3D) { + TrackNode* p = importRMC(line); + if (p) + TS->add(p); + } + } else + {/* Not handled */} + } + + if (TS->size()) + theLayer->add(TS); + else + g_backend.deallocFeature(aLayer, TS); + + delete theList; + return true; +} + +bool ImportNMEA::importGSA (QString line) +{ + if (line.count('$') > 1) + return false; + + QStringList tokens = line.split(","); + if (tokens.size() < 3) + return false; + + QString autoSelectFix = tokens[1]; + int Fix3D = tokens[2].toInt(); + + // qreal PDOP = tokens[15].toDouble(); + // qreal HDOP = tokens[16].toDouble(); + // qreal VDOP = tokens[17].toDouble(); + + return (Fix3D == 1 ? false: true); +} + +bool ImportNMEA::importGSV (QString /* line */) +{ + return true; +} + +bool ImportNMEA::importGGA (QString line) +{ + if (line.count('$') > 1) + return false; + + QStringList tokens = line.split(","); + + if (tokens.size() < 10) + return false; + + //qreal lat = tokens[2].left(2).toDouble(); + //qreal lon = tokens[4].left(3).toDouble(); + + //qreal latmin = tokens[2].mid(2).toDouble(); + //lat += latmin / 60.0; + //if (tokens[3] != "N") + // lat = -lat; + //qreal lonmin = tokens[4].mid(3).toDouble(); + //lon += lonmin / 60.0; + //if (tokens[5] != "E") + // lon = -lon; + + int fix = tokens[6].toInt(); + if (fix == 0) + return false; + + curAltitude = tokens[9].toDouble(); + + return true; +} + +bool ImportNMEA::importGLL (QString line) +{ + if (line.count('$') > 1) + return false; + + QStringList tokens = line.split(","); + + if (tokens.size() < 7) + return false; + + if (tokens[6] != "A") + return false; + + return true; +} + +TrackNode* ImportNMEA::importRMC (QString line) +{ + if (line.count('$') > 1) + return NULL; + + QStringList tokens = line.split(","); + if (tokens.size() < 10) + return NULL; + + //int time = tokens[1]; + if (tokens[2] != "A") + return NULL; + + qreal lat = tokens[3].left(2).toDouble(); + qreal latmin = tokens[3].mid(2).toDouble(); + lat += latmin / 60.0; + if (tokens[4] != "N") + lat = -lat; + qreal lon = tokens[5].left(3).toDouble(); + qreal lonmin = tokens[5].mid(3).toDouble(); + lon += lonmin / 60.0; + if (tokens[6] != "E") + lon = -lon; + qreal speed = tokens[7].toDouble() * 1.852; + //int date = token[9]; + + QString strDate = tokens[9] + tokens[1]; + QDateTime date = QDateTime::fromString(strDate, "ddMMyyHHmmss.zzz"); + if (!date.isValid()) date = QDateTime::fromString(strDate, "ddMMyyHHmmss.z"); + if (!date.isValid()) date = QDateTime::fromString(strDate, "ddMMyyHHmmss"); + if (!date.isValid()) { + return NULL; + } + + if (date.date().year() < 1970) + date = date.addYears(100); + //date.setTimeSpec(Qt::UTC); + + TrackNode* Pt = g_backend.allocTrackNode(theLayer, Coord(lon,lat)); + theLayer->add(Pt); + Pt->setLastUpdated(Feature::Log); + Pt->setElevation(curAltitude); + Pt->setSpeed(speed); + Pt->setTime(date); + + return Pt; +} diff --git a/src/ImportExport/ImportNMEA.h b/src/ImportExport/ImportNMEA.h new file mode 100644 index 0000000..82426cc --- /dev/null +++ b/src/ImportExport/ImportNMEA.h @@ -0,0 +1,45 @@ +// +// C++ Interface: ImportNMEA +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef IMPORTNMEA_H +#define IMPORTNMEA_H + +#include "IImportExport.h" + +/** + @author cbro <cbro@semperpax.com> +*/ +class ImportNMEA : public IImportExport +{ +public: + ImportNMEA(Document* doc); + + ~ImportNMEA(); + + // import the input + virtual bool import(Layer* aLayer); + // export + virtual bool export_(const QList<Feature *>& featList); + +private: + TrackLayer* theLayer; + + bool importGSA (QString line); + bool importGSV (QString line); + bool importGGA (QString line); + bool importGLL (QString line); + TrackNode* importRMC (QString line); + + qreal curAltitude; + +}; + +#endif diff --git a/src/ImportExport/ImportOSM.cpp b/src/ImportExport/ImportOSM.cpp new file mode 100644 index 0000000..721f2d4 --- /dev/null +++ b/src/ImportExport/ImportOSM.cpp @@ -0,0 +1,595 @@ +#include "ImportOSM.h" + +#include "Command.h" +#include "DocumentCommands.h" +#include "FeatureCommands.h" +#include "RelationCommands.h" +#include "DownloadOSM.h" +#include "Document.h" +#include "Layer.h" +#include "Features.h" +#include "Global.h" +#include "IProgressWindow.h" + +#include <QApplication> +#include <QBuffer> +#include <QDateTime> +#include <QEventLoop> +#include <QFile> +#include <QMessageBox> +#include <QProgressBar> +#include <QProgressDialog> +#include <QDomDocument> +#include <QXmlAttributes> + + +OSMHandler::OSMHandler(Document* aDoc, Layer* aLayer, Layer* aConflict) +: theDocument(aDoc), theLayer(aLayer), conflictLayer(aConflict), Current(0) +{ +} + +void OSMHandler::parseTag(const QXmlAttributes &atts) +{ + if (!Current) return; + + Current->setTag(atts.value("k"),atts.value("v")); +} + +void parseStandardAttributes(const QXmlAttributes& atts, Feature* F) +{ +#ifndef FRISIUS_BUILD + QString ts = atts.value("timestamp"); + QDateTime time = QDateTime::fromString(ts.left(19), Qt::ISODate); + if (!time.isValid()) + time = QDateTime::currentDateTime(); + QString user = atts.value("user"); + F->setTime(time); + F->setUser(user); + QString version = atts.value("version"); + if (!version.isEmpty()) + F->setVersionNumber(version.toInt()); +#endif +} + +void OSMHandler::parseNode(const QXmlAttributes& atts) +{ + qreal Lat = atts.value("lat").toDouble(); + qreal Lon = atts.value("lon").toDouble(); + QString id = atts.value("id"); + Node* Pt = CAST_NODE(theDocument->getFeature(IFeature::FId(IFeature::Point, id.toLongLong()))); + if (Pt) + { + Node* userPt = Pt; + Pt = g_backend.allocNode(theLayer, Coord(Lon,Lat)); + Pt->setId(IFeature::FId(IFeature::Point | IFeature::Conflict, id.toLongLong())); + Pt->setLastUpdated(Feature::OSMServerConflict); + parseStandardAttributes(atts,Pt); + + if (userPt->lastUpdated() == Feature::User) + { + // conflict + userPt->setLastUpdated(Feature::UserResolved); +#ifndef FRISIUS_BUILD + if (Pt->time() > userPt->time() || Pt->versionNumber() != userPt->versionNumber()) { + if (conflictLayer) + conflictLayer->add(Pt); + userPt->setVersionNumber(Pt->versionNumber()); + NewFeature = true; + } else +#endif + { + g_backend.deallocFeature(theLayer, Pt); + Pt = userPt; + NewFeature = false; + } + } + else if (userPt->lastUpdated() != Feature::UserResolved) + { +#ifndef FRISIUS_BUILD + if (userPt->lastUpdated() == Feature::NotYetDownloaded || (Pt->time() > userPt->time() || Pt->versionNumber() != userPt->versionNumber())) +#else + if (userPt->lastUpdated() == Feature::NotYetDownloaded) +#endif + { + g_backend.deallocFeature(theLayer, Pt); + Pt = userPt; + Pt->layer()->remove(Pt); + theLayer->add(Pt); + Pt->setPosition(Coord(Lon,Lat)); + Pt->clearTags(); + NewFeature = true; + if (Pt->lastUpdated() == Feature::NotYetDownloaded) + Pt->setLastUpdated(Feature::OSMServer); + } else { + g_backend.deallocFeature(theLayer, Pt); + Pt = userPt; + NewFeature = false; + } + } else { + qDebug() << "Node conflicted, but already is tagged as Feature::UserResolved. Ignoring" << Pt->xmlId(); + g_backend.deallocFeature(theLayer, Pt); + Pt = userPt; + NewFeature = false; + } + } + else + { + Pt = g_backend.allocNode(theLayer, Coord(Lon,Lat)); + Pt->setId(IFeature::FId(IFeature::Point, id.toLongLong())); + Pt->setLastUpdated(Feature::OSMServer); + theLayer->add(Pt); + NewFeature = true; + } + + if (NewFeature) { + parseStandardAttributes(atts,Pt); + Current = Pt; + for (int i=0; i<Pt->sizeParents(); ++i) { + if (Pt->getParent(i)->isDeleted()) continue; + if (Way* w = CAST_WAY(Pt->getParent(i))) + touchedWays << w; + } + } else + Current = NULL; +} + +void OSMHandler::parseNd(const QXmlAttributes& atts) +{ + Way* R = dynamic_cast<Way*>(Current); + if (!R) return; + Node *Part = Feature::getNodeOrCreatePlaceHolder(theDocument, theLayer, IFeature::FId(IFeature::Point, atts.value("ref").toLongLong())); + if (NewFeature) + R->add(Part); +} + +void OSMHandler::parseWay(const QXmlAttributes& atts) +{ + QString id = atts.value("id"); + QString ts = atts.value("timestamp"); ts.truncate(19); + Way* R = CAST_WAY(theDocument->getFeature(IFeature::FId(IFeature::LineString, id.toLongLong()))); + if (R) + { + Way* userRd = R; + R = g_backend.allocWay(theLayer); + R->setId(IFeature::FId(IFeature::LineString | IFeature::Conflict, id.toLongLong())); + R->setLastUpdated(Feature::OSMServerConflict); + parseStandardAttributes(atts,R); + + if (userRd->lastUpdated() == Feature::User) + { + userRd->setLastUpdated(Feature::UserResolved); + NewFeature = false; + // conflict +#ifndef FRISIUS_BUILD + if (R->time() > userRd->time() || R->versionNumber() != userRd->versionNumber()) { + if (conflictLayer) + conflictLayer->add(R); + userRd->setVersionNumber(R->versionNumber()); + NewFeature = true; + } else +#endif + { + g_backend.deallocFeature(theLayer, R); + R = userRd; + NewFeature = false; + } + } + else if (R->lastUpdated() != Feature::UserResolved) + { +#ifndef FRISIUS_BUILD + if (userRd->lastUpdated() == Feature::NotYetDownloaded || (R->time() > userRd->time() || R->versionNumber() != userRd->versionNumber())) { +#else + if (userRd->lastUpdated() == Feature::NotYetDownloaded) { +#endif + g_backend.deallocFeature(theLayer, R); + R = userRd; + R->layer()->remove(R); + theLayer->add(R); + while (R->size()) + R->remove((int)0); + R->clearTags(); + NewFeature = true; + if (R->lastUpdated() == Feature::NotYetDownloaded) + R->setLastUpdated(Feature::OSMServer); + } else { + g_backend.deallocFeature(theLayer, R); + R = userRd; + NewFeature = false; + } + } + } + else + { + R = g_backend.allocWay(theLayer); + R->setId(IFeature::FId(IFeature::LineString, id.toLongLong())); + R->setLastUpdated(Feature::OSMServer); + theLayer->add(R); + NewFeature = true; + } + + if (NewFeature) { + parseStandardAttributes(atts,R); + Current = R; + touchedWays << R; + } else + Current = NULL; +} + +void OSMHandler::parseMember(const QXmlAttributes& atts) +{ + Relation* R = dynamic_cast<Relation*>(Current); + if (!R) + return; + QString Type = atts.value("type"); + Feature* F = 0; + if (Type == "node") + F = Feature::getNodeOrCreatePlaceHolder(theDocument, theLayer, IFeature::FId(IFeature::Point, atts.value("ref").toLongLong())); + else if (Type == "way") + F = Feature::getWayOrCreatePlaceHolder(theDocument, theLayer, IFeature::FId(IFeature::LineString, atts.value("ref").toLongLong())); + else if (Type == "relation") + F = Feature::getRelationOrCreatePlaceHolder(theDocument, theLayer, IFeature::FId(IFeature::OsmRelation, atts.value("ref").toLongLong())); + + if (F && F != R) + R->add(atts.value("role"),F); +} + +void OSMHandler::parseRelation(const QXmlAttributes& atts) +{ + QString id = atts.value("id"); + QString ts = atts.value("timestamp"); ts.truncate(19); + Relation* R = CAST_RELATION(theDocument->getFeature(IFeature::FId(IFeature::OsmRelation, id.toLongLong()))); + if (R) + { + Relation* userR = R; + R = g_backend.allocRelation(theLayer); + R->setId(IFeature::FId(IFeature::OsmRelation | IFeature::Conflict, id.toLongLong())); + R->setLastUpdated(Feature::OSMServerConflict); + parseStandardAttributes(atts,R); + + if (R->lastUpdated() == Feature::User) + { + R->setLastUpdated(Feature::UserResolved); + NewFeature = false; + // conflict +#ifndef FRISIUS_BUILD + if (R->time() > userR->time() || R->versionNumber() != userR->versionNumber()) { + if (conflictLayer) + conflictLayer->add(R); + userR->setVersionNumber(R->versionNumber()); + NewFeature = true; + } else +#endif + { + g_backend.deallocFeature(theLayer, R); + R = userR; + NewFeature = false; + } + } + else if (R->lastUpdated() != Feature::UserResolved) + { +#ifndef FRISIUS_BUILD + if (userR->lastUpdated() == Feature::NotYetDownloaded || (R->time() > userR->time() || R->versionNumber() != userR->versionNumber())) { +#else + if (userR->lastUpdated() == Feature::NotYetDownloaded) { +#endif + g_backend.deallocFeature(theLayer, R); + R = userR; + R->layer()->remove(R); + theLayer->add(R); + while (R->size()) + R->remove((int)0); + R->clearTags(); + NewFeature = true; + if (R->lastUpdated() == Feature::NotYetDownloaded) + R->setLastUpdated(Feature::OSMServer); + } else { + g_backend.deallocFeature(theLayer, R); + R = userR; + NewFeature = false; + } + } + } + else + { + R = g_backend.allocRelation(theLayer); + R->setId(IFeature::FId(IFeature::OsmRelation, id.toLongLong())); + R->setLastUpdated(Feature::OSMServer); + NewFeature = true; + theLayer->add(R); + } + + if (NewFeature) { + parseStandardAttributes(atts,R); + Current = R; + touchedRelations << R; + } else + Current = NULL; +} + +bool OSMHandler::startElement ( const QString &, const QString & /* localName */, const QString & qName, const QXmlAttributes & atts ) +{ + if (qName == "tag") + parseTag(atts); + else if (qName == "node") + parseNode(atts); + else if (qName == "nd") + parseNd(atts); + else if (qName == "way") + parseWay(atts); + else if (qName == "member") + parseMember(atts); + else if (qName == "relation") + parseRelation(atts); + return true; +} + +bool OSMHandler::endElement ( const QString &, const QString & /* localName */, const QString & qName ) +{ + if (qName == "node") + Current = 0; + return true; +} + +static bool downloadToResolve(const QList<Feature*>& Resolution, QWidget* aParent, Document* theDocument, Layer* theLayer, Downloader* theDownloader) +{ + IProgressWindow* aProgressWindow = dynamic_cast<IProgressWindow*>(aParent); + if (!aProgressWindow) + return false; + + QProgressDialog* dlg = aProgressWindow->getProgressDialog(); + dlg->setWindowTitle(QApplication::translate("Downloader", "Downloading unresolved...")); + QProgressBar* Bar = aProgressWindow->getProgressBar(); + QLabel* Lbl = aProgressWindow->getProgressLabel(); + + for (int i=0; i<Resolution.size(); i++ ) + { + QUrl URL = M_PREFS->getOsmApiUrl()+theDownloader->getURLToFetchFull(Resolution[i]); + Lbl->setText(QApplication::translate("Downloader","Downloading unresolved %1 of %2").arg(i+1).arg(Resolution.size())); + if (theDownloader->go(URL)) + { + if (theDownloader->resultCode() == 410) { + theLayer->remove(Resolution[i]); + delete Resolution[i]; + } + else + { + Lbl->setText(QApplication::translate("Downloader","Parsing unresolved %1 of %2").arg(i+1).arg(Resolution.size())); + + QByteArray ba(theDownloader->content()); + QBuffer File(&ba); + File.open(QIODevice::ReadOnly); + + OSMHandler theHandler(theDocument,theLayer,NULL); + + QXmlSimpleReader xmlReader; + xmlReader.setContentHandler(&theHandler); + QXmlInputSource source; + QByteArray buf(File.read(10240)); + source.setData(buf); + xmlReader.parse(&source,true); + while (!File.atEnd()) + { + QByteArray buf(File.read(20480)); + source.setData(buf); + xmlReader.parseContinue(); + qApp->processEvents(); + if (dlg && dlg->wasCanceled()) + break; + } + } + Resolution[i]->setLastUpdated(Feature::OSMServer); + } + else + return false; + Bar->setValue(i); + } + return true; +} + +static void recurseDelete (Feature* F, QList<Feature*>& MustDelete) +{ + for (int i=0; i<F->sizeParents(); i++) { + recurseDelete(CAST_FEATURE(F->getParent(i)), MustDelete); + } + if (!MustDelete.contains(F)) + MustDelete.push_back(F); +} + +static bool resolveNotYetDownloaded(QWidget* aParent, Document* theDocument, Layer* theLayer, Downloader* theDownloader) +{ + // resolving nodes and roads makes no sense since the OSM api guarantees that they will be all downloaded, + // so only resolve for relations if the ResolveRelations pref is set + if (theDownloader) + { + IProgressWindow* aProgressWindow = dynamic_cast<IProgressWindow*>(aParent); + if (!aProgressWindow) + return false; + + QProgressBar* Bar = aProgressWindow->getProgressBar(); + //QLabel* Lbl = aProgressWindow->getProgressLabel(); + + QList<Feature*> MustResolve; + MustResolve.clear(); + for (FeatureIterator it(theDocument); !it.isEnd(); ++it) + { + Relation* RR = CAST_RELATION(it.get()); + if (RR && RR->notEverythingDownloaded()) + MustResolve.push_back(RR); + } + if (MustResolve.size()) + { + Bar->setMaximum(MustResolve.size()); + Bar->setValue(0); + if (!downloadToResolve(MustResolve,aParent,theDocument,theLayer, theDownloader)) + return false; + } + } + return true; +} + +static bool deleteIncompleteRelations(QWidget* /*aParent*/, Document* /*theDocument*/, Layer* theLayer, Downloader* /*theDownloader*/) +{ + QList<Feature*> MustDelete; + for (int i=0; i<theLayer->size(); i++) + { + if (theLayer->get(i)->notEverythingDownloaded()) { + recurseDelete(theLayer->get(i), MustDelete); + } + } + for (int i=0; i<MustDelete.size(); i++) { + MustDelete[i]->layer()->remove(MustDelete[i]); + delete MustDelete[i]; + } + return true; +} + +bool importOSM(QWidget* aParent, QIODevice& File, Document* theDocument, Layer* theLayer, Downloader* theDownloader) +{ + QDomDocument DomDoc; + QString ErrorStr; + /* int ErrorLine; */ + /* int ErrorColumn; */ + + QProgressDialog* dlg = NULL; + QProgressBar* Bar = NULL; + QLabel* Lbl = NULL; + IProgressWindow* aProgressWindow = dynamic_cast<IProgressWindow*>(aParent); + if (aProgressWindow) { + dlg = aProgressWindow->getProgressDialog(); + if (dlg) { + dlg->setWindowTitle(QApplication::translate("Downloader", "Parsing...")); + + Bar = aProgressWindow->getProgressBar(); + Bar->setTextVisible(false); + + Lbl = aProgressWindow->getProgressLabel(); + Lbl->setText(QApplication::translate("Downloader","Parsing XML")); + + dlg->show(); + } + } + + if (theDownloader) + theDownloader->setAnimator(dlg,Lbl,Bar,false); + Layer* conflictLayer = new DrawingLayer(QApplication::translate("Downloader","Conflicts from %1").arg(theLayer->name())); + theDocument->add(conflictLayer); + + OSMHandler theHandler(theDocument,theLayer,conflictLayer); + + QXmlSimpleReader xmlReader; + xmlReader.setContentHandler(&theHandler); + QXmlInputSource source; + QByteArray buf(File.read(10240)); + source.setData(buf); + xmlReader.parse(&source,true); + if (Bar) { + Bar->setMaximum(File.size()); + Bar->setValue(Bar->value()+buf.size()); + } + + while (!File.atEnd()) + { + QByteArray buf(File.read(20480)); + source.setData(buf); + xmlReader.parseContinue(); + if (Bar) + Bar->setValue(Bar->value()+buf.size()); + qApp->processEvents(); + if (dlg && dlg->wasCanceled()) + break; + } + + bool WasCanceled = false; + if (dlg) + WasCanceled = dlg->wasCanceled(); + if (!WasCanceled && M_PREFS->getResolveRelations()) + WasCanceled = !resolveNotYetDownloaded(aParent,theDocument,theLayer,theDownloader); + if (!WasCanceled && M_PREFS->getDeleteIncompleteRelations()) + WasCanceled = !deleteIncompleteRelations(aParent,theDocument,theLayer,theDownloader); + + if (WasCanceled) + { + theDocument->remove(conflictLayer); + delete conflictLayer; + return false; + } + else + { +// if (M_PREFS->getUseVirtualNodes()) { +// if (dlg) { +// Lbl->setText(QApplication::translate("Downloader","Update virtuals")); +// Bar->setMaximum(theHandler.touchedWays.size()); +// Bar->setValue(0); +// } +// foreach (Way* w, theHandler.touchedWays) { +// w->updateVirtuals(); +// if (Bar) +// Bar->setValue(Bar->value()+1); +// qApp->processEvents(); +// } +// } + + // Check for empty Roads/Relations and update virtual nodes + QList<Feature*> EmptyFeature; + foreach (Way* w, theHandler.touchedWays) { + if (!w->size()) + EmptyFeature.push_back(w); + } + foreach (Relation* r, theHandler.touchedRelations) { + if (!r->size()) + EmptyFeature.push_back(r); + } + + if (EmptyFeature.size()) { + if (QMessageBox::warning(aParent,QApplication::translate("Downloader","Empty roads/relations detected"), + QApplication::translate("Downloader", + "Empty roads/relations are probably errors.\n" + "Do you want to mark them for deletion?"), + QMessageBox::Ok | QMessageBox::Cancel, + QMessageBox::Cancel + ) == QMessageBox::Ok) { + for (int i=0; i<EmptyFeature.size(); i++ ) { + CommandList* emptyFeatureList = new CommandList(); + emptyFeatureList->setDescription(QApplication::translate("Downloader","Remove empty feature %1").arg(EmptyFeature[i]->description())); + emptyFeatureList->setFeature(EmptyFeature[i]); + emptyFeatureList->add(new RemoveFeatureCommand(theDocument, EmptyFeature[i])); + theDocument->addHistory(emptyFeatureList); + } + } + } + + if (!conflictLayer->size()) { + theDocument->remove(conflictLayer); + delete conflictLayer; + } else { + QMessageBox::warning(aParent,QApplication::translate("Downloader","Conflicts have been detected"), + QApplication::translate("Downloader", + "This means that some of the feature you modified" + " since your last download have since been modified by someone else on the server.\n" + "The features have been duplicated as \"conflict_...\" on the \"Conflicts...\" layer.\n" + "Before being able to upload your changes, you will have to manually merge the two versions" + " and remove the one from the \"Conflicts...\" layer." + )); + } + + } + return true; +} + +bool importOSM(QWidget* aParent, const QString& aFilename, Document* theDocument, Layer* theLayer) +{ + QFile File(aFilename); + if (!File.open(QIODevice::ReadOnly)) + return false; + return importOSM(aParent, File, theDocument, theLayer, 0 ); +} + +bool importOSM(QWidget* aParent, QByteArray& Content, Document* theDocument, Layer* theLayer, Downloader* theDownloader) +{ + QBuffer File(&Content); + File.open(QIODevice::ReadOnly); + return importOSM(aParent, File, theDocument, theLayer, theDownloader); +} + + + diff --git a/src/ImportExport/ImportOSM.h b/src/ImportExport/ImportOSM.h new file mode 100644 index 0000000..6612f77 --- /dev/null +++ b/src/ImportExport/ImportOSM.h @@ -0,0 +1,49 @@ +#ifndef MERKATOR_IMPORTOSM_H_ +#define MERKATOR_IMPORTOSM_H_ + +class CommandList; +class Downloader; +class Document; +class Feature; +class Layer; +class Way; +class Relation; + +class QByteArray; +class QString; +class QWidget; + +#include <QXmlDefaultHandler> +#include <QSet> + +class OSMHandler : public QXmlDefaultHandler +{ +public: + OSMHandler(Document* aDoc, Layer* aLayer, Layer* aConflict); + + virtual bool startElement ( const QString & namespaceURI, const QString & localName, const QString & qName, const QXmlAttributes & atts ); + virtual bool endElement ( const QString & namespaceURI, const QString & localName, const QString & qName ); + +private: + void parseNode(const QXmlAttributes & atts); + void parseTag(const QXmlAttributes & atts); + void parseWay(const QXmlAttributes & atts); + void parseNd(const QXmlAttributes & atts); + void parseMember(const QXmlAttributes & atts); + void parseRelation(const QXmlAttributes& atts); + + Document* theDocument; + Layer* theLayer; + Layer* conflictLayer; + Feature* Current; + bool NewFeature; + +public: + QSet<Way*> touchedWays; + QSet<Relation*> touchedRelations; +}; + +bool importOSM(QWidget* aParent, const QString& aFilename, Document* theDocument, Layer* theLayer); +bool importOSM(QWidget* aParent, QByteArray& Content, Document* theDocument, Layer* theLayer, Downloader* theDownloader); + +#endif diff --git a/src/ImportExport/fileformat.pb.cc b/src/ImportExport/fileformat.pb.cc new file mode 100644 index 0000000..c1f8c2d --- /dev/null +++ b/src/ImportExport/fileformat.pb.cc @@ -0,0 +1,611 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! + +#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION +#include "fileformat.pb.h" +#include <google/protobuf/stubs/once.h> +#include <google/protobuf/io/coded_stream.h> +#include <google/protobuf/wire_format_lite_inl.h> +// @@protoc_insertion_point(includes) + +namespace OSMPBF { + +void protobuf_ShutdownFile_fileformat_2eproto() { + delete Blob::default_instance_; + delete BlobHeader::default_instance_; +} + +void protobuf_AddDesc_fileformat_2eproto() { + static bool already_here = false; + if (already_here) return; + already_here = true; + GOOGLE_PROTOBUF_VERIFY_VERSION; + + Blob::default_instance_ = new Blob(); + BlobHeader::default_instance_ = new BlobHeader(); + Blob::default_instance_->InitAsDefaultInstance(); + BlobHeader::default_instance_->InitAsDefaultInstance(); + ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_fileformat_2eproto); +} + +// Force AddDescriptors() to be called at static initialization time. +struct StaticDescriptorInitializer_fileformat_2eproto { + StaticDescriptorInitializer_fileformat_2eproto() { + protobuf_AddDesc_fileformat_2eproto(); + } +} static_descriptor_initializer_fileformat_2eproto_; + + +// =================================================================== + +const ::std::string Blob::_default_raw_; +const ::std::string Blob::_default_zlib_data_; +const ::std::string Blob::_default_lzma_data_; +const ::std::string Blob::_default_obsolete_bzip2_data_; +#ifndef _MSC_VER +const int Blob::kRawFieldNumber; +const int Blob::kRawSizeFieldNumber; +const int Blob::kZlibDataFieldNumber; +const int Blob::kLzmaDataFieldNumber; +const int Blob::kOBSOLETEBzip2DataFieldNumber; +#endif // !_MSC_VER + +Blob::Blob() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void Blob::InitAsDefaultInstance() { +} + +Blob::Blob(const Blob& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void Blob::SharedCtor() { + _cached_size_ = 0; + raw_ = const_cast< ::std::string*>(&_default_raw_); + raw_size_ = 0; + zlib_data_ = const_cast< ::std::string*>(&_default_zlib_data_); + lzma_data_ = const_cast< ::std::string*>(&_default_lzma_data_); + obsolete_bzip2_data_ = const_cast< ::std::string*>(&_default_obsolete_bzip2_data_); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Blob::~Blob() { + SharedDtor(); +} + +void Blob::SharedDtor() { + if (raw_ != &_default_raw_) { + delete raw_; + } + if (zlib_data_ != &_default_zlib_data_) { + delete zlib_data_; + } + if (lzma_data_ != &_default_lzma_data_) { + delete lzma_data_; + } + if (obsolete_bzip2_data_ != &_default_obsolete_bzip2_data_) { + delete obsolete_bzip2_data_; + } + if (this != default_instance_) { + } +} + +void Blob::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const Blob& Blob::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_fileformat_2eproto(); return *default_instance_; +} + +Blob* Blob::default_instance_ = NULL; + +Blob* Blob::New() const { + return new Blob; +} + +void Blob::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (_has_bit(0)) { + if (raw_ != &_default_raw_) { + raw_->clear(); + } + } + raw_size_ = 0; + if (_has_bit(2)) { + if (zlib_data_ != &_default_zlib_data_) { + zlib_data_->clear(); + } + } + if (_has_bit(3)) { + if (lzma_data_ != &_default_lzma_data_) { + lzma_data_->clear(); + } + } + if (_has_bit(4)) { + if (obsolete_bzip2_data_ != &_default_obsolete_bzip2_data_) { + obsolete_bzip2_data_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool Blob::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional bytes raw = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_raw())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(16)) goto parse_raw_size; + break; + } + + // optional int32 raw_size = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_raw_size: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &raw_size_))); + _set_bit(1); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_zlib_data; + break; + } + + // optional bytes zlib_data = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_zlib_data: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_zlib_data())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_lzma_data; + break; + } + + // optional bytes lzma_data = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_lzma_data: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_lzma_data())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_OBSOLETE_bzip2_data; + break; + } + + // optional bytes OBSOLETE_bzip2_data = 5 [deprecated = true]; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_OBSOLETE_bzip2_data: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_obsolete_bzip2_data())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void Blob::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional bytes raw = 1; + if (_has_bit(0)) { + ::google::protobuf::internal::WireFormatLite::WriteBytes( + 1, this->raw(), output); + } + + // optional int32 raw_size = 2; + if (_has_bit(1)) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->raw_size(), output); + } + + // optional bytes zlib_data = 3; + if (_has_bit(2)) { + ::google::protobuf::internal::WireFormatLite::WriteBytes( + 3, this->zlib_data(), output); + } + + // optional bytes lzma_data = 4; + if (_has_bit(3)) { + ::google::protobuf::internal::WireFormatLite::WriteBytes( + 4, this->lzma_data(), output); + } + + // optional bytes OBSOLETE_bzip2_data = 5 [deprecated = true]; + if (_has_bit(4)) { + ::google::protobuf::internal::WireFormatLite::WriteBytes( + 5, this->obsolete_bzip2_data(), output); + } + +} + +int Blob::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional bytes raw = 1; + if (has_raw()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->raw()); + } + + // optional int32 raw_size = 2; + if (has_raw_size()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->raw_size()); + } + + // optional bytes zlib_data = 3; + if (has_zlib_data()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->zlib_data()); + } + + // optional bytes lzma_data = 4; + if (has_lzma_data()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->lzma_data()); + } + + // optional bytes OBSOLETE_bzip2_data = 5 [deprecated = true]; + if (has_obsolete_bzip2_data()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->obsolete_bzip2_data()); + } + + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Blob::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const Blob*>(&from)); +} + +void Blob::MergeFrom(const Blob& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from._has_bit(0)) { + set_raw(from.raw()); + } + if (from._has_bit(1)) { + set_raw_size(from.raw_size()); + } + if (from._has_bit(2)) { + set_zlib_data(from.zlib_data()); + } + if (from._has_bit(3)) { + set_lzma_data(from.lzma_data()); + } + if (from._has_bit(4)) { + set_obsolete_bzip2_data(from.obsolete_bzip2_data()); + } + } +} + +void Blob::CopyFrom(const Blob& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Blob::IsInitialized() const { + + return true; +} + +void Blob::Swap(Blob* other) { + if (other != this) { + std::swap(raw_, other->raw_); + std::swap(raw_size_, other->raw_size_); + std::swap(zlib_data_, other->zlib_data_); + std::swap(lzma_data_, other->lzma_data_); + std::swap(obsolete_bzip2_data_, other->obsolete_bzip2_data_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string Blob::GetTypeName() const { + return "OSMPBF.Blob"; +} + + +// =================================================================== + +const ::std::string BlobHeader::_default_type_; +const ::std::string BlobHeader::_default_indexdata_; +#ifndef _MSC_VER +const int BlobHeader::kTypeFieldNumber; +const int BlobHeader::kIndexdataFieldNumber; +const int BlobHeader::kDatasizeFieldNumber; +#endif // !_MSC_VER + +BlobHeader::BlobHeader() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void BlobHeader::InitAsDefaultInstance() { +} + +BlobHeader::BlobHeader(const BlobHeader& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void BlobHeader::SharedCtor() { + _cached_size_ = 0; + type_ = const_cast< ::std::string*>(&_default_type_); + indexdata_ = const_cast< ::std::string*>(&_default_indexdata_); + datasize_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +BlobHeader::~BlobHeader() { + SharedDtor(); +} + +void BlobHeader::SharedDtor() { + if (type_ != &_default_type_) { + delete type_; + } + if (indexdata_ != &_default_indexdata_) { + delete indexdata_; + } + if (this != default_instance_) { + } +} + +void BlobHeader::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const BlobHeader& BlobHeader::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_fileformat_2eproto(); return *default_instance_; +} + +BlobHeader* BlobHeader::default_instance_ = NULL; + +BlobHeader* BlobHeader::New() const { + return new BlobHeader; +} + +void BlobHeader::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (_has_bit(0)) { + if (type_ != &_default_type_) { + type_->clear(); + } + } + if (_has_bit(1)) { + if (indexdata_ != &_default_indexdata_) { + indexdata_->clear(); + } + } + datasize_ = 0; + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool BlobHeader::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // required string type = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_type())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_indexdata; + break; + } + + // optional bytes indexdata = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_indexdata: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_indexdata())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(24)) goto parse_datasize; + break; + } + + // required int32 datasize = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_datasize: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &datasize_))); + _set_bit(2); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void BlobHeader::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // required string type = 1; + if (_has_bit(0)) { + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->type(), output); + } + + // optional bytes indexdata = 2; + if (_has_bit(1)) { + ::google::protobuf::internal::WireFormatLite::WriteBytes( + 2, this->indexdata(), output); + } + + // required int32 datasize = 3; + if (_has_bit(2)) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->datasize(), output); + } + +} + +int BlobHeader::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // required string type = 1; + if (has_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->type()); + } + + // optional bytes indexdata = 2; + if (has_indexdata()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->indexdata()); + } + + // required int32 datasize = 3; + if (has_datasize()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->datasize()); + } + + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void BlobHeader::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const BlobHeader*>(&from)); +} + +void BlobHeader::MergeFrom(const BlobHeader& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from._has_bit(0)) { + set_type(from.type()); + } + if (from._has_bit(1)) { + set_indexdata(from.indexdata()); + } + if (from._has_bit(2)) { + set_datasize(from.datasize()); + } + } +} + +void BlobHeader::CopyFrom(const BlobHeader& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool BlobHeader::IsInitialized() const { + if ((_has_bits_[0] & 0x00000005) != 0x00000005) return false; + + return true; +} + +void BlobHeader::Swap(BlobHeader* other) { + if (other != this) { + std::swap(type_, other->type_); + std::swap(indexdata_, other->indexdata_); + std::swap(datasize_, other->datasize_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string BlobHeader::GetTypeName() const { + return "OSMPBF.BlobHeader"; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace OSMPBF + +// @@protoc_insertion_point(global_scope) diff --git a/src/ImportExport/fileformat.pb.h b/src/ImportExport/fileformat.pb.h new file mode 100644 index 0000000..03b1ac0 --- /dev/null +++ b/src/ImportExport/fileformat.pb.h @@ -0,0 +1,565 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: fileformat.proto + +#ifndef PROTOBUF_fileformat_2eproto__INCLUDED +#define PROTOBUF_fileformat_2eproto__INCLUDED + +#include <string> + +#include <google/protobuf/stubs/common.h> + +#if GOOGLE_PROTOBUF_VERSION < 2003000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 2003000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include <google/protobuf/generated_message_util.h> +#include <google/protobuf/repeated_field.h> +#include <google/protobuf/extension_set.h> +// @@protoc_insertion_point(includes) + +namespace OSMPBF { + +// Internal implementation detail -- do not call these. +void protobuf_AddDesc_fileformat_2eproto(); +void protobuf_AssignDesc_fileformat_2eproto(); +void protobuf_ShutdownFile_fileformat_2eproto(); + +class Blob; +class BlobHeader; + +// =================================================================== + +class Blob : public ::google::protobuf::MessageLite { + public: + Blob(); + virtual ~Blob(); + + Blob(const Blob& from); + + inline Blob& operator=(const Blob& from) { + CopyFrom(from); + return *this; + } + + static const Blob& default_instance(); + + void Swap(Blob* other); + + // implements Message ---------------------------------------------- + + Blob* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const Blob& from); + void MergeFrom(const Blob& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional bytes raw = 1; + inline bool has_raw() const; + inline void clear_raw(); + static const int kRawFieldNumber = 1; + inline const ::std::string& raw() const; + inline void set_raw(const ::std::string& value); + inline void set_raw(const char* value); + inline void set_raw(const void* value, size_t size); + inline ::std::string* mutable_raw(); + + // optional int32 raw_size = 2; + inline bool has_raw_size() const; + inline void clear_raw_size(); + static const int kRawSizeFieldNumber = 2; + inline ::google::protobuf::int32 raw_size() const; + inline void set_raw_size(::google::protobuf::int32 value); + + // optional bytes zlib_data = 3; + inline bool has_zlib_data() const; + inline void clear_zlib_data(); + static const int kZlibDataFieldNumber = 3; + inline const ::std::string& zlib_data() const; + inline void set_zlib_data(const ::std::string& value); + inline void set_zlib_data(const char* value); + inline void set_zlib_data(const void* value, size_t size); + inline ::std::string* mutable_zlib_data(); + + // optional bytes lzma_data = 4; + inline bool has_lzma_data() const; + inline void clear_lzma_data(); + static const int kLzmaDataFieldNumber = 4; + inline const ::std::string& lzma_data() const; + inline void set_lzma_data(const ::std::string& value); + inline void set_lzma_data(const char* value); + inline void set_lzma_data(const void* value, size_t size); + inline ::std::string* mutable_lzma_data(); + + // optional bytes OBSOLETE_bzip2_data = 5 [deprecated = true]; + inline bool has_obsolete_bzip2_data() const PROTOBUF_DEPRECATED; + inline void clear_obsolete_bzip2_data() PROTOBUF_DEPRECATED; + static const int kOBSOLETEBzip2DataFieldNumber = 5; + inline const ::std::string& obsolete_bzip2_data() const PROTOBUF_DEPRECATED; + inline void set_obsolete_bzip2_data(const ::std::string& value) PROTOBUF_DEPRECATED; + inline void set_obsolete_bzip2_data(const char* value) PROTOBUF_DEPRECATED; + inline void set_obsolete_bzip2_data(const void* value, size_t size) PROTOBUF_DEPRECATED; + inline ::std::string* mutable_obsolete_bzip2_data() PROTOBUF_DEPRECATED; + + // @@protoc_insertion_point(class_scope:OSMPBF.Blob) + private: + mutable int _cached_size_; + + ::std::string* raw_; + static const ::std::string _default_raw_; + ::google::protobuf::int32 raw_size_; + ::std::string* zlib_data_; + static const ::std::string _default_zlib_data_; + ::std::string* lzma_data_; + static const ::std::string _default_lzma_data_; + ::std::string* obsolete_bzip2_data_; + static const ::std::string _default_obsolete_bzip2_data_; + friend void protobuf_AddDesc_fileformat_2eproto(); + friend void protobuf_AssignDesc_fileformat_2eproto(); + friend void protobuf_ShutdownFile_fileformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(5 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static Blob* default_instance_; +}; +// ------------------------------------------------------------------- + +class BlobHeader : public ::google::protobuf::MessageLite { + public: + BlobHeader(); + virtual ~BlobHeader(); + + BlobHeader(const BlobHeader& from); + + inline BlobHeader& operator=(const BlobHeader& from) { + CopyFrom(from); + return *this; + } + + static const BlobHeader& default_instance(); + + void Swap(BlobHeader* other); + + // implements Message ---------------------------------------------- + + BlobHeader* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const BlobHeader& from); + void MergeFrom(const BlobHeader& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // required string type = 1; + inline bool has_type() const; + inline void clear_type(); + static const int kTypeFieldNumber = 1; + inline const ::std::string& type() const; + inline void set_type(const ::std::string& value); + inline void set_type(const char* value); + inline void set_type(const char* value, size_t size); + inline ::std::string* mutable_type(); + + // optional bytes indexdata = 2; + inline bool has_indexdata() const; + inline void clear_indexdata(); + static const int kIndexdataFieldNumber = 2; + inline const ::std::string& indexdata() const; + inline void set_indexdata(const ::std::string& value); + inline void set_indexdata(const char* value); + inline void set_indexdata(const void* value, size_t size); + inline ::std::string* mutable_indexdata(); + + // required int32 datasize = 3; + inline bool has_datasize() const; + inline void clear_datasize(); + static const int kDatasizeFieldNumber = 3; + inline ::google::protobuf::int32 datasize() const; + inline void set_datasize(::google::protobuf::int32 value); + + // @@protoc_insertion_point(class_scope:OSMPBF.BlobHeader) + private: + mutable int _cached_size_; + + ::std::string* type_; + static const ::std::string _default_type_; + ::std::string* indexdata_; + static const ::std::string _default_indexdata_; + ::google::protobuf::int32 datasize_; + friend void protobuf_AddDesc_fileformat_2eproto(); + friend void protobuf_AssignDesc_fileformat_2eproto(); + friend void protobuf_ShutdownFile_fileformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static BlobHeader* default_instance_; +}; +// =================================================================== + + +// =================================================================== + +// Blob + +// optional bytes raw = 1; +inline bool Blob::has_raw() const { + return _has_bit(0); +} +inline void Blob::clear_raw() { + if (raw_ != &_default_raw_) { + raw_->clear(); + } + _clear_bit(0); +} +inline const ::std::string& Blob::raw() const { + return *raw_; +} +inline void Blob::set_raw(const ::std::string& value) { + _set_bit(0); + if (raw_ == &_default_raw_) { + raw_ = new ::std::string; + } + raw_->assign(value); +} +inline void Blob::set_raw(const char* value) { + _set_bit(0); + if (raw_ == &_default_raw_) { + raw_ = new ::std::string; + } + raw_->assign(value); +} +inline void Blob::set_raw(const void* value, size_t size) { + _set_bit(0); + if (raw_ == &_default_raw_) { + raw_ = new ::std::string; + } + raw_->assign(reinterpret_cast<const char*>(value), size); +} +inline ::std::string* Blob::mutable_raw() { + _set_bit(0); + if (raw_ == &_default_raw_) { + raw_ = new ::std::string; + } + return raw_; +} + +// optional int32 raw_size = 2; +inline bool Blob::has_raw_size() const { + return _has_bit(1); +} +inline void Blob::clear_raw_size() { + raw_size_ = 0; + _clear_bit(1); +} +inline ::google::protobuf::int32 Blob::raw_size() const { + return raw_size_; +} +inline void Blob::set_raw_size(::google::protobuf::int32 value) { + _set_bit(1); + raw_size_ = value; +} + +// optional bytes zlib_data = 3; +inline bool Blob::has_zlib_data() const { + return _has_bit(2); +} +inline void Blob::clear_zlib_data() { + if (zlib_data_ != &_default_zlib_data_) { + zlib_data_->clear(); + } + _clear_bit(2); +} +inline const ::std::string& Blob::zlib_data() const { + return *zlib_data_; +} +inline void Blob::set_zlib_data(const ::std::string& value) { + _set_bit(2); + if (zlib_data_ == &_default_zlib_data_) { + zlib_data_ = new ::std::string; + } + zlib_data_->assign(value); +} +inline void Blob::set_zlib_data(const char* value) { + _set_bit(2); + if (zlib_data_ == &_default_zlib_data_) { + zlib_data_ = new ::std::string; + } + zlib_data_->assign(value); +} +inline void Blob::set_zlib_data(const void* value, size_t size) { + _set_bit(2); + if (zlib_data_ == &_default_zlib_data_) { + zlib_data_ = new ::std::string; + } + zlib_data_->assign(reinterpret_cast<const char*>(value), size); +} +inline ::std::string* Blob::mutable_zlib_data() { + _set_bit(2); + if (zlib_data_ == &_default_zlib_data_) { + zlib_data_ = new ::std::string; + } + return zlib_data_; +} + +// optional bytes lzma_data = 4; +inline bool Blob::has_lzma_data() const { + return _has_bit(3); +} +inline void Blob::clear_lzma_data() { + if (lzma_data_ != &_default_lzma_data_) { + lzma_data_->clear(); + } + _clear_bit(3); +} +inline const ::std::string& Blob::lzma_data() const { + return *lzma_data_; +} +inline void Blob::set_lzma_data(const ::std::string& value) { + _set_bit(3); + if (lzma_data_ == &_default_lzma_data_) { + lzma_data_ = new ::std::string; + } + lzma_data_->assign(value); +} +inline void Blob::set_lzma_data(const char* value) { + _set_bit(3); + if (lzma_data_ == &_default_lzma_data_) { + lzma_data_ = new ::std::string; + } + lzma_data_->assign(value); +} +inline void Blob::set_lzma_data(const void* value, size_t size) { + _set_bit(3); + if (lzma_data_ == &_default_lzma_data_) { + lzma_data_ = new ::std::string; + } + lzma_data_->assign(reinterpret_cast<const char*>(value), size); +} +inline ::std::string* Blob::mutable_lzma_data() { + _set_bit(3); + if (lzma_data_ == &_default_lzma_data_) { + lzma_data_ = new ::std::string; + } + return lzma_data_; +} + +// optional bytes OBSOLETE_bzip2_data = 5 [deprecated = true]; +inline bool Blob::has_obsolete_bzip2_data() const { + return _has_bit(4); +} +inline void Blob::clear_obsolete_bzip2_data() { + if (obsolete_bzip2_data_ != &_default_obsolete_bzip2_data_) { + obsolete_bzip2_data_->clear(); + } + _clear_bit(4); +} +inline const ::std::string& Blob::obsolete_bzip2_data() const { + return *obsolete_bzip2_data_; +} +inline void Blob::set_obsolete_bzip2_data(const ::std::string& value) { + _set_bit(4); + if (obsolete_bzip2_data_ == &_default_obsolete_bzip2_data_) { + obsolete_bzip2_data_ = new ::std::string; + } + obsolete_bzip2_data_->assign(value); +} +inline void Blob::set_obsolete_bzip2_data(const char* value) { + _set_bit(4); + if (obsolete_bzip2_data_ == &_default_obsolete_bzip2_data_) { + obsolete_bzip2_data_ = new ::std::string; + } + obsolete_bzip2_data_->assign(value); +} +inline void Blob::set_obsolete_bzip2_data(const void* value, size_t size) { + _set_bit(4); + if (obsolete_bzip2_data_ == &_default_obsolete_bzip2_data_) { + obsolete_bzip2_data_ = new ::std::string; + } + obsolete_bzip2_data_->assign(reinterpret_cast<const char*>(value), size); +} +inline ::std::string* Blob::mutable_obsolete_bzip2_data() { + _set_bit(4); + if (obsolete_bzip2_data_ == &_default_obsolete_bzip2_data_) { + obsolete_bzip2_data_ = new ::std::string; + } + return obsolete_bzip2_data_; +} + +// ------------------------------------------------------------------- + +// BlobHeader + +// required string type = 1; +inline bool BlobHeader::has_type() const { + return _has_bit(0); +} +inline void BlobHeader::clear_type() { + if (type_ != &_default_type_) { + type_->clear(); + } + _clear_bit(0); +} +inline const ::std::string& BlobHeader::type() const { + return *type_; +} +inline void BlobHeader::set_type(const ::std::string& value) { + _set_bit(0); + if (type_ == &_default_type_) { + type_ = new ::std::string; + } + type_->assign(value); +} +inline void BlobHeader::set_type(const char* value) { + _set_bit(0); + if (type_ == &_default_type_) { + type_ = new ::std::string; + } + type_->assign(value); +} +inline void BlobHeader::set_type(const char* value, size_t size) { + _set_bit(0); + if (type_ == &_default_type_) { + type_ = new ::std::string; + } + type_->assign(reinterpret_cast<const char*>(value), size); +} +inline ::std::string* BlobHeader::mutable_type() { + _set_bit(0); + if (type_ == &_default_type_) { + type_ = new ::std::string; + } + return type_; +} + +// optional bytes indexdata = 2; +inline bool BlobHeader::has_indexdata() const { + return _has_bit(1); +} +inline void BlobHeader::clear_indexdata() { + if (indexdata_ != &_default_indexdata_) { + indexdata_->clear(); + } + _clear_bit(1); +} +inline const ::std::string& BlobHeader::indexdata() const { + return *indexdata_; +} +inline void BlobHeader::set_indexdata(const ::std::string& value) { + _set_bit(1); + if (indexdata_ == &_default_indexdata_) { + indexdata_ = new ::std::string; + } + indexdata_->assign(value); +} +inline void BlobHeader::set_indexdata(const char* value) { + _set_bit(1); + if (indexdata_ == &_default_indexdata_) { + indexdata_ = new ::std::string; + } + indexdata_->assign(value); +} +inline void BlobHeader::set_indexdata(const void* value, size_t size) { + _set_bit(1); + if (indexdata_ == &_default_indexdata_) { + indexdata_ = new ::std::string; + } + indexdata_->assign(reinterpret_cast<const char*>(value), size); +} +inline ::std::string* BlobHeader::mutable_indexdata() { + _set_bit(1); + if (indexdata_ == &_default_indexdata_) { + indexdata_ = new ::std::string; + } + return indexdata_; +} + +// required int32 datasize = 3; +inline bool BlobHeader::has_datasize() const { + return _has_bit(2); +} +inline void BlobHeader::clear_datasize() { + datasize_ = 0; + _clear_bit(2); +} +inline ::google::protobuf::int32 BlobHeader::datasize() const { + return datasize_; +} +inline void BlobHeader::set_datasize(::google::protobuf::int32 value) { + _set_bit(2); + datasize_ = value; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace OSMPBF + +// @@protoc_insertion_point(global_scope) + +#endif // PROTOBUF_fileformat_2eproto__INCLUDED diff --git a/src/ImportExport/fileformat.proto b/src/ImportExport/fileformat.proto new file mode 100644 index 0000000..c9f3874 --- /dev/null +++ b/src/ImportExport/fileformat.proto @@ -0,0 +1,56 @@ +/** Copyright (c) 2010 Scott A. Crosby. <scott@sacrosby.com> + + This program 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 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +*/ + +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; +option java_package = "crosby.binary"; +package OSMPBF; + +//protoc --java_out=../.. fileformat.proto + + +// +// STORAGE LAYER: Storing primitives. +// + +message Blob { + optional bytes raw = 1; // No compression + optional int32 raw_size = 2; // When compressed, the uncompressed size + + // Possible compressed versions of the data. + optional bytes zlib_data = 3; + + // PROPOSED feature for LZMA compressed data. SUPPORT IS NOT REQUIRED. + optional bytes lzma_data = 4; + + // Formerly used for bzip2 compressed data. Depreciated in 2010. + optional bytes OBSOLETE_bzip2_data = 5 [deprecated=true]; // Don't reuse this tag number. +} + +/* A file contains an sequence of fileblock headers, each prefixed by +their length in network byte order, followed by a data block +containing the actual data. types staring with a "_" are reserved. +*/ + +message BlobHeader { + required string type = 1; + optional bytes indexdata = 2; + required int32 datasize = 3; +} + + diff --git a/src/ImportExport/osmformat.pb.cc b/src/ImportExport/osmformat.pb.cc new file mode 100644 index 0000000..b646c95 --- /dev/null +++ b/src/ImportExport/osmformat.pb.cc @@ -0,0 +1,3824 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! + +#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION +#include "osmformat.pb.h" +#include <google/protobuf/stubs/once.h> +#include <google/protobuf/io/coded_stream.h> +#include <google/protobuf/wire_format_lite_inl.h> +// @@protoc_insertion_point(includes) + +namespace OSMPBF { + +void protobuf_ShutdownFile_osmformat_2eproto() { + delete HeaderBlock::default_instance_; + delete HeaderBBox::default_instance_; + delete PrimitiveBlock::default_instance_; + delete PrimitiveGroup::default_instance_; + delete StringTable::default_instance_; + delete Info::default_instance_; + delete DenseInfo::default_instance_; + delete ChangeSet::default_instance_; + delete Node::default_instance_; + delete DenseNodes::default_instance_; + delete Way::default_instance_; + delete Relation::default_instance_; +} + +void protobuf_AddDesc_osmformat_2eproto() { + static bool already_here = false; + if (already_here) return; + already_here = true; + GOOGLE_PROTOBUF_VERIFY_VERSION; + + HeaderBlock::default_instance_ = new HeaderBlock(); + HeaderBBox::default_instance_ = new HeaderBBox(); + PrimitiveBlock::default_instance_ = new PrimitiveBlock(); + PrimitiveGroup::default_instance_ = new PrimitiveGroup(); + StringTable::default_instance_ = new StringTable(); + Info::default_instance_ = new Info(); + DenseInfo::default_instance_ = new DenseInfo(); + ChangeSet::default_instance_ = new ChangeSet(); + Node::default_instance_ = new Node(); + DenseNodes::default_instance_ = new DenseNodes(); + Way::default_instance_ = new Way(); + Relation::default_instance_ = new Relation(); + HeaderBlock::default_instance_->InitAsDefaultInstance(); + HeaderBBox::default_instance_->InitAsDefaultInstance(); + PrimitiveBlock::default_instance_->InitAsDefaultInstance(); + PrimitiveGroup::default_instance_->InitAsDefaultInstance(); + StringTable::default_instance_->InitAsDefaultInstance(); + Info::default_instance_->InitAsDefaultInstance(); + DenseInfo::default_instance_->InitAsDefaultInstance(); + ChangeSet::default_instance_->InitAsDefaultInstance(); + Node::default_instance_->InitAsDefaultInstance(); + DenseNodes::default_instance_->InitAsDefaultInstance(); + Way::default_instance_->InitAsDefaultInstance(); + Relation::default_instance_->InitAsDefaultInstance(); + ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_osmformat_2eproto); +} + +// Force AddDescriptors() to be called at static initialization time. +struct StaticDescriptorInitializer_osmformat_2eproto { + StaticDescriptorInitializer_osmformat_2eproto() { + protobuf_AddDesc_osmformat_2eproto(); + } +} static_descriptor_initializer_osmformat_2eproto_; + + +// =================================================================== + +const ::std::string HeaderBlock::_default_writingprogram_; +const ::std::string HeaderBlock::_default_source_; +#ifndef _MSC_VER +const int HeaderBlock::kBboxFieldNumber; +const int HeaderBlock::kRequiredFeaturesFieldNumber; +const int HeaderBlock::kOptionalFeaturesFieldNumber; +const int HeaderBlock::kWritingprogramFieldNumber; +const int HeaderBlock::kSourceFieldNumber; +#endif // !_MSC_VER + +HeaderBlock::HeaderBlock() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void HeaderBlock::InitAsDefaultInstance() { + bbox_ = const_cast< ::OSMPBF::HeaderBBox*>(&::OSMPBF::HeaderBBox::default_instance()); +} + +HeaderBlock::HeaderBlock(const HeaderBlock& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void HeaderBlock::SharedCtor() { + _cached_size_ = 0; + bbox_ = NULL; + writingprogram_ = const_cast< ::std::string*>(&_default_writingprogram_); + source_ = const_cast< ::std::string*>(&_default_source_); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +HeaderBlock::~HeaderBlock() { + SharedDtor(); +} + +void HeaderBlock::SharedDtor() { + if (writingprogram_ != &_default_writingprogram_) { + delete writingprogram_; + } + if (source_ != &_default_source_) { + delete source_; + } + if (this != default_instance_) { + delete bbox_; + } +} + +void HeaderBlock::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const HeaderBlock& HeaderBlock::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_osmformat_2eproto(); return *default_instance_; +} + +HeaderBlock* HeaderBlock::default_instance_ = NULL; + +HeaderBlock* HeaderBlock::New() const { + return new HeaderBlock; +} + +void HeaderBlock::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (_has_bit(0)) { + if (bbox_ != NULL) bbox_->::OSMPBF::HeaderBBox::Clear(); + } + if (_has_bit(3)) { + if (writingprogram_ != &_default_writingprogram_) { + writingprogram_->clear(); + } + } + if (_has_bit(4)) { + if (source_ != &_default_source_) { + source_->clear(); + } + } + } + required_features_.Clear(); + optional_features_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool HeaderBlock::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional .OSMPBF.HeaderBBox bbox = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_bbox())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_required_features; + break; + } + + // repeated string required_features = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_required_features: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->add_required_features())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_required_features; + if (input->ExpectTag(42)) goto parse_optional_features; + break; + } + + // repeated string optional_features = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_optional_features: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->add_optional_features())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_optional_features; + if (input->ExpectTag(130)) goto parse_writingprogram; + break; + } + + // optional string writingprogram = 16; + case 16: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_writingprogram: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_writingprogram())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(138)) goto parse_source; + break; + } + + // optional string source = 17; + case 17: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_source: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_source())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void HeaderBlock::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional .OSMPBF.HeaderBBox bbox = 1; + if (_has_bit(0)) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 1, this->bbox(), output); + } + + // repeated string required_features = 4; + for (int i = 0; i < this->required_features_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteString( + 4, this->required_features(i), output); + } + + // repeated string optional_features = 5; + for (int i = 0; i < this->optional_features_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteString( + 5, this->optional_features(i), output); + } + + // optional string writingprogram = 16; + if (_has_bit(3)) { + ::google::protobuf::internal::WireFormatLite::WriteString( + 16, this->writingprogram(), output); + } + + // optional string source = 17; + if (_has_bit(4)) { + ::google::protobuf::internal::WireFormatLite::WriteString( + 17, this->source(), output); + } + +} + +int HeaderBlock::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional .OSMPBF.HeaderBBox bbox = 1; + if (has_bbox()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->bbox()); + } + + // optional string writingprogram = 16; + if (has_writingprogram()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->writingprogram()); + } + + // optional string source = 17; + if (has_source()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->source()); + } + + } + // repeated string required_features = 4; + total_size += 1 * this->required_features_size(); + for (int i = 0; i < this->required_features_size(); i++) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this->required_features(i)); + } + + // repeated string optional_features = 5; + total_size += 1 * this->optional_features_size(); + for (int i = 0; i < this->optional_features_size(); i++) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this->optional_features(i)); + } + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void HeaderBlock::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const HeaderBlock*>(&from)); +} + +void HeaderBlock::MergeFrom(const HeaderBlock& from) { + GOOGLE_CHECK_NE(&from, this); + required_features_.MergeFrom(from.required_features_); + optional_features_.MergeFrom(from.optional_features_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from._has_bit(0)) { + mutable_bbox()->::OSMPBF::HeaderBBox::MergeFrom(from.bbox()); + } + if (from._has_bit(3)) { + set_writingprogram(from.writingprogram()); + } + if (from._has_bit(4)) { + set_source(from.source()); + } + } +} + +void HeaderBlock::CopyFrom(const HeaderBlock& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool HeaderBlock::IsInitialized() const { + + if (has_bbox()) { + if (!this->bbox().IsInitialized()) return false; + } + return true; +} + +void HeaderBlock::Swap(HeaderBlock* other) { + if (other != this) { + std::swap(bbox_, other->bbox_); + required_features_.Swap(&other->required_features_); + optional_features_.Swap(&other->optional_features_); + std::swap(writingprogram_, other->writingprogram_); + std::swap(source_, other->source_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string HeaderBlock::GetTypeName() const { + return "OSMPBF.HeaderBlock"; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int HeaderBBox::kLeftFieldNumber; +const int HeaderBBox::kRightFieldNumber; +const int HeaderBBox::kTopFieldNumber; +const int HeaderBBox::kBottomFieldNumber; +#endif // !_MSC_VER + +HeaderBBox::HeaderBBox() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void HeaderBBox::InitAsDefaultInstance() { +} + +HeaderBBox::HeaderBBox(const HeaderBBox& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void HeaderBBox::SharedCtor() { + _cached_size_ = 0; + left_ = GOOGLE_LONGLONG(0); + right_ = GOOGLE_LONGLONG(0); + top_ = GOOGLE_LONGLONG(0); + bottom_ = GOOGLE_LONGLONG(0); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +HeaderBBox::~HeaderBBox() { + SharedDtor(); +} + +void HeaderBBox::SharedDtor() { + if (this != default_instance_) { + } +} + +void HeaderBBox::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const HeaderBBox& HeaderBBox::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_osmformat_2eproto(); return *default_instance_; +} + +HeaderBBox* HeaderBBox::default_instance_ = NULL; + +HeaderBBox* HeaderBBox::New() const { + return new HeaderBBox; +} + +void HeaderBBox::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + left_ = GOOGLE_LONGLONG(0); + right_ = GOOGLE_LONGLONG(0); + top_ = GOOGLE_LONGLONG(0); + bottom_ = GOOGLE_LONGLONG(0); + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool HeaderBBox::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // required sint64 left = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, &left_))); + _set_bit(0); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(16)) goto parse_right; + break; + } + + // required sint64 right = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_right: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, &right_))); + _set_bit(1); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(24)) goto parse_top; + break; + } + + // required sint64 top = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_top: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, &top_))); + _set_bit(2); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(32)) goto parse_bottom; + break; + } + + // required sint64 bottom = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_bottom: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, &bottom_))); + _set_bit(3); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void HeaderBBox::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // required sint64 left = 1; + if (_has_bit(0)) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64(1, this->left(), output); + } + + // required sint64 right = 2; + if (_has_bit(1)) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64(2, this->right(), output); + } + + // required sint64 top = 3; + if (_has_bit(2)) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64(3, this->top(), output); + } + + // required sint64 bottom = 4; + if (_has_bit(3)) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64(4, this->bottom(), output); + } + +} + +int HeaderBBox::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // required sint64 left = 1; + if (has_left()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::SInt64Size( + this->left()); + } + + // required sint64 right = 2; + if (has_right()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::SInt64Size( + this->right()); + } + + // required sint64 top = 3; + if (has_top()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::SInt64Size( + this->top()); + } + + // required sint64 bottom = 4; + if (has_bottom()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::SInt64Size( + this->bottom()); + } + + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void HeaderBBox::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const HeaderBBox*>(&from)); +} + +void HeaderBBox::MergeFrom(const HeaderBBox& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from._has_bit(0)) { + set_left(from.left()); + } + if (from._has_bit(1)) { + set_right(from.right()); + } + if (from._has_bit(2)) { + set_top(from.top()); + } + if (from._has_bit(3)) { + set_bottom(from.bottom()); + } + } +} + +void HeaderBBox::CopyFrom(const HeaderBBox& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool HeaderBBox::IsInitialized() const { + if ((_has_bits_[0] & 0x0000000f) != 0x0000000f) return false; + + return true; +} + +void HeaderBBox::Swap(HeaderBBox* other) { + if (other != this) { + std::swap(left_, other->left_); + std::swap(right_, other->right_); + std::swap(top_, other->top_); + std::swap(bottom_, other->bottom_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string HeaderBBox::GetTypeName() const { + return "OSMPBF.HeaderBBox"; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int PrimitiveBlock::kStringtableFieldNumber; +const int PrimitiveBlock::kPrimitivegroupFieldNumber; +const int PrimitiveBlock::kGranularityFieldNumber; +const int PrimitiveBlock::kLatOffsetFieldNumber; +const int PrimitiveBlock::kLonOffsetFieldNumber; +const int PrimitiveBlock::kDateGranularityFieldNumber; +#endif // !_MSC_VER + +PrimitiveBlock::PrimitiveBlock() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void PrimitiveBlock::InitAsDefaultInstance() { + stringtable_ = const_cast< ::OSMPBF::StringTable*>(&::OSMPBF::StringTable::default_instance()); +} + +PrimitiveBlock::PrimitiveBlock(const PrimitiveBlock& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void PrimitiveBlock::SharedCtor() { + _cached_size_ = 0; + stringtable_ = NULL; + granularity_ = 100; + lat_offset_ = GOOGLE_LONGLONG(0); + lon_offset_ = GOOGLE_LONGLONG(0); + date_granularity_ = 1000; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +PrimitiveBlock::~PrimitiveBlock() { + SharedDtor(); +} + +void PrimitiveBlock::SharedDtor() { + if (this != default_instance_) { + delete stringtable_; + } +} + +void PrimitiveBlock::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const PrimitiveBlock& PrimitiveBlock::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_osmformat_2eproto(); return *default_instance_; +} + +PrimitiveBlock* PrimitiveBlock::default_instance_ = NULL; + +PrimitiveBlock* PrimitiveBlock::New() const { + return new PrimitiveBlock; +} + +void PrimitiveBlock::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (_has_bit(0)) { + if (stringtable_ != NULL) stringtable_->::OSMPBF::StringTable::Clear(); + } + granularity_ = 100; + lat_offset_ = GOOGLE_LONGLONG(0); + lon_offset_ = GOOGLE_LONGLONG(0); + date_granularity_ = 1000; + } + primitivegroup_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool PrimitiveBlock::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // required .OSMPBF.StringTable stringtable = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_stringtable())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_primitivegroup; + break; + } + + // repeated .OSMPBF.PrimitiveGroup primitivegroup = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_primitivegroup: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_primitivegroup())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_primitivegroup; + if (input->ExpectTag(136)) goto parse_granularity; + break; + } + + // optional int32 granularity = 17 [default = 100]; + case 17: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_granularity: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &granularity_))); + _set_bit(2); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(144)) goto parse_date_granularity; + break; + } + + // optional int32 date_granularity = 18 [default = 1000]; + case 18: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_date_granularity: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &date_granularity_))); + _set_bit(5); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(152)) goto parse_lat_offset; + break; + } + + // optional int64 lat_offset = 19 [default = 0]; + case 19: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_lat_offset: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &lat_offset_))); + _set_bit(3); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(160)) goto parse_lon_offset; + break; + } + + // optional int64 lon_offset = 20 [default = 0]; + case 20: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_lon_offset: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &lon_offset_))); + _set_bit(4); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void PrimitiveBlock::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // required .OSMPBF.StringTable stringtable = 1; + if (_has_bit(0)) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 1, this->stringtable(), output); + } + + // repeated .OSMPBF.PrimitiveGroup primitivegroup = 2; + for (int i = 0; i < this->primitivegroup_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 2, this->primitivegroup(i), output); + } + + // optional int32 granularity = 17 [default = 100]; + if (_has_bit(2)) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(17, this->granularity(), output); + } + + // optional int32 date_granularity = 18 [default = 1000]; + if (_has_bit(5)) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(18, this->date_granularity(), output); + } + + // optional int64 lat_offset = 19 [default = 0]; + if (_has_bit(3)) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(19, this->lat_offset(), output); + } + + // optional int64 lon_offset = 20 [default = 0]; + if (_has_bit(4)) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(20, this->lon_offset(), output); + } + +} + +int PrimitiveBlock::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // required .OSMPBF.StringTable stringtable = 1; + if (has_stringtable()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->stringtable()); + } + + // optional int32 granularity = 17 [default = 100]; + if (has_granularity()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->granularity()); + } + + // optional int64 lat_offset = 19 [default = 0]; + if (has_lat_offset()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->lat_offset()); + } + + // optional int64 lon_offset = 20 [default = 0]; + if (has_lon_offset()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->lon_offset()); + } + + // optional int32 date_granularity = 18 [default = 1000]; + if (has_date_granularity()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->date_granularity()); + } + + } + // repeated .OSMPBF.PrimitiveGroup primitivegroup = 2; + total_size += 1 * this->primitivegroup_size(); + for (int i = 0; i < this->primitivegroup_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->primitivegroup(i)); + } + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void PrimitiveBlock::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const PrimitiveBlock*>(&from)); +} + +void PrimitiveBlock::MergeFrom(const PrimitiveBlock& from) { + GOOGLE_CHECK_NE(&from, this); + primitivegroup_.MergeFrom(from.primitivegroup_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from._has_bit(0)) { + mutable_stringtable()->::OSMPBF::StringTable::MergeFrom(from.stringtable()); + } + if (from._has_bit(2)) { + set_granularity(from.granularity()); + } + if (from._has_bit(3)) { + set_lat_offset(from.lat_offset()); + } + if (from._has_bit(4)) { + set_lon_offset(from.lon_offset()); + } + if (from._has_bit(5)) { + set_date_granularity(from.date_granularity()); + } + } +} + +void PrimitiveBlock::CopyFrom(const PrimitiveBlock& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool PrimitiveBlock::IsInitialized() const { + if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; + + for (int i = 0; i < primitivegroup_size(); i++) { + if (!this->primitivegroup(i).IsInitialized()) return false; + } + return true; +} + +void PrimitiveBlock::Swap(PrimitiveBlock* other) { + if (other != this) { + std::swap(stringtable_, other->stringtable_); + primitivegroup_.Swap(&other->primitivegroup_); + std::swap(granularity_, other->granularity_); + std::swap(lat_offset_, other->lat_offset_); + std::swap(lon_offset_, other->lon_offset_); + std::swap(date_granularity_, other->date_granularity_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string PrimitiveBlock::GetTypeName() const { + return "OSMPBF.PrimitiveBlock"; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int PrimitiveGroup::kNodesFieldNumber; +const int PrimitiveGroup::kDenseFieldNumber; +const int PrimitiveGroup::kWaysFieldNumber; +const int PrimitiveGroup::kRelationsFieldNumber; +const int PrimitiveGroup::kChangesetsFieldNumber; +#endif // !_MSC_VER + +PrimitiveGroup::PrimitiveGroup() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void PrimitiveGroup::InitAsDefaultInstance() { + dense_ = const_cast< ::OSMPBF::DenseNodes*>(&::OSMPBF::DenseNodes::default_instance()); +} + +PrimitiveGroup::PrimitiveGroup(const PrimitiveGroup& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void PrimitiveGroup::SharedCtor() { + _cached_size_ = 0; + dense_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +PrimitiveGroup::~PrimitiveGroup() { + SharedDtor(); +} + +void PrimitiveGroup::SharedDtor() { + if (this != default_instance_) { + delete dense_; + } +} + +void PrimitiveGroup::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const PrimitiveGroup& PrimitiveGroup::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_osmformat_2eproto(); return *default_instance_; +} + +PrimitiveGroup* PrimitiveGroup::default_instance_ = NULL; + +PrimitiveGroup* PrimitiveGroup::New() const { + return new PrimitiveGroup; +} + +void PrimitiveGroup::Clear() { + if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { + if (_has_bit(1)) { + if (dense_ != NULL) dense_->::OSMPBF::DenseNodes::Clear(); + } + } + nodes_.Clear(); + ways_.Clear(); + relations_.Clear(); + changesets_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool PrimitiveGroup::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .OSMPBF.Node nodes = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_nodes: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_nodes())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(10)) goto parse_nodes; + if (input->ExpectTag(18)) goto parse_dense; + break; + } + + // optional .OSMPBF.DenseNodes dense = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_dense: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_dense())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_ways; + break; + } + + // repeated .OSMPBF.Way ways = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_ways: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_ways())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_ways; + if (input->ExpectTag(34)) goto parse_relations; + break; + } + + // repeated .OSMPBF.Relation relations = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_relations: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_relations())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_relations; + if (input->ExpectTag(42)) goto parse_changesets; + break; + } + + // repeated .OSMPBF.ChangeSet changesets = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_changesets: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_changesets())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_changesets; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void PrimitiveGroup::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .OSMPBF.Node nodes = 1; + for (int i = 0; i < this->nodes_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 1, this->nodes(i), output); + } + + // optional .OSMPBF.DenseNodes dense = 2; + if (_has_bit(1)) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 2, this->dense(), output); + } + + // repeated .OSMPBF.Way ways = 3; + for (int i = 0; i < this->ways_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 3, this->ways(i), output); + } + + // repeated .OSMPBF.Relation relations = 4; + for (int i = 0; i < this->relations_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 4, this->relations(i), output); + } + + // repeated .OSMPBF.ChangeSet changesets = 5; + for (int i = 0; i < this->changesets_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 5, this->changesets(i), output); + } + +} + +int PrimitiveGroup::ByteSize() const { + int total_size = 0; + + if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { + // optional .OSMPBF.DenseNodes dense = 2; + if (has_dense()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->dense()); + } + + } + // repeated .OSMPBF.Node nodes = 1; + total_size += 1 * this->nodes_size(); + for (int i = 0; i < this->nodes_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->nodes(i)); + } + + // repeated .OSMPBF.Way ways = 3; + total_size += 1 * this->ways_size(); + for (int i = 0; i < this->ways_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->ways(i)); + } + + // repeated .OSMPBF.Relation relations = 4; + total_size += 1 * this->relations_size(); + for (int i = 0; i < this->relations_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->relations(i)); + } + + // repeated .OSMPBF.ChangeSet changesets = 5; + total_size += 1 * this->changesets_size(); + for (int i = 0; i < this->changesets_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->changesets(i)); + } + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void PrimitiveGroup::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const PrimitiveGroup*>(&from)); +} + +void PrimitiveGroup::MergeFrom(const PrimitiveGroup& from) { + GOOGLE_CHECK_NE(&from, this); + nodes_.MergeFrom(from.nodes_); + ways_.MergeFrom(from.ways_); + relations_.MergeFrom(from.relations_); + changesets_.MergeFrom(from.changesets_); + if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) { + if (from._has_bit(1)) { + mutable_dense()->::OSMPBF::DenseNodes::MergeFrom(from.dense()); + } + } +} + +void PrimitiveGroup::CopyFrom(const PrimitiveGroup& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool PrimitiveGroup::IsInitialized() const { + + for (int i = 0; i < nodes_size(); i++) { + if (!this->nodes(i).IsInitialized()) return false; + } + for (int i = 0; i < ways_size(); i++) { + if (!this->ways(i).IsInitialized()) return false; + } + for (int i = 0; i < relations_size(); i++) { + if (!this->relations(i).IsInitialized()) return false; + } + for (int i = 0; i < changesets_size(); i++) { + if (!this->changesets(i).IsInitialized()) return false; + } + return true; +} + +void PrimitiveGroup::Swap(PrimitiveGroup* other) { + if (other != this) { + nodes_.Swap(&other->nodes_); + std::swap(dense_, other->dense_); + ways_.Swap(&other->ways_); + relations_.Swap(&other->relations_); + changesets_.Swap(&other->changesets_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string PrimitiveGroup::GetTypeName() const { + return "OSMPBF.PrimitiveGroup"; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int StringTable::kSFieldNumber; +#endif // !_MSC_VER + +StringTable::StringTable() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void StringTable::InitAsDefaultInstance() { +} + +StringTable::StringTable(const StringTable& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void StringTable::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +StringTable::~StringTable() { + SharedDtor(); +} + +void StringTable::SharedDtor() { + if (this != default_instance_) { + } +} + +void StringTable::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const StringTable& StringTable::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_osmformat_2eproto(); return *default_instance_; +} + +StringTable* StringTable::default_instance_ = NULL; + +StringTable* StringTable::New() const { + return new StringTable; +} + +void StringTable::Clear() { + s_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool StringTable::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated bytes s = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_s: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->add_s())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(10)) goto parse_s; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void StringTable::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated bytes s = 1; + for (int i = 0; i < this->s_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteBytes( + 1, this->s(i), output); + } + +} + +int StringTable::ByteSize() const { + int total_size = 0; + + // repeated bytes s = 1; + total_size += 1 * this->s_size(); + for (int i = 0; i < this->s_size(); i++) { + total_size += ::google::protobuf::internal::WireFormatLite::BytesSize( + this->s(i)); + } + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void StringTable::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const StringTable*>(&from)); +} + +void StringTable::MergeFrom(const StringTable& from) { + GOOGLE_CHECK_NE(&from, this); + s_.MergeFrom(from.s_); +} + +void StringTable::CopyFrom(const StringTable& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool StringTable::IsInitialized() const { + + return true; +} + +void StringTable::Swap(StringTable* other) { + if (other != this) { + s_.Swap(&other->s_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string StringTable::GetTypeName() const { + return "OSMPBF.StringTable"; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Info::kVersionFieldNumber; +const int Info::kTimestampFieldNumber; +const int Info::kChangesetFieldNumber; +const int Info::kUidFieldNumber; +const int Info::kUserSidFieldNumber; +#endif // !_MSC_VER + +Info::Info() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void Info::InitAsDefaultInstance() { +} + +Info::Info(const Info& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void Info::SharedCtor() { + _cached_size_ = 0; + version_ = -1; + timestamp_ = GOOGLE_LONGLONG(0); + changeset_ = GOOGLE_LONGLONG(0); + uid_ = 0; + user_sid_ = 0u; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Info::~Info() { + SharedDtor(); +} + +void Info::SharedDtor() { + if (this != default_instance_) { + } +} + +void Info::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const Info& Info::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_osmformat_2eproto(); return *default_instance_; +} + +Info* Info::default_instance_ = NULL; + +Info* Info::New() const { + return new Info; +} + +void Info::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + version_ = -1; + timestamp_ = GOOGLE_LONGLONG(0); + changeset_ = GOOGLE_LONGLONG(0); + uid_ = 0; + user_sid_ = 0u; + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool Info::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional int32 version = 1 [default = -1]; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &version_))); + _set_bit(0); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(16)) goto parse_timestamp; + break; + } + + // optional int64 timestamp = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_timestamp: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, ×tamp_))); + _set_bit(1); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(24)) goto parse_changeset; + break; + } + + // optional int64 changeset = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_changeset: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &changeset_))); + _set_bit(2); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(32)) goto parse_uid; + break; + } + + // optional int32 uid = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_uid: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &uid_))); + _set_bit(3); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(40)) goto parse_user_sid; + break; + } + + // optional uint32 user_sid = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_user_sid: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + input, &user_sid_))); + _set_bit(4); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void Info::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional int32 version = 1 [default = -1]; + if (_has_bit(0)) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->version(), output); + } + + // optional int64 timestamp = 2; + if (_has_bit(1)) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(2, this->timestamp(), output); + } + + // optional int64 changeset = 3; + if (_has_bit(2)) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(3, this->changeset(), output); + } + + // optional int32 uid = 4; + if (_has_bit(3)) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(4, this->uid(), output); + } + + // optional uint32 user_sid = 5; + if (_has_bit(4)) { + ::google::protobuf::internal::WireFormatLite::WriteUInt32(5, this->user_sid(), output); + } + +} + +int Info::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional int32 version = 1 [default = -1]; + if (has_version()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->version()); + } + + // optional int64 timestamp = 2; + if (has_timestamp()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->timestamp()); + } + + // optional int64 changeset = 3; + if (has_changeset()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->changeset()); + } + + // optional int32 uid = 4; + if (has_uid()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->uid()); + } + + // optional uint32 user_sid = 5; + if (has_user_sid()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt32Size( + this->user_sid()); + } + + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Info::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const Info*>(&from)); +} + +void Info::MergeFrom(const Info& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from._has_bit(0)) { + set_version(from.version()); + } + if (from._has_bit(1)) { + set_timestamp(from.timestamp()); + } + if (from._has_bit(2)) { + set_changeset(from.changeset()); + } + if (from._has_bit(3)) { + set_uid(from.uid()); + } + if (from._has_bit(4)) { + set_user_sid(from.user_sid()); + } + } +} + +void Info::CopyFrom(const Info& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Info::IsInitialized() const { + + return true; +} + +void Info::Swap(Info* other) { + if (other != this) { + std::swap(version_, other->version_); + std::swap(timestamp_, other->timestamp_); + std::swap(changeset_, other->changeset_); + std::swap(uid_, other->uid_); + std::swap(user_sid_, other->user_sid_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string Info::GetTypeName() const { + return "OSMPBF.Info"; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int DenseInfo::kVersionFieldNumber; +const int DenseInfo::kTimestampFieldNumber; +const int DenseInfo::kChangesetFieldNumber; +const int DenseInfo::kUidFieldNumber; +const int DenseInfo::kUserSidFieldNumber; +#endif // !_MSC_VER + +DenseInfo::DenseInfo() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void DenseInfo::InitAsDefaultInstance() { +} + +DenseInfo::DenseInfo(const DenseInfo& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void DenseInfo::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +DenseInfo::~DenseInfo() { + SharedDtor(); +} + +void DenseInfo::SharedDtor() { + if (this != default_instance_) { + } +} + +void DenseInfo::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const DenseInfo& DenseInfo::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_osmformat_2eproto(); return *default_instance_; +} + +DenseInfo* DenseInfo::default_instance_ = NULL; + +DenseInfo* DenseInfo::New() const { + return new DenseInfo; +} + +void DenseInfo::Clear() { + version_.Clear(); + timestamp_.Clear(); + changeset_.Clear(); + uid_.Clear(); + user_sid_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool DenseInfo::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated int32 version = 1 [packed = true]; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, this->mutable_version()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + 1, 10, input, this->mutable_version()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_timestamp; + break; + } + + // repeated sint64 timestamp = 2 [packed = true]; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_timestamp: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, this->mutable_timestamp()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + 1, 18, input, this->mutable_timestamp()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_changeset; + break; + } + + // repeated sint64 changeset = 3 [packed = true]; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_changeset: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, this->mutable_changeset()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + 1, 26, input, this->mutable_changeset()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_uid; + break; + } + + // repeated sint32 uid = 4 [packed = true]; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_uid: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_SINT32>( + input, this->mutable_uid()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_SINT32>( + 1, 34, input, this->mutable_uid()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_user_sid; + break; + } + + // repeated sint32 user_sid = 5 [packed = true]; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_user_sid: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_SINT32>( + input, this->mutable_user_sid()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_SINT32>( + 1, 42, input, this->mutable_user_sid()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void DenseInfo::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated int32 version = 1 [packed = true]; + if (this->version_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(1, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_version_cached_byte_size_); + } + for (int i = 0; i < this->version_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag( + this->version(i), output); + } + + // repeated sint64 timestamp = 2 [packed = true]; + if (this->timestamp_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(2, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_timestamp_cached_byte_size_); + } + for (int i = 0; i < this->timestamp_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64NoTag( + this->timestamp(i), output); + } + + // repeated sint64 changeset = 3 [packed = true]; + if (this->changeset_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(3, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_changeset_cached_byte_size_); + } + for (int i = 0; i < this->changeset_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64NoTag( + this->changeset(i), output); + } + + // repeated sint32 uid = 4 [packed = true]; + if (this->uid_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(4, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_uid_cached_byte_size_); + } + for (int i = 0; i < this->uid_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteSInt32NoTag( + this->uid(i), output); + } + + // repeated sint32 user_sid = 5 [packed = true]; + if (this->user_sid_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(5, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_user_sid_cached_byte_size_); + } + for (int i = 0; i < this->user_sid_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteSInt32NoTag( + this->user_sid(i), output); + } + +} + +int DenseInfo::ByteSize() const { + int total_size = 0; + + // repeated int32 version = 1 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->version_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + Int32Size(this->version(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _version_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated sint64 timestamp = 2 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->timestamp_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + SInt64Size(this->timestamp(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _timestamp_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated sint64 changeset = 3 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->changeset_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + SInt64Size(this->changeset(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _changeset_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated sint32 uid = 4 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->uid_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + SInt32Size(this->uid(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _uid_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated sint32 user_sid = 5 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->user_sid_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + SInt32Size(this->user_sid(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _user_sid_cached_byte_size_ = data_size; + total_size += data_size; + } + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void DenseInfo::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const DenseInfo*>(&from)); +} + +void DenseInfo::MergeFrom(const DenseInfo& from) { + GOOGLE_CHECK_NE(&from, this); + version_.MergeFrom(from.version_); + timestamp_.MergeFrom(from.timestamp_); + changeset_.MergeFrom(from.changeset_); + uid_.MergeFrom(from.uid_); + user_sid_.MergeFrom(from.user_sid_); +} + +void DenseInfo::CopyFrom(const DenseInfo& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool DenseInfo::IsInitialized() const { + + return true; +} + +void DenseInfo::Swap(DenseInfo* other) { + if (other != this) { + version_.Swap(&other->version_); + timestamp_.Swap(&other->timestamp_); + changeset_.Swap(&other->changeset_); + uid_.Swap(&other->uid_); + user_sid_.Swap(&other->user_sid_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string DenseInfo::GetTypeName() const { + return "OSMPBF.DenseInfo"; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int ChangeSet::kIdFieldNumber; +#endif // !_MSC_VER + +ChangeSet::ChangeSet() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void ChangeSet::InitAsDefaultInstance() { +} + +ChangeSet::ChangeSet(const ChangeSet& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void ChangeSet::SharedCtor() { + _cached_size_ = 0; + id_ = GOOGLE_LONGLONG(0); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ChangeSet::~ChangeSet() { + SharedDtor(); +} + +void ChangeSet::SharedDtor() { + if (this != default_instance_) { + } +} + +void ChangeSet::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ChangeSet& ChangeSet::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_osmformat_2eproto(); return *default_instance_; +} + +ChangeSet* ChangeSet::default_instance_ = NULL; + +ChangeSet* ChangeSet::New() const { + return new ChangeSet; +} + +void ChangeSet::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + id_ = GOOGLE_LONGLONG(0); + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool ChangeSet::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // required int64 id = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &id_))); + _set_bit(0); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void ChangeSet::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // required int64 id = 1; + if (_has_bit(0)) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(1, this->id(), output); + } + +} + +int ChangeSet::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // required int64 id = 1; + if (has_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->id()); + } + + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ChangeSet::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const ChangeSet*>(&from)); +} + +void ChangeSet::MergeFrom(const ChangeSet& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from._has_bit(0)) { + set_id(from.id()); + } + } +} + +void ChangeSet::CopyFrom(const ChangeSet& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ChangeSet::IsInitialized() const { + if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; + + return true; +} + +void ChangeSet::Swap(ChangeSet* other) { + if (other != this) { + std::swap(id_, other->id_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ChangeSet::GetTypeName() const { + return "OSMPBF.ChangeSet"; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Node::kIdFieldNumber; +const int Node::kKeysFieldNumber; +const int Node::kValsFieldNumber; +const int Node::kInfoFieldNumber; +const int Node::kLatFieldNumber; +const int Node::kLonFieldNumber; +#endif // !_MSC_VER + +Node::Node() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void Node::InitAsDefaultInstance() { + info_ = const_cast< ::OSMPBF::Info*>(&::OSMPBF::Info::default_instance()); +} + +Node::Node(const Node& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void Node::SharedCtor() { + _cached_size_ = 0; + id_ = GOOGLE_LONGLONG(0); + info_ = NULL; + lat_ = GOOGLE_LONGLONG(0); + lon_ = GOOGLE_LONGLONG(0); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Node::~Node() { + SharedDtor(); +} + +void Node::SharedDtor() { + if (this != default_instance_) { + delete info_; + } +} + +void Node::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const Node& Node::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_osmformat_2eproto(); return *default_instance_; +} + +Node* Node::default_instance_ = NULL; + +Node* Node::New() const { + return new Node; +} + +void Node::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + id_ = GOOGLE_LONGLONG(0); + if (_has_bit(3)) { + if (info_ != NULL) info_->::OSMPBF::Info::Clear(); + } + lat_ = GOOGLE_LONGLONG(0); + lon_ = GOOGLE_LONGLONG(0); + } + keys_.Clear(); + vals_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool Node::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // required sint64 id = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, &id_))); + _set_bit(0); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_keys; + break; + } + + // repeated uint32 keys = 2 [packed = true]; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_keys: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + input, this->mutable_keys()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + 1, 18, input, this->mutable_keys()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_vals; + break; + } + + // repeated uint32 vals = 3 [packed = true]; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_vals: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + input, this->mutable_vals()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + 1, 26, input, this->mutable_vals()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_info; + break; + } + + // optional .OSMPBF.Info info = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_info: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_info())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(64)) goto parse_lat; + break; + } + + // required sint64 lat = 8; + case 8: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_lat: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, &lat_))); + _set_bit(4); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(72)) goto parse_lon; + break; + } + + // required sint64 lon = 9; + case 9: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_lon: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, &lon_))); + _set_bit(5); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void Node::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // required sint64 id = 1; + if (_has_bit(0)) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64(1, this->id(), output); + } + + // repeated uint32 keys = 2 [packed = true]; + if (this->keys_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(2, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_keys_cached_byte_size_); + } + for (int i = 0; i < this->keys_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteUInt32NoTag( + this->keys(i), output); + } + + // repeated uint32 vals = 3 [packed = true]; + if (this->vals_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(3, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_vals_cached_byte_size_); + } + for (int i = 0; i < this->vals_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteUInt32NoTag( + this->vals(i), output); + } + + // optional .OSMPBF.Info info = 4; + if (_has_bit(3)) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 4, this->info(), output); + } + + // required sint64 lat = 8; + if (_has_bit(4)) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64(8, this->lat(), output); + } + + // required sint64 lon = 9; + if (_has_bit(5)) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64(9, this->lon(), output); + } + +} + +int Node::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // required sint64 id = 1; + if (has_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::SInt64Size( + this->id()); + } + + // optional .OSMPBF.Info info = 4; + if (has_info()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->info()); + } + + // required sint64 lat = 8; + if (has_lat()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::SInt64Size( + this->lat()); + } + + // required sint64 lon = 9; + if (has_lon()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::SInt64Size( + this->lon()); + } + + } + // repeated uint32 keys = 2 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->keys_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + UInt32Size(this->keys(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _keys_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated uint32 vals = 3 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->vals_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + UInt32Size(this->vals(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _vals_cached_byte_size_ = data_size; + total_size += data_size; + } + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Node::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const Node*>(&from)); +} + +void Node::MergeFrom(const Node& from) { + GOOGLE_CHECK_NE(&from, this); + keys_.MergeFrom(from.keys_); + vals_.MergeFrom(from.vals_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from._has_bit(0)) { + set_id(from.id()); + } + if (from._has_bit(3)) { + mutable_info()->::OSMPBF::Info::MergeFrom(from.info()); + } + if (from._has_bit(4)) { + set_lat(from.lat()); + } + if (from._has_bit(5)) { + set_lon(from.lon()); + } + } +} + +void Node::CopyFrom(const Node& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Node::IsInitialized() const { + if ((_has_bits_[0] & 0x00000031) != 0x00000031) return false; + + return true; +} + +void Node::Swap(Node* other) { + if (other != this) { + std::swap(id_, other->id_); + keys_.Swap(&other->keys_); + vals_.Swap(&other->vals_); + std::swap(info_, other->info_); + std::swap(lat_, other->lat_); + std::swap(lon_, other->lon_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string Node::GetTypeName() const { + return "OSMPBF.Node"; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int DenseNodes::kIdFieldNumber; +const int DenseNodes::kDenseinfoFieldNumber; +const int DenseNodes::kLatFieldNumber; +const int DenseNodes::kLonFieldNumber; +const int DenseNodes::kKeysValsFieldNumber; +#endif // !_MSC_VER + +DenseNodes::DenseNodes() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void DenseNodes::InitAsDefaultInstance() { + denseinfo_ = const_cast< ::OSMPBF::DenseInfo*>(&::OSMPBF::DenseInfo::default_instance()); +} + +DenseNodes::DenseNodes(const DenseNodes& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void DenseNodes::SharedCtor() { + _cached_size_ = 0; + denseinfo_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +DenseNodes::~DenseNodes() { + SharedDtor(); +} + +void DenseNodes::SharedDtor() { + if (this != default_instance_) { + delete denseinfo_; + } +} + +void DenseNodes::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const DenseNodes& DenseNodes::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_osmformat_2eproto(); return *default_instance_; +} + +DenseNodes* DenseNodes::default_instance_ = NULL; + +DenseNodes* DenseNodes::New() const { + return new DenseNodes; +} + +void DenseNodes::Clear() { + if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { + if (_has_bit(1)) { + if (denseinfo_ != NULL) denseinfo_->::OSMPBF::DenseInfo::Clear(); + } + } + id_.Clear(); + lat_.Clear(); + lon_.Clear(); + keys_vals_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool DenseNodes::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated sint64 id = 1 [packed = true]; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, this->mutable_id()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + 1, 10, input, this->mutable_id()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_denseinfo; + break; + } + + // optional .OSMPBF.DenseInfo denseinfo = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_denseinfo: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_denseinfo())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(66)) goto parse_lat; + break; + } + + // repeated sint64 lat = 8 [packed = true]; + case 8: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_lat: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, this->mutable_lat()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + 1, 66, input, this->mutable_lat()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(74)) goto parse_lon; + break; + } + + // repeated sint64 lon = 9 [packed = true]; + case 9: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_lon: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, this->mutable_lon()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + 1, 74, input, this->mutable_lon()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(82)) goto parse_keys_vals; + break; + } + + // repeated int32 keys_vals = 10 [packed = true]; + case 10: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_keys_vals: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, this->mutable_keys_vals()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + 1, 82, input, this->mutable_keys_vals()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void DenseNodes::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated sint64 id = 1 [packed = true]; + if (this->id_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(1, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_id_cached_byte_size_); + } + for (int i = 0; i < this->id_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64NoTag( + this->id(i), output); + } + + // optional .OSMPBF.DenseInfo denseinfo = 5; + if (_has_bit(1)) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 5, this->denseinfo(), output); + } + + // repeated sint64 lat = 8 [packed = true]; + if (this->lat_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(8, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_lat_cached_byte_size_); + } + for (int i = 0; i < this->lat_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64NoTag( + this->lat(i), output); + } + + // repeated sint64 lon = 9 [packed = true]; + if (this->lon_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(9, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_lon_cached_byte_size_); + } + for (int i = 0; i < this->lon_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64NoTag( + this->lon(i), output); + } + + // repeated int32 keys_vals = 10 [packed = true]; + if (this->keys_vals_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(10, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_keys_vals_cached_byte_size_); + } + for (int i = 0; i < this->keys_vals_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag( + this->keys_vals(i), output); + } + +} + +int DenseNodes::ByteSize() const { + int total_size = 0; + + if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { + // optional .OSMPBF.DenseInfo denseinfo = 5; + if (has_denseinfo()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->denseinfo()); + } + + } + // repeated sint64 id = 1 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->id_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + SInt64Size(this->id(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _id_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated sint64 lat = 8 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->lat_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + SInt64Size(this->lat(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _lat_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated sint64 lon = 9 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->lon_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + SInt64Size(this->lon(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _lon_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated int32 keys_vals = 10 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->keys_vals_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + Int32Size(this->keys_vals(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _keys_vals_cached_byte_size_ = data_size; + total_size += data_size; + } + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void DenseNodes::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const DenseNodes*>(&from)); +} + +void DenseNodes::MergeFrom(const DenseNodes& from) { + GOOGLE_CHECK_NE(&from, this); + id_.MergeFrom(from.id_); + lat_.MergeFrom(from.lat_); + lon_.MergeFrom(from.lon_); + keys_vals_.MergeFrom(from.keys_vals_); + if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) { + if (from._has_bit(1)) { + mutable_denseinfo()->::OSMPBF::DenseInfo::MergeFrom(from.denseinfo()); + } + } +} + +void DenseNodes::CopyFrom(const DenseNodes& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool DenseNodes::IsInitialized() const { + + return true; +} + +void DenseNodes::Swap(DenseNodes* other) { + if (other != this) { + id_.Swap(&other->id_); + std::swap(denseinfo_, other->denseinfo_); + lat_.Swap(&other->lat_); + lon_.Swap(&other->lon_); + keys_vals_.Swap(&other->keys_vals_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string DenseNodes::GetTypeName() const { + return "OSMPBF.DenseNodes"; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Way::kIdFieldNumber; +const int Way::kKeysFieldNumber; +const int Way::kValsFieldNumber; +const int Way::kInfoFieldNumber; +const int Way::kRefsFieldNumber; +#endif // !_MSC_VER + +Way::Way() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void Way::InitAsDefaultInstance() { + info_ = const_cast< ::OSMPBF::Info*>(&::OSMPBF::Info::default_instance()); +} + +Way::Way(const Way& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void Way::SharedCtor() { + _cached_size_ = 0; + id_ = GOOGLE_LONGLONG(0); + info_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Way::~Way() { + SharedDtor(); +} + +void Way::SharedDtor() { + if (this != default_instance_) { + delete info_; + } +} + +void Way::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const Way& Way::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_osmformat_2eproto(); return *default_instance_; +} + +Way* Way::default_instance_ = NULL; + +Way* Way::New() const { + return new Way; +} + +void Way::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + id_ = GOOGLE_LONGLONG(0); + if (_has_bit(3)) { + if (info_ != NULL) info_->::OSMPBF::Info::Clear(); + } + } + keys_.Clear(); + vals_.Clear(); + refs_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool Way::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // required int64 id = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &id_))); + _set_bit(0); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_keys; + break; + } + + // repeated uint32 keys = 2 [packed = true]; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_keys: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + input, this->mutable_keys()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + 1, 18, input, this->mutable_keys()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_vals; + break; + } + + // repeated uint32 vals = 3 [packed = true]; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_vals: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + input, this->mutable_vals()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + 1, 26, input, this->mutable_vals()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_info; + break; + } + + // optional .OSMPBF.Info info = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_info: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_info())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(66)) goto parse_refs; + break; + } + + // repeated sint64 refs = 8 [packed = true]; + case 8: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_refs: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, this->mutable_refs()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + 1, 66, input, this->mutable_refs()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void Way::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // required int64 id = 1; + if (_has_bit(0)) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(1, this->id(), output); + } + + // repeated uint32 keys = 2 [packed = true]; + if (this->keys_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(2, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_keys_cached_byte_size_); + } + for (int i = 0; i < this->keys_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteUInt32NoTag( + this->keys(i), output); + } + + // repeated uint32 vals = 3 [packed = true]; + if (this->vals_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(3, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_vals_cached_byte_size_); + } + for (int i = 0; i < this->vals_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteUInt32NoTag( + this->vals(i), output); + } + + // optional .OSMPBF.Info info = 4; + if (_has_bit(3)) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 4, this->info(), output); + } + + // repeated sint64 refs = 8 [packed = true]; + if (this->refs_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(8, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_refs_cached_byte_size_); + } + for (int i = 0; i < this->refs_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64NoTag( + this->refs(i), output); + } + +} + +int Way::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // required int64 id = 1; + if (has_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->id()); + } + + // optional .OSMPBF.Info info = 4; + if (has_info()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->info()); + } + + } + // repeated uint32 keys = 2 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->keys_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + UInt32Size(this->keys(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _keys_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated uint32 vals = 3 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->vals_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + UInt32Size(this->vals(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _vals_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated sint64 refs = 8 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->refs_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + SInt64Size(this->refs(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _refs_cached_byte_size_ = data_size; + total_size += data_size; + } + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Way::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const Way*>(&from)); +} + +void Way::MergeFrom(const Way& from) { + GOOGLE_CHECK_NE(&from, this); + keys_.MergeFrom(from.keys_); + vals_.MergeFrom(from.vals_); + refs_.MergeFrom(from.refs_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from._has_bit(0)) { + set_id(from.id()); + } + if (from._has_bit(3)) { + mutable_info()->::OSMPBF::Info::MergeFrom(from.info()); + } + } +} + +void Way::CopyFrom(const Way& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Way::IsInitialized() const { + if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; + + return true; +} + +void Way::Swap(Way* other) { + if (other != this) { + std::swap(id_, other->id_); + keys_.Swap(&other->keys_); + vals_.Swap(&other->vals_); + std::swap(info_, other->info_); + refs_.Swap(&other->refs_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string Way::GetTypeName() const { + return "OSMPBF.Way"; +} + + +// =================================================================== + +bool Relation_MemberType_IsValid(int value) { + switch(value) { + case 0: + case 1: + case 2: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const Relation_MemberType Relation::NODE; +const Relation_MemberType Relation::WAY; +const Relation_MemberType Relation::RELATION; +const Relation_MemberType Relation::MemberType_MIN; +const Relation_MemberType Relation::MemberType_MAX; +const int Relation::MemberType_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int Relation::kIdFieldNumber; +const int Relation::kKeysFieldNumber; +const int Relation::kValsFieldNumber; +const int Relation::kInfoFieldNumber; +const int Relation::kRolesSidFieldNumber; +const int Relation::kMemidsFieldNumber; +const int Relation::kTypesFieldNumber; +#endif // !_MSC_VER + +Relation::Relation() + : ::google::protobuf::MessageLite() { + SharedCtor(); +} + +void Relation::InitAsDefaultInstance() { + info_ = const_cast< ::OSMPBF::Info*>(&::OSMPBF::Info::default_instance()); +} + +Relation::Relation(const Relation& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); +} + +void Relation::SharedCtor() { + _cached_size_ = 0; + id_ = GOOGLE_LONGLONG(0); + info_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Relation::~Relation() { + SharedDtor(); +} + +void Relation::SharedDtor() { + if (this != default_instance_) { + delete info_; + } +} + +void Relation::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const Relation& Relation::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_osmformat_2eproto(); return *default_instance_; +} + +Relation* Relation::default_instance_ = NULL; + +Relation* Relation::New() const { + return new Relation; +} + +void Relation::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + id_ = GOOGLE_LONGLONG(0); + if (_has_bit(3)) { + if (info_ != NULL) info_->::OSMPBF::Info::Clear(); + } + } + keys_.Clear(); + vals_.Clear(); + roles_sid_.Clear(); + memids_.Clear(); + types_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +bool Relation::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // required int64 id = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &id_))); + _set_bit(0); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_keys; + break; + } + + // repeated uint32 keys = 2 [packed = true]; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_keys: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + input, this->mutable_keys()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + 1, 18, input, this->mutable_keys()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_vals; + break; + } + + // repeated uint32 vals = 3 [packed = true]; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_vals: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + input, this->mutable_vals()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + 1, 26, input, this->mutable_vals()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_info; + break; + } + + // optional .OSMPBF.Info info = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_info: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_info())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(66)) goto parse_roles_sid; + break; + } + + // repeated int32 roles_sid = 8 [packed = true]; + case 8: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_roles_sid: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, this->mutable_roles_sid()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + 1, 66, input, this->mutable_roles_sid()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(74)) goto parse_memids; + break; + } + + // repeated sint64 memids = 9 [packed = true]; + case 9: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_memids: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + input, this->mutable_memids()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_SINT64>( + 1, 74, input, this->mutable_memids()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(82)) goto parse_types; + break; + } + + // repeated .OSMPBF.Relation.MemberType types = 10 [packed = true]; + case 10: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_types: + ::google::protobuf::uint32 length; + DO_(input->ReadVarint32(&length)); + ::google::protobuf::io::CodedInputStream::Limit limit = input->PushLimit(length); + while (input->BytesUntilLimit() > 0) { + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::OSMPBF::Relation_MemberType_IsValid(value)) { + add_types(static_cast< ::OSMPBF::Relation_MemberType >(value)); + } + } + input->PopLimit(limit); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::OSMPBF::Relation_MemberType_IsValid(value)) { + add_types(static_cast< ::OSMPBF::Relation_MemberType >(value)); + } + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + break; + } + } + } + return true; +#undef DO_ +} + +void Relation::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // required int64 id = 1; + if (_has_bit(0)) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(1, this->id(), output); + } + + // repeated uint32 keys = 2 [packed = true]; + if (this->keys_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(2, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_keys_cached_byte_size_); + } + for (int i = 0; i < this->keys_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteUInt32NoTag( + this->keys(i), output); + } + + // repeated uint32 vals = 3 [packed = true]; + if (this->vals_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(3, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_vals_cached_byte_size_); + } + for (int i = 0; i < this->vals_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteUInt32NoTag( + this->vals(i), output); + } + + // optional .OSMPBF.Info info = 4; + if (_has_bit(3)) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 4, this->info(), output); + } + + // repeated int32 roles_sid = 8 [packed = true]; + if (this->roles_sid_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(8, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_roles_sid_cached_byte_size_); + } + for (int i = 0; i < this->roles_sid_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag( + this->roles_sid(i), output); + } + + // repeated sint64 memids = 9 [packed = true]; + if (this->memids_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(9, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_memids_cached_byte_size_); + } + for (int i = 0; i < this->memids_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteSInt64NoTag( + this->memids(i), output); + } + + // repeated .OSMPBF.Relation.MemberType types = 10 [packed = true]; + if (this->types_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag( + 10, + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, + output); + output->WriteVarint32(_types_cached_byte_size_); + } + for (int i = 0; i < this->types_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteEnumNoTag( + this->types(i), output); + } + +} + +int Relation::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // required int64 id = 1; + if (has_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->id()); + } + + // optional .OSMPBF.Info info = 4; + if (has_info()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->info()); + } + + } + // repeated uint32 keys = 2 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->keys_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + UInt32Size(this->keys(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _keys_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated uint32 vals = 3 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->vals_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + UInt32Size(this->vals(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _vals_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated int32 roles_sid = 8 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->roles_sid_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + Int32Size(this->roles_sid(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _roles_sid_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated sint64 memids = 9 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->memids_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + SInt64Size(this->memids(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _memids_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated .OSMPBF.Relation.MemberType types = 10 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->types_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite::EnumSize( + this->types(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _types_cached_byte_size_ = data_size; + total_size += data_size; + } + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Relation::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast<const Relation*>(&from)); +} + +void Relation::MergeFrom(const Relation& from) { + GOOGLE_CHECK_NE(&from, this); + keys_.MergeFrom(from.keys_); + vals_.MergeFrom(from.vals_); + roles_sid_.MergeFrom(from.roles_sid_); + memids_.MergeFrom(from.memids_); + types_.MergeFrom(from.types_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from._has_bit(0)) { + set_id(from.id()); + } + if (from._has_bit(3)) { + mutable_info()->::OSMPBF::Info::MergeFrom(from.info()); + } + } +} + +void Relation::CopyFrom(const Relation& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Relation::IsInitialized() const { + if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; + + return true; +} + +void Relation::Swap(Relation* other) { + if (other != this) { + std::swap(id_, other->id_); + keys_.Swap(&other->keys_); + vals_.Swap(&other->vals_); + std::swap(info_, other->info_); + roles_sid_.Swap(&other->roles_sid_); + memids_.Swap(&other->memids_); + types_.Swap(&other->types_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string Relation::GetTypeName() const { + return "OSMPBF.Relation"; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace OSMPBF + +// @@protoc_insertion_point(global_scope) diff --git a/src/ImportExport/osmformat.pb.h b/src/ImportExport/osmformat.pb.h new file mode 100644 index 0000000..abe9dc9 --- /dev/null +++ b/src/ImportExport/osmformat.pb.h @@ -0,0 +1,2810 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: osmformat.proto + +#ifndef PROTOBUF_osmformat_2eproto__INCLUDED +#define PROTOBUF_osmformat_2eproto__INCLUDED + +#include <string> + +#include <google/protobuf/stubs/common.h> + +#if GOOGLE_PROTOBUF_VERSION < 2003000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 2003000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include <google/protobuf/generated_message_util.h> +#include <google/protobuf/repeated_field.h> +#include <google/protobuf/extension_set.h> +// @@protoc_insertion_point(includes) + +namespace OSMPBF { + +// Internal implementation detail -- do not call these. +void protobuf_AddDesc_osmformat_2eproto(); +void protobuf_AssignDesc_osmformat_2eproto(); +void protobuf_ShutdownFile_osmformat_2eproto(); + +class HeaderBlock; +class HeaderBBox; +class PrimitiveBlock; +class PrimitiveGroup; +class StringTable; +class Info; +class DenseInfo; +class ChangeSet; +class Node; +class DenseNodes; +class Way; +class Relation; + +enum Relation_MemberType { + Relation_MemberType_NODE = 0, + Relation_MemberType_WAY = 1, + Relation_MemberType_RELATION = 2 +}; +bool Relation_MemberType_IsValid(int value); +const Relation_MemberType Relation_MemberType_MemberType_MIN = Relation_MemberType_NODE; +const Relation_MemberType Relation_MemberType_MemberType_MAX = Relation_MemberType_RELATION; +const int Relation_MemberType_MemberType_ARRAYSIZE = Relation_MemberType_MemberType_MAX + 1; + +// =================================================================== + +class HeaderBlock : public ::google::protobuf::MessageLite { + public: + HeaderBlock(); + virtual ~HeaderBlock(); + + HeaderBlock(const HeaderBlock& from); + + inline HeaderBlock& operator=(const HeaderBlock& from) { + CopyFrom(from); + return *this; + } + + static const HeaderBlock& default_instance(); + + void Swap(HeaderBlock* other); + + // implements Message ---------------------------------------------- + + HeaderBlock* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const HeaderBlock& from); + void MergeFrom(const HeaderBlock& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional .OSMPBF.HeaderBBox bbox = 1; + inline bool has_bbox() const; + inline void clear_bbox(); + static const int kBboxFieldNumber = 1; + inline const ::OSMPBF::HeaderBBox& bbox() const; + inline ::OSMPBF::HeaderBBox* mutable_bbox(); + + // repeated string required_features = 4; + inline int required_features_size() const; + inline void clear_required_features(); + static const int kRequiredFeaturesFieldNumber = 4; + inline const ::std::string& required_features(int index) const; + inline ::std::string* mutable_required_features(int index); + inline void set_required_features(int index, const ::std::string& value); + inline void set_required_features(int index, const char* value); + inline void set_required_features(int index, const char* value, size_t size); + inline ::std::string* add_required_features(); + inline void add_required_features(const ::std::string& value); + inline void add_required_features(const char* value); + inline void add_required_features(const char* value, size_t size); + inline const ::google::protobuf::RepeatedPtrField< ::std::string>& required_features() const; + inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_required_features(); + + // repeated string optional_features = 5; + inline int optional_features_size() const; + inline void clear_optional_features(); + static const int kOptionalFeaturesFieldNumber = 5; + inline const ::std::string& optional_features(int index) const; + inline ::std::string* mutable_optional_features(int index); + inline void set_optional_features(int index, const ::std::string& value); + inline void set_optional_features(int index, const char* value); + inline void set_optional_features(int index, const char* value, size_t size); + inline ::std::string* add_optional_features(); + inline void add_optional_features(const ::std::string& value); + inline void add_optional_features(const char* value); + inline void add_optional_features(const char* value, size_t size); + inline const ::google::protobuf::RepeatedPtrField< ::std::string>& optional_features() const; + inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_optional_features(); + + // optional string writingprogram = 16; + inline bool has_writingprogram() const; + inline void clear_writingprogram(); + static const int kWritingprogramFieldNumber = 16; + inline const ::std::string& writingprogram() const; + inline void set_writingprogram(const ::std::string& value); + inline void set_writingprogram(const char* value); + inline void set_writingprogram(const char* value, size_t size); + inline ::std::string* mutable_writingprogram(); + + // optional string source = 17; + inline bool has_source() const; + inline void clear_source(); + static const int kSourceFieldNumber = 17; + inline const ::std::string& source() const; + inline void set_source(const ::std::string& value); + inline void set_source(const char* value); + inline void set_source(const char* value, size_t size); + inline ::std::string* mutable_source(); + + // @@protoc_insertion_point(class_scope:OSMPBF.HeaderBlock) + private: + mutable int _cached_size_; + + ::OSMPBF::HeaderBBox* bbox_; + ::google::protobuf::RepeatedPtrField< ::std::string> required_features_; + ::google::protobuf::RepeatedPtrField< ::std::string> optional_features_; + ::std::string* writingprogram_; + static const ::std::string _default_writingprogram_; + ::std::string* source_; + static const ::std::string _default_source_; + friend void protobuf_AddDesc_osmformat_2eproto(); + friend void protobuf_AssignDesc_osmformat_2eproto(); + friend void protobuf_ShutdownFile_osmformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(5 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static HeaderBlock* default_instance_; +}; +// ------------------------------------------------------------------- + +class HeaderBBox : public ::google::protobuf::MessageLite { + public: + HeaderBBox(); + virtual ~HeaderBBox(); + + HeaderBBox(const HeaderBBox& from); + + inline HeaderBBox& operator=(const HeaderBBox& from) { + CopyFrom(from); + return *this; + } + + static const HeaderBBox& default_instance(); + + void Swap(HeaderBBox* other); + + // implements Message ---------------------------------------------- + + HeaderBBox* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const HeaderBBox& from); + void MergeFrom(const HeaderBBox& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // required sint64 left = 1; + inline bool has_left() const; + inline void clear_left(); + static const int kLeftFieldNumber = 1; + inline ::google::protobuf::int64 left() const; + inline void set_left(::google::protobuf::int64 value); + + // required sint64 right = 2; + inline bool has_right() const; + inline void clear_right(); + static const int kRightFieldNumber = 2; + inline ::google::protobuf::int64 right() const; + inline void set_right(::google::protobuf::int64 value); + + // required sint64 top = 3; + inline bool has_top() const; + inline void clear_top(); + static const int kTopFieldNumber = 3; + inline ::google::protobuf::int64 top() const; + inline void set_top(::google::protobuf::int64 value); + + // required sint64 bottom = 4; + inline bool has_bottom() const; + inline void clear_bottom(); + static const int kBottomFieldNumber = 4; + inline ::google::protobuf::int64 bottom() const; + inline void set_bottom(::google::protobuf::int64 value); + + // @@protoc_insertion_point(class_scope:OSMPBF.HeaderBBox) + private: + mutable int _cached_size_; + + ::google::protobuf::int64 left_; + ::google::protobuf::int64 right_; + ::google::protobuf::int64 top_; + ::google::protobuf::int64 bottom_; + friend void protobuf_AddDesc_osmformat_2eproto(); + friend void protobuf_AssignDesc_osmformat_2eproto(); + friend void protobuf_ShutdownFile_osmformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(4 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static HeaderBBox* default_instance_; +}; +// ------------------------------------------------------------------- + +class PrimitiveBlock : public ::google::protobuf::MessageLite { + public: + PrimitiveBlock(); + virtual ~PrimitiveBlock(); + + PrimitiveBlock(const PrimitiveBlock& from); + + inline PrimitiveBlock& operator=(const PrimitiveBlock& from) { + CopyFrom(from); + return *this; + } + + static const PrimitiveBlock& default_instance(); + + void Swap(PrimitiveBlock* other); + + // implements Message ---------------------------------------------- + + PrimitiveBlock* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const PrimitiveBlock& from); + void MergeFrom(const PrimitiveBlock& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // required .OSMPBF.StringTable stringtable = 1; + inline bool has_stringtable() const; + inline void clear_stringtable(); + static const int kStringtableFieldNumber = 1; + inline const ::OSMPBF::StringTable& stringtable() const; + inline ::OSMPBF::StringTable* mutable_stringtable(); + + // repeated .OSMPBF.PrimitiveGroup primitivegroup = 2; + inline int primitivegroup_size() const; + inline void clear_primitivegroup(); + static const int kPrimitivegroupFieldNumber = 2; + inline const ::OSMPBF::PrimitiveGroup& primitivegroup(int index) const; + inline ::OSMPBF::PrimitiveGroup* mutable_primitivegroup(int index); + inline ::OSMPBF::PrimitiveGroup* add_primitivegroup(); + inline const ::google::protobuf::RepeatedPtrField< ::OSMPBF::PrimitiveGroup >& + primitivegroup() const; + inline ::google::protobuf::RepeatedPtrField< ::OSMPBF::PrimitiveGroup >* + mutable_primitivegroup(); + + // optional int32 granularity = 17 [default = 100]; + inline bool has_granularity() const; + inline void clear_granularity(); + static const int kGranularityFieldNumber = 17; + inline ::google::protobuf::int32 granularity() const; + inline void set_granularity(::google::protobuf::int32 value); + + // optional int64 lat_offset = 19 [default = 0]; + inline bool has_lat_offset() const; + inline void clear_lat_offset(); + static const int kLatOffsetFieldNumber = 19; + inline ::google::protobuf::int64 lat_offset() const; + inline void set_lat_offset(::google::protobuf::int64 value); + + // optional int64 lon_offset = 20 [default = 0]; + inline bool has_lon_offset() const; + inline void clear_lon_offset(); + static const int kLonOffsetFieldNumber = 20; + inline ::google::protobuf::int64 lon_offset() const; + inline void set_lon_offset(::google::protobuf::int64 value); + + // optional int32 date_granularity = 18 [default = 1000]; + inline bool has_date_granularity() const; + inline void clear_date_granularity(); + static const int kDateGranularityFieldNumber = 18; + inline ::google::protobuf::int32 date_granularity() const; + inline void set_date_granularity(::google::protobuf::int32 value); + + // @@protoc_insertion_point(class_scope:OSMPBF.PrimitiveBlock) + private: + mutable int _cached_size_; + + ::OSMPBF::StringTable* stringtable_; + ::google::protobuf::RepeatedPtrField< ::OSMPBF::PrimitiveGroup > primitivegroup_; + ::google::protobuf::int32 granularity_; + ::google::protobuf::int64 lat_offset_; + ::google::protobuf::int64 lon_offset_; + ::google::protobuf::int32 date_granularity_; + friend void protobuf_AddDesc_osmformat_2eproto(); + friend void protobuf_AssignDesc_osmformat_2eproto(); + friend void protobuf_ShutdownFile_osmformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(6 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static PrimitiveBlock* default_instance_; +}; +// ------------------------------------------------------------------- + +class PrimitiveGroup : public ::google::protobuf::MessageLite { + public: + PrimitiveGroup(); + virtual ~PrimitiveGroup(); + + PrimitiveGroup(const PrimitiveGroup& from); + + inline PrimitiveGroup& operator=(const PrimitiveGroup& from) { + CopyFrom(from); + return *this; + } + + static const PrimitiveGroup& default_instance(); + + void Swap(PrimitiveGroup* other); + + // implements Message ---------------------------------------------- + + PrimitiveGroup* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const PrimitiveGroup& from); + void MergeFrom(const PrimitiveGroup& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .OSMPBF.Node nodes = 1; + inline int nodes_size() const; + inline void clear_nodes(); + static const int kNodesFieldNumber = 1; + inline const ::OSMPBF::Node& nodes(int index) const; + inline ::OSMPBF::Node* mutable_nodes(int index); + inline ::OSMPBF::Node* add_nodes(); + inline const ::google::protobuf::RepeatedPtrField< ::OSMPBF::Node >& + nodes() const; + inline ::google::protobuf::RepeatedPtrField< ::OSMPBF::Node >* + mutable_nodes(); + + // optional .OSMPBF.DenseNodes dense = 2; + inline bool has_dense() const; + inline void clear_dense(); + static const int kDenseFieldNumber = 2; + inline const ::OSMPBF::DenseNodes& dense() const; + inline ::OSMPBF::DenseNodes* mutable_dense(); + + // repeated .OSMPBF.Way ways = 3; + inline int ways_size() const; + inline void clear_ways(); + static const int kWaysFieldNumber = 3; + inline const ::OSMPBF::Way& ways(int index) const; + inline ::OSMPBF::Way* mutable_ways(int index); + inline ::OSMPBF::Way* add_ways(); + inline const ::google::protobuf::RepeatedPtrField< ::OSMPBF::Way >& + ways() const; + inline ::google::protobuf::RepeatedPtrField< ::OSMPBF::Way >* + mutable_ways(); + + // repeated .OSMPBF.Relation relations = 4; + inline int relations_size() const; + inline void clear_relations(); + static const int kRelationsFieldNumber = 4; + inline const ::OSMPBF::Relation& relations(int index) const; + inline ::OSMPBF::Relation* mutable_relations(int index); + inline ::OSMPBF::Relation* add_relations(); + inline const ::google::protobuf::RepeatedPtrField< ::OSMPBF::Relation >& + relations() const; + inline ::google::protobuf::RepeatedPtrField< ::OSMPBF::Relation >* + mutable_relations(); + + // repeated .OSMPBF.ChangeSet changesets = 5; + inline int changesets_size() const; + inline void clear_changesets(); + static const int kChangesetsFieldNumber = 5; + inline const ::OSMPBF::ChangeSet& changesets(int index) const; + inline ::OSMPBF::ChangeSet* mutable_changesets(int index); + inline ::OSMPBF::ChangeSet* add_changesets(); + inline const ::google::protobuf::RepeatedPtrField< ::OSMPBF::ChangeSet >& + changesets() const; + inline ::google::protobuf::RepeatedPtrField< ::OSMPBF::ChangeSet >* + mutable_changesets(); + + // @@protoc_insertion_point(class_scope:OSMPBF.PrimitiveGroup) + private: + mutable int _cached_size_; + + ::google::protobuf::RepeatedPtrField< ::OSMPBF::Node > nodes_; + ::OSMPBF::DenseNodes* dense_; + ::google::protobuf::RepeatedPtrField< ::OSMPBF::Way > ways_; + ::google::protobuf::RepeatedPtrField< ::OSMPBF::Relation > relations_; + ::google::protobuf::RepeatedPtrField< ::OSMPBF::ChangeSet > changesets_; + friend void protobuf_AddDesc_osmformat_2eproto(); + friend void protobuf_AssignDesc_osmformat_2eproto(); + friend void protobuf_ShutdownFile_osmformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(5 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static PrimitiveGroup* default_instance_; +}; +// ------------------------------------------------------------------- + +class StringTable : public ::google::protobuf::MessageLite { + public: + StringTable(); + virtual ~StringTable(); + + StringTable(const StringTable& from); + + inline StringTable& operator=(const StringTable& from) { + CopyFrom(from); + return *this; + } + + static const StringTable& default_instance(); + + void Swap(StringTable* other); + + // implements Message ---------------------------------------------- + + StringTable* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const StringTable& from); + void MergeFrom(const StringTable& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated bytes s = 1; + inline int s_size() const; + inline void clear_s(); + static const int kSFieldNumber = 1; + inline const ::std::string& s(int index) const; + inline ::std::string* mutable_s(int index); + inline void set_s(int index, const ::std::string& value); + inline void set_s(int index, const char* value); + inline void set_s(int index, const void* value, size_t size); + inline ::std::string* add_s(); + inline void add_s(const ::std::string& value); + inline void add_s(const char* value); + inline void add_s(const void* value, size_t size); + inline const ::google::protobuf::RepeatedPtrField< ::std::string>& s() const; + inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_s(); + + // @@protoc_insertion_point(class_scope:OSMPBF.StringTable) + private: + mutable int _cached_size_; + + ::google::protobuf::RepeatedPtrField< ::std::string> s_; + friend void protobuf_AddDesc_osmformat_2eproto(); + friend void protobuf_AssignDesc_osmformat_2eproto(); + friend void protobuf_ShutdownFile_osmformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static StringTable* default_instance_; +}; +// ------------------------------------------------------------------- + +class Info : public ::google::protobuf::MessageLite { + public: + Info(); + virtual ~Info(); + + Info(const Info& from); + + inline Info& operator=(const Info& from) { + CopyFrom(from); + return *this; + } + + static const Info& default_instance(); + + void Swap(Info* other); + + // implements Message ---------------------------------------------- + + Info* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const Info& from); + void MergeFrom(const Info& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional int32 version = 1 [default = -1]; + inline bool has_version() const; + inline void clear_version(); + static const int kVersionFieldNumber = 1; + inline ::google::protobuf::int32 version() const; + inline void set_version(::google::protobuf::int32 value); + + // optional int64 timestamp = 2; + inline bool has_timestamp() const; + inline void clear_timestamp(); + static const int kTimestampFieldNumber = 2; + inline ::google::protobuf::int64 timestamp() const; + inline void set_timestamp(::google::protobuf::int64 value); + + // optional int64 changeset = 3; + inline bool has_changeset() const; + inline void clear_changeset(); + static const int kChangesetFieldNumber = 3; + inline ::google::protobuf::int64 changeset() const; + inline void set_changeset(::google::protobuf::int64 value); + + // optional int32 uid = 4; + inline bool has_uid() const; + inline void clear_uid(); + static const int kUidFieldNumber = 4; + inline ::google::protobuf::int32 uid() const; + inline void set_uid(::google::protobuf::int32 value); + + // optional uint32 user_sid = 5; + inline bool has_user_sid() const; + inline void clear_user_sid(); + static const int kUserSidFieldNumber = 5; + inline ::google::protobuf::uint32 user_sid() const; + inline void set_user_sid(::google::protobuf::uint32 value); + + // @@protoc_insertion_point(class_scope:OSMPBF.Info) + private: + mutable int _cached_size_; + + ::google::protobuf::int32 version_; + ::google::protobuf::int64 timestamp_; + ::google::protobuf::int64 changeset_; + ::google::protobuf::int32 uid_; + ::google::protobuf::uint32 user_sid_; + friend void protobuf_AddDesc_osmformat_2eproto(); + friend void protobuf_AssignDesc_osmformat_2eproto(); + friend void protobuf_ShutdownFile_osmformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(5 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static Info* default_instance_; +}; +// ------------------------------------------------------------------- + +class DenseInfo : public ::google::protobuf::MessageLite { + public: + DenseInfo(); + virtual ~DenseInfo(); + + DenseInfo(const DenseInfo& from); + + inline DenseInfo& operator=(const DenseInfo& from) { + CopyFrom(from); + return *this; + } + + static const DenseInfo& default_instance(); + + void Swap(DenseInfo* other); + + // implements Message ---------------------------------------------- + + DenseInfo* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const DenseInfo& from); + void MergeFrom(const DenseInfo& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated int32 version = 1 [packed = true]; + inline int version_size() const; + inline void clear_version(); + static const int kVersionFieldNumber = 1; + inline ::google::protobuf::int32 version(int index) const; + inline void set_version(int index, ::google::protobuf::int32 value); + inline void add_version(::google::protobuf::int32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& + version() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* + mutable_version(); + + // repeated sint64 timestamp = 2 [packed = true]; + inline int timestamp_size() const; + inline void clear_timestamp(); + static const int kTimestampFieldNumber = 2; + inline ::google::protobuf::int64 timestamp(int index) const; + inline void set_timestamp(int index, ::google::protobuf::int64 value); + inline void add_timestamp(::google::protobuf::int64 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& + timestamp() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* + mutable_timestamp(); + + // repeated sint64 changeset = 3 [packed = true]; + inline int changeset_size() const; + inline void clear_changeset(); + static const int kChangesetFieldNumber = 3; + inline ::google::protobuf::int64 changeset(int index) const; + inline void set_changeset(int index, ::google::protobuf::int64 value); + inline void add_changeset(::google::protobuf::int64 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& + changeset() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* + mutable_changeset(); + + // repeated sint32 uid = 4 [packed = true]; + inline int uid_size() const; + inline void clear_uid(); + static const int kUidFieldNumber = 4; + inline ::google::protobuf::int32 uid(int index) const; + inline void set_uid(int index, ::google::protobuf::int32 value); + inline void add_uid(::google::protobuf::int32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& + uid() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* + mutable_uid(); + + // repeated sint32 user_sid = 5 [packed = true]; + inline int user_sid_size() const; + inline void clear_user_sid(); + static const int kUserSidFieldNumber = 5; + inline ::google::protobuf::int32 user_sid(int index) const; + inline void set_user_sid(int index, ::google::protobuf::int32 value); + inline void add_user_sid(::google::protobuf::int32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& + user_sid() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* + mutable_user_sid(); + + // @@protoc_insertion_point(class_scope:OSMPBF.DenseInfo) + private: + mutable int _cached_size_; + + ::google::protobuf::RepeatedField< ::google::protobuf::int32 > version_; + mutable int _version_cached_byte_size_; + ::google::protobuf::RepeatedField< ::google::protobuf::int64 > timestamp_; + mutable int _timestamp_cached_byte_size_; + ::google::protobuf::RepeatedField< ::google::protobuf::int64 > changeset_; + mutable int _changeset_cached_byte_size_; + ::google::protobuf::RepeatedField< ::google::protobuf::int32 > uid_; + mutable int _uid_cached_byte_size_; + ::google::protobuf::RepeatedField< ::google::protobuf::int32 > user_sid_; + mutable int _user_sid_cached_byte_size_; + friend void protobuf_AddDesc_osmformat_2eproto(); + friend void protobuf_AssignDesc_osmformat_2eproto(); + friend void protobuf_ShutdownFile_osmformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(5 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static DenseInfo* default_instance_; +}; +// ------------------------------------------------------------------- + +class ChangeSet : public ::google::protobuf::MessageLite { + public: + ChangeSet(); + virtual ~ChangeSet(); + + ChangeSet(const ChangeSet& from); + + inline ChangeSet& operator=(const ChangeSet& from) { + CopyFrom(from); + return *this; + } + + static const ChangeSet& default_instance(); + + void Swap(ChangeSet* other); + + // implements Message ---------------------------------------------- + + ChangeSet* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ChangeSet& from); + void MergeFrom(const ChangeSet& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // required int64 id = 1; + inline bool has_id() const; + inline void clear_id(); + static const int kIdFieldNumber = 1; + inline ::google::protobuf::int64 id() const; + inline void set_id(::google::protobuf::int64 value); + + // @@protoc_insertion_point(class_scope:OSMPBF.ChangeSet) + private: + mutable int _cached_size_; + + ::google::protobuf::int64 id_; + friend void protobuf_AddDesc_osmformat_2eproto(); + friend void protobuf_AssignDesc_osmformat_2eproto(); + friend void protobuf_ShutdownFile_osmformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static ChangeSet* default_instance_; +}; +// ------------------------------------------------------------------- + +class Node : public ::google::protobuf::MessageLite { + public: + Node(); + virtual ~Node(); + + Node(const Node& from); + + inline Node& operator=(const Node& from) { + CopyFrom(from); + return *this; + } + + static const Node& default_instance(); + + void Swap(Node* other); + + // implements Message ---------------------------------------------- + + Node* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const Node& from); + void MergeFrom(const Node& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // required sint64 id = 1; + inline bool has_id() const; + inline void clear_id(); + static const int kIdFieldNumber = 1; + inline ::google::protobuf::int64 id() const; + inline void set_id(::google::protobuf::int64 value); + + // repeated uint32 keys = 2 [packed = true]; + inline int keys_size() const; + inline void clear_keys(); + static const int kKeysFieldNumber = 2; + inline ::google::protobuf::uint32 keys(int index) const; + inline void set_keys(int index, ::google::protobuf::uint32 value); + inline void add_keys(::google::protobuf::uint32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& + keys() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* + mutable_keys(); + + // repeated uint32 vals = 3 [packed = true]; + inline int vals_size() const; + inline void clear_vals(); + static const int kValsFieldNumber = 3; + inline ::google::protobuf::uint32 vals(int index) const; + inline void set_vals(int index, ::google::protobuf::uint32 value); + inline void add_vals(::google::protobuf::uint32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& + vals() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* + mutable_vals(); + + // optional .OSMPBF.Info info = 4; + inline bool has_info() const; + inline void clear_info(); + static const int kInfoFieldNumber = 4; + inline const ::OSMPBF::Info& info() const; + inline ::OSMPBF::Info* mutable_info(); + + // required sint64 lat = 8; + inline bool has_lat() const; + inline void clear_lat(); + static const int kLatFieldNumber = 8; + inline ::google::protobuf::int64 lat() const; + inline void set_lat(::google::protobuf::int64 value); + + // required sint64 lon = 9; + inline bool has_lon() const; + inline void clear_lon(); + static const int kLonFieldNumber = 9; + inline ::google::protobuf::int64 lon() const; + inline void set_lon(::google::protobuf::int64 value); + + // @@protoc_insertion_point(class_scope:OSMPBF.Node) + private: + mutable int _cached_size_; + + ::google::protobuf::int64 id_; + ::google::protobuf::RepeatedField< ::google::protobuf::uint32 > keys_; + mutable int _keys_cached_byte_size_; + ::google::protobuf::RepeatedField< ::google::protobuf::uint32 > vals_; + mutable int _vals_cached_byte_size_; + ::OSMPBF::Info* info_; + ::google::protobuf::int64 lat_; + ::google::protobuf::int64 lon_; + friend void protobuf_AddDesc_osmformat_2eproto(); + friend void protobuf_AssignDesc_osmformat_2eproto(); + friend void protobuf_ShutdownFile_osmformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(6 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static Node* default_instance_; +}; +// ------------------------------------------------------------------- + +class DenseNodes : public ::google::protobuf::MessageLite { + public: + DenseNodes(); + virtual ~DenseNodes(); + + DenseNodes(const DenseNodes& from); + + inline DenseNodes& operator=(const DenseNodes& from) { + CopyFrom(from); + return *this; + } + + static const DenseNodes& default_instance(); + + void Swap(DenseNodes* other); + + // implements Message ---------------------------------------------- + + DenseNodes* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const DenseNodes& from); + void MergeFrom(const DenseNodes& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated sint64 id = 1 [packed = true]; + inline int id_size() const; + inline void clear_id(); + static const int kIdFieldNumber = 1; + inline ::google::protobuf::int64 id(int index) const; + inline void set_id(int index, ::google::protobuf::int64 value); + inline void add_id(::google::protobuf::int64 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& + id() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* + mutable_id(); + + // optional .OSMPBF.DenseInfo denseinfo = 5; + inline bool has_denseinfo() const; + inline void clear_denseinfo(); + static const int kDenseinfoFieldNumber = 5; + inline const ::OSMPBF::DenseInfo& denseinfo() const; + inline ::OSMPBF::DenseInfo* mutable_denseinfo(); + + // repeated sint64 lat = 8 [packed = true]; + inline int lat_size() const; + inline void clear_lat(); + static const int kLatFieldNumber = 8; + inline ::google::protobuf::int64 lat(int index) const; + inline void set_lat(int index, ::google::protobuf::int64 value); + inline void add_lat(::google::protobuf::int64 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& + lat() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* + mutable_lat(); + + // repeated sint64 lon = 9 [packed = true]; + inline int lon_size() const; + inline void clear_lon(); + static const int kLonFieldNumber = 9; + inline ::google::protobuf::int64 lon(int index) const; + inline void set_lon(int index, ::google::protobuf::int64 value); + inline void add_lon(::google::protobuf::int64 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& + lon() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* + mutable_lon(); + + // repeated int32 keys_vals = 10 [packed = true]; + inline int keys_vals_size() const; + inline void clear_keys_vals(); + static const int kKeysValsFieldNumber = 10; + inline ::google::protobuf::int32 keys_vals(int index) const; + inline void set_keys_vals(int index, ::google::protobuf::int32 value); + inline void add_keys_vals(::google::protobuf::int32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& + keys_vals() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* + mutable_keys_vals(); + + // @@protoc_insertion_point(class_scope:OSMPBF.DenseNodes) + private: + mutable int _cached_size_; + + ::google::protobuf::RepeatedField< ::google::protobuf::int64 > id_; + mutable int _id_cached_byte_size_; + ::OSMPBF::DenseInfo* denseinfo_; + ::google::protobuf::RepeatedField< ::google::protobuf::int64 > lat_; + mutable int _lat_cached_byte_size_; + ::google::protobuf::RepeatedField< ::google::protobuf::int64 > lon_; + mutable int _lon_cached_byte_size_; + ::google::protobuf::RepeatedField< ::google::protobuf::int32 > keys_vals_; + mutable int _keys_vals_cached_byte_size_; + friend void protobuf_AddDesc_osmformat_2eproto(); + friend void protobuf_AssignDesc_osmformat_2eproto(); + friend void protobuf_ShutdownFile_osmformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(5 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static DenseNodes* default_instance_; +}; +// ------------------------------------------------------------------- + +class Way : public ::google::protobuf::MessageLite { + public: + Way(); + virtual ~Way(); + + Way(const Way& from); + + inline Way& operator=(const Way& from) { + CopyFrom(from); + return *this; + } + + static const Way& default_instance(); + + void Swap(Way* other); + + // implements Message ---------------------------------------------- + + Way* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const Way& from); + void MergeFrom(const Way& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // required int64 id = 1; + inline bool has_id() const; + inline void clear_id(); + static const int kIdFieldNumber = 1; + inline ::google::protobuf::int64 id() const; + inline void set_id(::google::protobuf::int64 value); + + // repeated uint32 keys = 2 [packed = true]; + inline int keys_size() const; + inline void clear_keys(); + static const int kKeysFieldNumber = 2; + inline ::google::protobuf::uint32 keys(int index) const; + inline void set_keys(int index, ::google::protobuf::uint32 value); + inline void add_keys(::google::protobuf::uint32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& + keys() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* + mutable_keys(); + + // repeated uint32 vals = 3 [packed = true]; + inline int vals_size() const; + inline void clear_vals(); + static const int kValsFieldNumber = 3; + inline ::google::protobuf::uint32 vals(int index) const; + inline void set_vals(int index, ::google::protobuf::uint32 value); + inline void add_vals(::google::protobuf::uint32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& + vals() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* + mutable_vals(); + + // optional .OSMPBF.Info info = 4; + inline bool has_info() const; + inline void clear_info(); + static const int kInfoFieldNumber = 4; + inline const ::OSMPBF::Info& info() const; + inline ::OSMPBF::Info* mutable_info(); + + // repeated sint64 refs = 8 [packed = true]; + inline int refs_size() const; + inline void clear_refs(); + static const int kRefsFieldNumber = 8; + inline ::google::protobuf::int64 refs(int index) const; + inline void set_refs(int index, ::google::protobuf::int64 value); + inline void add_refs(::google::protobuf::int64 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& + refs() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* + mutable_refs(); + + // @@protoc_insertion_point(class_scope:OSMPBF.Way) + private: + mutable int _cached_size_; + + ::google::protobuf::int64 id_; + ::google::protobuf::RepeatedField< ::google::protobuf::uint32 > keys_; + mutable int _keys_cached_byte_size_; + ::google::protobuf::RepeatedField< ::google::protobuf::uint32 > vals_; + mutable int _vals_cached_byte_size_; + ::OSMPBF::Info* info_; + ::google::protobuf::RepeatedField< ::google::protobuf::int64 > refs_; + mutable int _refs_cached_byte_size_; + friend void protobuf_AddDesc_osmformat_2eproto(); + friend void protobuf_AssignDesc_osmformat_2eproto(); + friend void protobuf_ShutdownFile_osmformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(5 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static Way* default_instance_; +}; +// ------------------------------------------------------------------- + +class Relation : public ::google::protobuf::MessageLite { + public: + Relation(); + virtual ~Relation(); + + Relation(const Relation& from); + + inline Relation& operator=(const Relation& from) { + CopyFrom(from); + return *this; + } + + static const Relation& default_instance(); + + void Swap(Relation* other); + + // implements Message ---------------------------------------------- + + Relation* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const Relation& from); + void MergeFrom(const Relation& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef Relation_MemberType MemberType; + static const MemberType NODE = Relation_MemberType_NODE; + static const MemberType WAY = Relation_MemberType_WAY; + static const MemberType RELATION = Relation_MemberType_RELATION; + static inline bool MemberType_IsValid(int value) { + return Relation_MemberType_IsValid(value); + } + static const MemberType MemberType_MIN = + Relation_MemberType_MemberType_MIN; + static const MemberType MemberType_MAX = + Relation_MemberType_MemberType_MAX; + static const int MemberType_ARRAYSIZE = + Relation_MemberType_MemberType_ARRAYSIZE; + + // accessors ------------------------------------------------------- + + // required int64 id = 1; + inline bool has_id() const; + inline void clear_id(); + static const int kIdFieldNumber = 1; + inline ::google::protobuf::int64 id() const; + inline void set_id(::google::protobuf::int64 value); + + // repeated uint32 keys = 2 [packed = true]; + inline int keys_size() const; + inline void clear_keys(); + static const int kKeysFieldNumber = 2; + inline ::google::protobuf::uint32 keys(int index) const; + inline void set_keys(int index, ::google::protobuf::uint32 value); + inline void add_keys(::google::protobuf::uint32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& + keys() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* + mutable_keys(); + + // repeated uint32 vals = 3 [packed = true]; + inline int vals_size() const; + inline void clear_vals(); + static const int kValsFieldNumber = 3; + inline ::google::protobuf::uint32 vals(int index) const; + inline void set_vals(int index, ::google::protobuf::uint32 value); + inline void add_vals(::google::protobuf::uint32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& + vals() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* + mutable_vals(); + + // optional .OSMPBF.Info info = 4; + inline bool has_info() const; + inline void clear_info(); + static const int kInfoFieldNumber = 4; + inline const ::OSMPBF::Info& info() const; + inline ::OSMPBF::Info* mutable_info(); + + // repeated int32 roles_sid = 8 [packed = true]; + inline int roles_sid_size() const; + inline void clear_roles_sid(); + static const int kRolesSidFieldNumber = 8; + inline ::google::protobuf::int32 roles_sid(int index) const; + inline void set_roles_sid(int index, ::google::protobuf::int32 value); + inline void add_roles_sid(::google::protobuf::int32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& + roles_sid() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* + mutable_roles_sid(); + + // repeated sint64 memids = 9 [packed = true]; + inline int memids_size() const; + inline void clear_memids(); + static const int kMemidsFieldNumber = 9; + inline ::google::protobuf::int64 memids(int index) const; + inline void set_memids(int index, ::google::protobuf::int64 value); + inline void add_memids(::google::protobuf::int64 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& + memids() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* + mutable_memids(); + + // repeated .OSMPBF.Relation.MemberType types = 10 [packed = true]; + inline int types_size() const; + inline void clear_types(); + static const int kTypesFieldNumber = 10; + inline ::OSMPBF::Relation_MemberType types(int index) const; + inline void set_types(int index, ::OSMPBF::Relation_MemberType value); + inline void add_types(::OSMPBF::Relation_MemberType value); + inline const ::google::protobuf::RepeatedField<int>& types() const; + inline ::google::protobuf::RepeatedField<int>* mutable_types(); + + // @@protoc_insertion_point(class_scope:OSMPBF.Relation) + private: + mutable int _cached_size_; + + ::google::protobuf::int64 id_; + ::google::protobuf::RepeatedField< ::google::protobuf::uint32 > keys_; + mutable int _keys_cached_byte_size_; + ::google::protobuf::RepeatedField< ::google::protobuf::uint32 > vals_; + mutable int _vals_cached_byte_size_; + ::OSMPBF::Info* info_; + ::google::protobuf::RepeatedField< ::google::protobuf::int32 > roles_sid_; + mutable int _roles_sid_cached_byte_size_; + ::google::protobuf::RepeatedField< ::google::protobuf::int64 > memids_; + mutable int _memids_cached_byte_size_; + ::google::protobuf::RepeatedField<int> types_; + mutable int _types_cached_byte_size_; + friend void protobuf_AddDesc_osmformat_2eproto(); + friend void protobuf_AssignDesc_osmformat_2eproto(); + friend void protobuf_ShutdownFile_osmformat_2eproto(); + + ::google::protobuf::uint32 _has_bits_[(7 + 31) / 32]; + + // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? + inline bool _has_bit(int index) const { + return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; + } + inline void _set_bit(int index) { + _has_bits_[index / 32] |= (1u << (index % 32)); + } + inline void _clear_bit(int index) { + _has_bits_[index / 32] &= ~(1u << (index % 32)); + } + + void InitAsDefaultInstance(); + static Relation* default_instance_; +}; +// =================================================================== + + +// =================================================================== + +// HeaderBlock + +// optional .OSMPBF.HeaderBBox bbox = 1; +inline bool HeaderBlock::has_bbox() const { + return _has_bit(0); +} +inline void HeaderBlock::clear_bbox() { + if (bbox_ != NULL) bbox_->::OSMPBF::HeaderBBox::Clear(); + _clear_bit(0); +} +inline const ::OSMPBF::HeaderBBox& HeaderBlock::bbox() const { + return bbox_ != NULL ? *bbox_ : *default_instance_->bbox_; +} +inline ::OSMPBF::HeaderBBox* HeaderBlock::mutable_bbox() { + _set_bit(0); + if (bbox_ == NULL) bbox_ = new ::OSMPBF::HeaderBBox; + return bbox_; +} + +// repeated string required_features = 4; +inline int HeaderBlock::required_features_size() const { + return required_features_.size(); +} +inline void HeaderBlock::clear_required_features() { + required_features_.Clear(); +} +inline const ::std::string& HeaderBlock::required_features(int index) const { + return required_features_.Get(index); +} +inline ::std::string* HeaderBlock::mutable_required_features(int index) { + return required_features_.Mutable(index); +} +inline void HeaderBlock::set_required_features(int index, const ::std::string& value) { + required_features_.Mutable(index)->assign(value); +} +inline void HeaderBlock::set_required_features(int index, const char* value) { + required_features_.Mutable(index)->assign(value); +} +inline void HeaderBlock::set_required_features(int index, const char* value, size_t size) { + required_features_.Mutable(index)->assign( + reinterpret_cast<const char*>(value), size); +} +inline ::std::string* HeaderBlock::add_required_features() { + return required_features_.Add(); +} +inline void HeaderBlock::add_required_features(const ::std::string& value) { + required_features_.Add()->assign(value); +} +inline void HeaderBlock::add_required_features(const char* value) { + required_features_.Add()->assign(value); +} +inline void HeaderBlock::add_required_features(const char* value, size_t size) { + required_features_.Add()->assign(reinterpret_cast<const char*>(value), size); +} +inline const ::google::protobuf::RepeatedPtrField< ::std::string>& +HeaderBlock::required_features() const { + return required_features_; +} +inline ::google::protobuf::RepeatedPtrField< ::std::string>* +HeaderBlock::mutable_required_features() { + return &required_features_; +} + +// repeated string optional_features = 5; +inline int HeaderBlock::optional_features_size() const { + return optional_features_.size(); +} +inline void HeaderBlock::clear_optional_features() { + optional_features_.Clear(); +} +inline const ::std::string& HeaderBlock::optional_features(int index) const { + return optional_features_.Get(index); +} +inline ::std::string* HeaderBlock::mutable_optional_features(int index) { + return optional_features_.Mutable(index); +} +inline void HeaderBlock::set_optional_features(int index, const ::std::string& value) { + optional_features_.Mutable(index)->assign(value); +} +inline void HeaderBlock::set_optional_features(int index, const char* value) { + optional_features_.Mutable(index)->assign(value); +} +inline void HeaderBlock::set_optional_features(int index, const char* value, size_t size) { + optional_features_.Mutable(index)->assign( + reinterpret_cast<const char*>(value), size); +} +inline ::std::string* HeaderBlock::add_optional_features() { + return optional_features_.Add(); +} +inline void HeaderBlock::add_optional_features(const ::std::string& value) { + optional_features_.Add()->assign(value); +} +inline void HeaderBlock::add_optional_features(const char* value) { + optional_features_.Add()->assign(value); +} +inline void HeaderBlock::add_optional_features(const char* value, size_t size) { + optional_features_.Add()->assign(reinterpret_cast<const char*>(value), size); +} +inline const ::google::protobuf::RepeatedPtrField< ::std::string>& +HeaderBlock::optional_features() const { + return optional_features_; +} +inline ::google::protobuf::RepeatedPtrField< ::std::string>* +HeaderBlock::mutable_optional_features() { + return &optional_features_; +} + +// optional string writingprogram = 16; +inline bool HeaderBlock::has_writingprogram() const { + return _has_bit(3); +} +inline void HeaderBlock::clear_writingprogram() { + if (writingprogram_ != &_default_writingprogram_) { + writingprogram_->clear(); + } + _clear_bit(3); +} +inline const ::std::string& HeaderBlock::writingprogram() const { + return *writingprogram_; +} +inline void HeaderBlock::set_writingprogram(const ::std::string& value) { + _set_bit(3); + if (writingprogram_ == &_default_writingprogram_) { + writingprogram_ = new ::std::string; + } + writingprogram_->assign(value); +} +inline void HeaderBlock::set_writingprogram(const char* value) { + _set_bit(3); + if (writingprogram_ == &_default_writingprogram_) { + writingprogram_ = new ::std::string; + } + writingprogram_->assign(value); +} +inline void HeaderBlock::set_writingprogram(const char* value, size_t size) { + _set_bit(3); + if (writingprogram_ == &_default_writingprogram_) { + writingprogram_ = new ::std::string; + } + writingprogram_->assign(reinterpret_cast<const char*>(value), size); +} +inline ::std::string* HeaderBlock::mutable_writingprogram() { + _set_bit(3); + if (writingprogram_ == &_default_writingprogram_) { + writingprogram_ = new ::std::string; + } + return writingprogram_; +} + +// optional string source = 17; +inline bool HeaderBlock::has_source() const { + return _has_bit(4); +} +inline void HeaderBlock::clear_source() { + if (source_ != &_default_source_) { + source_->clear(); + } + _clear_bit(4); +} +inline const ::std::string& HeaderBlock::source() const { + return *source_; +} +inline void HeaderBlock::set_source(const ::std::string& value) { + _set_bit(4); + if (source_ == &_default_source_) { + source_ = new ::std::string; + } + source_->assign(value); +} +inline void HeaderBlock::set_source(const char* value) { + _set_bit(4); + if (source_ == &_default_source_) { + source_ = new ::std::string; + } + source_->assign(value); +} +inline void HeaderBlock::set_source(const char* value, size_t size) { + _set_bit(4); + if (source_ == &_default_source_) { + source_ = new ::std::string; + } + source_->assign(reinterpret_cast<const char*>(value), size); +} +inline ::std::string* HeaderBlock::mutable_source() { + _set_bit(4); + if (source_ == &_default_source_) { + source_ = new ::std::string; + } + return source_; +} + +// ------------------------------------------------------------------- + +// HeaderBBox + +// required sint64 left = 1; +inline bool HeaderBBox::has_left() const { + return _has_bit(0); +} +inline void HeaderBBox::clear_left() { + left_ = GOOGLE_LONGLONG(0); + _clear_bit(0); +} +inline ::google::protobuf::int64 HeaderBBox::left() const { + return left_; +} +inline void HeaderBBox::set_left(::google::protobuf::int64 value) { + _set_bit(0); + left_ = value; +} + +// required sint64 right = 2; +inline bool HeaderBBox::has_right() const { + return _has_bit(1); +} +inline void HeaderBBox::clear_right() { + right_ = GOOGLE_LONGLONG(0); + _clear_bit(1); +} +inline ::google::protobuf::int64 HeaderBBox::right() const { + return right_; +} +inline void HeaderBBox::set_right(::google::protobuf::int64 value) { + _set_bit(1); + right_ = value; +} + +// required sint64 top = 3; +inline bool HeaderBBox::has_top() const { + return _has_bit(2); +} +inline void HeaderBBox::clear_top() { + top_ = GOOGLE_LONGLONG(0); + _clear_bit(2); +} +inline ::google::protobuf::int64 HeaderBBox::top() const { + return top_; +} +inline void HeaderBBox::set_top(::google::protobuf::int64 value) { + _set_bit(2); + top_ = value; +} + +// required sint64 bottom = 4; +inline bool HeaderBBox::has_bottom() const { + return _has_bit(3); +} +inline void HeaderBBox::clear_bottom() { + bottom_ = GOOGLE_LONGLONG(0); + _clear_bit(3); +} +inline ::google::protobuf::int64 HeaderBBox::bottom() const { + return bottom_; +} +inline void HeaderBBox::set_bottom(::google::protobuf::int64 value) { + _set_bit(3); + bottom_ = value; +} + +// ------------------------------------------------------------------- + +// PrimitiveBlock + +// required .OSMPBF.StringTable stringtable = 1; +inline bool PrimitiveBlock::has_stringtable() const { + return _has_bit(0); +} +inline void PrimitiveBlock::clear_stringtable() { + if (stringtable_ != NULL) stringtable_->::OSMPBF::StringTable::Clear(); + _clear_bit(0); +} +inline const ::OSMPBF::StringTable& PrimitiveBlock::stringtable() const { + return stringtable_ != NULL ? *stringtable_ : *default_instance_->stringtable_; +} +inline ::OSMPBF::StringTable* PrimitiveBlock::mutable_stringtable() { + _set_bit(0); + if (stringtable_ == NULL) stringtable_ = new ::OSMPBF::StringTable; + return stringtable_; +} + +// repeated .OSMPBF.PrimitiveGroup primitivegroup = 2; +inline int PrimitiveBlock::primitivegroup_size() const { + return primitivegroup_.size(); +} +inline void PrimitiveBlock::clear_primitivegroup() { + primitivegroup_.Clear(); +} +inline const ::OSMPBF::PrimitiveGroup& PrimitiveBlock::primitivegroup(int index) const { + return primitivegroup_.Get(index); +} +inline ::OSMPBF::PrimitiveGroup* PrimitiveBlock::mutable_primitivegroup(int index) { + return primitivegroup_.Mutable(index); +} +inline ::OSMPBF::PrimitiveGroup* PrimitiveBlock::add_primitivegroup() { + return primitivegroup_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OSMPBF::PrimitiveGroup >& +PrimitiveBlock::primitivegroup() const { + return primitivegroup_; +} +inline ::google::protobuf::RepeatedPtrField< ::OSMPBF::PrimitiveGroup >* +PrimitiveBlock::mutable_primitivegroup() { + return &primitivegroup_; +} + +// optional int32 granularity = 17 [default = 100]; +inline bool PrimitiveBlock::has_granularity() const { + return _has_bit(2); +} +inline void PrimitiveBlock::clear_granularity() { + granularity_ = 100; + _clear_bit(2); +} +inline ::google::protobuf::int32 PrimitiveBlock::granularity() const { + return granularity_; +} +inline void PrimitiveBlock::set_granularity(::google::protobuf::int32 value) { + _set_bit(2); + granularity_ = value; +} + +// optional int64 lat_offset = 19 [default = 0]; +inline bool PrimitiveBlock::has_lat_offset() const { + return _has_bit(3); +} +inline void PrimitiveBlock::clear_lat_offset() { + lat_offset_ = GOOGLE_LONGLONG(0); + _clear_bit(3); +} +inline ::google::protobuf::int64 PrimitiveBlock::lat_offset() const { + return lat_offset_; +} +inline void PrimitiveBlock::set_lat_offset(::google::protobuf::int64 value) { + _set_bit(3); + lat_offset_ = value; +} + +// optional int64 lon_offset = 20 [default = 0]; +inline bool PrimitiveBlock::has_lon_offset() const { + return _has_bit(4); +} +inline void PrimitiveBlock::clear_lon_offset() { + lon_offset_ = GOOGLE_LONGLONG(0); + _clear_bit(4); +} +inline ::google::protobuf::int64 PrimitiveBlock::lon_offset() const { + return lon_offset_; +} +inline void PrimitiveBlock::set_lon_offset(::google::protobuf::int64 value) { + _set_bit(4); + lon_offset_ = value; +} + +// optional int32 date_granularity = 18 [default = 1000]; +inline bool PrimitiveBlock::has_date_granularity() const { + return _has_bit(5); +} +inline void PrimitiveBlock::clear_date_granularity() { + date_granularity_ = 1000; + _clear_bit(5); +} +inline ::google::protobuf::int32 PrimitiveBlock::date_granularity() const { + return date_granularity_; +} +inline void PrimitiveBlock::set_date_granularity(::google::protobuf::int32 value) { + _set_bit(5); + date_granularity_ = value; +} + +// ------------------------------------------------------------------- + +// PrimitiveGroup + +// repeated .OSMPBF.Node nodes = 1; +inline int PrimitiveGroup::nodes_size() const { + return nodes_.size(); +} +inline void PrimitiveGroup::clear_nodes() { + nodes_.Clear(); +} +inline const ::OSMPBF::Node& PrimitiveGroup::nodes(int index) const { + return nodes_.Get(index); +} +inline ::OSMPBF::Node* PrimitiveGroup::mutable_nodes(int index) { + return nodes_.Mutable(index); +} +inline ::OSMPBF::Node* PrimitiveGroup::add_nodes() { + return nodes_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OSMPBF::Node >& +PrimitiveGroup::nodes() const { + return nodes_; +} +inline ::google::protobuf::RepeatedPtrField< ::OSMPBF::Node >* +PrimitiveGroup::mutable_nodes() { + return &nodes_; +} + +// optional .OSMPBF.DenseNodes dense = 2; +inline bool PrimitiveGroup::has_dense() const { + return _has_bit(1); +} +inline void PrimitiveGroup::clear_dense() { + if (dense_ != NULL) dense_->::OSMPBF::DenseNodes::Clear(); + _clear_bit(1); +} +inline const ::OSMPBF::DenseNodes& PrimitiveGroup::dense() const { + return dense_ != NULL ? *dense_ : *default_instance_->dense_; +} +inline ::OSMPBF::DenseNodes* PrimitiveGroup::mutable_dense() { + _set_bit(1); + if (dense_ == NULL) dense_ = new ::OSMPBF::DenseNodes; + return dense_; +} + +// repeated .OSMPBF.Way ways = 3; +inline int PrimitiveGroup::ways_size() const { + return ways_.size(); +} +inline void PrimitiveGroup::clear_ways() { + ways_.Clear(); +} +inline const ::OSMPBF::Way& PrimitiveGroup::ways(int index) const { + return ways_.Get(index); +} +inline ::OSMPBF::Way* PrimitiveGroup::mutable_ways(int index) { + return ways_.Mutable(index); +} +inline ::OSMPBF::Way* PrimitiveGroup::add_ways() { + return ways_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OSMPBF::Way >& +PrimitiveGroup::ways() const { + return ways_; +} +inline ::google::protobuf::RepeatedPtrField< ::OSMPBF::Way >* +PrimitiveGroup::mutable_ways() { + return &ways_; +} + +// repeated .OSMPBF.Relation relations = 4; +inline int PrimitiveGroup::relations_size() const { + return relations_.size(); +} +inline void PrimitiveGroup::clear_relations() { + relations_.Clear(); +} +inline const ::OSMPBF::Relation& PrimitiveGroup::relations(int index) const { + return relations_.Get(index); +} +inline ::OSMPBF::Relation* PrimitiveGroup::mutable_relations(int index) { + return relations_.Mutable(index); +} +inline ::OSMPBF::Relation* PrimitiveGroup::add_relations() { + return relations_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OSMPBF::Relation >& +PrimitiveGroup::relations() const { + return relations_; +} +inline ::google::protobuf::RepeatedPtrField< ::OSMPBF::Relation >* +PrimitiveGroup::mutable_relations() { + return &relations_; +} + +// repeated .OSMPBF.ChangeSet changesets = 5; +inline int PrimitiveGroup::changesets_size() const { + return changesets_.size(); +} +inline void PrimitiveGroup::clear_changesets() { + changesets_.Clear(); +} +inline const ::OSMPBF::ChangeSet& PrimitiveGroup::changesets(int index) const { + return changesets_.Get(index); +} +inline ::OSMPBF::ChangeSet* PrimitiveGroup::mutable_changesets(int index) { + return changesets_.Mutable(index); +} +inline ::OSMPBF::ChangeSet* PrimitiveGroup::add_changesets() { + return changesets_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OSMPBF::ChangeSet >& +PrimitiveGroup::changesets() const { + return changesets_; +} +inline ::google::protobuf::RepeatedPtrField< ::OSMPBF::ChangeSet >* +PrimitiveGroup::mutable_changesets() { + return &changesets_; +} + +// ------------------------------------------------------------------- + +// StringTable + +// repeated bytes s = 1; +inline int StringTable::s_size() const { + return s_.size(); +} +inline void StringTable::clear_s() { + s_.Clear(); +} +inline const ::std::string& StringTable::s(int index) const { + return s_.Get(index); +} +inline ::std::string* StringTable::mutable_s(int index) { + return s_.Mutable(index); +} +inline void StringTable::set_s(int index, const ::std::string& value) { + s_.Mutable(index)->assign(value); +} +inline void StringTable::set_s(int index, const char* value) { + s_.Mutable(index)->assign(value); +} +inline void StringTable::set_s(int index, const void* value, size_t size) { + s_.Mutable(index)->assign( + reinterpret_cast<const char*>(value), size); +} +inline ::std::string* StringTable::add_s() { + return s_.Add(); +} +inline void StringTable::add_s(const ::std::string& value) { + s_.Add()->assign(value); +} +inline void StringTable::add_s(const char* value) { + s_.Add()->assign(value); +} +inline void StringTable::add_s(const void* value, size_t size) { + s_.Add()->assign(reinterpret_cast<const char*>(value), size); +} +inline const ::google::protobuf::RepeatedPtrField< ::std::string>& +StringTable::s() const { + return s_; +} +inline ::google::protobuf::RepeatedPtrField< ::std::string>* +StringTable::mutable_s() { + return &s_; +} + +// ------------------------------------------------------------------- + +// Info + +// optional int32 version = 1 [default = -1]; +inline bool Info::has_version() const { + return _has_bit(0); +} +inline void Info::clear_version() { + version_ = -1; + _clear_bit(0); +} +inline ::google::protobuf::int32 Info::version() const { + return version_; +} +inline void Info::set_version(::google::protobuf::int32 value) { + _set_bit(0); + version_ = value; +} + +// optional int64 timestamp = 2; +inline bool Info::has_timestamp() const { + return _has_bit(1); +} +inline void Info::clear_timestamp() { + timestamp_ = GOOGLE_LONGLONG(0); + _clear_bit(1); +} +inline ::google::protobuf::int64 Info::timestamp() const { + return timestamp_; +} +inline void Info::set_timestamp(::google::protobuf::int64 value) { + _set_bit(1); + timestamp_ = value; +} + +// optional int64 changeset = 3; +inline bool Info::has_changeset() const { + return _has_bit(2); +} +inline void Info::clear_changeset() { + changeset_ = GOOGLE_LONGLONG(0); + _clear_bit(2); +} +inline ::google::protobuf::int64 Info::changeset() const { + return changeset_; +} +inline void Info::set_changeset(::google::protobuf::int64 value) { + _set_bit(2); + changeset_ = value; +} + +// optional int32 uid = 4; +inline bool Info::has_uid() const { + return _has_bit(3); +} +inline void Info::clear_uid() { + uid_ = 0; + _clear_bit(3); +} +inline ::google::protobuf::int32 Info::uid() const { + return uid_; +} +inline void Info::set_uid(::google::protobuf::int32 value) { + _set_bit(3); + uid_ = value; +} + +// optional uint32 user_sid = 5; +inline bool Info::has_user_sid() const { + return _has_bit(4); +} +inline void Info::clear_user_sid() { + user_sid_ = 0u; + _clear_bit(4); +} +inline ::google::protobuf::uint32 Info::user_sid() const { + return user_sid_; +} +inline void Info::set_user_sid(::google::protobuf::uint32 value) { + _set_bit(4); + user_sid_ = value; +} + +// ------------------------------------------------------------------- + +// DenseInfo + +// repeated int32 version = 1 [packed = true]; +inline int DenseInfo::version_size() const { + return version_.size(); +} +inline void DenseInfo::clear_version() { + version_.Clear(); +} +inline ::google::protobuf::int32 DenseInfo::version(int index) const { + return version_.Get(index); +} +inline void DenseInfo::set_version(int index, ::google::protobuf::int32 value) { + version_.Set(index, value); +} +inline void DenseInfo::add_version(::google::protobuf::int32 value) { + version_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& +DenseInfo::version() const { + return version_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* +DenseInfo::mutable_version() { + return &version_; +} + +// repeated sint64 timestamp = 2 [packed = true]; +inline int DenseInfo::timestamp_size() const { + return timestamp_.size(); +} +inline void DenseInfo::clear_timestamp() { + timestamp_.Clear(); +} +inline ::google::protobuf::int64 DenseInfo::timestamp(int index) const { + return timestamp_.Get(index); +} +inline void DenseInfo::set_timestamp(int index, ::google::protobuf::int64 value) { + timestamp_.Set(index, value); +} +inline void DenseInfo::add_timestamp(::google::protobuf::int64 value) { + timestamp_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& +DenseInfo::timestamp() const { + return timestamp_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* +DenseInfo::mutable_timestamp() { + return ×tamp_; +} + +// repeated sint64 changeset = 3 [packed = true]; +inline int DenseInfo::changeset_size() const { + return changeset_.size(); +} +inline void DenseInfo::clear_changeset() { + changeset_.Clear(); +} +inline ::google::protobuf::int64 DenseInfo::changeset(int index) const { + return changeset_.Get(index); +} +inline void DenseInfo::set_changeset(int index, ::google::protobuf::int64 value) { + changeset_.Set(index, value); +} +inline void DenseInfo::add_changeset(::google::protobuf::int64 value) { + changeset_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& +DenseInfo::changeset() const { + return changeset_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* +DenseInfo::mutable_changeset() { + return &changeset_; +} + +// repeated sint32 uid = 4 [packed = true]; +inline int DenseInfo::uid_size() const { + return uid_.size(); +} +inline void DenseInfo::clear_uid() { + uid_.Clear(); +} +inline ::google::protobuf::int32 DenseInfo::uid(int index) const { + return uid_.Get(index); +} +inline void DenseInfo::set_uid(int index, ::google::protobuf::int32 value) { + uid_.Set(index, value); +} +inline void DenseInfo::add_uid(::google::protobuf::int32 value) { + uid_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& +DenseInfo::uid() const { + return uid_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* +DenseInfo::mutable_uid() { + return &uid_; +} + +// repeated sint32 user_sid = 5 [packed = true]; +inline int DenseInfo::user_sid_size() const { + return user_sid_.size(); +} +inline void DenseInfo::clear_user_sid() { + user_sid_.Clear(); +} +inline ::google::protobuf::int32 DenseInfo::user_sid(int index) const { + return user_sid_.Get(index); +} +inline void DenseInfo::set_user_sid(int index, ::google::protobuf::int32 value) { + user_sid_.Set(index, value); +} +inline void DenseInfo::add_user_sid(::google::protobuf::int32 value) { + user_sid_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& +DenseInfo::user_sid() const { + return user_sid_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* +DenseInfo::mutable_user_sid() { + return &user_sid_; +} + +// ------------------------------------------------------------------- + +// ChangeSet + +// required int64 id = 1; +inline bool ChangeSet::has_id() const { + return _has_bit(0); +} +inline void ChangeSet::clear_id() { + id_ = GOOGLE_LONGLONG(0); + _clear_bit(0); +} +inline ::google::protobuf::int64 ChangeSet::id() const { + return id_; +} +inline void ChangeSet::set_id(::google::protobuf::int64 value) { + _set_bit(0); + id_ = value; +} + +// ------------------------------------------------------------------- + +// Node + +// required sint64 id = 1; +inline bool Node::has_id() const { + return _has_bit(0); +} +inline void Node::clear_id() { + id_ = GOOGLE_LONGLONG(0); + _clear_bit(0); +} +inline ::google::protobuf::int64 Node::id() const { + return id_; +} +inline void Node::set_id(::google::protobuf::int64 value) { + _set_bit(0); + id_ = value; +} + +// repeated uint32 keys = 2 [packed = true]; +inline int Node::keys_size() const { + return keys_.size(); +} +inline void Node::clear_keys() { + keys_.Clear(); +} +inline ::google::protobuf::uint32 Node::keys(int index) const { + return keys_.Get(index); +} +inline void Node::set_keys(int index, ::google::protobuf::uint32 value) { + keys_.Set(index, value); +} +inline void Node::add_keys(::google::protobuf::uint32 value) { + keys_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& +Node::keys() const { + return keys_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* +Node::mutable_keys() { + return &keys_; +} + +// repeated uint32 vals = 3 [packed = true]; +inline int Node::vals_size() const { + return vals_.size(); +} +inline void Node::clear_vals() { + vals_.Clear(); +} +inline ::google::protobuf::uint32 Node::vals(int index) const { + return vals_.Get(index); +} +inline void Node::set_vals(int index, ::google::protobuf::uint32 value) { + vals_.Set(index, value); +} +inline void Node::add_vals(::google::protobuf::uint32 value) { + vals_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& +Node::vals() const { + return vals_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* +Node::mutable_vals() { + return &vals_; +} + +// optional .OSMPBF.Info info = 4; +inline bool Node::has_info() const { + return _has_bit(3); +} +inline void Node::clear_info() { + if (info_ != NULL) info_->::OSMPBF::Info::Clear(); + _clear_bit(3); +} +inline const ::OSMPBF::Info& Node::info() const { + return info_ != NULL ? *info_ : *default_instance_->info_; +} +inline ::OSMPBF::Info* Node::mutable_info() { + _set_bit(3); + if (info_ == NULL) info_ = new ::OSMPBF::Info; + return info_; +} + +// required sint64 lat = 8; +inline bool Node::has_lat() const { + return _has_bit(4); +} +inline void Node::clear_lat() { + lat_ = GOOGLE_LONGLONG(0); + _clear_bit(4); +} +inline ::google::protobuf::int64 Node::lat() const { + return lat_; +} +inline void Node::set_lat(::google::protobuf::int64 value) { + _set_bit(4); + lat_ = value; +} + +// required sint64 lon = 9; +inline bool Node::has_lon() const { + return _has_bit(5); +} +inline void Node::clear_lon() { + lon_ = GOOGLE_LONGLONG(0); + _clear_bit(5); +} +inline ::google::protobuf::int64 Node::lon() const { + return lon_; +} +inline void Node::set_lon(::google::protobuf::int64 value) { + _set_bit(5); + lon_ = value; +} + +// ------------------------------------------------------------------- + +// DenseNodes + +// repeated sint64 id = 1 [packed = true]; +inline int DenseNodes::id_size() const { + return id_.size(); +} +inline void DenseNodes::clear_id() { + id_.Clear(); +} +inline ::google::protobuf::int64 DenseNodes::id(int index) const { + return id_.Get(index); +} +inline void DenseNodes::set_id(int index, ::google::protobuf::int64 value) { + id_.Set(index, value); +} +inline void DenseNodes::add_id(::google::protobuf::int64 value) { + id_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& +DenseNodes::id() const { + return id_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* +DenseNodes::mutable_id() { + return &id_; +} + +// optional .OSMPBF.DenseInfo denseinfo = 5; +inline bool DenseNodes::has_denseinfo() const { + return _has_bit(1); +} +inline void DenseNodes::clear_denseinfo() { + if (denseinfo_ != NULL) denseinfo_->::OSMPBF::DenseInfo::Clear(); + _clear_bit(1); +} +inline const ::OSMPBF::DenseInfo& DenseNodes::denseinfo() const { + return denseinfo_ != NULL ? *denseinfo_ : *default_instance_->denseinfo_; +} +inline ::OSMPBF::DenseInfo* DenseNodes::mutable_denseinfo() { + _set_bit(1); + if (denseinfo_ == NULL) denseinfo_ = new ::OSMPBF::DenseInfo; + return denseinfo_; +} + +// repeated sint64 lat = 8 [packed = true]; +inline int DenseNodes::lat_size() const { + return lat_.size(); +} +inline void DenseNodes::clear_lat() { + lat_.Clear(); +} +inline ::google::protobuf::int64 DenseNodes::lat(int index) const { + return lat_.Get(index); +} +inline void DenseNodes::set_lat(int index, ::google::protobuf::int64 value) { + lat_.Set(index, value); +} +inline void DenseNodes::add_lat(::google::protobuf::int64 value) { + lat_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& +DenseNodes::lat() const { + return lat_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* +DenseNodes::mutable_lat() { + return &lat_; +} + +// repeated sint64 lon = 9 [packed = true]; +inline int DenseNodes::lon_size() const { + return lon_.size(); +} +inline void DenseNodes::clear_lon() { + lon_.Clear(); +} +inline ::google::protobuf::int64 DenseNodes::lon(int index) const { + return lon_.Get(index); +} +inline void DenseNodes::set_lon(int index, ::google::protobuf::int64 value) { + lon_.Set(index, value); +} +inline void DenseNodes::add_lon(::google::protobuf::int64 value) { + lon_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& +DenseNodes::lon() const { + return lon_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* +DenseNodes::mutable_lon() { + return &lon_; +} + +// repeated int32 keys_vals = 10 [packed = true]; +inline int DenseNodes::keys_vals_size() const { + return keys_vals_.size(); +} +inline void DenseNodes::clear_keys_vals() { + keys_vals_.Clear(); +} +inline ::google::protobuf::int32 DenseNodes::keys_vals(int index) const { + return keys_vals_.Get(index); +} +inline void DenseNodes::set_keys_vals(int index, ::google::protobuf::int32 value) { + keys_vals_.Set(index, value); +} +inline void DenseNodes::add_keys_vals(::google::protobuf::int32 value) { + keys_vals_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& +DenseNodes::keys_vals() const { + return keys_vals_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* +DenseNodes::mutable_keys_vals() { + return &keys_vals_; +} + +// ------------------------------------------------------------------- + +// Way + +// required int64 id = 1; +inline bool Way::has_id() const { + return _has_bit(0); +} +inline void Way::clear_id() { + id_ = GOOGLE_LONGLONG(0); + _clear_bit(0); +} +inline ::google::protobuf::int64 Way::id() const { + return id_; +} +inline void Way::set_id(::google::protobuf::int64 value) { + _set_bit(0); + id_ = value; +} + +// repeated uint32 keys = 2 [packed = true]; +inline int Way::keys_size() const { + return keys_.size(); +} +inline void Way::clear_keys() { + keys_.Clear(); +} +inline ::google::protobuf::uint32 Way::keys(int index) const { + return keys_.Get(index); +} +inline void Way::set_keys(int index, ::google::protobuf::uint32 value) { + keys_.Set(index, value); +} +inline void Way::add_keys(::google::protobuf::uint32 value) { + keys_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& +Way::keys() const { + return keys_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* +Way::mutable_keys() { + return &keys_; +} + +// repeated uint32 vals = 3 [packed = true]; +inline int Way::vals_size() const { + return vals_.size(); +} +inline void Way::clear_vals() { + vals_.Clear(); +} +inline ::google::protobuf::uint32 Way::vals(int index) const { + return vals_.Get(index); +} +inline void Way::set_vals(int index, ::google::protobuf::uint32 value) { + vals_.Set(index, value); +} +inline void Way::add_vals(::google::protobuf::uint32 value) { + vals_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& +Way::vals() const { + return vals_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* +Way::mutable_vals() { + return &vals_; +} + +// optional .OSMPBF.Info info = 4; +inline bool Way::has_info() const { + return _has_bit(3); +} +inline void Way::clear_info() { + if (info_ != NULL) info_->::OSMPBF::Info::Clear(); + _clear_bit(3); +} +inline const ::OSMPBF::Info& Way::info() const { + return info_ != NULL ? *info_ : *default_instance_->info_; +} +inline ::OSMPBF::Info* Way::mutable_info() { + _set_bit(3); + if (info_ == NULL) info_ = new ::OSMPBF::Info; + return info_; +} + +// repeated sint64 refs = 8 [packed = true]; +inline int Way::refs_size() const { + return refs_.size(); +} +inline void Way::clear_refs() { + refs_.Clear(); +} +inline ::google::protobuf::int64 Way::refs(int index) const { + return refs_.Get(index); +} +inline void Way::set_refs(int index, ::google::protobuf::int64 value) { + refs_.Set(index, value); +} +inline void Way::add_refs(::google::protobuf::int64 value) { + refs_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& +Way::refs() const { + return refs_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* +Way::mutable_refs() { + return &refs_; +} + +// ------------------------------------------------------------------- + +// Relation + +// required int64 id = 1; +inline bool Relation::has_id() const { + return _has_bit(0); +} +inline void Relation::clear_id() { + id_ = GOOGLE_LONGLONG(0); + _clear_bit(0); +} +inline ::google::protobuf::int64 Relation::id() const { + return id_; +} +inline void Relation::set_id(::google::protobuf::int64 value) { + _set_bit(0); + id_ = value; +} + +// repeated uint32 keys = 2 [packed = true]; +inline int Relation::keys_size() const { + return keys_.size(); +} +inline void Relation::clear_keys() { + keys_.Clear(); +} +inline ::google::protobuf::uint32 Relation::keys(int index) const { + return keys_.Get(index); +} +inline void Relation::set_keys(int index, ::google::protobuf::uint32 value) { + keys_.Set(index, value); +} +inline void Relation::add_keys(::google::protobuf::uint32 value) { + keys_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& +Relation::keys() const { + return keys_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* +Relation::mutable_keys() { + return &keys_; +} + +// repeated uint32 vals = 3 [packed = true]; +inline int Relation::vals_size() const { + return vals_.size(); +} +inline void Relation::clear_vals() { + vals_.Clear(); +} +inline ::google::protobuf::uint32 Relation::vals(int index) const { + return vals_.Get(index); +} +inline void Relation::set_vals(int index, ::google::protobuf::uint32 value) { + vals_.Set(index, value); +} +inline void Relation::add_vals(::google::protobuf::uint32 value) { + vals_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& +Relation::vals() const { + return vals_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* +Relation::mutable_vals() { + return &vals_; +} + +// optional .OSMPBF.Info info = 4; +inline bool Relation::has_info() const { + return _has_bit(3); +} +inline void Relation::clear_info() { + if (info_ != NULL) info_->::OSMPBF::Info::Clear(); + _clear_bit(3); +} +inline const ::OSMPBF::Info& Relation::info() const { + return info_ != NULL ? *info_ : *default_instance_->info_; +} +inline ::OSMPBF::Info* Relation::mutable_info() { + _set_bit(3); + if (info_ == NULL) info_ = new ::OSMPBF::Info; + return info_; +} + +// repeated int32 roles_sid = 8 [packed = true]; +inline int Relation::roles_sid_size() const { + return roles_sid_.size(); +} +inline void Relation::clear_roles_sid() { + roles_sid_.Clear(); +} +inline ::google::protobuf::int32 Relation::roles_sid(int index) const { + return roles_sid_.Get(index); +} +inline void Relation::set_roles_sid(int index, ::google::protobuf::int32 value) { + roles_sid_.Set(index, value); +} +inline void Relation::add_roles_sid(::google::protobuf::int32 value) { + roles_sid_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& +Relation::roles_sid() const { + return roles_sid_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* +Relation::mutable_roles_sid() { + return &roles_sid_; +} + +// repeated sint64 memids = 9 [packed = true]; +inline int Relation::memids_size() const { + return memids_.size(); +} +inline void Relation::clear_memids() { + memids_.Clear(); +} +inline ::google::protobuf::int64 Relation::memids(int index) const { + return memids_.Get(index); +} +inline void Relation::set_memids(int index, ::google::protobuf::int64 value) { + memids_.Set(index, value); +} +inline void Relation::add_memids(::google::protobuf::int64 value) { + memids_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >& +Relation::memids() const { + return memids_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int64 >* +Relation::mutable_memids() { + return &memids_; +} + +// repeated .OSMPBF.Relation.MemberType types = 10 [packed = true]; +inline int Relation::types_size() const { + return types_.size(); +} +inline void Relation::clear_types() { + types_.Clear(); +} +inline ::OSMPBF::Relation_MemberType Relation::types(int index) const { + return static_cast< ::OSMPBF::Relation_MemberType >(types_.Get(index)); +} +inline void Relation::set_types(int index, ::OSMPBF::Relation_MemberType value) { + GOOGLE_DCHECK(::OSMPBF::Relation_MemberType_IsValid(value)); + types_.Set(index, value); +} +inline void Relation::add_types(::OSMPBF::Relation_MemberType value) { + GOOGLE_DCHECK(::OSMPBF::Relation_MemberType_IsValid(value)); + types_.Add(value); +} +inline const ::google::protobuf::RepeatedField<int>& +Relation::types() const { + return types_; +} +inline ::google::protobuf::RepeatedField<int>* +Relation::mutable_types() { + return &types_; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace OSMPBF + +// @@protoc_insertion_point(global_scope) + +#endif // PROTOBUF_osmformat_2eproto__INCLUDED diff --git a/src/ImportExport/osmformat.proto b/src/ImportExport/osmformat.proto new file mode 100644 index 0000000..8a5a031 --- /dev/null +++ b/src/ImportExport/osmformat.proto @@ -0,0 +1,229 @@ +/** Copyright (c) 2010 Scott A. Crosby. <scott@sacrosby.com> + + This program 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 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +*/ + +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; +option java_package = "crosby.binary"; +package OSMPBF; + +/* OSM Binary file format + +This is the master schema file of the OSM binary file format. This +file is designed to support limited random-access and future +extendability. + +A binary OSM file consists of a sequence of FileBlocks (please see +fileformat.proto). The first fileblock contains a serialized instance +of HeaderBlock, followed by a sequence of PrimitiveBlock blocks that +contain the primitives. + +Each primitiveblock is designed to be independently parsable. It +contains a string table storing all strings in that block (keys and +values in tags, roles in relations, usernames, etc.) as well as +metadata containing the precision of coordinates or timestamps in that +block. + +A primitiveblock contains a sequence of primitive groups, each +containing primitives of the same type (nodes, densenodes, ways, +relations). Coordinates are stored in signed 64-bit integers. Lat&lon +are measured in units <granularity> nanodegrees. The default of +granularity of 100 nanodegrees corresponds to about 1cm on the ground, +and a full lat or lon fits into 32 bits. + +Converting an integer to a lattitude or longitude uses the formula: +$OUT = IN * granularity / 10**9$. Many encoding schemes use delta +coding when representing nodes and relations. + +*/ + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +/* Contains the file header. */ + +message HeaderBlock { + optional HeaderBBox bbox = 1; + /* Additional tags to aid in parsing this dataset */ + repeated string required_features = 4; + repeated string optional_features = 5; + + optional string writingprogram = 16; + optional string source = 17; // From the bbox field. +} + + +/** The bounding box field in the OSM header. BBOX, as used in the OSM +header. Units are always in nanodegrees -- they do not obey +granularity rules. */ + +message HeaderBBox { + required sint64 left = 1; + required sint64 right = 2; + required sint64 top = 3; + required sint64 bottom = 4; +} + + +/////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////// + + +message PrimitiveBlock { + required StringTable stringtable = 1; + repeated PrimitiveGroup primitivegroup = 2; + + // Granularity, units of nanodegrees, used to store coordinates in this block + optional int32 granularity = 17 [default=100]; + // Offset value between the output coordinates coordinates and the granularity grid in unites of nanodegrees. + optional int64 lat_offset = 19 [default=0]; + optional int64 lon_offset = 20 [default=0]; + +// Granularity of dates, normally represented in units of milliseconds since the 1970 epoch. + optional int32 date_granularity = 18 [default=1000]; + + + // Proposed extension: + //optional BBox bbox = XX; +} + +// Group of OSMPrimitives. All primitives in a group must be the same type. +message PrimitiveGroup { + repeated Node nodes = 1; + optional DenseNodes dense = 2; + repeated Way ways = 3; + repeated Relation relations = 4; + repeated ChangeSet changesets = 5; +} + + +/** String table, contains the common strings in each block. + + Note that we reserve index '0' as a delimiter, so the entry at that + index in the table is ALWAYS blank and unused. + + */ +message StringTable { + repeated bytes s = 1; +} + +/* Optional metadata that may be included into each primitive. */ +message Info { + optional int32 version = 1 [default = -1]; + optional int64 timestamp = 2; + optional int64 changeset = 3; + optional int32 uid = 4; + optional uint32 user_sid = 5; // String IDs +} + +/** Optional metadata that may be included into each primitive. Special dense format used in DenseNodes. */ +message DenseInfo { + repeated int32 version = 1 [packed = true]; + repeated sint64 timestamp = 2 [packed = true]; // DELTA coded + repeated sint64 changeset = 3 [packed = true]; // DELTA coded + repeated sint32 uid = 4 [packed = true]; // DELTA coded + repeated sint32 user_sid = 5 [packed = true]; // String IDs for usernames. DELTA coded +} + + +// THIS IS STUB DESIGN FOR CHANGESETS. NOT USED RIGHT NOW. +// TODO: REMOVE THIS? +message ChangeSet { + required int64 id = 1; +// +// // Parallel arrays. +// repeated uint32 keys = 2 [packed = true]; // String IDs. +// repeated uint32 vals = 3 [packed = true]; // String IDs. +// +// optional Info info = 4; + +// optional int64 created_at = 8; +// optional int64 closetime_delta = 9; +// optional bool open = 10; +// optional HeaderBBox bbox = 11; +} + + +message Node { + required sint64 id = 1; + // Parallel arrays. + repeated uint32 keys = 2 [packed = true]; // String IDs. + repeated uint32 vals = 3 [packed = true]; // String IDs. + + optional Info info = 4; // May be omitted in omitmeta + + required sint64 lat = 8; + required sint64 lon = 9; +} + +/* Used to densly represent a sequence of nodes that do not have any tags. + +We represent these nodes columnwise as five columns: ID's, lats, and +lons, all delta coded. When metadata is not omitted, + +We encode keys & vals for all nodes as a single array of integers +containing key-stringid and val-stringid, using a stringid of 0 as a +delimiter between nodes. + + ( (<keyid> <valid>)* '0' )* + */ + +message DenseNodes { + repeated sint64 id = 1 [packed = true]; // DELTA coded + + //repeated Info info = 4; + optional DenseInfo denseinfo = 5; + + repeated sint64 lat = 8 [packed = true]; // DELTA coded + repeated sint64 lon = 9 [packed = true]; // DELTA coded + + // Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless. + repeated int32 keys_vals = 10 [packed = true]; +} + + +message Way { + required int64 id = 1; + // Parallel arrays. + repeated uint32 keys = 2 [packed = true]; + repeated uint32 vals = 3 [packed = true]; + + optional Info info = 4; + + repeated sint64 refs = 8 [packed = true]; // DELTA coded +} + +message Relation { + enum MemberType { + NODE = 0; + WAY = 1; + RELATION = 2; + } + required int64 id = 1; + + // Parallel arrays. + repeated uint32 keys = 2 [packed = true]; + repeated uint32 vals = 3 [packed = true]; + + optional Info info = 4; + + // Parallel arrays + repeated int32 roles_sid = 8 [packed = true]; + repeated sint64 memids = 9 [packed = true]; // DELTA encoded + repeated MemberType types = 10 [packed = true]; +} + diff --git a/src/Interactions/BuildBridgeInteraction.cpp b/src/Interactions/BuildBridgeInteraction.cpp new file mode 100644 index 0000000..22c93e3 --- /dev/null +++ b/src/Interactions/BuildBridgeInteraction.cpp @@ -0,0 +1,174 @@ +#include "Global.h" +#include "BuildBridgeInteraction.h" + +#include "MainWindow.h" +#include "PropertiesDock.h" +#include "DocumentCommands.h" +#include "FeatureCommands.h" +#include "WayCommands.h" +#include "Projection.h" +#include "Node.h" +#include "LineF.h" +#include "FeatureManipulations.h" +#include "Global.h" + +#include <QList> +#include <QMessageBox> +#include <assert.h> + +BuildBridgeInteraction::BuildBridgeInteraction(MainWindow* aMain) + : FeatureSnapInteraction(aMain), freshSplit(false) +{ + g_Merk_MainWindow->properties()->setSelection(0); + g_Merk_MainWindow->view()->invalidate(true, true, false); +} + +BuildBridgeInteraction::~BuildBridgeInteraction(void) +{ +} + +QString BuildBridgeInteraction::toHtml() +{ + QString help; + //help = (MainWindow::tr("LEFT-CLICK to select; LEFT-DRAG to move")); + + QString desc; + desc = QString("<big><b>%1</b></big><br/>").arg(MainWindow::tr("Build Bridge interaction")); + desc += QString("<b>%1</b><br/>").arg(help); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "</body></html>"; + + return S; +} + +/* +void BuildBridgeInteraction::snapMousePressEvent(QMouseEvent * ev, Feature* aFeat) +{ + Q_UNUSED(ev); + Q_UNUSED(aFeat); +#ifdef _MOBILE + theMain->view()->setCursor(cursor()); +#endif +} + +void BuildBridgeInteraction::snapMouseMoveEvent(QMouseEvent* ev, Feature* aFeat) +{ +#ifdef _MOBILE + theMain->view()->setCursor(cursor()); +#endif +} +*/ + +void BuildBridgeInteraction::snapMouseReleaseEvent(QMouseEvent * ev, Feature* aFeat) +{ +/* + if (theMoveInteraction) { + QMessageBox::critical(g_Merk_MainWindow, tr("BridgeBuilder"), tr("Hmm")); + theMoveInteraction->snapMouseReleaseEvent(ev, aFeat); + return; + } */ + + + Node* addNode = NULL; + + Way* aRoad = dynamic_cast<Way*>(aFeat); + if (aRoad) { + Coord P(XY_TO_COORD(ev->pos())); + addNode = createNode(P, aFeat); + } else if (aFeat) { + addNode = dynamic_cast<Node*>(aFeat); + } + + + if (freshSplit) { + freshSplit = false; + g_Merk_MainWindow->properties()->setSelection(0); + } + + if (addNode) { + g_Merk_MainWindow->properties()->addSelection(addNode); + } + if (g_Merk_MainWindow->properties()->selectionSize() >= 2) { + splitAndMark(); + freshSplit = true; + } +} + +void BuildBridgeInteraction::splitAndMark() { + /* Do some sanity check */ + Node* firstNode = CAST_NODE(g_Merk_MainWindow->properties()->selection(0)); + Node* secondNode = CAST_NODE(g_Merk_MainWindow->properties()->selection(1)); + if ((g_Merk_MainWindow->properties()->selectionSize() > 2) || (!firstNode) || (!secondNode)) { + QMessageBox::critical(g_Merk_MainWindow, tr("BridgeBuilder"), tr("Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.")); + g_Merk_MainWindow->properties()->setSelection(0); + return; + } + + CommandList* theList = new CommandList(tr("Convert segment to bridge"), NULL); + Way *R = cutoutRoad(g_Merk_MainWindow->document(), theList, g_Merk_MainWindow->properties(), firstNode, secondNode); + if (R) { + /* Add the bridge=yes/tunnel=culvert tag, including possible layer increase if nonexistent */ + if (R->findKey("bridge") == -1 && R->findKey("tunnel") == -1) { + int layer = R->tagValue("layer", "0").toInt(); + if (R->findKey("highway") != -1) { + theList->add(new SetTagCommand(R, "bridge", "yes")); + layer++; + } + if (R->findKey("waterway") != -1) { + theList->add(new SetTagCommand(R, "tunnel", "culvert")); + layer--; + } + + if (layer == 0) { + /* Remove the layer tag if it exists and would become 0. */ + if (R->findKey("level") != -1) { + theList->add(new ClearTagCommand(R, "layer")); + } + } else { + theList->add(new SetTagCommand(R, "layer", QString::number(layer))); + } + } else { + QMessageBox::critical(g_Merk_MainWindow, tr("BridgeBuilder"), tr("Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.")); + } + g_Merk_MainWindow->properties()->setSelection(R); + g_Merk_MainWindow->document()->addHistory(theList); + //g_Merk_MainWindow->view()->invalidate(true, true, false); + g_Merk_MainWindow->invalidateView(); + } else { + QMessageBox::critical(g_Merk_MainWindow, tr("BridgeBuilder"), tr("Unsupported action: The bridge does not seem to be a single way.")); + theList->undo(); + } +} + +#ifndef _MOBILE +QCursor BuildBridgeInteraction::cursor() const +{ + return QCursor(Qt::CrossCursor); +} +#endif + +Node *BuildBridgeInteraction::createNode(Coord P, Feature* aFeat) +{ + Node* N = NULL; + CommandList* theList; + Way* aRoad = dynamic_cast<Way*>(aFeat); + /* Bridge can be only created from existing roads */ + if (aRoad) + { + theList = new CommandList(MainWindow::tr("Create node in way %1").arg(aRoad->id().numId), aRoad); + int SnapIdx = findSnapPointIndex(aRoad, P); + N = g_backend.allocNode(g_Merk_MainWindow->document()->getDirtyOrOriginLayer(aRoad->layer()), P); + theList->add(new AddFeatureCommand(g_Merk_MainWindow->document()->getDirtyOrOriginLayer(aRoad->layer()),N,true)); + theList->add(new WayAddNodeCommand(aRoad,N,SnapIdx,g_Merk_MainWindow->document()->getDirtyOrOriginLayer(aRoad->layer()))); + + g_Merk_MainWindow->document()->addHistory(theList); + g_Merk_MainWindow->view()->invalidate(true, true, false); + } else { + assert(0); + } + return N; +} diff --git a/src/Interactions/BuildBridgeInteraction.h b/src/Interactions/BuildBridgeInteraction.h new file mode 100644 index 0000000..a9b940c --- /dev/null +++ b/src/Interactions/BuildBridgeInteraction.h @@ -0,0 +1,26 @@ +#ifndef MERKAARTOR_MARKBRIDGEINTERATION_H_ +#define MERKAARTOR_MARKBRIDGEINTERATION_H_ + +#include "Interaction.h" +#include "Feature.h" + +class BuildBridgeInteraction : public FeatureSnapInteraction +{ + public: + BuildBridgeInteraction(MainWindow* aMain); + ~BuildBridgeInteraction(void); + + + //virtual void snapMousePressEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseReleaseEvent(QMouseEvent * event, Feature* aLast); + //virtual void snapMouseMoveEvent(QMouseEvent* event, Feature* aLast); + virtual QString toHtml(); +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif + static Node* createNode(Coord P, Feature* aFeat); + void splitAndMark(); + bool freshSplit; +}; + +#endif diff --git a/src/Interactions/CreateAreaInteraction.cpp b/src/Interactions/CreateAreaInteraction.cpp new file mode 100644 index 0000000..bdaf703 --- /dev/null +++ b/src/Interactions/CreateAreaInteraction.cpp @@ -0,0 +1,277 @@ +#include "CreateAreaInteraction.h" +#include "DocumentCommands.h" +#include "RelationCommands.h" +#include "WayCommands.h" +#include "NodeCommands.h" +#include "Painting.h" +#include "Relation.h" +#include "Way.h" +#include "Node.h" +#include "LineF.h" +#include "MainWindow.h" +#include "PropertiesDock.h" +#include "MDiscardableDialog.h" +#include "Global.h" + +#include <QDockWidget> +#include <QMessageBox> +#include <QPainter> + +CreateAreaInteraction::CreateAreaInteraction(MainWindow* aMain) + : FeatureSnapInteraction(aMain), + theRelation(0), theRoad(0), LastRoad(0), FirstPoint(0,0), + FirstNode(0), HaveFirst(false), EndNow(false) +{ +} + +CreateAreaInteraction::~CreateAreaInteraction() +{ +} + +QString CreateAreaInteraction::toHtml() +{ + QString help; + //help = (MainWindow::tr("LEFT-CLICK to select; LEFT-DRAG to move")); + + QString desc; + desc = QString("<big><b>%1</b></big><br/>").arg(MainWindow::tr("Create Area interaction")); + desc += QString("<b>%1</b><br/>").arg(help); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "</body></html>"; + + return S; +} + +void CreateAreaInteraction::paintEvent(QPaintEvent* anEvent, QPainter& thePainter) +{ + if (theRoad && (!theRoad->layer() || theRoad->isDeleted())) { // The road was begon and then undoed. Restarting.... + HaveFirst = false; + theRoad = NULL; + view()->setInteracting(false); + } + + if (HaveFirst) + { + QPointF PreviousPoint; + if (theRoad && theRoad->size()) + PreviousPoint = COORD_TO_XY(CAST_NODE(theRoad->get(theRoad->size()-1))->position()); + else + PreviousPoint = COORD_TO_XY(FirstPoint); + QBrush SomeBrush(QColor(0xff,0x77,0x11,128)); + QPen TP(SomeBrush,view()->pixelPerM()*4+2); + ::draw(thePainter,TP,Feature::UnknownDirection, PreviousPoint,LastCursor ,4 ,view()->projection()); + + Coord NewPoint = XY_TO_COORD(LastCursor); + const qreal distance = FirstPoint.distanceFrom(NewPoint); + + QString distanceTag; + if (distance < 1.0) + distanceTag = QString("%1 m").arg(int(distance * 1000)); + else + distanceTag = QString("%1 km").arg(distance, 0, 'f', 3); + + thePainter.drawText(LastCursor + QPointF(10,-10), distanceTag); + } + + FeatureSnapInteraction::paintEvent(anEvent,thePainter); +} + +void CreateAreaInteraction::snapMouseMoveEvent(QMouseEvent* ev, Feature* aFeature) +{ + if (Node* Pt = dynamic_cast<Node*>(aFeature)) + LastCursor = COORD_TO_XY(Pt); + else if (Way* R = dynamic_cast<Way*>(aFeature)) + { + Coord P(XY_TO_COORD(ev->pos())); + findSnapPointIndex(R, P); + LastCursor = COORD_TO_XY(P); + } + else + LastCursor = ev->pos(); + view()->update(); +} + +void CreateAreaInteraction::startNewRoad(QMouseEvent* anEvent, Feature* aFeature) +{ + if (Node* Pt = CAST_NODE(aFeature)) + FirstNode = Pt; + else if (Way* aRoad = CAST_WAY(aFeature)) + { + Coord P(XY_TO_COORD(anEvent->pos())); + CommandList* theList = new CommandList(MainWindow::tr("Create Area %1").arg(aRoad->description()), aRoad); + int SnapIdx = findSnapPointIndex(aRoad, P); + Node* N = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), P); + theList->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),N,true)); + theList->add(new WayAddNodeCommand(aRoad,N,SnapIdx)); + document()->addHistory(theList); + view()->invalidate(true, true, false); + FirstNode = N; + } + view()->setInteracting(true); +} + +void CreateAreaInteraction::createNewRoad(CommandList* L) +{ + Node* From = 0; + theRoad = g_backend.allocWay(theMain->document()->getDirtyOrOriginLayer()); + if (FirstNode) + { + From = FirstNode; + FirstNode = 0; + if (!From->isDirty() && !From->hasOSMId() && From->isUploadable()) + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),From,true)); + } + else + { + From = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), FirstPoint); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),From,true)); + } + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),theRoad,true)); + if (M_PREFS->getAutoSourceTag()) { + QStringList sl = theMain->document()->getCurrentSourceTags(); + if (sl.size()) + theRoad->setTag("source", sl.join(";")); + } + L->add(new WayAddNodeCommand(theRoad,From)); + L->setDescription(MainWindow::tr("Area: Create Road %1").arg(theRoad->description())); + L->setFeature(theRoad); +} + +void CreateAreaInteraction::finishRoad(CommandList* L) +{ + if (theRelation) + L->add(new RelationAddFeatureCommand(theRelation,"inner",theRoad)); + else if (LastRoad) + { + theRelation = g_backend.allocRelation(theMain->document()->getDirtyOrOriginLayer()); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),theRelation,true)); + if (M_PREFS->getAutoSourceTag()) { + QStringList sl = theMain->document()->getCurrentSourceTags(); + if (sl.size()) + theRelation->setTag("source", sl.join(";")); + } + theRelation->setTag("type","multipolygon"); + theRelation->add("outer",LastRoad); + theRelation->add("inner",theRoad); + LastRoad = 0; + } + HaveFirst = false; + LastRoad = theRoad; + theRoad = 0; + view()->setInteracting(false); + + MDiscardableMessage dlg(NULL, + MainWindow::tr("Add a hole."), + MainWindow::tr("Do you want to add a(nother) hole to this area?")); + if (dlg.check() == QDialog::Rejected) { + EndNow = true; + } + L->setDescription(MainWindow::tr("Area: Finish Road %1").arg(LastRoad->description())); + L->setFeature(LastRoad); +} + +void CreateAreaInteraction::addToRoad(QMouseEvent* anEvent, Feature* Snap, CommandList* L) +{ + Node* Pt = dynamic_cast<Node*>(Snap); + Node* To = 0; + if (Pt) + To = Pt; + else if (Way* aRoad = dynamic_cast<Way*>(Snap)) + { + Coord P(XY_TO_COORD(anEvent->pos())); + int SnapIdx = findSnapPointIndex(aRoad, P); + Node* N = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), P); + CommandList* theList = new CommandList(MainWindow::tr("Area: Add node %1 to Road %2").arg(N->description()).arg(theRoad->description()), N); + theList->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),N,true)); + theList->add(new WayAddNodeCommand(aRoad,N,SnapIdx)); + document()->addHistory(theList); + view()->invalidate(true, true, false); + To = N; + } + if (!To) + { + To = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), XY_TO_COORD(anEvent->pos())); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),To,true)); + L->setDescription(MainWindow::tr("Area: Add node %1 to Road %2").arg(To->description()).arg(theRoad->description())); + L->setFeature(To); + } else { + if (!To->isDirty() && !To->hasOSMId() && To->isUploadable()) + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),To,true)); + } + L->add(new WayAddNodeCommand(theRoad,To)); + if (To == theRoad->get(0)) + finishRoad(L); +} + +void CreateAreaInteraction::snapMouseReleaseEvent(QMouseEvent* anEvent, Feature* aFeature) +{ + if (M_PREFS->getMouseSingleButton() && anEvent->button() == Qt::RightButton) { + LastRoad = NULL; + theRelation = NULL; + HaveFirst = false; + EndNow = false; + view()->setInteracting(false); + } else + if ( !panning() ) { + if (!HaveFirst) + { + HaveFirst = true; + startNewRoad(anEvent, aFeature); + } + else + { + CommandList* L = new CommandList(); + if (!theRoad) + createNewRoad(L); + addToRoad(anEvent, aFeature, L); + document()->addHistory(L); + view()->invalidate(true, true, false); + if (theRelation) + theMain->properties()->setSelection(theRelation); + else + theMain->properties()->setSelection(theRoad); + } + FirstPoint = XY_TO_COORD(anEvent->pos()); + + if (EndNow) { + if (theRelation) + theMain->properties()->setSelection(theRelation); + else + theMain->properties()->setSelection(LastRoad); + LastRoad = NULL; + theRelation = NULL; + HaveFirst = false; + EndNow = false; + view()->setInteracting(false); + } + } +} + +#ifndef _MOBILE +QCursor CreateAreaInteraction::cursor() const +{ + return QCursor(Qt::CrossCursor); +} +#endif + +void CreateAreaInteraction::closeAndFinish() +{ + view()->setInteracting(false); + + if (!theRoad || theRoad->size() < 3) + return; + + Node* N = theRoad->getNode(0); + CommandList* theList = new CommandList(MainWindow::tr("Close Area %1").arg(theRoad->description()), theRoad); + addToRoad(NULL, N, theList); + document()->addHistory(theList); + view()->invalidate(true, true, false); + if (theRelation) + theMain->properties()->setSelection(theRelation); + else + theMain->properties()->setSelection(theRoad); +} diff --git a/src/Interactions/CreateAreaInteraction.h b/src/Interactions/CreateAreaInteraction.h new file mode 100644 index 0000000..f04313d --- /dev/null +++ b/src/Interactions/CreateAreaInteraction.h @@ -0,0 +1,45 @@ +#ifndef MERKATOR_INTERACTION_CREATEAREAINTERACTION_H +#define MERKATOR_INTERACTION_CREATEAREAINTERACTION_H + +#include "Interaction.h" + +class MainWindow; +class Way; +class Way; + +class QDockWidget; + +class CreateAreaInteraction : public FeatureSnapInteraction +{ + Q_OBJECT + + public: + CreateAreaInteraction(MainWindow* Main); + ~CreateAreaInteraction(); + + virtual void snapMouseReleaseEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseMoveEvent(QMouseEvent* event, Feature* aLast); + virtual void paintEvent(QPaintEvent* anEvent, QPainter& thePainter); + virtual QString toHtml(); +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif + + virtual void closeAndFinish(); + + private: + void startNewRoad(QMouseEvent* anEvent, Feature* Snap); + void createNewRoad(CommandList* L); + void addToRoad(QMouseEvent* anEvent, Feature* Snap, CommandList* L); + void finishRoad(CommandList* L); + + QPoint LastCursor; + Relation* theRelation; + Way* theRoad; + Way* LastRoad; + Coord FirstPoint; + Node* FirstNode; + bool HaveFirst, EndNow; +}; + +#endif // INTERACTION\CREATEDOUBLEWAYINTERACTION_H diff --git a/src/Interactions/CreateDoubleWayDock.ui b/src/Interactions/CreateDoubleWayDock.ui new file mode 100644 index 0000000..1a49ba6 --- /dev/null +++ b/src/Interactions/CreateDoubleWayDock.ui @@ -0,0 +1,66 @@ +<ui version="4.0" > + <class>CreateDoubleWayDock</class> + <widget class="QWidget" name="CreateDoubleWayDock" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle" > + <string>Form</string> + </property> + <layout class="QVBoxLayout" > + <property name="margin" > + <number>9</number> + </property> + <property name="spacing" > + <number>6</number> + </property> + <item> + <widget class="QCheckBox" name="DriveRight" > + <property name="text" > + <string>Road driving on the right</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" > + <property name="margin" > + <number>0</number> + </property> + <property name="spacing" > + <number>6</number> + </property> + <item> + <widget class="QLabel" name="label" > + <property name="text" > + <string>Separation distance</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="RoadDistance" /> + </item> + </layout> + </item> + <item> + <spacer> + <property name="orientation" > + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" > + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/Interactions/CreateDoubleWayInteraction.cpp b/src/Interactions/CreateDoubleWayInteraction.cpp new file mode 100644 index 0000000..97e1132 --- /dev/null +++ b/src/Interactions/CreateDoubleWayInteraction.cpp @@ -0,0 +1,263 @@ +#include "CreateDoubleWayInteraction.h" +#include "DocumentCommands.h" +#include "WayCommands.h" +#include "NodeCommands.h" +#include "Painting.h" +#include "Way.h" +#include "Node.h" +#include "LineF.h" +#include "MainWindow.h" +#include "MerkaartorPreferences.h" +#include "Global.h" + +#include <QDockWidget> +#include <QPainter> + +CreateDoubleWayInteraction::CreateDoubleWayInteraction(MainWindow* aMain) + : Interaction(aMain), R1(0), R2(0), FirstPoint(0,0), HaveFirst(false), theDock(0) +{ +#ifndef _MOBILE + theDock = new QDockWidget(theMain); + QWidget* DockContent = new QWidget(theDock); + DockData.setupUi(DockContent); + theDock->setWidget(DockContent); + theDock->setAllowedAreas(Qt::LeftDockWidgetArea); + theMain->addDockWidget(Qt::LeftDockWidgetArea, theDock); + theDock->show(); + DockData.DriveRight->setChecked(M_PREFS->getrightsidedriving()); + DockData.RoadDistance->setText(QString().setNum(M_PREFS->getdoubleroaddistance())); + + theMain->view()->setCursor(cursor()); +#endif +} + +CreateDoubleWayInteraction::~CreateDoubleWayInteraction() +{ + M_PREFS->setrightsidedriving(DockData.DriveRight->isChecked()); + M_PREFS->setdoubleroaddistance(DockData.RoadDistance->text().toDouble()); + + delete theDock; + view()->update(); +} + +QString CreateDoubleWayInteraction::toHtml() +{ + QString help; + //help = (MainWindow::tr("LEFT-CLICK to select; LEFT-DRAG to move")); + + QString desc; + desc = QString("<big><b>%1</b></big><br/>").arg(MainWindow::tr("Create Parallel Way interaction")); + desc += QString("<b>%1</b><br/>").arg(help); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "</body></html>"; + + return S; +} + +void CreateDoubleWayInteraction::paintEvent(QPaintEvent* /* anEvent */, QPainter& thePainter) +{ + if (R1 && (!R1->layer() || R1->isDeleted())) { // The roads were begon and then undoed. Restarting.... + HaveFirst = false; + view()->setInteracting(false); + R1 = R2 = NULL; + } + + qreal rB = view()->pixelPerM()*DockData.RoadDistance->text().toDouble()/2; + if (!HaveFirst) + { + thePainter.setPen(QColor(0,0,0)); + thePainter.drawEllipse(int(LastCursor.x()-rB),int(LastCursor.y()-rB),int(rB*2),int(rB*2)); + } + else + { + Coord PreviousPoint; + if (R1 && R1->size()) + PreviousPoint = PreviousPoints[R1->size()-1]; + else + PreviousPoint = FirstPoint; + + if (distance(COORD_TO_XY(PreviousPoint), LastCursor) > 1) + { + qreal rA = FirstDistance * view()->pixelPerM()/2; + LineF FA1(COORD_TO_XY(PreviousPoint),LastCursor); + LineF FA2(FA1); + LineF FB1(FA1); + LineF FB2(FA1); + FA1.slide(-rA); + FA2.slide(rA); + FB1.slide(-rB); + FB2.slide(rB); + QPointF A1(FA1.project(COORD_TO_XY(PreviousPoint))); + QPointF A2(FA2.project(COORD_TO_XY(PreviousPoint))); + QPointF B1(FB1.project(LastCursor)); + QPointF B2(FB2.project(LastCursor)); + + QBrush SomeBrush(QColor(0xff,0x77,0x11,128)); + QPen TP(SomeBrush,view()->pixelPerM()*4); + if (DockData.DriveRight->isChecked()) + { + ::draw(thePainter,TP,Feature::OneWay, B1,A1,rB/4,view()->projection()); + ::draw(thePainter,TP,Feature::OneWay, A2,B2,rB/4,view()->projection()); + } + else + { + ::draw(thePainter,TP,Feature::OneWay, A1,B1,rB/4,view()->projection()); + ::draw(thePainter,TP,Feature::OneWay, B2,A2,rB/4,view()->projection()); + } + } + } +} + +void CreateDoubleWayInteraction::mouseMoveEvent(QMouseEvent* event) +{ + LastCursor = event->pos(); + Interaction::mouseMoveEvent(event); + view()->update(); + Interaction::mouseMoveEvent(event); +} + +void CreateDoubleWayInteraction::mouseReleaseEvent(QMouseEvent* anEvent) +{ + if (M_PREFS->getMouseSingleButton() && anEvent->button() == Qt::RightButton) { + HaveFirst = false; + view()->update(); + } + Interaction::mouseReleaseEvent(anEvent); +} + +void CreateDoubleWayInteraction::mousePressEvent(QMouseEvent* anEvent) +{ + if (anEvent->buttons() & Qt::LeftButton) + { + if (!HaveFirst) + { + HaveFirst = true; + view()->setInteracting(true); + FirstPoint = XY_TO_COORD(anEvent->pos()); + FirstDistance = DockData.RoadDistance->text().toDouble(); + } + else if (R1) + { + int i1 = R1->size()-1; + int i2 = 1; + LineF P1( + COORD_TO_XY(R1->getNode(i1-1)), + COORD_TO_XY(R1->getNode(i1))); + LineF P2( + COORD_TO_XY(R2->getNode(i2-1)), + COORD_TO_XY(R2->getNode(i2))); + + Coord PreviousPoint = PreviousPoints[R1->size()-1]; + if (distance(COORD_TO_XY(PreviousPoint), LastCursor) > 1) + { + qreal rB = view()->pixelPerM()*DockData.RoadDistance->text().toDouble()/2; + qreal rA = FirstDistance * view()->pixelPerM()/2; + LineF FA1(COORD_TO_XY(PreviousPoint),LastCursor); + LineF FA2(FA1); + LineF FB1(FA1); + LineF FB2(FA1); + qreal Modifier = DockData.DriveRight->isChecked()?1:-1; + FA1.slide(rA*Modifier); + FA2.slide(-rA*Modifier); + FB1.slide(rB*Modifier); + FB2.slide(-rB*Modifier); + LineF N1(FA1.project(COORD_TO_XY(PreviousPoint)), FB1.project(LastCursor)); + LineF N2(FA2.project(COORD_TO_XY(PreviousPoint)), FB2.project(LastCursor)); + + Node* A1; + Node* A2; + CommandList* L = new CommandList(MainWindow::tr("Add nodes to parallel way %1").arg(R1->id().numId), R1); + A1 = R1->getNode(i1); + A2 = R2->getNode(i2-1); + L->add(new MoveNodeCommand(A1,XY_TO_COORD( + P1.intersectionWith(N1).toPoint()))); + L->add(new MoveNodeCommand(A2,XY_TO_COORD( + P2.intersectionWith(N2).toPoint()))); + Node* B1 = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), XY_TO_COORD( + FB1.project(LastCursor).toPoint())); + Node* B2 = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), XY_TO_COORD( + FB2.project(LastCursor).toPoint())); + + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),B1,true)); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),B2,true)); + L->add(new WayAddNodeCommand(R1,B1)); + L->add(new WayAddNodeCommand(R2,B2,(int)0)); + document()->addHistory(L); + view()->invalidate(true, true, false); + //FirstPoint = view()->projection().inverse(anEvent->pos()); + PreviousPoints[R1->size()-1] = XY_TO_COORD(anEvent->pos()); + FirstDistance = DockData.RoadDistance->text().toDouble(); + } + } + else + { + Coord PreviousPoint = FirstPoint; + if (distance(COORD_TO_XY(PreviousPoint), LastCursor) > 1) + { + qreal rB = view()->pixelPerM()*DockData.RoadDistance->text().toDouble()/2; + qreal rA = FirstDistance * view()->pixelPerM()/2; + LineF FA1(COORD_TO_XY(PreviousPoint),LastCursor); + LineF FA2(FA1); + LineF FB1(FA1); + LineF FB2(FA1); + qreal Modifier = DockData.DriveRight->isChecked()?1:-1; + FA1.slide(rA*Modifier); + FA2.slide(-rA*Modifier); + FB1.slide(rB*Modifier); + FB2.slide(-rB*Modifier); + + Node* A1 = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), XY_TO_COORD( + FA1.project(COORD_TO_XY(PreviousPoint)).toPoint())); + Node* A2 = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), XY_TO_COORD( + FA2.project(COORD_TO_XY(PreviousPoint)).toPoint())); + Node* B1 = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), XY_TO_COORD( + FB1.project(LastCursor).toPoint())); + Node* B2 = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), XY_TO_COORD( + FB2.project(LastCursor).toPoint())); + R1 = g_backend.allocWay(theMain->document()->getDirtyOrOriginLayer()); + R2 = g_backend.allocWay(theMain->document()->getDirtyOrOriginLayer()); + + CommandList* L = new CommandList(MainWindow::tr("Create parallel way %1").arg(R1->id().numId), R1); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),A1,true)); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),A2,true)); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),B1,true)); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),B2,true)); + + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),R1,true)); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),R2,true)); + if (M_PREFS->getAutoSourceTag()) { + QStringList sl = theMain->document()->getCurrentSourceTags(); + if (sl.size()) { + R1->setTag("source", sl.join(";")); + R2->setTag("source", sl.join(";")); + } + } + R1->setTag("oneway","yes"); + R2->setTag("oneway","yes"); + L->add(new WayAddNodeCommand(R1,A1)); + L->add(new WayAddNodeCommand(R1,B1)); + L->add(new WayAddNodeCommand(R2,B2)); + L->add(new WayAddNodeCommand(R2,A2)); + document()->addHistory(L); + view()->invalidate(true, true, false); + //FirstPoint = view()->projection().inverse(anEvent->pos()); + PreviousPoints[R1->size()-1] = XY_TO_COORD(anEvent->pos()); + FirstDistance = DockData.RoadDistance->text().toDouble(); + } + } + } + else + Interaction::mousePressEvent(anEvent); +} + +#ifndef _MOBILE +QCursor CreateDoubleWayInteraction::cursor() const +{ + return QCursor(Qt::CrossCursor); +} + +#endif diff --git a/src/Interactions/CreateDoubleWayInteraction.h b/src/Interactions/CreateDoubleWayInteraction.h new file mode 100644 index 0000000..4c347ba --- /dev/null +++ b/src/Interactions/CreateDoubleWayInteraction.h @@ -0,0 +1,41 @@ +#ifndef MERKATOR_INTERACTION_CREATEDOUBLEWAYINTERACTION_H +#define MERKATOR_INTERACTION_CREATEDOUBLEWAYINTERACTION_H + +#include <ui_CreateDoubleWayDock.h> +#include "Interaction.h" + +class MainWindow; +class Way; + +class QDockWidget; + +class CreateDoubleWayInteraction : public Interaction +{ + Q_OBJECT + + public: + CreateDoubleWayInteraction(MainWindow* Main); + ~CreateDoubleWayInteraction(); + + virtual void mousePressEvent(QMouseEvent * event); + virtual void mouseMoveEvent(QMouseEvent* event); + virtual void mouseReleaseEvent(QMouseEvent* event); + virtual void paintEvent(QPaintEvent* anEvent, QPainter& thePainter); + virtual QString toHtml(); +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif + + private: + QDockWidget* theDock; + Ui::CreateDoubleWayDock DockData; + QPoint LastCursor; + Way* R1; + Way* R2; + Coord FirstPoint; + qreal FirstDistance; + bool HaveFirst; + QHash<int, Coord> PreviousPoints; +}; + +#endif // INTERACTION\CREATEDOUBLEWAYINTERACTION_H diff --git a/src/Interactions/CreateNodeInteraction.cpp b/src/Interactions/CreateNodeInteraction.cpp new file mode 100644 index 0000000..e35e3d7 --- /dev/null +++ b/src/Interactions/CreateNodeInteraction.cpp @@ -0,0 +1,133 @@ +#include "Global.h" +#include "CreateNodeInteraction.h" + +#include "MainWindow.h" +#include "PropertiesDock.h" +#include "DocumentCommands.h" +#include "WayCommands.h" +#include "Projection.h" +#include "Node.h" +#include "LineF.h" +#include "MoveNodeInteraction.h" +#include "Global.h" + +#include <QList> + +CreateNodeInteraction::CreateNodeInteraction(MainWindow* aMain) + : FeatureSnapInteraction(aMain) + , theMoveInteraction(0) +{ +} + +CreateNodeInteraction::~CreateNodeInteraction(void) +{ + delete theMoveInteraction; +} + +QString CreateNodeInteraction::toHtml() +{ + QString help; + //help = (MainWindow::tr("LEFT-CLICK to select; LEFT-DRAG to move")); + + QString desc; + desc = QString("<big><b>%1</b></big><br/>").arg(MainWindow::tr("Create Node interaction")); + desc += QString("<b>%1</b><br/>").arg(help); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "</body></html>"; + + return S; +} + +void CreateNodeInteraction::snapMousePressEvent(QMouseEvent * ev, Feature* aFeat) +{ + if (CAST_NODE(aFeat)) { + return theMoveInteraction->snapMousePressEvent(ev, aFeat); + } else { + SAFE_DELETE(theMoveInteraction); +#ifndef _MOBILE + theMain->view()->setCursor(cursor()); +#endif + } + +} + +void CreateNodeInteraction::snapMouseMoveEvent(QMouseEvent* ev, Feature* aFeat) +{ + if (CAST_NODE(aFeat)) { + if (!theMoveInteraction) { + theMoveInteraction = new MoveNodeInteraction(theMain); + } +#ifndef _MOBILE + theMain->view()->setCursor(theMoveInteraction->cursor()); + } else + theMain->view()->setCursor(cursor()); +#else + } +#endif + + if (theMoveInteraction) + return theMoveInteraction->snapMouseMoveEvent(ev, aFeat); +} + +void CreateNodeInteraction::snapMouseReleaseEvent(QMouseEvent * ev, Feature* aFeat) +{ + if (theMoveInteraction) { + theMoveInteraction->snapMouseReleaseEvent(ev, aFeat); + return; + } + + Way* aRoad = dynamic_cast<Way*>(aFeat); + if (!aFeat || aRoad) { + SAFE_DELETE(theMoveInteraction); + Coord P(XY_TO_COORD(ev->pos())); + + createNode(P, aFeat); + + theMoveInteraction = new MoveNodeInteraction(theMain); +#ifndef _MOBILE + theMain->view()->setCursor(theMoveInteraction->cursor()); +#endif + } +} + +#ifndef _MOBILE +QCursor CreateNodeInteraction::cursor() const +{ + return QCursor(Qt::CrossCursor); +} +#endif + +void CreateNodeInteraction::createNode(Coord P, Feature* aFeat) +{ + Node* N; + CommandList* theList; + Way* aRoad = dynamic_cast<Way*>(aFeat); + if (aRoad) + { + g_Merk_MainWindow->properties()->setSelection(0); + theList = new CommandList(MainWindow::tr("Create node in way %1").arg(aRoad->id().numId), aRoad); + int SnapIdx = findSnapPointIndex(aRoad, P); + N = g_backend.allocNode(g_Merk_MainWindow->document()->getDirtyOrOriginLayer(aRoad->layer()), P); + theList->add(new AddFeatureCommand(g_Merk_MainWindow->document()->getDirtyOrOriginLayer(aRoad->layer()),N,true)); + theList->add(new WayAddNodeCommand(aRoad,N,SnapIdx,g_Merk_MainWindow->document()->getDirtyOrOriginLayer(aRoad->layer()))); + } + else + { + N = g_backend.allocNode(g_Merk_MainWindow->document()->getDirtyOrOriginLayer(), P); + theList = new CommandList(MainWindow::tr("Create node %1").arg(N->id().numId), N); + theList->add(new AddFeatureCommand(g_Merk_MainWindow->document()->getDirtyOrOriginLayer(),N,true)); + if (M_PREFS->getAutoSourceTag()) { + QStringList sl = g_Merk_MainWindow->document()->getCurrentSourceTags(); + if (sl.size()) + N->setTag("source", sl.join(";")); + } + N->updateMeta(); + } + g_Merk_MainWindow->document()->addHistory(theList); + g_Merk_MainWindow->properties()->setSelection(N); + g_Merk_MainWindow->view()->invalidate(true, true, false); +} diff --git a/src/Interactions/CreateNodeInteraction.h b/src/Interactions/CreateNodeInteraction.h new file mode 100644 index 0000000..ce27496 --- /dev/null +++ b/src/Interactions/CreateNodeInteraction.h @@ -0,0 +1,28 @@ +#ifndef MERKAARTOR_CREATENODEINTERATION_H_ +#define MERKAARTOR_CREATENODEINTERATION_H_ + +#include "Interaction.h" + +class MoveNodeInteraction; + +class CreateNodeInteraction : public FeatureSnapInteraction +{ + public: + CreateNodeInteraction(MainWindow* aMain); + ~CreateNodeInteraction(void); + + + virtual void snapMousePressEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseReleaseEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseMoveEvent(QMouseEvent* event, Feature* aLast); + virtual QString toHtml(); +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif + static void createNode(Coord P, Feature* aFeat); + + private: + MoveNodeInteraction* theMoveInteraction; +}; + +#endif diff --git a/src/Interactions/CreatePolygonInteraction.cpp b/src/Interactions/CreatePolygonInteraction.cpp new file mode 100644 index 0000000..e240e52 --- /dev/null +++ b/src/Interactions/CreatePolygonInteraction.cpp @@ -0,0 +1,203 @@ +#include "CreatePolygonInteraction.h" + +#include "MainWindow.h" +#include "DocumentCommands.h" +#include "WayCommands.h" +#include "NodeCommands.h" +#include "Painting.h" +#include "Way.h" +#include "Node.h" +#include "LineF.h" +#include "PropertiesDock.h" +#include "MerkaartorPreferences.h" +#include "Global.h" + +#include <QtGui/QPainter> +#include <QInputDialog> + +#include <math.h> + +CreatePolygonInteraction::CreatePolygonInteraction(MainWindow* aMain, int sides, const QList< QPair <QString, QString> >& tags) + : Interaction(aMain), Origin(0,0), Sides(sides), HaveOrigin(false), bAngle(0.0), bScale(QPointF(1., 1.)), theTags(tags) +{ +#ifndef _MOBILE + theMain->view()->setCursor(cursor()); +#endif +} + +CreatePolygonInteraction::~CreatePolygonInteraction() +{ + view()->update(); +} + +QString CreatePolygonInteraction::toHtml() +{ + QString help; + help = (MainWindow::tr("LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end")); + + QStringList helpList = help.split(";"); + + QString desc; + desc = QString("<big><b>%1</b></big>").arg(MainWindow::tr("Create Polygon interaction")); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "<hr/>"; + S += "<ul style=\"margin-left: 0px; padding-left: 0px;\">"; + for (int i=0; i<helpList.size(); ++i) { + S+= "<li>" + helpList[i] + "</li>"; + } + S += "</ul>"; + S += "</body></html>"; + + return S; +} + + +void CreatePolygonInteraction::mousePressEvent(QMouseEvent * event) +{ + if (event->buttons() & Qt::LeftButton) + { + if (!HaveOrigin) + { + HaveOrigin = true; + view()->setInteracting(true); + Origin = XY_TO_COORD(event->pos()); + OriginF = QPointF(event->pos()); + bAngle = 0.; + bScale = QPointF(1., 1.); + } + else + { + QPointF CenterF(0.5, 0.5); + qreal Radius = 0.5; + if (Sides == 4) + Radius = sqrt(2.)/2.; + qreal Angle = 2*M_PI/Sides; + QBrush SomeBrush(QColor(0xff,0x77,0x11,128)); + QPen TP(SomeBrush,view()->pixelPerM()*4); + + QMatrix m; + m.translate(OriginF.x(), OriginF.y()); + m.rotate(bAngle); + m.scale(bScale.x(), bScale.y()); + + QPointF Prev(CenterF.x()+cos(-Angle/2)*Radius,CenterF.y()+sin(-Angle/2)*Radius); + Node* First = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), XY_TO_COORD(m.map(Prev).toPoint())); + Way* R = g_backend.allocWay(theMain->document()->getDirtyOrOriginLayer()); + CommandList* L = new CommandList(MainWindow::tr("Create polygon %1").arg(R->id().numId), R); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),R,true)); + R->add(First); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),First,true)); + for (qreal a = 2*M_PI - Angle*3/2; a>0; a-=Angle) + { + QPointF Next(CenterF.x()+cos(a)*Radius,CenterF.y()+sin(a)*Radius); + Node* New = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), XY_TO_COORD(m.map(Next).toPoint())); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),New,true)); + R->add(New); + } + R->add(First); + if (M_PREFS->getAutoSourceTag()) { + QStringList sl = theMain->document()->getCurrentSourceTags(); + if (sl.size()) + R->setTag("source", sl.join(";")); + } + QPair <QString, QString> tag; + foreach (tag, theTags) { + R->setTag(tag.first, tag.second); + } + for (FeatureIterator it(document()); !it.isEnd(); ++it) + { + Way* W1 = dynamic_cast<Way*>(it.get()); + if (W1 && (W1 != R)) + Way::createJunction(theMain->document(), L, R, W1, true); + } + theMain->properties()->setSelection(R); + document()->addHistory(L); + view()->setInteracting(false); + view()->invalidate(true, true, false); + theMain->launchInteraction(0); + } + } + else + Interaction::mousePressEvent(event); +} + +void CreatePolygonInteraction::paintEvent(QPaintEvent* , QPainter& thePainter) +{ + if (HaveOrigin) + { + QPointF CenterF(0.5, 0.5); + qreal Radius = 0.5; + if (Sides == 4) + Radius = sqrt(2.)/2.; + + QMatrix m; + m.translate(OriginF.x(), OriginF.y()); + m.rotate(bAngle); + m.scale(bScale.x(), bScale.y()); + QPolygonF thePoly = m.map(QRectF(QPointF(0.0, 0.0), QPointF(1.0, 1.0))); + + thePainter.setPen(QPen(QColor(0,0,255),1,Qt::DotLine)); + thePainter.drawPolygon(thePoly); + + qreal Angle = 2*M_PI/Sides; + QBrush SomeBrush(QColor(0xff,0x77,0x11,128)); + QPen TP(SomeBrush,view()->pixelPerM()*4+1); + QPointF Prev(CenterF.x()+cos(-Angle/2)*Radius,CenterF.y()+sin(-Angle/2)*Radius); + for (qreal a = 2*M_PI - Angle*3/2; a>0; a-=Angle) + { + QPointF Next(CenterF.x()+cos(a)*Radius,CenterF.y()+sin(a)*Radius); + ::draw(thePainter,TP,Feature::UnknownDirection, m.map(Prev),m.map(Next),4,view()->projection()); + Prev = Next; + } + QPointF Next(CenterF.x()+cos(-Angle/2)*Radius,CenterF.y()+sin(-Angle/2)*Radius); + ::draw(thePainter,TP,Feature::UnknownDirection, m.map(Prev),m.map(Next),4,view()->projection()); + } +} + +void CreatePolygonInteraction::mouseMoveEvent(QMouseEvent* event) +{ + if (HaveOrigin) { + OriginF = COORD_TO_XY(Origin); + + QMatrix m; + m.translate(OriginF.x(), OriginF.y()); + m.rotate(bAngle); + + if (event->modifiers() & Qt::ShiftModifier) { + bAngle += radToAng(angle(m.inverted().map(LastCursor), m.inverted().map(event->pos()))); + + QMatrix m2; + m2.translate(OriginF.x(), OriginF.y()); + m2.rotate(bAngle); + bScale = m2.inverted().map(event->pos()); + } else { + bScale = m.inverted().map(event->pos()); + } + + view()->update(); + } + LastCursor = event->pos(); + Interaction::mouseMoveEvent(event); +} + +void CreatePolygonInteraction::mouseReleaseEvent(QMouseEvent* event) +{ + if (M_PREFS->getMouseSingleButton() && event->button() == Qt::RightButton) { + HaveOrigin = false; + view()->setInteracting(false); + view()->update(); + } + Interaction::mouseReleaseEvent(event); +} + + +#ifndef _MOBILE +QCursor CreatePolygonInteraction::cursor() const +{ + return QCursor(Qt::CrossCursor); +} +#endif diff --git a/src/Interactions/CreatePolygonInteraction.h b/src/Interactions/CreatePolygonInteraction.h new file mode 100644 index 0000000..249fc4c --- /dev/null +++ b/src/Interactions/CreatePolygonInteraction.h @@ -0,0 +1,36 @@ +#ifndef INTERACTION_CREATEPOLYGONINTERACTION_H +#define INTERACTION_CREATEPOLYGONINTERACTION_H + +#include "Interaction.h" +#include "Coord.h" + +class CreatePolygonInteraction : public Interaction +{ + Q_OBJECT + + public: + CreatePolygonInteraction(MainWindow* Main, int sides, const QList< QPair <QString, QString> >& tags); + ~CreatePolygonInteraction(); + + virtual void mousePressEvent(QMouseEvent * event); + virtual void mouseMoveEvent(QMouseEvent* event); + virtual void mouseReleaseEvent(QMouseEvent* event); + virtual void paintEvent(QPaintEvent* anEvent, QPainter& thePainter); + virtual QString toHtml(); +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif + + private: + Coord Origin; + QPointF OriginF; + int Sides; + QPointF LastCursor; + bool HaveOrigin; + + qreal bAngle; + QPointF bScale; + QList< QPair <QString, QString> > theTags; +}; + +#endif // INTERACTION\CreatePolygonInteraction_H diff --git a/src/Interactions/CreateRoundaboutDock.ui b/src/Interactions/CreateRoundaboutDock.ui new file mode 100644 index 0000000..9f5d505 --- /dev/null +++ b/src/Interactions/CreateRoundaboutDock.ui @@ -0,0 +1,106 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>CreateRoundaboutDock</class> + <widget class="QWidget" name="CreateRoundaboutDock"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>364</width> + <height>142</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>9</number> + </property> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="3" column="0"> + <widget class="QLabel" name="precisionLabel"> + <property name="text"> + <string>Precision (meters/segment)</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Type</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QDoubleSpinBox" name="precision"> + <property name="decimals"> + <number>1</number> + </property> + <property name="minimum"> + <double>0.100000000000000</double> + </property> + <property name="value"> + <double>3.000000000000000</double> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QComboBox" name="type"> + <item> + <property name="text"> + <string>Roundabout</string> + </property> + </item> + <item> + <property name="text"> + <string>Plain circle</string> + </property> + </item> + </widget> + </item> + <item row="2" column="1"> + <widget class="QComboBox" name="drivingSide"> + <item> + <property name="text"> + <string>Left</string> + </property> + </item> + <item> + <property name="text"> + <string>Right</string> + </property> + </item> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Driving side</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/Interactions/CreateRoundaboutInteraction.cpp b/src/Interactions/CreateRoundaboutInteraction.cpp new file mode 100644 index 0000000..9331eef --- /dev/null +++ b/src/Interactions/CreateRoundaboutInteraction.cpp @@ -0,0 +1,190 @@ +#include "CreateRoundaboutInteraction.h" + +#include "MainWindow.h" +#include "DocumentCommands.h" +#include "WayCommands.h" +#include "NodeCommands.h" +#include "Painting.h" +#include "Way.h" +#include "Node.h" +#include "LineF.h" +#include "PropertiesDock.h" +#include "MerkaartorPreferences.h" +#include "Global.h" + +#include <QDockWidget> +#include <QPainter> + +#include <math.h> + +CreateRoundaboutInteraction::CreateRoundaboutInteraction(MainWindow* aMain) + : Interaction(aMain), Center(0,0), HaveCenter(false), theDock(0) +{ +#ifndef _MOBILE + theDock = new QDockWidget(theMain); + QWidget* DockContent = new QWidget(theDock); + DockData.setupUi(DockContent); + theDock->setWidget(DockContent); + theDock->setAllowedAreas(Qt::LeftDockWidgetArea); + theMain->addDockWidget(Qt::LeftDockWidgetArea, theDock); + theDock->show(); + connect(DockData.type, SIGNAL(currentIndexChanged(int)), this, SLOT(on_typeChanged(int))); + DockData.drivingSide->setCurrentIndex(M_PREFS->getrightsidedriving()); + DockData.precision->setValue(M_PREFS->getRoundaboutPrecision()); + DockData.type->setCurrentIndex(M_PREFS->getRoundaboutType()); + + theMain->view()->setCursor(cursor()); +#endif +} + +void CreateRoundaboutInteraction::on_typeChanged(int newType) { + DockData.drivingSide->setEnabled(newType == 0); +} + +CreateRoundaboutInteraction::~CreateRoundaboutInteraction() +{ + M_PREFS->setrightsidedriving(DockData.drivingSide->currentIndex()); /* 0 is left, 1 is right */ + M_PREFS->setRoundaboutType(DockData.type->currentIndex()); + M_PREFS->setRoundaboutPrecision(DockData.precision->value()); + delete theDock; + view()->update(); +} + +QString CreateRoundaboutInteraction::toHtml() +{ + QString help; + //help = (MainWindow::tr("LEFT-CLICK to select; LEFT-DRAG to move")); + + QString desc; + desc = QString("<big><b>%1</b></big><br/>").arg(MainWindow::tr("Create Roundabout interaction")); + desc += QString("<b>%1</b><br/>").arg(help); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "</body></html>"; + + return S; +} + +void CreateRoundaboutInteraction::mousePressEvent(QMouseEvent * event) +{ + if (event->buttons() & Qt::LeftButton) + { + if (!HaveCenter) + { + HaveCenter = true; + view()->setInteracting(true); + Center = XY_TO_COORD(event->pos()); + } + else + { + calculatePoints(); + if (Points.size() == 0) return; + + QPointF Prev = Points[0]; + Node* First = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), XY_TO_COORD(Prev.toPoint())); + Way* R = g_backend.allocWay(theMain->document()->getDirtyOrOriginLayer()); + CommandList* L = new CommandList(MainWindow::tr("Create Roundabout %1").arg(R->id().numId), R); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),R,true)); + R->add(First); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),First,true)); + if (M_PREFS->getAutoSourceTag()) { + QStringList sl = theMain->document()->getCurrentSourceTags(); + if (sl.size()) + R->setTag("source", sl.join(";")); + } + // "oneway" is implied on roundabouts + //R->setTag("oneway","yes"); + if (DockData.type->currentIndex() == 0) + R->setTag("junction","roundabout"); + for (int i = 1; i < Points.size(); i++ ) { + QPointF Next = Points[i]; + Node* New = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), XY_TO_COORD(Next.toPoint())); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),New,true)); + R->add(New); + } + R->add(First); + for (FeatureIterator it(document()); !it.isEnd(); ++it) { + Way* W1 = CAST_WAY(it.get()); + if (W1 && (W1 != R)) + Way::createJunction(theMain->document(), L, R, W1, true); + } + theMain->properties()->setSelection(R); + document()->addHistory(L); + view()->setInteracting(false); + view()->invalidate(true, true, false); + theMain->launchInteraction(0); + } + } + else + Interaction::mousePressEvent(event); +} + +void CreateRoundaboutInteraction::mouseMoveEvent(QMouseEvent* event) +{ + LastCursor = event->pos(); + if (HaveCenter) + view()->update(); + Interaction::mouseMoveEvent(event); +} + +void CreateRoundaboutInteraction::mouseReleaseEvent(QMouseEvent* anEvent) +{ + if (M_PREFS->getMouseSingleButton() && anEvent->button() == Qt::RightButton) { + HaveCenter = false; + view()->setInteracting(false); + view()->update(); + } + Interaction::mouseReleaseEvent(anEvent); +} + +void CreateRoundaboutInteraction::calculatePoints() { + Points.clear(); + if (HaveCenter) { + QPointF CenterF(COORD_TO_XY(Center)); + qreal Radius = distance(CenterF,LastCursor)/view()->pixelPerM(); + qreal Precision = DockData.precision->value(); //2.49; + /* Let the precision be the approximate number of meters per arc */ + + qreal Circumference = 2*M_PI*Radius; + qreal Steps = Circumference/Precision; + if (Steps < 3) Steps = 3; + qreal Angle = 2*M_PI/Steps; + + /* Normalize the radius for drawing */ + Radius *= view()->pixelPerM(); + + qreal Modifier = DockData.drivingSide->currentIndex() == 1 ? -1:1; + for (qreal a = 0; a<2*M_PI; a+=Angle) { + QPointF point(CenterF.x()+cos(Modifier*a)*Radius,CenterF.y()+sin(Modifier*a)*Radius); + Points.append(point); + } + } +} + +void CreateRoundaboutInteraction::paintEvent(QPaintEvent* , QPainter& thePainter) +{ + calculatePoints(); + + if (Points.size() == 0) return; + + qreal Precision = DockData.precision->value(); //2.49; + QBrush SomeBrush(QColor(0xff,0x77,0x11,128)); + QPen TP(SomeBrush,view()->pixelPerM()*Precision/2); + + for (int i = 0; i < Points.size(); i++) { + QPointF Prev = Points[i]; + QPointF Next = Points[ (i+1)%Points.size() ]; + ::draw(thePainter, TP, (DockData.type->currentIndex() == 0) ? Feature::OneWay : Feature::BothWays, Prev, Next, Precision, view()->projection()); + Prev = Next; + } +} + +#ifndef _MOBILE +QCursor CreateRoundaboutInteraction::cursor() const +{ + return QCursor(Qt::CrossCursor); +} +#endif diff --git a/src/Interactions/CreateRoundaboutInteraction.h b/src/Interactions/CreateRoundaboutInteraction.h new file mode 100644 index 0000000..5fd6f36 --- /dev/null +++ b/src/Interactions/CreateRoundaboutInteraction.h @@ -0,0 +1,39 @@ +#ifndef INTERACTION_CREATEROUNDABOUTINTERACTION_H +#define INTERACTION_CREATEROUNDABOUTINTERACTION_H + +#include <ui_CreateRoundaboutDock.h> +#include "Interaction.h" +#include "Coord.h" + +class QDockWidget; + +class CreateRoundaboutInteraction : public Interaction +{ + Q_OBJECT + + public: + CreateRoundaboutInteraction(MainWindow* aMain); + ~CreateRoundaboutInteraction(); + + virtual void mousePressEvent(QMouseEvent * event); + virtual void mouseMoveEvent(QMouseEvent* event); + virtual void mouseReleaseEvent(QMouseEvent* event); + virtual void paintEvent(QPaintEvent* anEvent, QPainter& thePainter); + virtual QString toHtml(); +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif + private slots: + void on_typeChanged(int newType); + + private: + void calculatePoints(); + QDockWidget* theDock; + Ui::CreateRoundaboutDock DockData; + Coord Center; + QList<QPointF> Points; + QPointF LastCursor; + bool HaveCenter; +}; + +#endif // INTERACTION\CREATEROUNDABOUTINTERACTION_H diff --git a/src/Interactions/CreateSingleWayInteraction.cpp b/src/Interactions/CreateSingleWayInteraction.cpp new file mode 100644 index 0000000..f69e308 --- /dev/null +++ b/src/Interactions/CreateSingleWayInteraction.cpp @@ -0,0 +1,364 @@ +#include "CreateSingleWayInteraction.h" +#include "CreateNodeInteraction.h" +#include "DocumentCommands.h" +#include "WayCommands.h" +#include "NodeCommands.h" +#include "Painting.h" +#include "Way.h" +#include "Node.h" +#include "LineF.h" +#include "MainWindow.h" +#include "PropertiesDock.h" +#include "Global.h" + +#include <QDockWidget> +#include <QPainter> + +CreateSingleWayInteraction::CreateSingleWayInteraction(MainWindow* aMain, Node *firstNode, bool aCurved) + : FeatureSnapInteraction(aMain), theRoad(0), FirstPoint(0,0), + FirstNode(firstNode), HaveFirst(false), Prepend(false), IsCurved(aCurved), Creating(false) + , SnapAngle(0) + , ParallelMode(false) +{ + if (firstNode) + { + FirstPoint = firstNode->position(); + LastCursor = COORD_TO_XY(FirstPoint); + HaveFirst = true; + view()->setInteracting(true); + if ((theRoad = Way::GetSingleParentRoad(firstNode))) { + if (theRoad->isExtrimity(firstNode)) { + Prepend = (theRoad->get(0) == firstNode) ? true : false; + } else + theRoad = NULL; + + } + } +} + +CreateSingleWayInteraction::~CreateSingleWayInteraction() +{ +} + +void CreateSingleWayInteraction::setSnapAngle(qreal angle) +{ + SnapAngle = angle; +} + +void CreateSingleWayInteraction::setParallelMode(bool val) +{ + ParallelMode = val; +} + +QString CreateSingleWayInteraction::toHtml() +{ + QString help; + //help = (MainWindow::tr("LEFT-CLICK to select; LEFT-DRAG to move")); + + QString desc; + desc = QString("<big><b>%1</b></big><br/>").arg(MainWindow::tr("Create Way interaction")); + desc += QString("<b>%1</b><br/>").arg(help); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "</body></html>"; + + return S; +} + +void CreateSingleWayInteraction::paintEvent(QPaintEvent* anEvent, QPainter& thePainter) +{ + if (theRoad && (!theRoad->layer() || theRoad->isDeleted())) { // The road was begon and then undoed. Restarting.... + HaveFirst = false; + theRoad = NULL; + Creating = false; + view()->setInteracting(false); + } + + if (HaveFirst) + { + QPointF PreviousPoint; + if (theRoad && theRoad->size() && !Prepend) + PreviousPoint = COORD_TO_XY(CAST_NODE(theRoad->get(theRoad->size()-1))->position()); + else + PreviousPoint = COORD_TO_XY(FirstPoint); + QBrush SomeBrush(QColor(0xff,0x77,0x11,128)); + QPen TP(SomeBrush,qBound(3, int(view()->pixelPerM()*4+2), 10)); + ::draw(thePainter,TP,Feature::UnknownDirection, PreviousPoint,LastCursor ,4 ,view()->projection()); + + Coord NewPoint = XY_TO_COORD(LastCursor); + const qreal distance = FirstPoint.distanceFrom(NewPoint); + + QString distanceTag; + if (distance < 1.0) + distanceTag = QString("%1 m").arg(int(distance * 1000)); + else + distanceTag = QString("%1 km").arg(distance, 0, 'f', 3); + + thePainter.drawText(LastCursor + QPointF(10,-10), distanceTag); + } + FeatureSnapInteraction::paintEvent(anEvent,thePainter); +} + +void CreateSingleWayInteraction::snapMouseMoveEvent(QMouseEvent* ev, Feature* lastSnap) +{ + if (Node* Pt = dynamic_cast<Node*>(lastSnap)) + LastCursor = COORD_TO_XY(Pt); + else if (Way* R = dynamic_cast<Way*>(lastSnap)) + { + Coord P(XY_TO_COORD(ev->pos())); + findSnapPointIndex(R, P); + LastCursor = COORD_TO_XY(P); + } + else if (theRoad && theRoad->size() > 1 && SnapAngle) + { + QLineF l1(COORD_TO_XY(theRoad->getNode(theRoad->size()-1)), COORD_TO_XY(theRoad->getNode(theRoad->size()-2))); + QLineF l2(COORD_TO_XY(theRoad->getNode(theRoad->size()-1)), ev->pos()); + qreal a = l1.angleTo(l2); + a = qRound(a/SnapAngle) * SnapAngle; + l2.setAngle(l1.angle() + a); + LastCursor = l2.p2().toPoint(); + } + else if (HaveFirst && ParallelMode) + { +#define CLEAR_DISTANCE 200 + QPointF PreviousPoint; + if (theRoad && theRoad->size() && !Prepend) + PreviousPoint = COORD_TO_XY(CAST_NODE(theRoad->get(theRoad->size()-1))->position()); + else + PreviousPoint = COORD_TO_XY(FirstPoint); + + CoordBox HotZone(XY_TO_COORD(ev->pos()-QPoint(CLEAR_DISTANCE, CLEAR_DISTANCE)),XY_TO_COORD(ev->pos()+QPoint(CLEAR_DISTANCE, CLEAR_DISTANCE))); + qreal BestDistanceNW = 9999, AngleNW = 0; + qreal BestDistanceNE = 9999, AngleNE = 0; + qreal* BestDistance = &BestDistanceNW; + qreal* BestAngle = &BestDistanceNE; + qreal curAngle = 666; + + Way* R; + for (int j=0; j<document()->layerSize(); ++j) { + QList < Feature* > ret = g_backend.indexFind(document()->getLayer(j), HotZone); + foreach(Feature* F, ret) { + if (!(R = CAST_WAY(F))) + continue; + + if (R->isHidden()) + continue; + if (R->notEverythingDownloaded()) + continue; + + for (int i=0; i<R->size()-1; ++i) + { + LineF F(COORD_TO_XY(R->getNode(i)),COORD_TO_XY(R->getNode(i+1))); + qreal D = F.capDistance(ev->pos()); + if (D < CLEAR_DISTANCE) { + QLineF l(COORD_TO_XY(R->getNode(i)), COORD_TO_XY(R->getNode(i+1))); + qreal a = l.angle(); + if ((a >= 0 && a < 90) || (a < -270 && a >= -360)) { + BestDistance = &BestDistanceNE; + BestAngle = &AngleNE; + curAngle = a; + } else if ((a >= 90 && a < 180) || (a < -180 && a >= -270)) { + BestDistance = &BestDistanceNW; + BestAngle = &AngleNW; + curAngle = a; + } else if ((a >= 180 && a < 270) || (a < -90 && a >= -180)) { + BestDistance = &BestDistanceNE; + BestAngle = &AngleNE; + curAngle = a - 180; + } else if ((a >= 270 && a < 360) || (a < 0 && a >= -90)) { + BestDistance = &BestDistanceNW; + BestAngle = &AngleNW; + curAngle = a - 180; + } + + if (D < *BestDistance) { + *BestDistance = D; + *BestAngle = curAngle; + } + } + } + + qDebug() << BestDistanceNE << BestDistanceNW << AngleNE << AngleNW; + } + } + + /* Check if for some reason not a single angle was found. */ + Q_ASSERT(curAngle >= -360 && curAngle <= 360); + + QLineF l(PreviousPoint, ev->pos()); + qreal a = l.angle(); + if ((a >= 0 && a < 90) || (a < -270 && a >= -360)) { + if (BestDistanceNE < 9999) + a = AngleNE; + } else if ((a >= 90 && a < 180) || (a < -180 && a >= -270)) { + if (BestDistanceNW < 9999) + a = AngleNW; + } else if ((a >= 180 && a < 270) || (a < -90 && a >= -180)) { + if (BestDistanceNE < 9999) + a = AngleNE - 180; + } else if ((a >= 270 && a < 360) || (a < 0 && a >= -90)) { + if (BestDistanceNW < 9999) + a = AngleNW - 180; + } + l.setAngle(a); + LastCursor = l.p2().toPoint(); + } else + LastCursor = ev->pos(); + view()->update(); +} + +void CreateSingleWayInteraction::snapMousePressEvent(QMouseEvent* /* anEvent */, Feature* lastSnap) +{ + Q_UNUSED(lastSnap) + Creating = true; + view()->setInteracting(true); +} + +void CreateSingleWayInteraction::snapMouseReleaseEvent(QMouseEvent* anEvent, Feature* lastSnap) +{ + if (M_PREFS->getMouseSingleButton() && anEvent->button() == Qt::RightButton) { // Abort + HaveFirst = false; + theRoad = NULL; + Creating = false; + view()->setInteracting(false); + } else + if ( Creating && !panning() ) + { + Node* Pt = dynamic_cast<Node*>(lastSnap); + if (!HaveFirst) + { + HaveFirst = true; + if (Pt) + FirstNode = Pt; + else if (Way* aRoad = dynamic_cast<Way*>(lastSnap)) + { + Coord P(XY_TO_COORD(LastCursor)); + int SnapIdx = findSnapPointIndex(aRoad, P); + Node* N = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), P); + CommandList* theList = new CommandList(MainWindow::tr("Create node %1 in way %2").arg(N->description()).arg(aRoad->description()), N); + theList->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),N,true)); + theList->add(new WayAddNodeCommand(aRoad,N,SnapIdx,theMain->document()->getDirtyOrOriginLayer(aRoad))); + document()->addHistory(theList); + view()->invalidate(true, true, false); + FirstNode = N; + } + } + else + { + CommandList* L = new CommandList(); + if (!theRoad) + { + Node* From = 0; + theRoad = g_backend.allocWay(theMain->document()->getDirtyOrOriginLayer()); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),theRoad,true)); + if (FirstNode) { + if (FirstNode->isVirtual()) { + Way* aRoad = CAST_WAY(FirstNode->getParent(0)); + int SnapIdx = aRoad->findVirtual(FirstNode)+1; + From = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(aRoad->layer()), *FirstNode); + From->setVirtual(false); + From->setPosition(FirstNode->position()); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(aRoad->layer()),From,true)); + L->add(new WayAddNodeCommand(aRoad,From,SnapIdx,main()->document()->getDirtyOrOriginLayer(aRoad->layer()))); + } else { + From = FirstNode; + if (!From->isDirty() && !From->hasOSMId() && From->isUploadable()) + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),From,true)); + } + } + else + { + From = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), FirstPoint); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),From,true)); + } + if (M_PREFS->getAutoSourceTag()) { + QStringList sl = theMain->document()->getCurrentSourceTags(); + if (sl.size()) + theRoad->setTag("source", sl.join(";")); + } + if (IsCurved) + theRoad->setTag("smooth","yes"); + L->add(new WayAddNodeCommand(theRoad,From)); + L->setDescription(MainWindow::tr("Create way %1").arg(theRoad->description())); + L->setFeature(theRoad); + } + Node* To = 0; + if (Pt) { + To = Pt; + if (!To->isDirty() && !To->hasOSMId() && To->isUploadable()) { + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),To,true)); + L->setDescription(MainWindow::tr("Create node: %1").arg(To->description())); + } + } + else if (Way* aRoad = dynamic_cast<Way*>(lastSnap)) + { + Coord P(XY_TO_COORD(LastCursor)); + int SnapIdx = findSnapPointIndex(aRoad, P); + Node* N = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), P); + CommandList* theList = new CommandList(MainWindow::tr("Create node %1 in way %2").arg(N->description()).arg(aRoad->description()), N); + theList->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),N,true)); + theList->add(new WayAddNodeCommand(aRoad,N,SnapIdx,theMain->document()->getDirtyOrOriginLayer(aRoad))); + document()->addHistory(theList); + view()->invalidate(true, true, false); + To = N; + } + if (!To) + { + To = g_backend.allocNode(theMain->document()->getDirtyOrOriginLayer(), XY_TO_COORD(LastCursor)); + L->add(new AddFeatureCommand(theMain->document()->getDirtyOrOriginLayer(),To,true)); + L->setDescription(MainWindow::tr("Create node %1 in way %2").arg(To->description()).arg(theRoad->description())); + L->setFeature(To); + } + L->setDescription(MainWindow::tr("Add node %1 to way %2").arg(To->description()).arg(theRoad->description())); + if (Prepend) + L->add(new WayAddNodeCommand(theRoad,To,(int)0,theMain->document()->getDirtyOrOriginLayer(theRoad))); + else + L->add(new WayAddNodeCommand(theRoad,To,theMain->document()->getDirtyOrOriginLayer(theRoad))); + document()->addHistory(L); + view()->invalidate(true, true, false); + theMain->properties()->setSelection(theRoad); + } + FirstPoint = XY_TO_COORD(LastCursor); + } + Creating = false; + LastCursor = anEvent->pos(); +} + +void CreateSingleWayInteraction::snapMouseDoubleClickEvent(QMouseEvent* anEvent, Feature*) +{ + HaveFirst = false; + theRoad = NULL; + Creating = false; + view()->setInteracting(false); + + if ((lastSnap() && lastSnap()->getType() & IFeature::LineString) || !lastSnap()) + CreateNodeInteraction::createNode(XY_TO_COORD(anEvent->pos()), lastSnap()); +} + +#ifndef _MOBILE +QCursor CreateSingleWayInteraction::cursor() const +{ + return QCursor(Qt::CrossCursor); +} +#endif + +void CreateSingleWayInteraction::closeAndFinish() +{ + if (!theRoad || theRoad->size() < 3) + return; + + Node* N = theRoad->getNode(0); + CommandList* theList = new CommandList(MainWindow::tr("Close Road %1").arg(theRoad->description()), theRoad); + theList->add(new WayAddNodeCommand(theRoad,N,theMain->document()->getDirtyOrOriginLayer(theRoad))); + document()->addHistory(theList); + view()->invalidate(true, true, false); + theMain->properties()->setSelection(theRoad); + + HaveFirst = false; + theRoad = NULL; + Creating = false; + view()->setInteracting(false); +} diff --git a/src/Interactions/CreateSingleWayInteraction.h b/src/Interactions/CreateSingleWayInteraction.h new file mode 100644 index 0000000..78ed817 --- /dev/null +++ b/src/Interactions/CreateSingleWayInteraction.h @@ -0,0 +1,48 @@ +#ifndef MERKATOR_INTERACTION_CREATESINGLEWAYINTERACTION_H +#define MERKATOR_INTERACTION_CREATESINGLEWAYINTERACTION_H + +#include "Interaction.h" + +class MainWindow; +class Way; + +class QDockWidget; + +class CreateSingleWayInteraction : public FeatureSnapInteraction +{ + Q_OBJECT + + public: + CreateSingleWayInteraction(MainWindow* aMain, Node * firstNode, bool aCurved); + ~CreateSingleWayInteraction(); + + virtual void snapMousePressEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseReleaseEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseMoveEvent(QMouseEvent* event, Feature* aLast); + virtual void snapMouseDoubleClickEvent(QMouseEvent* , Feature*); + virtual void paintEvent(QPaintEvent* anEvent, QPainter& thePainter); + virtual QString toHtml(); +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif + +public: + void setSnapAngle(qreal angle); + void setParallelMode(bool val); + + virtual void closeAndFinish(); + + private: + QPoint LastCursor; + Way* theRoad; + Coord FirstPoint; + Node* FirstNode; + bool HaveFirst; + bool Prepend; + bool IsCurved; + bool Creating; + qreal SnapAngle; + bool ParallelMode; +}; + +#endif // INTERACTION\CREATEDOUBLEWAYINTERACTION_H diff --git a/src/Interactions/EditInteraction.cpp b/src/Interactions/EditInteraction.cpp new file mode 100644 index 0000000..fbc628d --- /dev/null +++ b/src/Interactions/EditInteraction.cpp @@ -0,0 +1,345 @@ +#include "Global.h" +#include "EditInteraction.h" + +#include "MainWindow.h" +#ifndef _MOBILE +#include "ui_MainWindow.h" +#endif +#include "MapView.h" +#include "PropertiesDock.h" +#include "InfoDock.h" +#include "Command.h" +#include "DocumentCommands.h" +#include "FeatureCommands.h" +#include "MoveNodeInteraction.h" +#include "Document.h" +#include "Features.h" +#include "FeatureManipulations.h" +#include "Projection.h" +#include "LineF.h" +#include "MDiscardableDialog.h" + +#include <QtGui/QMouseEvent> +#include <QtGui/QPainter> +#include <QMessageBox> + +#include <QList> + +#define PROPERTIES(x) {if (theMain->properties()) theMain->properties()->x;} + +EditInteraction::EditInteraction(MainWindow* aMain) +: FeatureSnapInteraction(aMain), Dragging(false), StartDrag(0,0), EndDrag(0,0) +{ + defaultCursor = QCursor(Qt::ArrowCursor); + + connect(main(),SIGNAL(remove_triggered()),this,SLOT(on_remove_triggered())); + connect(main(),SIGNAL(reverse_triggered()), this,SLOT(on_reverse_triggered())); + PROPERTIES(checkMenuStatus()); +} + +EditInteraction::~EditInteraction(void) +{ +} + +QString EditInteraction::toHtml() +{ + QString help; + if (!M_PREFS->getMouseSingleButton()) + help = (MainWindow::tr("LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;")); + else + help = (MainWindow::tr("CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;")); + + QStringList helpList = help.split(";"); + + QString desc; + desc = QString("<big><b>%1</b></big>").arg(MainWindow::tr("Edit interaction")); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "<hr/>"; + S += "<ul style=\"margin-left: 0px; padding-left: 0px;\">"; + for (int i=0; i<helpList.size(); ++i) { + S+= "<li>" + helpList[i] + "</li>"; + } + S += "</ul>"; + S += "</body></html>"; + + return S; +} + +void EditInteraction::paintEvent(QPaintEvent* anEvent, QPainter& thePainter) +{ + if (Dragging) + { + thePainter.setPen(QPen(QColor(255,0,0),1,Qt::DotLine)); + thePainter.drawRect(QRectF(COORD_TO_XY(StartDrag),COORD_TO_XY(EndDrag))); + } + FeatureSnapInteraction::paintEvent(anEvent, thePainter); +} + +static bool modifiersForAdd(Qt::KeyboardModifiers modifiers) +{ + return modifiers.testFlag(Qt::ShiftModifier); +} + +static bool modifiersForToggle(Qt::KeyboardModifiers modifiers) +{ + return modifiers.testFlag(Qt::ControlModifier); +} + +static bool modifiersForDrag(Qt::KeyboardModifiers modifiers) +{ + if (M_PREFS->getMouseSingleButton()) + return modifiers.testFlag(Qt::ShiftModifier); + else + return true; +} + +#if 0 +static bool modifiersForSegmentSelect(Qt::KeyboardModifiers modifiers) +{ + return modifiers.testFlag(Qt::AltModifier); +} +#endif + +static bool modifiersForGreedyAdd(Qt::KeyboardModifiers modifiers) +{ + // whether drag select should include intersected as well as contained features + if (M_PREFS->getMouseSingleButton()) + return modifiers.testFlag(Qt::ShiftModifier) && modifiers.testFlag(Qt::AltModifier); + else + return modifiers.testFlag(Qt::ShiftModifier); +} + + + +void EditInteraction::snapMousePressEvent(QMouseEvent * ev, Feature* aLast) +{ + Qt::KeyboardModifiers modifiers = ev->modifiers(); + if (!view()->isSelectionLocked()) { + if (modifiers) { + if (modifiersForToggle(modifiers) && aLast) + PROPERTIES(toggleSelection(aLast)); + + if (modifiersForAdd(modifiers) && aLast) + PROPERTIES(addSelection(aLast)); + + if (g_Merk_Segment_Mode && aLast) { + PROPERTIES(setSelection(aLast)); + } + } else { + StackSnap = SnapList; +// if (aLast) +// PROPERTIES(setSelection(aLast)); + } + if (!aLast && modifiersForDrag(modifiers)) + { + EndDrag = StartDrag = XY_TO_COORD(ev->pos()); + Dragging = true; + } + PROPERTIES(checkMenuStatus()); + view()->update(); + } +} + +bool EditInteraction::isIdle() const +{ + if (Dragging && !(StartDrag == EndDrag)) + return false; + + if (panning()) + return false; + + return true; +} + +void EditInteraction::snapMouseReleaseEvent(QMouseEvent * ev , Feature* aLast) +{ + Qt::KeyboardModifiers modifiers = ev->modifiers(); + if (ev->button() != Qt::LeftButton) + return; + + if (Dragging) + { + QList<Feature*> List; + EndDrag = XY_TO_COORD(ev->pos()); + CoordBox DragBox(StartDrag, EndDrag); + for (VisibleFeatureIterator it(document()); !it.isEnd(); ++it) { + if (it.get()->isReadonly()) + continue; + + if (modifiersForGreedyAdd(modifiers)) + { + if (!DragBox.intersects(it.get()->boundingBox())) + continue; + if (DragBox.contains(it.get()->boundingBox())) + List.push_back(it.get()); + else { + Coord A, B; + if (Way* R = dynamic_cast<Way*>(it.get())) { + for (int j=1; j<R->size(); ++j) { + A = R->getNode(j-1)->position(); + B = R->getNode(j)->position(); + if (CoordBox::visibleLine(DragBox, A, B)) { + List.push_back(R); + break; + } + } + } else + if (Relation* r = dynamic_cast<Relation*>(it.get())) { + for (int k=0; k<r->size(); ++k) { + if (Way* R = dynamic_cast<Way*>(r->get(k))) { + for (int j=1; j<R->size(); ++j) { + A = R->getNode(j-1)->position(); + B = R->getNode(j)->position(); + if (CoordBox::visibleLine(DragBox, A, B)) { + List.push_back(r); + break; + } + } + } + } + } + } + } else { + if (DragBox.contains(it.get()->boundingBox())) + List.push_back(it.get()); + } + } + if (!List.isEmpty() || (!modifiersForAdd(modifiers) && !modifiersForToggle(modifiers))) + PROPERTIES(setSelection(List)); + PROPERTIES(checkMenuStatus()); + Dragging = false; + view()->update(); + } else { + if (!panning() && !modifiers) { + PROPERTIES(setSelection(aLast)); + PROPERTIES(checkMenuStatus()); + view()->update(); + } + } +} + +void EditInteraction::snapMouseMoveEvent(QMouseEvent* anEvent, Feature* aLast) +{ + Q_UNUSED(anEvent) + Q_UNUSED(aLast) + + if (Dragging) + { + EndDrag = XY_TO_COORD(anEvent->pos()); + view()->update(); + } +} + +void EditInteraction::snapMouseDoubleClickEvent(QMouseEvent* anEvent, Feature* aLast) +{ + Q_UNUSED(anEvent) + Q_UNUSED(aLast) + +// Qt::KeyboardModifiers modifiers = anEvent->modifiers(); +// if (!panning() && !modifiers) { +// if (aLast) { +// QList<Feature*> theFeatures; +// theFeatures << aLast; +// for (int i=0; i<aLast->size(); ++i) +// theFeatures << aLast->get(i); +// PROPERTIES(setSelection(theFeatures)); +// PROPERTIES(checkMenuStatus()); +// view()->update(); +// } else { +// Node* N = g_backend.allocNode(XY_TO_COORD(anEvent->pos())); +// CommandList* theList = new CommandList(MainWindow::tr("Create point %1").arg(N->id()), N); +// theList->add(new AddFeatureCommand(main()->document()->getDirtyOrOriginLayer(),N,true)); +// document()->addHistory(theList); +// main()->properties()->setSelection(N); +// view()->invalidate(true, true, false); +// } +// } +} + +void EditInteraction::on_remove_triggered() +{ + if (theMain->properties()->selectionSize() == 0) return; + + QList<Feature*> Sel; + for (int i=0; i<theMain->properties()->selectionSize(); ++i) { + if (!document()->isDownloadedSafe(theMain->properties()->selection(i)->boundingBox()) && theMain->properties()->selection(i)->hasOSMId()) + continue; + else + Sel.push_back(theMain->properties()->selection(i)); + } + if (Sel.size() == 0) { + QMessageBox::critical(NULL, tr("Cannot delete"), tr("Cannot delete the selection because it is outside the downloaded area.")); + return; + } else if (Sel.size() != theMain->properties()->selectionSize()) { + if (!QMessageBox::warning(NULL, tr("Cannot delete everything"), + tr("The complete selection cannot be deleted because part of it is outside the downloaded area.\n" + "Delete what can be?"), + QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes)) + return; + } + + CommandList* theList; + if (Sel.size() == 1) + theList = new CommandList(MainWindow::tr("Remove feature %1").arg(Sel[0]->id().numId), Sel[0]); + else + theList = new CommandList(MainWindow::tr("Remove features"), NULL); + + bool deleteChildrenOKDefined = false; + bool deleteChildrenOK = false; + for (int i=0; i<Sel.size(); ++i) { + if (document()->exists(Sel[i])) { + QList<Feature*> Alternatives; + + if (Sel[i]->size() && !deleteChildrenOKDefined) { + MDiscardableMessage dlg(NULL, + MainWindow::tr("Delete Children."), + MainWindow::tr("Do you want to delete the children nodes also?\n" + "Note that OSM nodes outside the downloaded area will be kept.")); + deleteChildrenOKDefined = true; + deleteChildrenOK = (dlg.check() == QDialog::Accepted); + } + if (deleteChildrenOK) + Sel[i]->deleteChildren(document(), theList); + theList->add(new RemoveFeatureCommand(document(), Sel[i], Alternatives)); + } + } + + if (theList->size()) { + document()->addHistory(theList); + theMain->properties()->setSelection(0); + theMain->properties()->checkMenuStatus(); + } + else + delete theList; + view()->invalidate(true, true, false); +} + +void EditInteraction::on_reverse_triggered() +{ + QList<Feature*> selection = theMain->properties()->selection(); + QString desc = selection.size() == 1 ? tr("Reverse way %1").arg(selection[0]->id().numId) : tr("Reverse %1 ways"); + CommandList* theList = new CommandList(MainWindow::tr("Reverse %1 ways").arg(selection.size()), NULL); + foreach (Feature* f, selection) + if (Way* R = dynamic_cast<Way*>(f)) + reversePoints(document(), theList, R); + if (theList->empty()) { + delete theList; + } else { + document()->addHistory(theList); + view()->invalidate(true, true, false); + } +} + +#ifndef _MOBILE +QCursor EditInteraction::cursor() const +{ + if (LastSnap) + return defaultCursor; + + return FeatureSnapInteraction::cursor(); +} +#endif diff --git a/src/Interactions/EditInteraction.h b/src/Interactions/EditInteraction.h new file mode 100644 index 0000000..4e908a1 --- /dev/null +++ b/src/Interactions/EditInteraction.h @@ -0,0 +1,44 @@ +#ifndef MERKAARTOR_INTERACTION_H_ +#define MERKAARTOR_INTERACTION_H_ + +#include "Interaction.h" + +class MoveNodeInteraction; + +class EditInteraction : public FeatureSnapInteraction +{ + Q_OBJECT + + public: + typedef enum { EditMode, MoveMode, RotateMode, ScaleMode } EditModeEnum; + + EditInteraction(MainWindow* aMain); + ~EditInteraction(void); + + virtual void paintEvent(QPaintEvent* anEvent, QPainter& thePainter); + virtual void snapMousePressEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseReleaseEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseMoveEvent(QMouseEvent* event, Feature* aLast); + virtual void snapMouseDoubleClickEvent(QMouseEvent* event, Feature* aLast); + virtual QString toHtml(); +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif + + virtual bool isIdle() const; + + public slots: + void on_remove_triggered(); + void on_reverse_triggered(); + + private: + bool Dragging; + Coord StartDrag; + Coord EndDrag; + + QCursor defaultCursor; +}; + +#endif + + diff --git a/src/Interactions/ExtrudeInteraction.cpp b/src/Interactions/ExtrudeInteraction.cpp new file mode 100644 index 0000000..549b179 --- /dev/null +++ b/src/Interactions/ExtrudeInteraction.cpp @@ -0,0 +1,174 @@ +#include "ExtrudeInteraction.h" +#include "CreateNodeInteraction.h" +#include "DocumentCommands.h" +#include "WayCommands.h" +#include "NodeCommands.h" +#include "Painting.h" +#include "Way.h" +#include "Node.h" +#include "LineF.h" +#include "MainWindow.h" +#include "PropertiesDock.h" +#include "Global.h" + +#include <QtGui/QPainter> + +ExtrudeInteraction::ExtrudeInteraction(MainWindow* aMain) + : FeatureSnapInteraction(aMain) + , Creating(false) + , BestSegment(-1) +{ +} + +ExtrudeInteraction::~ExtrudeInteraction() +{ +} + +void ExtrudeInteraction::setSnapAngle(qreal angle) +{ + SnapAngle = angle; +} + +qreal ExtrudeInteraction::snapAngle() +{ + return SnapAngle; +} + +QString ExtrudeInteraction::toHtml() +{ + QString help; + //help = (MainWindow::tr("LEFT-CLICK to select; LEFT-DRAG to move")); + + QString desc; + desc = QString("<big><b>%1</b></big><br/>").arg(MainWindow::tr("Extrude interaction")); + desc += QString("<b>%1</b><br/>").arg(help); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "</body></html>"; + + return S; +} + +void ExtrudeInteraction::paintEvent(QPaintEvent* anEvent, QPainter& thePainter) +{ + if (Creating) { + QBrush SomeBrush(QColor(0xff,0x77,0x11,128)); + QPen TP(SomeBrush,qBound(3, int(view()->pixelPerM()*4+2), 10)); + thePainter.setRenderHint(QPainter::Antialiasing); + thePainter.setPen(TP); + + QLineF l(OrigSegment.p1(), LastCursor); + qreal a = OrigSegment.angleTo(l); + qreal largeur = sin(angToRad(a))*l.length(); + + QLineF n = OrigSegment.normalVector(); + n.setLength(largeur); + + QPointF pb = n.p2(); + QLineF s2 = QLineF::fromPolar(OrigSegment.length(), OrigSegment.angle()); + s2.translate(pb); + + thePainter.drawLine(s2.p1(), s2.p2()); + thePainter.drawLine(OrigSegment.p1(), s2.p1()); + thePainter.drawLine(OrigSegment.p2(), s2.p2()); + } + + FeatureSnapInteraction::paintEvent(anEvent,thePainter); +} + +void ExtrudeInteraction::snapMouseMoveEvent(QMouseEvent* ev, Feature* lastSnap) +{ + Q_UNUSED(lastSnap) + +#ifdef QT5 + LastCursor = ev->localPos(); +#else + LastCursor = ev->posF(); +#endif + view()->update(); +} + +void ExtrudeInteraction::snapMousePressEvent(QMouseEvent* anEvent, Feature* lastSnap) +{ + Q_UNUSED(lastSnap) + + theRoad = CAST_WAY(lastSnap); + if (!theRoad) + return; + + if (theRoad->bestSegment() != -1) { + Creating = true; + QLineF l = theRoad->getSegment(theRoad->bestSegment()); + BestSegment = theRoad->bestSegment(); + OrigSegment = QLineF(COORD_TO_XY(Coord(l.p1())), COORD_TO_XY(Coord(l.p2()))); + LastCursor = anEvent->pos(); + } +} + +void ExtrudeInteraction::snapMouseReleaseEvent(QMouseEvent* anEvent, Feature* lastSnap) +{ + Q_UNUSED(anEvent) + Q_UNUSED(lastSnap) + + if (Creating) { +#ifdef QT5 + QPointF pos = anEvent->localPos(); +#else + QPointF pos = anEvent->posF(); +#endif + QLineF l(OrigSegment.p1(), pos); + qreal a = OrigSegment.angleTo(l); + qreal largeur = sin(angToRad(a))*l.length(); + + QLineF n = OrigSegment.normalVector(); + n.setLength(largeur); + + QPointF pb = n.p2(); + QLineF s2 = QLineF::fromPolar(OrigSegment.length(), OrigSegment.angle()); + s2.translate(pb); + + CommandList* theList = new CommandList(MainWindow::tr("Extrude way %1").arg(theRoad->description()), theRoad); + if (theRoad->segmentCount() == 1) { + int pos = 0; + Node* N = g_backend.allocNode(theRoad->layer(), XY_TO_COORD(s2.p1().toPoint())); + theList->add(new AddFeatureCommand(theRoad->layer(), N, true)); + theList->add(new WayAddNodeCommand(theRoad, N, ++pos)); + N = g_backend.allocNode(theRoad->layer(), XY_TO_COORD(s2.p2().toPoint())); + theList->add(new AddFeatureCommand(theRoad->layer(), N, true)); + theList->add(new WayAddNodeCommand(theRoad, N, ++pos)); + theList->add(new WayAddNodeCommand(theRoad, theRoad->getNode(0))); + } else { + int pos = BestSegment; + Node* N = g_backend.allocNode(theRoad->layer(), XY_TO_COORD(s2.p1().toPoint())); + theList->add(new AddFeatureCommand(theRoad->layer(), N, true)); + theList->add(new WayAddNodeCommand(theRoad, N, ++pos)); + N = g_backend.allocNode(theRoad->layer(), XY_TO_COORD(s2.p2().toPoint())); + theList->add(new AddFeatureCommand(theRoad->layer(), N, true)); + theList->add(new WayAddNodeCommand(theRoad, N, ++pos)); + } + + + document()->addHistory(theList); + view()->invalidate(true, true, false); + } + Creating = false; +} + +void ExtrudeInteraction::snapMouseDoubleClickEvent(QMouseEvent* anEvent, Feature*) +{ + Q_UNUSED(anEvent) +} + +#ifndef _MOBILE +QCursor ExtrudeInteraction::cursor() const +{ + return QCursor(Qt::SplitHCursor); +} +#endif + +void ExtrudeInteraction::closeAndFinish() +{ +} diff --git a/src/Interactions/ExtrudeInteraction.h b/src/Interactions/ExtrudeInteraction.h new file mode 100644 index 0000000..5069701 --- /dev/null +++ b/src/Interactions/ExtrudeInteraction.h @@ -0,0 +1,44 @@ +#ifndef MERKATOR_INTERACTION_EXTRUDE_H +#define MERKATOR_INTERACTION_EXTRUDE_H + +#include "Interaction.h" + +class MainWindow; +class Way; + +class QDockWidget; + +class ExtrudeInteraction : public FeatureSnapInteraction +{ + Q_OBJECT + + public: + ExtrudeInteraction(MainWindow* aMain); + ~ExtrudeInteraction(); + + virtual void snapMousePressEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseReleaseEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseMoveEvent(QMouseEvent* event, Feature* aLast); + virtual void snapMouseDoubleClickEvent(QMouseEvent* , Feature*); + virtual void paintEvent(QPaintEvent* anEvent, QPainter& thePainter); + virtual QString toHtml(); +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif + +public: + void setSnapAngle(qreal angle); + qreal snapAngle(); + + virtual void closeAndFinish(); + + private: + Way* theRoad; + QPointF LastCursor; + bool Creating; + qreal SnapAngle; + int BestSegment; + QLineF OrigSegment; +}; + +#endif // MERKATOR_INTERACTION_EXTRUDE_H diff --git a/src/Interactions/Interaction.cpp b/src/Interactions/Interaction.cpp new file mode 100644 index 0000000..3b05776 --- /dev/null +++ b/src/Interactions/Interaction.cpp @@ -0,0 +1,544 @@ +#include "Interaction.h" + +#include "MainWindow.h" +#include "MapView.h" +#include "Document.h" +#include "Projection.h" +#include "Node.h" +#include "PropertiesDock.h" +#include "Utils.h" +#include "Global.h" + +#include "EditInteraction.h" +#include "CreateSingleWayInteraction.h" +#include "CreateNodeInteraction.h" +#include "CreateAreaInteraction.h" +#include "MoveNodeInteraction.h" +#include "ExtrudeInteraction.h" + +#include <QtGui/QMouseEvent> +#include <QtGui/QPainter> + +#include <math.h> + +#define CLEAR_DISTANCE 7.01 + +Interaction::Interaction(MainWindow* aMain) + : QObject(aMain), theMain(aMain), Panning(false) + , SnapActive(true) + , NoSelectPoints(false), NoSelectRoads(false), NoSelectVirtuals(true) + , Dragging(false) + , StartDrag(0,0), EndDrag(0,0) +{ + connect(this, SIGNAL(requestCustomContextMenu(const QPoint &)), theMain, SLOT(onCustomcontextmenurequested(const QPoint &))); +} + +Interaction::~Interaction() +{ +} + +bool Interaction::panning() const +{ + return (Panning && (LastPan != FirstPan)); +} + +MainWindow* Interaction::main() +{ + return theMain; +} + +MapView* Interaction::view() +{ + return theMain->view(); +} + +Document* Interaction::document() +{ + return theMain->document(); +} + +void Interaction::mousePressEvent(QMouseEvent * anEvent) +{ + if (anEvent->buttons() & Qt::MiddleButton) { + Panning = true; + FirstPan = LastPan = anEvent->pos(); + } else +#if defined(Q_OS_MAC) + // In the name of beautifull code, Steve, add a right mouse button + if ( (anEvent->modifiers() & Qt::MetaModifier) || + (M_PREFS->getMouseSingleButton() && (anEvent->buttons() & Qt::LeftButton)) || + (!M_PREFS->getMouseSingleButton() && (anEvent->buttons() & Qt::RightButton)) + ) +#else + if ( + (M_PREFS->getMouseSingleButton() && (anEvent->buttons() & Qt::LeftButton)) || + (!M_PREFS->getMouseSingleButton() && (anEvent->buttons() & Qt::RightButton)) + ) +#endif // Q_OS_MAC + { + if (anEvent->modifiers() & Qt::ControlModifier) { + EndDrag = StartDrag = XY_TO_COORD(anEvent->pos()); + Dragging = true; + } else if (anEvent->modifiers() & Qt::ShiftModifier) { + } else { + Panning = true; + FirstPan = LastPan = anEvent->pos(); + } + } +} + +void Interaction::mouseReleaseEvent(QMouseEvent * anEvent) +{ + if (Panning) { + if (FirstPan != LastPan) + view()->invalidate(false, false, true); +#ifndef _MOBILE + else + if (anEvent->button() == Qt::RightButton) + emit(requestCustomContextMenu(anEvent->pos())); +#endif + Panning = false; + } else + if (Dragging) + { + CoordBox DragBox(StartDrag,XY_TO_COORD(anEvent->pos())); + if (!DragBox.isEmpty()) { + view()->setViewport(DragBox,view()->rect()); + view()->invalidate(true, true, true); + theMain->launchInteraction(0); + } + Dragging = false; + } +} + +void Interaction::mouseMoveEvent(QMouseEvent* anEvent) +{ + if (anEvent->buttons() & Qt::MiddleButton) { + if (Panning) + { + QPoint Delta = LastPan; + Delta -= anEvent->pos(); + view()->panScreen(-Delta); + LastPan = anEvent->pos(); +#if defined(ENABLE_NVIDIA_HACK) + view()->invalidate(true, true, false); +#endif // ENABLE_NVIDIA_HACK + } + } else + +#if defined(Q_OS_MAC) + // In the name of beautifull code, Steve, add a right mouse button + if ( (anEvent->modifiers() & Qt::MetaModifier) || + (M_PREFS->getMouseSingleButton() && (anEvent->buttons() & Qt::LeftButton)) || + (!M_PREFS->getMouseSingleButton() && (anEvent->buttons() & Qt::RightButton)) + ) +#else + if ( + (M_PREFS->getMouseSingleButton() && (anEvent->buttons() & Qt::LeftButton)) || + (!M_PREFS->getMouseSingleButton() && (anEvent->buttons() & Qt::RightButton)) + ) +#endif // Q_OS_MAC + { + if (Panning) + { + QPoint Delta = LastPan; + Delta -= anEvent->pos(); + view()->panScreen(-Delta); + LastPan = anEvent->pos(); +#if defined(ENABLE_NVIDIA_HACK) + view()->invalidate(true, true, false); +#endif // ENABLE_NVIDIA_HACK + } else + if (Dragging) + { + EndDrag = XY_TO_COORD(anEvent->pos()); + view()->update(); + } + } +} + +void Interaction::mouseDoubleClickEvent(QMouseEvent* /*anEvent*/) +{ +} + +void Interaction::wheelEvent(QWheelEvent* ev) +{ + qreal finalZoom = 1.; + + /* The original code is this: + * int Steps = ev->delta() / 120; + * However, classic mouse usually gives only 120, and trackpoint/touchpad gives very low values. + */ + int Steps = ev->delta() / 8; + if (Steps > 0) { + for (int i = 0; i < Steps; ++i) { + finalZoom *= M_PREFS->getZoomIn()/100.0; + } + } else if (Steps < 0) { + for (int i = 0; i < -Steps; ++i) { + finalZoom *= M_PREFS->getZoomOut()/100.0; + } + } + + // Do not overzoom in one go (circular scroll on touchpads can scroll very + // fast). Without this check we can end up scaling the background by e.g. + // 40 times in each direction and running out of memory. + if (finalZoom > 2.0) + finalZoom = 2.0; + else if (finalZoom < 0.5) + finalZoom = 0.5; + + view()->zoom(finalZoom, ev->pos()); +} + +void Interaction::paintEvent(QPaintEvent*, QPainter& thePainter) +{ + if (Dragging) + { + thePainter.setPen(QPen(QColor(0,0,255),1,Qt::DotLine)); + thePainter.drawRect(QRectF(COORD_TO_XY(StartDrag),COORD_TO_XY(EndDrag))); + } +} + +void Interaction::mouseEvent(QMouseEvent*) { + +} + +void FeatureSnapInteraction::mouseEvent(QMouseEvent* event) { + updateSnap(event); +} + +void FeatureSnapInteraction::updateSnap(QMouseEvent* event) +{ + if (panning()) + { + clearLastSnap(); + return; + } + bool NoRoads = + ( (QApplication::keyboardModifiers() & Qt::AltModifier) && (QApplication::keyboardModifiers() &Qt::ControlModifier) ); + + /* Beware: Prev shall not be dereferenced after clearLastSnap! */ + Feature* Prev = lastSnap(); + clearLastSnap(); + + Feature* ReadOnlySnap = 0; + if (!SnapActive) return; + //QTime Start(QTime::currentTime()); + CoordBox HotZone(XY_TO_COORD(event->pos()-QPoint(M_PREFS->getMaxGeoPicWidth()+5,M_PREFS->getMaxGeoPicWidth()+5)),XY_TO_COORD(event->pos()+QPoint(M_PREFS->getMaxGeoPicWidth()+5,M_PREFS->getMaxGeoPicWidth()+5))); + CoordBox HotZoneSnap(XY_TO_COORD(event->pos()-QPoint(15,15)),XY_TO_COORD(event->pos()+QPoint(15,15))); + SnapList.clear(); + qreal BestDistance = 5; + qreal BestReadonlyDistance = 5; + bool areNodesSelectable = (/*theMain->view()->nodeWidth() >= 1 && */M_PREFS->getTrackPointsVisible()); + + Way* R; + Node* N; + for (int j=0; j<document()->layerSize(); ++j) { + QList < Feature* > ret = g_backend.indexFind(document()->getLayer(j), HotZone); + foreach(Feature* F, ret) { + if (F) + { + if (F->isHidden()) + continue; + if (NoSnap.contains(F)) + continue; + if (F->notEverythingDownloaded()) + continue; + if ((R = CAST_WAY(F))) { + if ( NoRoads || NoSelectRoads) + continue; + + if (HotZoneSnap.contains(R->boundingBox())) + SnapList.push_back(F); + else { + QPointF lastPoint = R->getNode(0)->position(); + QPointF aP; + for (int j=1; j<R->size(); ++j) { + aP = R->getNode(j)->position(); + QLineF l(lastPoint, aP); + QPointF a, b; + if (Utils::QRectInterstects(HotZoneSnap, l, a, b)) { + SnapList.push_back(F); + break; + } + lastPoint = aP; + } + } + } + if ((N = CAST_NODE(F))) { + if (NoSelectPoints) + continue; + if (!N->isSelectable(theMain->view()->pixelPerM(), theMain->view()->renderOptions())) + continue; + if (HotZoneSnap.contains(N->boundingBox())) + SnapList.push_back(F); + } + + qreal Distance = F->pixelDistance(event->pos(), CLEAR_DISTANCE, NoSnap, view()); + if (Distance < BestDistance && !F->isReadonly()) + { + BestDistance = Distance; + setLastSnap( F ); + } else if (Distance < BestReadonlyDistance && F->isReadonly()) + { + BestReadonlyDistance = Distance; + ReadOnlySnap = F; + } + } + } + } + if (areNodesSelectable) { + R = CAST_WAY(lastSnap()); + if (R) { + Node* N = R->pixelDistanceNode(event->pos(), CLEAR_DISTANCE, view(), NoSnap, NoSelectVirtuals); + if (N) + setLastSnap( N ); + } + } + + if (Prev != lastSnap()) { + curStackSnap = SnapList.indexOf(lastSnap()); + view()->update(); + } + + if (M_PREFS->getMapTooltip()) { + if (lastSnap()) + view()->setToolTip(lastSnap()->toHtml()); + else + view()->setToolTip(""); + } + if (M_PREFS->getInfoOnHover() && main() && theMain->info() && theMain->info()->isVisible()) { + if (lastSnap()) { + theMain->info()->setHoverHtml(lastSnap()->toHtml()); + } else + if (ReadOnlySnap) + theMain->info()->setHoverHtml(ReadOnlySnap->toHtml()); + else + theMain->info()->unsetHoverHtml(); + } + + emit featureSnap(lastSnap()); +} + + +/***************/ + +FeatureSnapInteraction::FeatureSnapInteraction(MainWindow* aMain) + : Interaction(aMain), LastSnap(0) +{ +// handCursor = QCursor(QPixmap(":/Icons/grab.png")); +// grabCursor = QCursor(QPixmap(":/Icons/grabbing.png")); + handCursor = QCursor(Qt::OpenHandCursor); + grabCursor = QCursor(Qt::ClosedHandCursor); + defaultCursor = QCursor(Qt::ArrowCursor); +// warningCursor = QCursor(Qt::ForbiddenCursor); + warningCursor = QCursor(QPixmap(":/Icons/cursor-warning"), 16, 5); + +#ifndef _MOBILE + theMain->view()->setCursor(cursor()); +#endif +} + +void FeatureSnapInteraction::paintEvent(QPaintEvent* anEvent, QPainter& thePainter) +{ + Interaction::paintEvent(anEvent, thePainter); + +#ifndef _MOBILE + for (int i=0; i<theMain->features()->highlightedSize(); ++i) { + theMain->features()->highlighted(i)->buildPath(view()->projection()); + theMain->features()->highlighted(i)->drawHighlight(thePainter, view()); + } + for (int i=0; i<theMain->properties()->selectionSize(); ++i) { + theMain->properties()->selection(i)->buildPath(view()->projection()); + theMain->properties()->selection(i)->drawFocus(thePainter, view()); + } + for (int i=0; i<theMain->properties()->highlightedSize(); ++i) { + theMain->properties()->highlighted(i)->buildPath(view()->projection()); + theMain->properties()->highlighted(i)->drawHighlight(thePainter, view()); + } + + if (lastSnap()) { + lastSnap()->drawHover(thePainter, view()); + view()->setToolTip(lastSnap()->toHtml()); + } else { + view()->setToolTip(""); + } +#endif +} + +void FeatureSnapInteraction::mousePressEvent(QMouseEvent * event) +{ + if (event->button() == Qt::LeftButton) + snapMousePressEvent(event,lastSnap()); + if (!(M_PREFS->getMouseSingleButton() && lastSnap())) + Interaction::mousePressEvent(event); +} + +void FeatureSnapInteraction::mouseReleaseEvent(QMouseEvent * event) +{ + if (event->button() == Qt::RightButton && !Panning && !Dragging) + emit(requestCustomContextMenu(event->pos())); + + snapMouseReleaseEvent(event,lastSnap()); + if (!(M_PREFS->getMouseSingleButton() && lastSnap())) + Interaction::mouseReleaseEvent(event); +} + +void FeatureSnapInteraction::mouseMoveEvent(QMouseEvent* event) +{ +#ifndef _MOBILE +// if (!document()->isDownloadedSafe(theMain->view()->fromView(event->pos()))) +// view()->setCursor(warningCursor); +// else + view()->setCursor(cursor()); +#endif + snapMouseMoveEvent(event, lastSnap()); + if (!(M_PREFS->getMouseSingleButton() && lastSnap())) + Interaction::mouseMoveEvent(event); +} + +void FeatureSnapInteraction::mouseDoubleClickEvent(QMouseEvent* event) +{ +// if (!document()->isDownloadedSafe(theMain->view()->fromView(event->pos()))) +// view()->setCursor(warningCursor); +// else +#ifndef _MOBILE + view()->setCursor(cursor()); +#endif + snapMouseDoubleClickEvent(event, lastSnap()); + if (!(M_PREFS->getMouseSingleButton() && lastSnap())) + Interaction::mouseDoubleClickEvent(event); +} + +void FeatureSnapInteraction::snapMousePressEvent(QMouseEvent * , Feature*) +{ +} + +void FeatureSnapInteraction::snapMouseReleaseEvent(QMouseEvent * , Feature*) +{ +} + +void FeatureSnapInteraction::snapMouseMoveEvent(QMouseEvent* , Feature*) +{ +} + +void FeatureSnapInteraction::snapMouseDoubleClickEvent(QMouseEvent* , Feature*) +{ +} + +void FeatureSnapInteraction::activateSnap(bool b) +{ + SnapActive = b; +} + +void FeatureSnapInteraction::addToNoSnap(Feature* F) +{ + NoSnap.append(F); +} + +void FeatureSnapInteraction::addToNoSnap(QList<Feature*> Fl) +{ + NoSnap.append(Fl); +} + +void FeatureSnapInteraction::clearNoSnap() +{ + NoSnap.clear(); +} + +void FeatureSnapInteraction::clearSnap() +{ + StackSnap.clear(); +} + +void FeatureSnapInteraction::clearLastSnap() +{ + if (LastSnap) { + LastSnap = 0; + g_backend.resumeDeletes(); + } +} + +void FeatureSnapInteraction::setLastSnap(Feature *f) +{ + if (!LastSnap) g_backend.delayDeletes(); + LastSnap = f; +} + +Feature* FeatureSnapInteraction::lastSnap() +{ + return LastSnap; +} + + +QList<Feature*> FeatureSnapInteraction::snapList() +{ + return StackSnap; +} + +void FeatureSnapInteraction::addSnap(Feature* aSnap) +{ + StackSnap.append(aSnap); +} + +void FeatureSnapInteraction::setSnap(QList<Feature*> aSnapList) +{ + StackSnap = aSnapList; + curStackSnap = 0; +} + +void FeatureSnapInteraction::nextSnap() +{ + if (!StackSnap.size()) + return; + curStackSnap++; + if (curStackSnap > StackSnap.size() -1) + curStackSnap = 0; + if (theMain->properties()) + theMain->properties()->setSelection(StackSnap[curStackSnap]); + view()->update(); +} + +void FeatureSnapInteraction::previousSnap() +{ + if (!StackSnap.size()) + return; + curStackSnap--; + if (curStackSnap < 0) + curStackSnap = StackSnap.size() -1; + if (theMain->properties()) + theMain->properties()->setSelection(StackSnap[curStackSnap]); + view()->update(); +} + +void FeatureSnapInteraction::setDontSelectPoints(bool b) +{ + NoSelectPoints = b; +} + +void FeatureSnapInteraction::setDontSelectRoads(bool b) +{ + NoSelectRoads = b; +} + +void FeatureSnapInteraction::setDontSelectVirtual(bool b) +{ + NoSelectVirtuals = b; +} + +#ifndef _MOBILE +QCursor FeatureSnapInteraction::cursor() const +{ + if (M_PREFS->getMouseSingleButton()) { + if (!Panning) { + return handCursor; + } else { + return grabCursor; + } + + } else + return defaultCursor; +} +#endif + diff --git a/src/Interactions/Interaction.h b/src/Interactions/Interaction.h new file mode 100644 index 0000000..5b6b12e --- /dev/null +++ b/src/Interactions/Interaction.h @@ -0,0 +1,136 @@ +#ifndef MERKATOR_INTERACTION_H_ +#define MERKATOR_INTERACTION_H_ + +class Node; +class MainWindow; +class Projection; +class Node; +class Way; + +class QMouseEvent; +class QPaintEvent; +class QPainter; + +#include "MapView.h" +#include "InfoDock.h" +#include "FeaturesDock.h" +#include "Document.h" +#include "Features.h" + +#include <QtCore/QObject> +#include <QtCore/QTime> +#include <QApplication> +#include <QtGui/QCursor> +#include <QtGui/QMouseEvent> +#include <QList> + +#include <algorithm> + +#define XY_TO_COORD(x) theMain->view()->fromView(x) +#define COORD_TO_XY(x) theMain->view()->toView(x) + +class Interaction : public QObject +{ + Q_OBJECT +public: + Interaction(MainWindow* aMain); + virtual ~Interaction(); + + virtual void mousePressEvent(QMouseEvent * event); + virtual void mouseReleaseEvent(QMouseEvent * event); + virtual void mouseMoveEvent(QMouseEvent* event); + virtual void mouseDoubleClickEvent(QMouseEvent* event); + virtual void wheelEvent(QWheelEvent* ev); + virtual void mouseEvent(QMouseEvent* ev); + + virtual void paintEvent(QPaintEvent* anEvent, QPainter& thePainter); + virtual QString toHtml() = 0; + + MapView* view(); + Document* document(); + MainWindow* main(); + bool panning() const; + +protected: + MainWindow* theMain; + bool Panning; + QPoint FirstPan; + QPoint LastPan; + + QList<Feature*> NoSnap; + bool SnapActive; + bool NoSelectPoints; + bool NoSelectWays; + bool NoSelectRoads; + bool NoSelectVirtuals; + + QList<Feature*> StackSnap; + QList<Feature*> SnapList; + int curStackSnap; + +signals: + void requestCustomContextMenu(const QPoint & pos); + +protected: + bool Dragging; + Coord StartDrag; + Coord EndDrag; +}; + +class FeatureSnapInteraction : public Interaction +{ + Q_OBJECT +public: + FeatureSnapInteraction(MainWindow* aMain); + + virtual void paintEvent(QPaintEvent* anEvent, QPainter& thePainter); + + virtual void mousePressEvent(QMouseEvent * event); + virtual void mouseReleaseEvent(QMouseEvent * event); + virtual void mouseMoveEvent(QMouseEvent* event); + virtual void mouseDoubleClickEvent(QMouseEvent* event); + + virtual void snapMousePressEvent(QMouseEvent * , Feature*); + virtual void snapMouseReleaseEvent(QMouseEvent * , Feature*); + virtual void snapMouseMoveEvent(QMouseEvent* , Feature*); + virtual void snapMouseDoubleClickEvent(QMouseEvent* , Feature*); + + virtual void mouseEvent(QMouseEvent* event); + + void activateSnap(bool b); + void addToNoSnap(Feature* F); + void addToNoSnap(QList<Feature *> Fl); + void clearNoSnap(); + void clearSnap(); + QList<Feature*> snapList(); + void addSnap(Feature* aSnap); + void setSnap(QList<Feature*> aSnapList); + void nextSnap(); + void previousSnap(); + void updateSnap(QMouseEvent* event); + + void setLastSnap(Feature *f); + void clearLastSnap(); + Feature* lastSnap(); + + void setDontSelectPoints(bool b); + void setDontSelectRoads(bool b); + void setDontSelectVirtual(bool b); + +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif +protected: + Feature* LastSnap; +private: + QCursor handCursor; + QCursor grabCursor; + QCursor defaultCursor; + QCursor warningCursor; +signals: + void featureSnap(Feature*); +}; + +#endif + + diff --git a/src/Interactions/Interactions.pri b/src/Interactions/Interactions.pri new file mode 100644 index 0000000..10e4e9e --- /dev/null +++ b/src/Interactions/Interactions.pri @@ -0,0 +1,38 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/Interactions +DEPENDPATH += $$MERKAARTOR_SRC_DIR/Interactions + +HEADERS += \ + CreateAreaInteraction.h \ + CreateDoubleWayInteraction.h \ + CreateNodeInteraction.h \ + CreateRoundaboutInteraction.h \ + CreatePolygonInteraction.h \ + CreateSingleWayInteraction.h \ + EditInteraction.h \ + Interaction.h \ + MoveNodeInteraction.h \ + RotateInteraction.h \ + ScaleInteraction.h \ + ZoomInteraction.h \ + ExtrudeInteraction.h \ + BuildBridgeInteraction.h + +SOURCES += \ + CreateAreaInteraction.cpp \ + CreateDoubleWayInteraction.cpp \ + CreateNodeInteraction.cpp \ + CreateSingleWayInteraction.cpp \ + CreateRoundaboutInteraction.cpp \ + CreatePolygonInteraction.cpp \ + EditInteraction.cpp \ + Interaction.cpp \ + MoveNodeInteraction.cpp \ + RotateInteraction.cpp \ + ScaleInteraction.cpp \ + ZoomInteraction.cpp \ + ExtrudeInteraction.cpp \ + BuildBridgeInteraction.cpp + +FORMS += \ + CreateDoubleWayDock.ui \ + CreateRoundaboutDock.ui \ diff --git a/src/Interactions/MoveNodeInteraction.cpp b/src/Interactions/MoveNodeInteraction.cpp new file mode 100644 index 0000000..9893b92 --- /dev/null +++ b/src/Interactions/MoveNodeInteraction.cpp @@ -0,0 +1,324 @@ +#include "Global.h" +#include "MoveNodeInteraction.h" + +#include "MainWindow.h" +#include "MapView.h" +#include "DocumentCommands.h" +#include "WayCommands.h" +#include "NodeCommands.h" +#include "Coord.h" +#include "Document.h" +#include "Projection.h" +#include "Node.h" +#include "LineF.h" +#include "MDiscardableDialog.h" +#include "PropertiesDock.h" + +#include <QtGui/QCursor> +#include <QtGui/QMouseEvent> +#include <QtGui/QPixmap> +#include <QMessageBox> + +#include <QList> + +MoveNodeInteraction::MoveNodeInteraction(MainWindow* aMain) + : FeatureSnapInteraction(aMain) + , StartDragPosition(0,0) + , theList(0) +{ + setDontSelectVirtual(true); + if (M_PREFS->getSeparateMoveMode()) { + setDontSelectVirtual(false); + } +} + +MoveNodeInteraction::~MoveNodeInteraction(void) +{ +} + +QString MoveNodeInteraction::toHtml() +{ + QString help; + help = (MainWindow::tr("LEFT-CLICK to select;LEFT-DRAG to move")); + + QStringList helpList = help.split(";"); + + QString desc; + desc = QString("<big><b>%1</b></big>").arg(MainWindow::tr("Move Node interaction")); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "<hr/>"; + S += "<ul style=\"margin-left: 0px; padding-left: 0px;\">"; + for (int i=0; i<helpList.size(); ++i) { + S+= "<li>" + helpList[i] + "</li>"; + } + S += "</ul>"; + S += "</body></html>"; + + return S; +} + +#ifndef _MOBILE +QCursor MoveNodeInteraction::cursor() const +{ +#ifdef Q_OS_MAC + QPixmap pm(":/Icons/move.xpm"); + return QCursor(pm); +#else + return QCursor(Qt::SizeAllCursor); +#endif +} +#endif + +void MoveNodeInteraction::recurseAddNodes(Feature* F) +{ + if (Node* Pt = CAST_NODE(F)) + { + Moving.push_back(Pt); + } + else if (Way* R = CAST_WAY(F)) { + if (!g_Merk_Segment_Mode) { + for (int j=0; j<R->size(); ++j) + if (std::find(Moving.begin(),Moving.end(),R->get(j)) == Moving.end()) { + Moving.push_back(R->getNode(j)); + } + } else { + for (int j=R->bestSegment(); j<=R->bestSegment()+1; ++j) + if (std::find(Moving.begin(),Moving.end(),R->get(j)) == Moving.end()) { + Moving.push_back(R->getNode(j)); + } + } + addToNoSnap(R); + } + else if (Relation* L = CAST_RELATION(F)) { + for (int j=0; j<L->size(); ++j) + recurseAddNodes(L->get(j)); + addToNoSnap(L); + } +} + +void MoveNodeInteraction::snapMousePressEvent(QMouseEvent * event, Feature* aLast) +{ + QList<Feature*> sel; + if (view()->isSelectionLocked()) { + if (theMain->properties()->selection(0)) + sel.append(theMain->properties()->selection(0)); + else + sel.append(aLast); + } else { + if (aLast) { + if (theMain->properties()->selection().size() && !M_PREFS->getSeparateMoveMode()) + sel = theMain->properties()->selection(); + else + sel.append(aLast); + } + } + HasMoved = false; + clearNoSnap(); + Moving.clear(); + OriginalPosition.clear(); + StartDragPosition = XY_TO_COORD(event->pos()); + if (sel.size() == 1) { + if (Node* Pt = CAST_NODE(sel[0])) { + StartDragPosition = Pt->position(); + Moving.push_back(Pt); + } else + recurseAddNodes(sel[0]); + } else { + for (int i=0; i<sel.size(); i++) { + recurseAddNodes(sel[i]); + } + } + + for (int i=0; i<Moving.size(); ++i) + { + OriginalPosition.push_back(Moving[i]->position()); + addToNoSnap(Moving[i]); + } + Virtual = false; + theList = new CommandList; +} + +void MoveNodeInteraction::snapMouseReleaseEvent(QMouseEvent * event, Feature* Closer) +{ + if (event->button() != Qt::LeftButton) + return; + + if (Moving.size() && !panning() && HasMoved) + { + Coord Diff(calculateNewPosition(event,Closer, theList)-StartDragPosition); + if (Moving.size() > 1) { + theList->setDescription(MainWindow::tr("Move nodes")); + theList->setFeature(Moving[0]); + } else { + if (!Virtual) { + theList->setDescription(MainWindow::tr("Move node %1").arg(Moving[0]->id().numId)); + theList->setFeature(Moving[0]); + } + } + QSet<Way*> WaysToUpdate; + for (int i=0; i<Moving.size(); ++i) + { + Moving[i]->setPosition(OriginalPosition[i]); + if (Moving[i]->layer()->isTrack()) + theList->add(new MoveNodeCommand(Moving[i],OriginalPosition[i]+Diff, Moving[i]->layer())); + else + theList->add(new MoveNodeCommand(Moving[i],OriginalPosition[i]+Diff, document()->getDirtyOrOriginLayer(Moving[i]->layer()))); + for (int j=0; j<Moving[i]->sizeParents(); ++j) { + if (Way* aRoad = CAST_WAY(Moving[i]->getParent(j))) + WaysToUpdate << aRoad; + else { + Feature* f = CAST_FEATURE(Moving[i]->getParent(j)); + if (f) + g_backend.sync(f); + } + } + } + foreach (Way* w, WaysToUpdate) { + g_backend.sync(w); + } + + // If moving a single node (not a track node), see if it got dropped onto another node + if (Moving.size() == 1 && !Moving[0]->layer()->isTrack()) + { + Coord newPos = OriginalPosition[0] + Diff; + QList<Node*> samePosPts; + for (VisibleFeatureIterator it(document()); !it.isEnd(); ++it) + { + Node* visPt = CAST_NODE(it.get()); + if (visPt && visPt->layer()->classType() != Layer::TrackLayerType) + { + if (visPt == Moving[0]) + continue; + + if (visPt->position() == newPos) + { + samePosPts.push_back(visPt); + } + } + } + // Ensure the node being moved is at the end of the list. + // (This is not the node that all nodes will be merged into, + // they are always merged into a node that already was at that position.) + samePosPts.push_back(Moving[0]); + + if (samePosPts.size() > 1) // Ignore the node we're moving, see if there are more + { + MDiscardableMessage dlg(view(), + MainWindow::tr("Nodes at the same position found."), + MainWindow::tr("Do you want to merge all nodes at the drop position?")); + if (dlg.check() == QDialog::Accepted) + { + // Merge all nodes from the same position + + // from MainWindow::on_nodeMergeAction_triggered() + // Merge all nodes into the first node that has been found (not the node being moved) + Node* merged = samePosPts[0]; + // Change the command description to reflect the merge + theList->setDescription(MainWindow::tr("Merge nodes into %1").arg(merged->id().numId)); + theList->setFeature(merged); + + // from mergeNodes(theDocument, theList, theProperties); + QList<Feature*> alt; + alt.push_back(merged); + for (int i = 1; i < samePosPts.size(); ++i) { + Feature::mergeTags(document(), theList, merged, samePosPts[i]); + theList->add(new RemoveFeatureCommand(document(), samePosPts[i], alt)); + } + + theMain->properties()->setSelection(merged); + } + } + } + + if (theList) + document()->addHistory(theList); + theList = NULL; + view()->setInteracting(false); + view()->invalidate(true, true, false); + } else + SAFE_DELETE(theList); + Moving.clear(); + OriginalPosition.clear(); + clearNoSnap(); +} + +void MoveNodeInteraction::snapMouseMoveEvent(QMouseEvent* event, Feature* Closer) +{ + if (Moving.size() && !panning()) + { + HasMoved = true; + view()->setInteracting(true); + Coord Diff = calculateNewPosition(event,Closer,NULL)-StartDragPosition; + for (int i=0; i<Moving.size(); ++i) { + if (Moving[i]->isVirtual()) { + Virtual = true; + Node* v = Moving[i]; + Way* aRoad = CAST_WAY(v->getParent(0)); + theList->setDescription(MainWindow::tr("Create node in way %1").arg(aRoad->id().numId)); + theList->setFeature(aRoad); + int SnapIdx = aRoad->findVirtual(v)+1; + Node* N = g_backend.allocNode(main()->document()->getDirtyOrOriginLayer(aRoad->layer()), *v); + N->setVirtual(false); + N->setPosition(OriginalPosition[i]+Diff); + + if (theMain->properties()->isSelected(v)) { + theMain->properties()->toggleSelection(v); + theMain->properties()->toggleSelection(N); + } + theList->add(new AddFeatureCommand(main()->document()->getDirtyOrOriginLayer(aRoad->layer()),N,true)); + theList->add(new WayAddNodeCommand(aRoad,N,SnapIdx,main()->document()->getDirtyOrOriginLayer(aRoad->layer()))); + + Moving[i] = N; + LastSnap = N; + } else { + Moving[i]->setPosition(OriginalPosition[i]+Diff); + } + } + view()->invalidate(true, true, false); + } +} + +Coord MoveNodeInteraction::calculateNewPosition(QMouseEvent *event, Feature *aLast, CommandList* theList) +{ + if (aLast && CHECK_NODE(aLast)) + return STATIC_CAST_NODE(aLast)->position(); + + Coord TargetC = XY_TO_COORD(event->pos()); + if (aLast && CHECK_WAY(aLast)) + { + Way* R = STATIC_CAST_WAY(aLast); + QPointF Target = TargetC; + LineF L1(R->getNode(0)->position(),R->getNode(1)->position()); + qreal Dist = L1.capDistance(TargetC); + QPointF BestTarget = L1.project(Target); + int BestIdx = 1; + for (int i=2; i<R->size(); ++i) + { + LineF L2(R->getNode(i-1)->position(),R->getNode(i)->position()); + qreal Dist2 = L2.capDistance(TargetC); + if (Dist2 < Dist) + { + Dist = Dist2; + BestTarget = L2.project(Target); + BestIdx = i; + } + } + if (theList && (Moving.size() == 1)) + theList->add(new + WayAddNodeCommand(R,Moving[0],BestIdx,document()->getDirtyOrOriginLayer(R->layer()))); + return Coord(BestTarget); + } + return TargetC; +} + +bool MoveNodeInteraction::isIdle() +{ + if (Moving.size() && !panning()) + return false; + + return true; +} diff --git a/src/Interactions/MoveNodeInteraction.h b/src/Interactions/MoveNodeInteraction.h new file mode 100644 index 0000000..e75d739 --- /dev/null +++ b/src/Interactions/MoveNodeInteraction.h @@ -0,0 +1,40 @@ +#ifndef MERKATOR_MOVENODEINTERACTION_H_ +#define MERKATOR_MOVENODEINTERACTION_H_ + +#include "Interaction.h" +#include "Coord.h" + +#include <QList> + +class CommandList; + +class MoveNodeInteraction : public FeatureSnapInteraction +{ + public: + MoveNodeInteraction(MainWindow* aMain); + ~MoveNodeInteraction(void); + + virtual void snapMousePressEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseReleaseEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseMoveEvent(QMouseEvent* event, Feature* aLast); + virtual QString toHtml(); +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif + + virtual bool isIdle(); + +private: + void recurseAddNodes(Feature* F); + Coord calculateNewPosition(QMouseEvent* event, Feature* aLast, CommandList* theList); + QList<Node*> Moving; + QList<Coord> OriginalPosition; + Coord StartDragPosition; + CommandList* theList; + bool Virtual; + bool HasMoved; +}; + +#endif + + diff --git a/src/Interactions/RotateInteraction.cpp b/src/Interactions/RotateInteraction.cpp new file mode 100644 index 0000000..70f077e --- /dev/null +++ b/src/Interactions/RotateInteraction.cpp @@ -0,0 +1,203 @@ +#include "RotateInteraction.h" + +#include "MainWindow.h" +#include "MapView.h" +#include "DocumentCommands.h" +#include "WayCommands.h" +#include "NodeCommands.h" +#include "Coord.h" +#include "Document.h" +#include "Projection.h" +#include "Node.h" +#include "LineF.h" +#include "MDiscardableDialog.h" +#include "PropertiesDock.h" + +#include <QtGui/QCursor> +#include <QtGui/QMouseEvent> +#include <QtGui/QPixmap> +#include <QMessageBox> + +#include <QList> +#include <QPainter> + +RotateInteraction::RotateInteraction(MainWindow* aMain) + : FeatureSnapInteraction(aMain), StartDragPosition(0,0) +{ + QPixmap pm(":/Icons/rotate.png"); + rotateCursor = QCursor(pm.scaledToWidth(22)); + +} + +RotateInteraction::~RotateInteraction(void) +{ +} + +QString RotateInteraction::toHtml() +{ + QString help; + help = (MainWindow::tr("HOVER to select;LEFT-DRAG to rotate")); + + QStringList helpList = help.split(";"); + + QString desc; + desc = QString("<big><b>%1</b></big>").arg(MainWindow::tr("Rotate interaction")); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "<hr/>"; + S += "<ul style=\"margin-left: 0px; padding-left: 0px;\">"; + for (int i=0; i<helpList.size(); ++i) { + S+= "<li>" + helpList[i] + "</li>"; + } + S += "</ul>"; + S += "</body></html>"; + + return S; +} + +#ifndef _MOBILE +QCursor RotateInteraction::cursor() const +{ + if (LastSnap || Rotating.size()) { + return rotateCursor; + } + + return FeatureSnapInteraction::cursor(); +} +#endif + + +void RotateInteraction::snapMousePressEvent(QMouseEvent * anEvent, Feature* aLast) +{ + QList<Feature*> sel; + if (view()->isSelectionLocked()) { + if (theMain->properties()->selection(0)) + sel.append(theMain->properties()->selection(0)); + else + sel.append(aLast); + } else { + sel = theMain->properties()->selection(); + if (!sel.size() && aLast) + sel.append(aLast); + } + Angle = 0.0; + clearNoSnap(); + Rotating.clear(); + OriginalPosition.clear(); + + if (!sel.size()) + return; + + view()->setInteracting(true); + + StartDragPosition = XY_TO_COORD(anEvent->pos()); + OriginNode = NULL; + NodeOrigin = false; + CoordBox selBB = sel[0]->boundingBox(); + for (int j=0; j<sel.size(); j++) { + selBB.merge(sel[j]->boundingBox()); + if (CHECK_WAY(sel[j])) { + Way* R = STATIC_CAST_WAY(sel[j]); + for (int i=0; i<R->size(); ++i) + if (std::find(Rotating.begin(),Rotating.end(),R->get(i)) == Rotating.end()) + Rotating.push_back(R->getNode(i)); + addToNoSnap(R); + } else if (CHECK_NODE(sel[j])) { + if (!OriginNode && !NodeOrigin) { + OriginNode = STATIC_CAST_NODE(sel[j]); + NodeOrigin = true; + } else { + NodeOrigin = false; + } + } + } + if (Rotating.size() > 1) { + if (NodeOrigin) { + RotationCenter = COORD_TO_XY(OriginNode->position()); + } else { + RotationCenter = COORD_TO_XY(selBB.center()); + } + for (int i=0; i<Rotating.size(); ++i) + { + OriginalPosition.push_back(Rotating[i]->position()); + addToNoSnap(Rotating[i]); + } + } else + Rotating.clear(); +} + +void RotateInteraction::snapMouseReleaseEvent(QMouseEvent * anEvent, Feature* /*Closer*/) +{ + Q_UNUSED(anEvent); + + if (Angle != 0.0 && Rotating.size() && !panning()) + { + CommandList* theList; + theList = new CommandList(MainWindow::tr("Rotate Feature").arg(Rotating[0]->id().numId), Rotating[0]); + for (int i=0; i<Rotating.size(); ++i) + { + if (NodeOrigin && Rotating[i] == OriginNode) + continue; + Rotating[i]->setPosition(OriginalPosition[i]); + if (Rotating[i]->layer()->isTrack()) + theList->add(new MoveNodeCommand(Rotating[i],rotatePosition(OriginalPosition[i], Angle), Rotating[i]->layer())); + else + theList->add(new MoveNodeCommand(Rotating[i],rotatePosition(OriginalPosition[i], Angle), document()->getDirtyOrOriginLayer(Rotating[i]->layer()))); + } + + + document()->addHistory(theList); + view()->invalidate(true, true, false); + } + Angle = 0.0; + Rotating.clear(); + OriginalPosition.clear(); + view()->setInteracting(false); + clearNoSnap(); +} + +void RotateInteraction::snapMouseMoveEvent(QMouseEvent* anEvent, Feature* /*Closer*/) +{ + if (Rotating.size() && !panning()) + { + Angle = calculateNewAngle(anEvent); + for (int i=0; i<Rotating.size(); ++i) { + if (NodeOrigin && Rotating[i] == OriginNode) + continue; + Rotating[i]->setPosition(rotatePosition(OriginalPosition[i], Angle)); + } + view()->invalidate(true, true, false); + } +} + +Coord RotateInteraction::rotatePosition(Coord position, qreal angle) +{ + QPointF p = COORD_TO_XY(position); + QLineF v(RotationCenter, p); + v.setAngle(v.angle() + angle); + + return XY_TO_COORD(v.p2().toPoint()); +} + +qreal RotateInteraction::calculateNewAngle(QMouseEvent *event) +{ + QPointF p1 = COORD_TO_XY(StartDragPosition); + QLineF v1(RotationCenter, p1); + QLineF v2(RotationCenter, event->pos()); + + return v1.angleTo(v2); +} + +void RotateInteraction::paintEvent(QPaintEvent* anEvent, QPainter& thePainter) +{ + if (!RotationCenter.isNull()) + { + thePainter.setPen(QPen(QColor(255,0,0),1)); + thePainter.drawEllipse(COORD_TO_XY(RotationCenter), 5, 5); + } + FeatureSnapInteraction::paintEvent(anEvent, thePainter); +} + diff --git a/src/Interactions/RotateInteraction.h b/src/Interactions/RotateInteraction.h new file mode 100644 index 0000000..8f160c4 --- /dev/null +++ b/src/Interactions/RotateInteraction.h @@ -0,0 +1,42 @@ +#ifndef MERKATOR_ROTATEINTERACTION_H_ +#define MERKATOR_ROTATEINTERACTION_H_ + +#include "Interaction.h" +#include "Coord.h" + +#include <QList> + +class CommandList; + +class RotateInteraction : public FeatureSnapInteraction +{ + public: + RotateInteraction(MainWindow* aMain); + ~RotateInteraction(void); + + virtual void paintEvent(QPaintEvent* anEvent, QPainter& thePainter); + virtual void snapMousePressEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseReleaseEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseMoveEvent(QMouseEvent* event, Feature* aLast); + virtual QString toHtml(); +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif + + private: + Coord rotatePosition(Coord position, qreal angle); + qreal calculateNewAngle(QMouseEvent* event); + QList<Node*> Rotating; + QList<Coord> OriginalPosition; + Coord StartDragPosition; + bool NodeOrigin; + Node* OriginNode; + QPointF RotationCenter; + qreal Angle; + + QCursor rotateCursor; +}; + +#endif + + diff --git a/src/Interactions/ScaleInteraction.cpp b/src/Interactions/ScaleInteraction.cpp new file mode 100644 index 0000000..ce86b5d --- /dev/null +++ b/src/Interactions/ScaleInteraction.cpp @@ -0,0 +1,194 @@ +#include "ScaleInteraction.h" + +#include "MainWindow.h" +#include "MapView.h" +#include "DocumentCommands.h" +#include "WayCommands.h" +#include "NodeCommands.h" +#include "Coord.h" +#include "Document.h" +#include "Projection.h" +#include "Node.h" +#include "LineF.h" +#include "MDiscardableDialog.h" +#include "PropertiesDock.h" + +#include <QtGui/QCursor> +#include <QtGui/QMouseEvent> +#include <QtGui/QPixmap> +#include <QMessageBox> + +#include <QList> +#include <QPainter> + +ScaleInteraction::ScaleInteraction(MainWindow* aMain) + : FeatureSnapInteraction(aMain), StartDragPosition(0,0) + { + QPixmap pm(":/Icons/rotate.png"); + rotateCursor = QCursor(pm.scaledToWidth(22)); + +} + +ScaleInteraction::~ScaleInteraction(void) +{ +} + +QString ScaleInteraction::toHtml() +{ + QString help; + help = (MainWindow::tr("HOVER to select;LEFT-DRAG to scale")); + + QStringList helpList = help.split(";"); + + QString desc; + desc = QString("<big><b>%1</b></big>").arg(MainWindow::tr("Scale interaction")); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "<hr/>"; + S += "<ul style=\"margin-left: 0px; padding-left: 0px;\">"; + for (int i=0; i<helpList.size(); ++i) { + S+= "<li>" + helpList[i] + "</li>"; + } + S += "</ul>"; + S += "</body></html>"; + + return S; +} + +#ifndef _MOBILE +QCursor ScaleInteraction::cursor() const +{ + if (LastSnap || Scaling.size()) { + return QCursor(Qt::SizeBDiagCursor); + } + + return FeatureSnapInteraction::cursor(); +} +#endif + + +void ScaleInteraction::snapMousePressEvent(QMouseEvent * anEvent, Feature* aLast) +{ + QList<Feature*> sel; + if (view()->isSelectionLocked()) { + if (theMain->properties()->selection(0)) + sel.append(theMain->properties()->selection(0)); + else + sel.append(aLast); + } else { + sel = theMain->properties()->selection(); + if (!sel.size() && aLast) + sel.append(aLast); + } + Radius = 1.0; + clearNoSnap(); + Scaling.clear(); + OriginalPosition.clear(); + + if (!sel.size()) + return; + + view()->setInteracting(true); + + StartDragPosition = XY_TO_COORD(anEvent->pos()); + OriginNode = NULL; + NodeOrigin = false; + CoordBox selBB = sel[0]->boundingBox(); + for (int j=0; j<sel.size(); j++) { + selBB.merge(sel[j]->boundingBox()); + if (CHECK_WAY(sel[j])) { + Way* R = STATIC_CAST_WAY(sel[j]); + for (int i=0; i<R->size(); ++i) + if (std::find(Scaling.begin(),Scaling.end(),R->get(i)) == Scaling.end()) + Scaling.push_back(R->getNode(i)); + addToNoSnap(R); + } else if (CHECK_NODE(sel[j])) { + if (!OriginNode && !NodeOrigin) { + OriginNode = STATIC_CAST_NODE(sel[j]); + NodeOrigin = true; + } else { + NodeOrigin = false; + } + } + } + if (Scaling.size() > 1) { + if (NodeOrigin) { + ScaleCenter = COORD_TO_XY(OriginNode->position()); + } else { + ScaleCenter = COORD_TO_XY(selBB.center()); + } + for (int i=0; i<Scaling.size(); ++i) + { + OriginalPosition.push_back(Scaling[i]->position()); + addToNoSnap(Scaling[i]); + } + } else + Scaling.clear(); +} + +void ScaleInteraction::snapMouseReleaseEvent(QMouseEvent * anEvent, Feature* /*Closer*/) +{ + Q_UNUSED(anEvent); + + if (Radius != 1.0 && Scaling.size() && !panning()) + { + CommandList* theList; + theList = new CommandList(MainWindow::tr("Scale Feature").arg(Scaling[0]->id().numId), Scaling[0]); + for (int i=0; i<Scaling.size(); ++i) + { + if (NodeOrigin && Scaling[i] == OriginNode) + continue; + Scaling[i]->setPosition(OriginalPosition[i]); + if (Scaling[i]->layer()->isTrack()) + theList->add(new MoveNodeCommand(Scaling[i],scalePosition(OriginalPosition[i], Radius), Scaling[i]->layer())); + else + theList->add(new MoveNodeCommand(Scaling[i],scalePosition(OriginalPosition[i], Radius), document()->getDirtyOrOriginLayer(Scaling[i]->layer()))); + } + + + document()->addHistory(theList); + view()->invalidate(true, true, false); + } + view()->setInteracting(false); + Radius = 1.0; + Scaling.clear(); + OriginalPosition.clear(); + clearNoSnap(); +} + +void ScaleInteraction::snapMouseMoveEvent(QMouseEvent* anEvent, Feature* /*Closer*/) +{ + if (Scaling.size() && !panning()) + { + Radius = distance(ScaleCenter,anEvent->pos()) / distance(ScaleCenter, COORD_TO_XY(StartDragPosition)); + for (int i=0; i<Scaling.size(); ++i) { + if (NodeOrigin && Scaling[i] == OriginNode) + continue; + Scaling[i]->setPosition(scalePosition(OriginalPosition[i], Radius)); + } + view()->invalidate(true, true, false); + } +} + +Coord ScaleInteraction::scalePosition(Coord position, qreal radius) +{ + QPointF p = COORD_TO_XY(position); + QLineF v(ScaleCenter, p); + v.setLength(v.length() * radius); + + return XY_TO_COORD(v.p2().toPoint()); +} + +void ScaleInteraction::paintEvent(QPaintEvent* anEvent, QPainter& thePainter) +{ + if (!ScaleCenter.isNull()) + { + thePainter.setPen(QPen(QColor(255,0,0),1)); + thePainter.drawEllipse(COORD_TO_XY(ScaleCenter), 5, 5); + } + FeatureSnapInteraction::paintEvent(anEvent, thePainter); +} + diff --git a/src/Interactions/ScaleInteraction.h b/src/Interactions/ScaleInteraction.h new file mode 100644 index 0000000..5e54e0e --- /dev/null +++ b/src/Interactions/ScaleInteraction.h @@ -0,0 +1,41 @@ +#ifndef MERKATOR_SCALEINTERACTION_H_ +#define MERKATOR_SCALEINTERACTION_H_ + +#include "Interaction.h" +#include "Coord.h" + +#include <QList> + +class CommandList; + +class ScaleInteraction : public FeatureSnapInteraction +{ + public: + ScaleInteraction(MainWindow* aMain); + ~ScaleInteraction(void); + + virtual void paintEvent(QPaintEvent* anEvent, QPainter& thePainter); + virtual void snapMousePressEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseReleaseEvent(QMouseEvent * event, Feature* aLast); + virtual void snapMouseMoveEvent(QMouseEvent* event, Feature* aLast); + virtual QString toHtml(); +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif + + private: + Coord scalePosition(Coord position, qreal radius); + QList<Node*> Scaling; + QList<Coord> OriginalPosition; + Coord StartDragPosition; + bool NodeOrigin; + Node* OriginNode; + QPointF ScaleCenter; + qreal Radius; + + QCursor rotateCursor; +}; + +#endif // MERKATOR_SCALEINTERACTION_H_ + + diff --git a/src/Interactions/ZoomInteraction.cpp b/src/Interactions/ZoomInteraction.cpp new file mode 100644 index 0000000..283fe93 --- /dev/null +++ b/src/Interactions/ZoomInteraction.cpp @@ -0,0 +1,87 @@ +#include "ZoomInteraction.h" + +#include "MainWindow.h" +#include "MapView.h" +#include "Document.h" +#include "Projection.h" +#include "Node.h" + +#include <QtGui/QMouseEvent> +#include <QtGui/QPainter> + +ZoomInteraction::ZoomInteraction(MainWindow* aMain) +: Interaction(aMain), HaveFirstPoint(false) +{ +#ifndef _MOBILE + theMain->view()->setCursor(cursor()); +#endif +} + +ZoomInteraction::~ZoomInteraction(void) +{ +} + +QString ZoomInteraction::toHtml() +{ + QString help; + help = (MainWindow::tr("LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom")); + + QString desc; + desc = QString("<big><b>%1</b></big><br/>").arg(MainWindow::tr("Zoom interaction")); + desc += QString("<b>%1</b><br/>").arg(help); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "</body></html>"; + + return S; +} + +void ZoomInteraction::paintEvent(QPaintEvent*, QPainter& thePainter) +{ + if (HaveFirstPoint) + { + QPen TP(Qt::DashDotLine); + thePainter.setBrush(Qt::NoBrush); + TP.setColor(QColor(255,0,0)); + thePainter.setPen(TP); + thePainter.drawRect(QRectF(P1,QSize(int(P2.x()-P1.x()),int(P2.y()-P1.y())))); + } +} + +void ZoomInteraction::mouseReleaseEvent(QMouseEvent * event) +{ + if (!HaveFirstPoint) + { + P1 = P2 = event->pos(); + HaveFirstPoint = true; + } + else + { + P2 = event->pos(); + view()->setViewport(CoordBox(XY_TO_COORD(P1),XY_TO_COORD(P2)),view()->rect()); + view()->invalidate(true, true, true); + theMain->launchInteraction(0); + } +} + +void ZoomInteraction::mouseMoveEvent(QMouseEvent* event) +{ + if (HaveFirstPoint) + { + P2 = event->pos(); + view()->update(); + } +} + +#ifndef _MOBILE +QCursor ZoomInteraction::cursor() const +{ + QPixmap pm(":/Icons/zoomico.xpm"); + return QCursor(pm,11,12); +} +#endif + + diff --git a/src/Interactions/ZoomInteraction.h b/src/Interactions/ZoomInteraction.h new file mode 100644 index 0000000..597fd5e --- /dev/null +++ b/src/Interactions/ZoomInteraction.h @@ -0,0 +1,31 @@ +#ifndef MERKATOR_ZOOMINTERACTION_H_ +#define MERKATOR_ZOOMINTERACTION_H_ + +#include "Interaction.h" + +#include <QtCore/QPointF> + +class MapView; + +class ZoomInteraction : public Interaction +{ + public: + ZoomInteraction(MainWindow* aMain); + ~ZoomInteraction(); + + virtual void mouseReleaseEvent(QMouseEvent * event); + virtual void mouseMoveEvent(QMouseEvent* event); + virtual void paintEvent(QPaintEvent* anEvent, QPainter& thePainter); + virtual QString toHtml(); +#ifndef _MOBILE + virtual QCursor cursor() const; +#endif + + private: + bool HaveFirstPoint; + QPoint P1, P2; +}; + +#endif + + diff --git a/src/Layers/FilterEditDialog.ui b/src/Layers/FilterEditDialog.ui new file mode 100644 index 0000000..2699d33 --- /dev/null +++ b/src/Layers/FilterEditDialog.ui @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>FilterEditDialog</class> + <widget class="QDialog" name="FilterEditDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>165</height> + </rect> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Name</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edName"/> + </item> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Filter</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="FilterLayout"> + <item> + <widget class="QLineEdit" name="edFilter"/> + </item> + <item> + <widget class="QToolButton" name="btFilterHelper"> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>FilterEditDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>FilterEditDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/Layers/ImageMapLayer.cpp b/src/Layers/ImageMapLayer.cpp new file mode 100644 index 0000000..7cd0f4b --- /dev/null +++ b/src/Layers/ImageMapLayer.cpp @@ -0,0 +1,1054 @@ +#include "Global.h" + +#include "MainWindow.h" +#include "MapView.h" +#include "ImageMapLayer.h" + +#include "Document.h" +#include "MerkaartorPreferences.h" +#include "Projection.h" + +#include "IMapAdapterFactory.h" +#include "IMapAdapter.h" +#include "imagemanager.h" +#ifdef USE_WEBKIT +#include "browserimagemanager.h" +#endif +#include "tilemapadapter.h" +#include "wmsmapadapter.h" +#include "WmscMapAdapter.h" + +#include <QLocale> +#include <QPainter> +#include <QMessageBox> + +#include "LayerWidget.h" +#include "Features.h" + +#include "ui_LicenseDisplayDialog.h" + +// ImageMapLayerPrivate + +class ImageMapLayerPrivate +{ +public: + QUuid bgType; + IMapAdapter* theMapAdapter; + + QPixmap curPix; + QPixmap newPix; + Projection theProjection; + QString selServer; + + IImageManager* theImageManager; +#ifdef USE_WEBKIT + BrowserImageManager* theBrowserImageManager; +#endif + ImageManager* theNetworkImageManager; + + QRect pr; + QTransform theTransform; + QRectF Viewport; + QTransform AlignementTransform; + QVector<QTransform> AlignementTransformList; + QPointF cumulatedDelta; + +public: + ImageMapLayerPrivate() + { + theMapAdapter = NULL; + theImageManager = NULL; +#ifdef USE_WEBKIT + theBrowserImageManager = NULL; +#endif + theNetworkImageManager = NULL; + } + ~ImageMapLayerPrivate() + { + delete theMapAdapter; + delete theImageManager; + } +}; + + +// ImageMapLayer + +ImageMapLayer::ImageMapLayer(const QString & aName) + : Layer(aName), p(new ImageMapLayerPrivate) +{ + p->bgType = NONE_ADAPTER_UUID; + setName(tr("Map - None")); + Layer::setVisible(false); + setReadonly(true); +} + +ImageMapLayer::~ ImageMapLayer() +{ + delete p; +} + +CoordBox ImageMapLayer::boundingBox() +{ + if (p->bgType == SHAPE_ADAPTER_UUID && isVisible()) + return Layer::boundingBox(); + else + if (!p->theMapAdapter || p->theMapAdapter->getBoundingbox().isNull()) + return CoordBox(); + + p->theProjection.setProjectionType(p->theMapAdapter->projection()); + QRectF r = p->theMapAdapter->getBoundingbox(); + Coord tl = p->theProjection.inverse(r.topLeft()); + Coord br = p->theProjection.inverse(r.bottomRight()); + return CoordBox(tl, br); +} + +int ImageMapLayer::size() const +{ + return Layer::size(); +} + +LayerWidget* ImageMapLayer::newWidget(void) +{ +// delete theWidget; + theWidget = new ImageLayerWidget(this); + return theWidget; +} + +void ImageMapLayer::setEnabled(bool b) +{ + if (!b) + setMapAdapter(NONE_ADAPTER_UUID); + + Layer::setEnabled(b); +} + +void ImageMapLayer::updateWidget() +{ + theWidget->initActions(); + setMapAdapter(M_PREFS->getBackgroundPlugin(), M_PREFS->getSelectedServer()); + theWidget->update(); +} + +void ImageMapLayer::setVisible(bool b) +{ + Layer::setVisible(b); + if (p->bgType == NONE_ADAPTER_UUID) + Layer::setVisible(false); + M_PREFS->setBgVisible(isVisible()); +} + +void ImageMapLayer::resetAlign() +{ + p->AlignementTransform = QTransform(); + if (p->theMapAdapter) { + if (p->theMapAdapter->isTiled()) + p->AlignementTransformList[p->theMapAdapter->getAdaptedZoom()] = QTransform(); + else + p->AlignementTransformList[0] = QTransform(); + } else + p->AlignementTransformList.resize(0); +} + +QString ImageMapLayer::projection() const +{ + if (p->theMapAdapter) + return p->theMapAdapter->projection(); + + return QString(); +} + +IImageManager* ImageMapLayer::getImageManger() +{ + return p->theImageManager; +} + +IMapAdapter* ImageMapLayer::getMapAdapter() +{ + return p->theMapAdapter; +} + +void ImageMapLayer::setNoneAdapter() +{ + p->bgType = NONE_ADAPTER_UUID; + setName(tr("Map - None")); + setVisible(false); +} + +void ImageMapLayer::setMapAdapter(const QUuid& theAdapterUid, const QString& server) +{ + WmsServerList* wsl; + TmsServerList* tsl; + + if (p->theImageManager) + p->theImageManager->abortLoading(); + p->theImageManager = NULL; + on_loadingFinished(); + if (p->theMapAdapter) + SAFE_DELETE(p->theMapAdapter); + p->curPix = QPixmap(); + resetAlign(); + + QString id = theAdapterUid.toString(); + p->bgType = theAdapterUid; + M_PREFS->setBackgroundPlugin(theAdapterUid); + if (p->bgType == NONE_ADAPTER_UUID) { + setNoneAdapter(); + } else + if (p->bgType == WMS_ADAPTER_UUID) { + wsl = M_PREFS->getWmsServers(); + if (!wsl->contains(server)) { // WMS not locally found + setNoneAdapter(); + } else { + p->selServer = server; + WmsServer theWmsServer(wsl->value(p->selServer)); + p->theMapAdapter = new WMSMapAdapter(theWmsServer); + switch (theWmsServer.WmsIsTiled) { + case 0: + setName(tr("Map - WMS - %1").arg(p->theMapAdapter->getName())); + break; + case 1: + setName(tr("Map - WMS-C - %1").arg(p->theMapAdapter->getName())); + break; + case 2: + setName(tr("Map - WMS-Tiled - %1").arg(p->theMapAdapter->getName())); + break; + } + id += p->theMapAdapter->getName(); + } + } else + if (p->bgType == TMS_ADAPTER_UUID) { + tsl = M_PREFS->getTmsServers(); + if (!tsl->contains(server)) { // TMS not locally found + setNoneAdapter(); + } else { + p->selServer = server; + TmsServer ts = tsl->value(p->selServer); + p->theMapAdapter = new TileMapAdapter(ts); + + setName(tr("Map - TMS - %1").arg(p->theMapAdapter->getName())); + id += p->theMapAdapter->getName(); + } + } else + if (p->bgType == SHAPE_ADAPTER_UUID) { + setNoneAdapter(); + } else + { + IMapAdapterFactory* fac = M_PREFS->getBackgroundPlugin(p->bgType); + if (fac) + p->theMapAdapter = fac->CreateInstance(); + if (p->theMapAdapter) { + setName(tr("Map - %1").arg(p->theMapAdapter->getName())); + p->theMapAdapter->setSettings(M_PREFS->getQSettings()); + ImageLayerWidget* theImageWidget = qobject_cast<ImageLayerWidget*>(theWidget); + Q_ASSERT(theImageWidget); + connect(p->theMapAdapter, SIGNAL(forceZoom()), theImageWidget, SLOT(zoomLayer())); + connect(p->theMapAdapter, SIGNAL(forceProjection()), theImageWidget, SLOT(setProjection())); +#ifndef _MOBILE + if (g_Merk_MainWindow) + connect(p->theMapAdapter, SIGNAL(forceRefresh()), g_Merk_MainWindow, SLOT(invalidateView())); +#endif + } else + setNoneAdapter(); + } + // Display License + if (p->theMapAdapter) { + QString s = p->theMapAdapter->getLicenseUrl(); + if (!s.isEmpty()) { + QSettings* set = M_PREFS->getQSettings(); + QStringList AcceptedLicenses = set->value("backgroundImage/AcceptedLicenses").toStringList(); + if (!AcceptedLicenses.contains(id)) { + QUrl u(s); + if (u.isValid()) { + Ui::LicenseDisplayDialog ui; + QDialog dlg; + ui.setupUi(&dlg); + dlg.setWindowTitle(tr("Licensing Terms: %1").arg(name())); + ui.urlLabel->setText(QString("<a href='%1'>%2</a>").arg(u.toString()).arg(u.toString())); + + bool OK = false; + while (!OK) { + if (dlg.exec()) { + if (!ui.cbAgree->isChecked()) { + QMessageBox::StandardButton ret = QMessageBox::warning(&dlg, tr("License Terms not accepted"), tr("You have not ticked the checkbox expressing your agreement with the licensing terms.\nAs such, you won't be able to use this source as a map layer.\nIs it really what you meant?"), QMessageBox::Yes|QMessageBox::No, QMessageBox::No); + if (ret == QMessageBox::Yes) + OK = true; + } else + OK = true; + } + } + if (!ui.cbAgree->isChecked()) { + SAFE_DELETE(p->theMapAdapter) + if (p->theImageManager) + p->theImageManager->abortLoading(); + SAFE_DELETE(p->theImageManager) + on_loadingFinished(); + p->curPix = QPixmap(); + + p->bgType = NONE_ADAPTER_UUID; + setName(tr("Map - None")); + setVisible(false); + } else { + AcceptedLicenses << id; + set->setValue("backgroundImage/AcceptedLicenses", AcceptedLicenses); + } + } + } + } + } + if (p->theMapAdapter) { + switch (p->theMapAdapter->getType()) { + case IMapAdapter::DirectBackground: + case IMapAdapter::VectorBackground: + if (!p->theNetworkImageManager) { + p->theNetworkImageManager = new ImageManager(); + connect(p->theNetworkImageManager, SIGNAL(dataRequested()), + this, SLOT(on_imageRequested()), Qt::QueuedConnection); + connect(p->theNetworkImageManager, SIGNAL(dataReceived()), + this, SLOT(on_imageReceived()), Qt::QueuedConnection); + connect(p->theNetworkImageManager, SIGNAL(loadingFinished()), + this, SLOT(on_loadingFinished()), Qt::QueuedConnection); + } + p->theImageManager = p->theNetworkImageManager; + p->theMapAdapter->setImageManager(p->theImageManager); + break; + case IMapAdapter::BrowserBackground : +#ifdef USE_WEBKIT + if (!p->theBrowserImageManager) { + p->theBrowserImageManager = new BrowserImageManager(); + connect(p->theBrowserImageManager, SIGNAL(dataRequested()), + this, SLOT(on_imageRequested()), Qt::QueuedConnection); + connect(p->theBrowserImageManager, SIGNAL(dataReceived()), + this, SLOT(on_imageReceived()), Qt::QueuedConnection); + connect(p->theBrowserImageManager, SIGNAL(loadingFinished()), + this, SLOT(on_loadingFinished()), Qt::QueuedConnection); + } + p->theBrowserImageManager->setCacheDir(M_PREFS->getCacheDir()); + p->theBrowserImageManager->setCacheMaxSize(M_PREFS->getCacheSize()); + #ifdef BROWSERIMAGEMANAGER_IS_THREADED + m->start(); + #endif // BROWSERIMAGEMANAGER_IS_THREADED + p->theImageManager = p->theBrowserImageManager; + p->theMapAdapter->setImageManager(p->theImageManager); +#endif + break; + case IMapAdapter::NetworkBackground : + case IMapAdapter::NetworkDataBackground : + if (!p->theNetworkImageManager) { + p->theNetworkImageManager = new ImageManager(); + connect(p->theNetworkImageManager, SIGNAL(dataRequested()), + this, SLOT(on_imageRequested()), Qt::QueuedConnection); + connect(p->theNetworkImageManager, SIGNAL(dataReceived()), + this, SLOT(on_imageReceived()), Qt::QueuedConnection); + connect(p->theNetworkImageManager, SIGNAL(loadingFinished()), + this, SLOT(on_loadingFinished()), Qt::QueuedConnection); + } + p->theNetworkImageManager->setCacheDir(M_PREFS->getCacheDir()); + p->theNetworkImageManager->setCacheMaxSize(M_PREFS->getCacheSize()); + p->theImageManager = p->theNetworkImageManager; + p->theMapAdapter->setImageManager(p->theImageManager); + break; + } + } +} + +bool ImageMapLayer::isTiled() +{ + if (!p->theMapAdapter) + return false; + + return (p->theMapAdapter->isTiled()); +} + +void QTransformToXml(QXmlStreamWriter& stream, const QTransform& theTransform) +{ + stream.writeAttribute("m11", QString::number(theTransform.m11())); + stream.writeAttribute("m12", QString::number(theTransform.m12())); + stream.writeAttribute("m13", QString::number(theTransform.m13())); + stream.writeAttribute("m21", QString::number(theTransform.m21())); + stream.writeAttribute("m22", QString::number(theTransform.m22())); + stream.writeAttribute("m23", QString::number(theTransform.m23())); + stream.writeAttribute("m31", QString::number(theTransform.m31())); + stream.writeAttribute("m32", QString::number(theTransform.m32())); + stream.writeAttribute("m33", QString::number(theTransform.m33())); +} + +QTransform QTransformFomXml(QXmlStreamReader& stream) +{ + qreal m11 = stream.attributes().value("m11").toString().toDouble(); + qreal m12 = stream.attributes().value("m12").toString().toDouble(); + qreal m13 = stream.attributes().value("m13").toString().toDouble(); + qreal m21 = stream.attributes().value("m21").toString().toDouble(); + qreal m22 = stream.attributes().value("m11").toString().toDouble(); + qreal m23 = stream.attributes().value("m23").toString().toDouble(); + qreal m31 = stream.attributes().value("m31").toString().toDouble(); + qreal m32 = stream.attributes().value("m32").toString().toDouble(); + qreal m33 = stream.attributes().value("m33").toString().toDouble(); + + return QTransform(m11, m12, m13, m21, m22, m23, m31, m32, m33); +} + +bool ImageMapLayer::toXML(QXmlStreamWriter& stream, bool asTemplate, QProgressDialog * /* progress */) +{ + stream.writeStartElement(metaObject()->className()); + + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("name", name()); + stream.writeAttribute("alpha", QString::number(getAlpha(),'f',2)); + stream.writeAttribute("visible", QString((isVisible() ? "true" : "false"))); + stream.writeAttribute("selected", QString((isSelected() ? "true" : "false"))); + stream.writeAttribute("enabled", QString((isEnabled() ? "true" : "false"))); + + stream.writeAttribute("bgtype", p->bgType.toString()); + + WmsServer ws; + TmsServer ts; + + if (p->bgType == WMS_ADAPTER_UUID) { + stream.writeStartElement("WmsServer"); + stream.writeAttribute("name", p->selServer); + stream.writeEndElement(); + } else if (p->bgType == TMS_ADAPTER_UUID) { + stream.writeStartElement("TmsServer"); + stream.writeAttribute("name", p->selServer); + stream.writeEndElement(); + } else if (p->bgType != NONE_ADAPTER_UUID) { + stream.writeStartElement("Data"); + if (!asTemplate) + p->theMapAdapter->toXML(stream); + stream.writeEndElement(); + } + if (!asTemplate) { + stream.writeStartElement("AdjustmentList"); + for (int i=0; i<p->AlignementTransformList.size(); ++i) { + if (!p->AlignementTransformList.at(i).isIdentity()) { + stream.writeStartElement("Adjustment"); + stream.writeAttribute("zoom", QString::number(i)); + QTransformToXml(stream, p->AlignementTransformList.at(i)); + stream.writeEndElement(); + } + } + stream.writeEndElement(); + } + stream.writeEndElement(); + + return true; +} + +ImageMapLayer * ImageMapLayer::fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * /*progress*/) +{ + ImageMapLayer* l = new ImageMapLayer(stream.attributes().value("name").toString()); + + l->setId(stream.attributes().value("xml:id").toString()); + d->addImageLayer(l); + + QString server; + QUuid bgtype = QUuid(stream.attributes().value("bgtype").toString()); + + qreal alpha = stream.attributes().value("alpha").toString().toDouble(); + // TODO: Note that the logic for "enabled" is slightly different. Why? + bool visible = (stream.attributes().value("visible") == "true" ? true : false); + bool selected = (stream.attributes().value("selected") == "true" ? true : false); + bool enabled = (stream.attributes().value("enabled") == "false" ? false : true); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "AdjustmentList") { + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Adjustment") { + int z = stream.attributes().value("zoom").toString().toInt(); + if (l->p->AlignementTransformList.size() < z+1) + l->p->AlignementTransformList.resize(z+1); + l->p->AlignementTransformList[z] = QTransformFomXml(stream); + stream.readNext(); + } else if (!stream.isWhitespace()) { + qDebug() << "ImgLay: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + stream.readNext(); + } + } else if (stream.name() == "WmsServer") { + server = stream.attributes().value("name").toString(); + l->setMapAdapter(bgtype, server); + stream.readNext(); + } else if (stream.name() == "TmsServer") { + server = stream.attributes().value("name").toString(); + l->setMapAdapter(bgtype, server); + stream.readNext(); + } else if (stream.name() == "Data") { + l->setMapAdapter(bgtype, server); + stream.readNext(); + if (l->getMapAdapter()) + l->getMapAdapter()->fromXML(stream); + } else if (!stream.isWhitespace()) { + qDebug() << "ImgLay: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + stream.readNext(); + } + + l->setAlpha(alpha); + l->setVisible(visible); + l->setSelected(selected); + l->setEnabled(enabled); + + return l; +} + +void ImageMapLayer::drawImage(QPainter* P) +{ + if (!p->theMapAdapter) + return; + + P->setOpacity(getAlpha()); + P->drawPixmap(0, 0, p->curPix); +} + +void ImageMapLayer::zoom(qreal zoom, const QPoint& pos, const QRect& rect) +{ + if (!p->theMapAdapter) + return; + if (p->theMapAdapter->getImageManager()) + p->theMapAdapter->getImageManager()->abortLoading(); + if (p->curPix.isNull()) + return; + + QPixmap tpm = p->curPix.scaled(rect.size() * zoom, Qt::KeepAspectRatio); + p->curPix.fill(Qt::transparent); + QPainter P(&p->curPix); + QPointF fPos(pos); + fPos -= fPos * zoom; + P.drawPixmap(fPos, tpm); +} + +void ImageMapLayer::pan(QPoint delta) +{ + if (!p->theMapAdapter) + return; + if (p->theMapAdapter->getImageManager()) + p->theMapAdapter->getImageManager()->abortLoading(); + if (p->curPix.isNull()) + return; + + QRegion exposed; + p->curPix.scroll(delta.x(), delta.y(), p->curPix.rect(), &exposed); + QPainter P(&p->curPix); + P.setClipping(true); + P.setClipRegion(exposed); + P.eraseRect(p->curPix.rect()); + // on_imageReceived(); +} + +void ImageMapLayer::zoom_in() +{ + if (!isTiled()) + return; + + p->theMapAdapter->zoom_in(); +} + +void ImageMapLayer::zoom_out() +{ + if (!isTiled()) + return; + + p->theMapAdapter->zoom_out(); +} + +int ImageMapLayer::getCurrentZoom() +{ + if (!isTiled()) + return -1; + + return p->theMapAdapter->getAdaptedZoom(); +} + +void ImageMapLayer::setCurrentZoom(MapView& theView, const CoordBox& viewport, const QRect& rect) +{ + QRectF projVp; + QRectF fRect(rect); + + if (p->theProjection.getProjectionProj4() == theView.projection().getProjectionProj4()) { + projVp.setTopLeft(theView.invertedTransform().map(fRect.topLeft())); + projVp.setBottomRight(theView.invertedTransform().map(fRect.bottomRight())); + } else + projVp = p->theProjection.toProjectedRectF(viewport, rect); + + qreal tileWidth, tileHeight; + int maxZoom = p->theMapAdapter->getAdaptedMaxZoom(viewport); + int tilesizeW = p->theMapAdapter->getTileSizeW(); + int tilesizeH = p->theMapAdapter->getTileSizeH(); + + // Set zoom level to 0. + while (p->theMapAdapter->getAdaptedZoom()) { + p->theMapAdapter->zoom_out(); + } + + tileWidth = p->theMapAdapter->getBoundingbox().width() / p->theMapAdapter->getTilesWE(p->theMapAdapter->getZoom()); + tileHeight = p->theMapAdapter->getBoundingbox().height() / p->theMapAdapter->getTilesNS(p->theMapAdapter->getZoom()); + qreal w = (fRect.width() / tilesizeW) * tileWidth; + qreal h = (fRect.height() / tilesizeH) * tileHeight; + + while (!(projVp.width() > w && -projVp.height() > h) && (p->theMapAdapter->getAdaptedZoom() < maxZoom)) { + p->theMapAdapter->zoom_in(); + + tileWidth = p->theMapAdapter->getBoundingbox().width() / p->theMapAdapter->getTilesWE(p->theMapAdapter->getZoom()); + tileHeight = p->theMapAdapter->getBoundingbox().height() / p->theMapAdapter->getTilesNS(p->theMapAdapter->getZoom()); + w = (fRect.width() / tilesizeW) * tileWidth; + h = (fRect.height() / tilesizeH) * tileHeight; + } + + QPointF vpCenter = projVp.center(); + QPointF upperLeft = QPointF(vpCenter.x() - w/2, vpCenter.y() + h/2); + QPointF lowerRight = QPointF(vpCenter.x() + w/2, vpCenter.y() - h/2); + QRectF vlm = QRectF(upperLeft, lowerRight); + if (p->theMapAdapter->getAdaptedZoom() && projVp != vlm) + p->theMapAdapter->zoom_out(); +} + +qreal ImageMapLayer::pixelPerCoord() +{ + if (!isTiled()) + return -1.; + + return (p->theMapAdapter->getTileSizeW() * p->theMapAdapter->getTilesWE(p->theMapAdapter->getZoom())) / 360.; +} + +void ImageMapLayer::forceRedraw(MapView& theView, QTransform& aTransform, QRect Screen) +{ + if (!p->theMapAdapter) + return; + + if (!p->Viewport.intersects(theView.viewport())) { + p->curPix = QPixmap(Screen.size()); + p->curPix.fill(Qt::transparent); + } + p->AlignementTransform = aTransform; + p->Viewport = theView.viewport(); + + draw(theView, Screen); +} + +void ImageMapLayer::draw(MapView& theView, QRect& rect) +{ + if (!p->theMapAdapter) + return; + + p->theProjection.setProjectionType(p->theMapAdapter->projection()); + p->cumulatedDelta = QPointF(); + + if (p->theMapAdapter->isTiled()) + p->pr = drawTiled(theView, rect); + else + p->pr = drawFull(theView, rect); + + if (p->curPix.size() != rect.size()) { + p->curPix = QPixmap(rect.size()); + } + + if (p->newPix.isNull()) + return; + + const QSize ps = p->pr.size(); + const QSize pmSize = p->newPix.size(); + const qreal ratio = qMax<const qreal>((qreal)pmSize.width()/ps.width()*1.0, (qreal)pmSize.height()/ps.height()*1.0); +// qDebug() << "Bg image ratio" << ratio; + QPixmap pms; + if (ratio >= 1.0) { +// qDebug() << "Bg image scale 1" << ps << ":" << p->newPix.size(); + pms = p->newPix.scaled(ps); + } else { + const QSizeF drawingSize = pmSize * ratio; + const QSizeF originSize = pmSize/2 - drawingSize/2; + const QPointF drawingOrigin = QPointF(originSize.width(), originSize.height()); + const QRect drawingRect = QRect(drawingOrigin.toPoint(), drawingSize.toSize()); + +// qDebug() << "Bg image scale 2" << ps << ":" << p->newPix.size(); + if (ps*ratio != drawingRect.size()) + pms = p->newPix.copy(drawingRect).scaled(ps*ratio); + else + pms = p->newPix.copy(drawingRect); + } + + /* We need to clear the pixmap in case we're painting transparent stuff over */ + p->curPix.fill(Qt::transparent); + + QPainter P(&p->curPix); + P.drawPixmap((pmSize.width()-pms.width())/2, (pmSize.height()-pms.height())/2, pms); + // if (p->theMapAdapter->isTiled()) + // P.drawPixmap((pmSize.width()-pms.width())/2, (pmSize.height()-pms.height())/2, pms); + // else + // P.drawPixmap(QPoint((pmSize.width()-pms.width())/2, (pmSize.height()-pms.height())/2) + p->theDelta, pms); +} + +QRect ImageMapLayer::drawFull(MapView& theView, QRect& rect) +{ + QRectF fRect(rect); + p->AlignementTransformList.resize(1); + p->AlignementTransformList[0] *= p->AlignementTransform; + p->AlignementTransform = QTransform(); + QRectF alignedViewport = p->AlignementTransformList.at(0).mapRect(p->Viewport); + + MapView::transformCalc(p->theTransform, p->theProjection, 0.0, CoordBox(alignedViewport), rect); + + CoordBox cViewport(p->theProjection.inverse(p->theTransform.inverted().map(fRect.bottomLeft())), + p->theProjection.inverse(p->theTransform.inverted().map(fRect.topRight()))); + CoordBox Viewport = CoordBox(p->AlignementTransformList.at(0).mapRect(cViewport)); + QPointF bl = theView.toView(Viewport.bottomLeft()); + QPointF tr = theView.toView(Viewport.topRight()); + + if ( + Viewport.bottomLeft().y() >= -90. && Viewport.bottomLeft().y() <= 90. + && Viewport.bottomLeft().x() >= -180. && Viewport.bottomLeft().x() <= 180. + && Viewport.topRight().y() >= -90. && Viewport.topRight().y() <= 90. + && Viewport.topRight().x() >= -180. && Viewport.topRight().x() <= 180. + ) { + QRectF vp; + if (p->theProjection.getProjectionProj4() == theView.projection().getProjectionProj4() && alignedViewport == theView.viewport()) { + bl = QPointF(rect.bottomLeft()); + tr = QPointF(rect.topRight()); + vp.setTopLeft(theView.invertedTransform().map(fRect.topLeft())); + vp.setBottomRight(theView.invertedTransform().map(fRect.bottomRight())); + } else + vp = p->theProjection.toProjectedRectF(CoordBox(alignedViewport), rect); + + QRectF wgs84vp = QRectF(QPointF(Viewport.bottomLeft().x(), Viewport.bottomLeft().y()) + , QPointF(Viewport.topRight().x(), Viewport.topRight().y())); + + // Act depending on adapter type + if (p->theMapAdapter->getType() == IMapAdapter::DirectBackground) { + QPixmap pm = p->theMapAdapter->getPixmap(wgs84vp, vp, rect); + if (!pm.isNull()) { + p->curPix = QPixmap(); + if (pm.rect() != rect) + p->newPix = pm.scaled(rect.size(), Qt::IgnoreAspectRatio); + else + p->newPix = pm; + } else + return rect; + } else if (p->theMapAdapter->getType() == IMapAdapter::VectorBackground) { + const QList<IFeature*>* theFeatures = p->theMapAdapter->getPaths(wgs84vp, NULL); + if (theFeatures) { + foreach(IFeature* f, *theFeatures) { + const QPainterPath& thePath = f->getPath(); + if (thePath.elementCount() == 1) { + IFeature::FId id(IFeature::Point, -(f->id().numId)); + if (get(id)) + continue; + Node* N = g_backend.allocNode(this, Coord((QPointF)thePath.elementAt(0))); + N->setId(id); + add(N); + for (int i=0; i<f->tagSize(); ++i) + N->setTag(f->tagKey(i),f->tagValue(i)); + } else { + IFeature::FId id(IFeature::LineString, -(f->id().numId)); + if (get(id)) + continue; + Way* W = g_backend.allocWay(this); + W->setId(id); + for (int i=0; i<thePath.elementCount(); ++i) { + Node* N = g_backend.allocNode(this, Coord((QPointF)thePath.elementAt(i))); + add(N); + W->add(N); + } + add(W); + for (int i=0; i<f->tagSize(); ++i) + W->setTag(f->tagKey(i),f->tagValue(i)); + } + } + } + p->newPix = QPixmap(rect.size()); + p->newPix.fill(Qt::transparent); + } else if (p->theMapAdapter->getType() == IMapAdapter::NetworkDataBackground) { +// QString url (p->theMapAdapter->getQuery(wgs84vp, vp, rect)); +// if (!url.isEmpty()) { +// qDebug() << "ImageMapLayer::drawFull: getting:" << url; +// QByteArray ba = p->theMapAdapter->getImageManager()->getData(p->theMapAdapter,url); +// QDomDocument* theXmlDoc = new QDomDocument(); +// theXmlDoc->setContent(ba); +// Document* doc = Document::getDocumentFromXml(theXmlDoc); +// if (doc) { +// QList<Feature*> theFeats; +// for (int i=0; i<doc->layerSize(); ++i) +// for (int j=0; j<doc->getLayer(i)->size(); ++j) +// if (!doc->getLayer(i)->get(j)->isNull()) +// theFeats.push_back(doc->getLayer(i)->get(j)); +// for (int i=0; i<theFeats.size(); ++i) { +// Feature*F = theFeats.at(i); +// // TODO Make reproducable id's or delete everything or ... +// if (get(F->id())) +// continue; + +// // get tags +// QList<QPair<QString, QString> > Tags; +// for (int j=0; j<F->tagSize(); ++j) { +// Tags << qMakePair(F->tagKey(j), F->tagValue(j)); +// } +// F->clearTags(); + +// // Re-link null features to the ones in the current document +// for (int j=0; j<F->size(); ++j) { +// Feature* C = F->get(j); +// if (C->isNull()) { +// if (Feature* CC = get(C->id())) { +// if (Relation* R = CAST_RELATION(F)) { +// QString role = R->getRole(j); +// R->remove(j); +// R->add(role, CC, j); +// } else if (Way* W = CAST_WAY(F)) { +// Node* N = CAST_NODE(CC); +// W->remove(j); +// W->add(N, j); +// } +// } else +// theFeats.push_back(C); +// } +// } +// F->layer()->remove(F); +// add(F); + +// //Put tags +// for (int j=0; j<Tags.size(); ++j) { +// F->setTag(Tags[j].first, Tags[j].second); +// } +// } +// } +// delete doc; +// delete theXmlDoc; +// } + p->newPix = QPixmap(); + return rect; + + } else if (p->theMapAdapter->getType() == IMapAdapter::NetworkBackground || p->theMapAdapter->getType() == IMapAdapter::BrowserBackground) { + QString url (p->theMapAdapter->getQuery(wgs84vp, vp, rect)); + if (!url.isEmpty()) { + //qDebug() << "ImageMapLayer::drawFull: getting:" << url; + QPixmap pm = QPixmap::fromImage(p->theMapAdapter->getImageManager()->getImage(p->theMapAdapter,url)); + if (!pm.isNull()) { + p->curPix = QPixmap(); + p->newPix = pm.scaled(rect.size(), Qt::IgnoreAspectRatio); + } else { + p->newPix = QPixmap(); + return rect; + } + } + } + } + + return QRectF(bl.x(), tr.y(), tr.x() - bl.x() +1, bl.y() - tr.y() + 1).toRect(); +} + +QRect ImageMapLayer::drawTiled(MapView& theView, QRect& rect) +{ + QRectF projVp; +// QRectF fRect(-rect.width(), -rect.height(), rect.width()*3.0, rect.height()*3.0); + QRectF fRect(rect); + + if (p->theProjection.getProjectionProj4() == theView.projection().getProjectionProj4()) { + projVp.setTopLeft(theView.invertedTransform().map(fRect.topLeft())); + projVp.setBottomRight(theView.invertedTransform().map(fRect.bottomRight())); + } else + projVp = p->theProjection.toProjectedRectF(CoordBox(p->Viewport), fRect.toRect()); + + qreal tileWidth, tileHeight; + int maxZoom = p->theMapAdapter->getAdaptedMaxZoom(p->Viewport); + int tilesizeW = p->theMapAdapter->getTileSizeW(); + int tilesizeH = p->theMapAdapter->getTileSizeH(); + + if (!M_PREFS->getZoomBoris()) { + // Set zoom level to 0. + while (p->theMapAdapter->getAdaptedZoom()) { + p->theMapAdapter->zoom_out(); + } + } + + tileWidth = p->theMapAdapter->getBoundingbox().width() / p->theMapAdapter->getTilesWE(p->theMapAdapter->getZoom()); + tileHeight = p->theMapAdapter->getBoundingbox().height() / p->theMapAdapter->getTilesNS(p->theMapAdapter->getZoom()); + qreal w = (fRect.width() / tilesizeW) * tileWidth; + qreal h = (fRect.height() / tilesizeH) * tileHeight; + + if (!M_PREFS->getZoomBoris()) { + while (!(projVp.width() > w && -projVp.height() > h) && (p->theMapAdapter->getAdaptedZoom() < maxZoom)) { + p->theMapAdapter->zoom_in(); + + tileWidth = p->theMapAdapter->getBoundingbox().width() / p->theMapAdapter->getTilesWE(p->theMapAdapter->getZoom()); + tileHeight = p->theMapAdapter->getBoundingbox().height() / p->theMapAdapter->getTilesNS(p->theMapAdapter->getZoom()); + w = (fRect.width() / tilesizeW) * tileWidth; + h = (fRect.height() / tilesizeH) * tileHeight; + } + if (p->theMapAdapter->getAdaptedZoom() && projVp.width() > w && -projVp.height() > h) { + p->theMapAdapter->zoom_out(); + tileWidth = p->theMapAdapter->getBoundingbox().width() / p->theMapAdapter->getTilesWE(p->theMapAdapter->getZoom()); + tileHeight = p->theMapAdapter->getBoundingbox().height() / p->theMapAdapter->getTilesNS(p->theMapAdapter->getZoom()); + w = (fRect.width() / tilesizeW) * tileWidth; + h = (fRect.height() / tilesizeH) * tileHeight; + } + } + + p->AlignementTransformList.resize(maxZoom+1); + p->AlignementTransformList[p->theMapAdapter->getAdaptedZoom()] *= p->AlignementTransform; + p->AlignementTransform = QTransform(); + QRectF alignedViewport = p->AlignementTransformList.at(p->theMapAdapter->getAdaptedZoom()).mapRect(p->Viewport); + + if (alignedViewport != p->Viewport) { + if (p->theProjection.getProjectionProj4() == theView.projection().getProjectionProj4() && alignedViewport == theView.viewport()) { + projVp.setTopLeft(theView.invertedTransform().map(fRect.topLeft())); + projVp.setBottomRight(theView.invertedTransform().map(fRect.bottomRight())); + } else + projVp = p->theProjection.toProjectedRectF(CoordBox(alignedViewport), rect); + } + + QPointF vpCenter = projVp.center(); + QPointF upperLeft = QPointF(vpCenter.x() - w/2, vpCenter.y() + h/2); + QPointF lowerRight = QPointF(vpCenter.x() + w/2, vpCenter.y() - h/2); + QRectF vlm = QRectF(upperLeft, lowerRight); + + QPointF vp0Center = QPointF(projVp.width()/2, -projVp.height()/2); + + Coord ulCoord, lrCoord; + ulCoord = p->theProjection.inverse(vlm.topLeft()); + lrCoord = p->theProjection.inverse(vlm.bottomRight()); + + const QPointF tl = theView.transform().map(theView.projection().project(ulCoord)); + const QPointF br = theView.transform().map(theView.projection().project(lrCoord)); + QRect retRect = QRectF(tl, br).toRect(); + + // Actual drawing + int i, j; + QPointF vpCenter0 = QPointF(vpCenter.x()-p->theMapAdapter->getBoundingbox().left(), p->theMapAdapter->getBoundingbox().bottom()-vpCenter.y()); + qreal mapmiddle_tile_x = qRound(vpCenter0.x()/tileWidth); + qreal mapmiddle_tile_y = qRound(vpCenter0.y()/tileHeight); + //qDebug() << "z:" << p->theMapAdapter->getAdaptedZoom() << "; t_x:" << mapmiddle_tile_x << "; t_y:" << mapmiddle_tile_y ; + + qreal cross_x = vpCenter0.x() - mapmiddle_tile_x*tileWidth; // position on middle tile + qreal cross_y = vpCenter0.y() - mapmiddle_tile_y*tileHeight; + //qDebug() << "cross_x:" << cross_x << "; cross_y:" << cross_y; + + // calculate how many surrounding tiles have to be drawn to fill the display + qreal space_left = vp0Center.x() - cross_x; + int tiles_left = space_left/tileWidth; + if (space_left>0) + tiles_left+=1; + qreal space_above = vp0Center.y() - cross_y; + int tiles_above = space_above/tileHeight; + if (space_above>0) + tiles_above+=1; + + qreal space_right = vp0Center.x() - (tileWidth-cross_x); + int tiles_right = space_right/tileWidth; + if (space_right>0) + tiles_right+=1; + + qreal space_bottom = vp0Center.y() - (tileHeight-cross_y); + int tiles_bottom = space_bottom/tileHeight; + if (space_bottom>0) + tiles_bottom+=1; + + QList<Tile> tiles; + int cross_scr_x = cross_x * tilesizeW / tileWidth; + int cross_scr_y = cross_y * tilesizeH / tileHeight; + + QSize pmSize = fRect.size().toSize(); + p->newPix = QPixmap(pmSize); + p->newPix.fill(Qt::transparent); + QPainter painter(&p->newPix); +// painter.drawPixmap(0, 0, tmpPm); + +// qDebug() << "Tiles:" << tiles_right+tiles_left+1 << "x" << tiles_bottom+tiles_above+1; + for (i=-tiles_left; i<=tiles_right; i++) + { + for (j=-tiles_above; j<=tiles_bottom; j++) + { + if (p->theMapAdapter->isValid(mapmiddle_tile_x+i, mapmiddle_tile_y+j, p->theMapAdapter->getZoom())) + { +#ifdef Q_CC_MSVC + qreal priority = _hypot(i, j); +#else + qreal priority = hypot(i, j); +#endif + tiles.append(Tile(i, j, priority)); + } + } + } + + qSort(tiles); + + int n=0; // Arbitrarily limit the number of tiles to 100 + for (QList<Tile>::const_iterator tile = tiles.begin(); tile != tiles.end() && n<100; ++tile) + { + QImage pm = p->theMapAdapter->getImageManager()->getImage(p->theMapAdapter, p->theMapAdapter->getQuery(mapmiddle_tile_x+tile->i, mapmiddle_tile_y+tile->j, p->theMapAdapter->getZoom())); + int x = (tile->i*tilesizeW)+pmSize.width()/2 -cross_scr_x; + int y = (tile->j*tilesizeH)+pmSize.height()/2-cross_scr_y; + if (!pm.isNull()) + painter.drawImage(x, y, pm); + + if (M_PREFS->getDrawTileBoundary()) + painter.drawRect(x, y, tilesizeW, tilesizeH); + + ++n; + } + painter.end(); + +// qDebug() << "tl:" << tl << "; br:" << br; +// qDebug() << "vp:" << projVp; + // qDebug() << "vlm:" << vlm; + //qDebug() << "retRect:" << retRect; +// QRect expR = QRect(-retRect.left(), -retRect.top(), retRect.width()+retRect.left(), retRect.height()+retRect.top()); +// p->newPix.save("c:/tmp.png"); +// p->newPix.copy(expR).save("c:/tmp2.png"); + return retRect; +} + +void ImageMapLayer::on_imageRequested() +{ + emit imageRequested(this); +} + +void ImageMapLayer::on_imageReceived() +{ + emit imageReceived(this); +} + +void ImageMapLayer::on_loadingFinished() +{ + emit loadingFinished(this); +} + +QString ImageMapLayer::toPropertiesHtml() +{ + QString h; + QRectF alignedViewport = p->AlignementTransform.mapRect(p->Viewport); + + h += "<u>" + name() + "</u><br/>"; + if (p->theMapAdapter) { + if (p->theMapAdapter->getType() != IMapAdapter::DirectBackground) { + h += "<i>" + tr("Server") + ": </i>" + p->theMapAdapter->getHost(); + h += "<br/>"; + if (p->theMapAdapter->isTiled()) { + h += "<i>" + tr("Tile size") + ": </i>" + QString("%1x%2").arg(p->theMapAdapter->getTileSizeW()).arg(p->theMapAdapter->getTileSizeH()); + h += "<br/>"; + h += "<i>" + tr("Min/Max zoom") + ": </i>" + QString("%1/%2").arg(p->theMapAdapter->getMinZoom(alignedViewport)).arg(p->theMapAdapter->getMaxZoom(alignedViewport)); + h += "<br/>"; + } + } + h += "<i>" + tr("Projection") + ": </i>" + p->theMapAdapter->projection(); + h += "<br/>"; + h += p->theMapAdapter->toPropertiesHtml(); + } + h += ""; + + return h; +} + +QTransform ImageMapLayer::getCurrentAlignmentTransform() +{ + if (p->theMapAdapter && p->AlignementTransformList.size()) { + if (p->theMapAdapter->isTiled()) { + return p->AlignementTransformList.at(p->theMapAdapter->getAdaptedZoom()); + } else { + return p->AlignementTransformList.at(0); + } + } else + return QTransform(); +} + diff --git a/src/Layers/ImageMapLayer.h b/src/Layers/ImageMapLayer.h new file mode 100644 index 0000000..7ff6314 --- /dev/null +++ b/src/Layers/ImageMapLayer.h @@ -0,0 +1,94 @@ +#ifndef IMAGEMAPLAYER_H_ +#define IMAGEMAPLAYER_H_ + +#include "Layer.h" + +#define NONE_ADAPTER_UUID QUuid("{8F5D3625-F987-45c5-A50B-17D88384F97D}") +#define SHAPE_ADAPTER_UUID QUuid("{AFB0324E-34D0-4267-BB8A-CF56CD2D7012}") +#define WMS_ADAPTER_UUID QUuid("{E238750A-AC27-429e-995C-A60C17B9A1E0}") +#define TMS_ADAPTER_UUID QUuid("{CA8A07EC-A466-462b-929F-3805BC9DEC95}") +#define BING_ADAPTER_UUID QUuid("2a888701-1a93-4040-9b34-1e5339f67f43}") + +class MapView; +class ImageMapLayerPrivate; +class Projection; +class IImageManager; + +struct Tile +{ + Tile(int i, int j, qreal priority) + : i(i), j(j), priority(priority) + {} + + int i, j; + qreal priority; + + bool operator<(const Tile& rhs) const { return priority < rhs.priority; } +}; + +class ImageMapLayer : public Layer +{ + Q_OBJECT +public: + //ImageMapLayer() : layermanager(0) {} + ImageMapLayer(const QString& aName); + virtual ~ImageMapLayer(); + + IMapAdapter* getMapAdapter(); + void setMapAdapter(const QUuid& theAdapterUid, const QString& server = QString()); + QString projection() const; + + virtual void setVisible(bool b); + virtual LayerWidget* newWidget(void); + virtual void updateWidget(); + CoordBox boundingBox(); + virtual int size() const; + + virtual bool toXML(QXmlStreamWriter& stream, bool asTemplate, QProgressDialog * progress); + virtual QString toPropertiesHtml(); + static ImageMapLayer* fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress); + + virtual /* const */ LayerType classType() const {return Layer::ImageLayerType;} + virtual const LayerGroups classGroups() const {return(Layer::Map);} + + virtual void drawImage(QPainter* P); + virtual void forceRedraw(MapView& theView, QTransform& aTransform, QRect rect); + virtual void draw(MapView& theView, QRect& rect); + + virtual void pan(QPoint delta); + virtual void zoom(qreal zoom, const QPoint& pos, const QRect& rect); + virtual void zoom_in(); + virtual void zoom_out(); + virtual int getCurrentZoom(); + virtual void setCurrentZoom(MapView& theView, const CoordBox& viewport, const QRect& rect); + virtual qreal pixelPerCoord(); + virtual QTransform getCurrentAlignmentTransform(); + + bool isTiled(); + + IImageManager* getImageManger(); + virtual void setEnabled(bool b); + void resetAlign(); + +private: + void setNoneAdapter(); + QRect drawTiled(MapView& theView, QRect& rect); + QRect drawFull(MapView& theView, QRect& rect); + +signals: + void imageRequested(ImageMapLayer*); + void imageReceived(ImageMapLayer*); + void loadingFinished(ImageMapLayer*); + +private slots: + void on_imageRequested(); + void on_imageReceived(); + void on_loadingFinished(); + +protected: + ImageMapLayerPrivate* p; +}; + +#endif + + diff --git a/src/Layers/Layer.cpp b/src/Layers/Layer.cpp new file mode 100644 index 0000000..23fb5a8 --- /dev/null +++ b/src/Layers/Layer.cpp @@ -0,0 +1,982 @@ +#include "Layer.h" + +#include "Features.h" + +#include "Document.h" +#include "LayerWidget.h" + +#include "DocumentCommands.h" +#include "FeatureCommands.h" +#include "WayCommands.h" + +#include "LineF.h" + +#include "Global.h" +#include "MainWindow.h" + +#include <QApplication> +#include <QMultiMap> +#include <QProgressDialog> +#include <QUuid> +#include <QMap> +#include <QList> +#include <QMenu> + +#include <algorithm> +#include "LayerPrivate.h" + +/* Layer */ + +Layer::Layer() +: p(new LayerPrivate), theWidget(0) +{ + p->alpha = 1.0; + p->dirtyLevel = 0; +} + +Layer::Layer(const QString& aName) +: p(new LayerPrivate), theWidget(0) +{ + qDebug() << "Created layer" << aName; + p->Name = aName; + p->alpha = 1.0; + p->dirtyLevel = 0; +} + +Layer::Layer(const Layer&) +: QObject(), p(0), theWidget(0) +{ +} + +Layer::~Layer() +{ + clear(); + delete p; +} + +void Layer::setName(const QString& s) +{ + p->Name = s; + if (theWidget) { + theWidget->setName(s); + theWidget->getAssociatedMenu()->setTitle(s); + } +} + +const QString& Layer::name() const +{ + return p->Name; +} + +void Layer::setDescription(const QString& s) +{ + p->Description = s; +} + +const QString& Layer::description() const +{ + return p->Description; +} + +void Layer::setVisible(bool b) { + p->Visible = b; + if (theWidget) { + theWidget->setLayerVisible(p->Visible, false); + } + + if (p->theDocument) { + FeatureIterator it(p->theDocument); + for(;!it.isEnd(); ++it) { + it.get()->invalidateMeta(); + } + } +} + +bool Layer::isVisible() const +{ + return p->Visible; +} + +void Layer::setSelected(bool b) { + p->selected = b; +} + +bool Layer::isSelected() const +{ + return p->selected; +} + +void Layer::setEnabled(bool b) { + p->Enabled = b; + if (theWidget) { + theWidget->setVisible(b); + theWidget->getAssociatedMenu()->menuAction()->setVisible(b); + } + + if (p->theDocument) { + FeatureIterator it(p->theDocument); + for(;!it.isEnd(); ++it) { + it.get()->invalidateMeta(); + } + } +} + +bool Layer::isEnabled() const +{ + return p->Enabled; +} + +void Layer::setReadonly(bool b) { + p->Readonly = b; + + if (p->theDocument) { + FeatureIterator it(p->theDocument); + for(;!it.isEnd(); ++it) { + it.get()->invalidateMeta(); + } + } +} + +bool Layer::isReadonly() const +{ + return p->Readonly; +} + +void Layer::setUploadable(bool b) { + p->Uploadable = b; +} + +bool Layer::isUploadable() const +{ + return p->Uploadable; +} + +void Layer::add(Feature* aFeature) +{ + if (aFeature) { + aFeature->setLayer(this); + p->Features.push_back(aFeature); + g_backend.sync(aFeature); + aFeature->invalidateMeta(); + notifyIdUpdate(aFeature->id(),aFeature); + } else { + qDebug() << "Layer::add: logic error, no featured passed"; + } +} + +void Layer::remove(Feature* aFeature) +{ + if (p->Features.removeOne(aFeature)) + { + g_backend.sync(aFeature); + aFeature->setLayer(0); + notifyIdUpdate(aFeature->id(),0); + } +} + +void Layer::deleteFeature(Feature* aFeature) +{ + if (p->Features.removeOne(aFeature)) + { + g_backend.deallocFeature(this, aFeature); + aFeature->setLayer(0); + notifyIdUpdate(aFeature->id(),0); + } +} + +void Layer::clear() +{ + while (p->Features.count()) + { + remove(p->Features[0]); + } +} + +void Layer::deleteAll() { + while (p->Features.count()) + { + deleteFeature(p->Features[0]); + } +} + +void Layer::notifyIdUpdate(const IFeature::FId& id, Feature* aFeature) +{ + QHash<qint64, MapFeaturePtr>::iterator i; + + if (!aFeature) { + i = p->IdMap.find(id.numId); + while (i != p->IdMap.end() && i.key() == id.numId) { + if (i.value()->id().type & id.type) + i = p->IdMap.erase(i); + else + ++i; + } + } + else { + if (!aFeature->isVirtual()) + p->IdMap.insertMulti(id.numId, aFeature); + } +} + +bool Layer::exists(Feature* F) const +{ + int i = p->Features.indexOf(F); + return (i != -1); +} + +int Layer::size() const +{ + return p->Features.size(); +} + +void Layer::setDocument(Document* aDocument) +{ + p->theDocument = aDocument; +} + +Document* Layer::getDocument() +{ + return p->theDocument; +} + +int Layer::get(Feature* aFeature) +{ + for (int i=0; i<p->Features.size(); ++i) + if (p->Features[i] == aFeature) + return i; + + return -1; +} + +QList<Feature *> Layer::get() +{ + QList<Feature *> theList; + for (int i=0; i<p->Features.size(); ++i) + if (p->Features[i]) + theList.append(p->Features[i]); + return theList; +} + + +Feature* Layer::get(int i) +{ + return p->Features.at(i); +} + +Feature* Layer::get(const IFeature::FId& id) +{ + QHash<qint64, MapFeaturePtr>::const_iterator i; + + i = p->IdMap.find(id.numId); + while (i != p->IdMap.end() && i.key() == id.numId) { + if ((i.value()->id().type & id.type) != 0) + return i.value(); + ++i; + } + return NULL; +} + +const Feature* Layer::get(int i) const +{ + if((int)i>=p->Features.size()) return 0; + return p->Features[i]; +} + +LayerWidget* Layer::getWidget(void) +{ + return theWidget; +} + +void Layer::deleteWidget(void) +{ +// theWidget->deleteLater(); + delete theWidget; + theWidget = NULL; +} + +void Layer::setAlpha(const qreal a) +{ + p->alpha = a; + + if (p->theDocument) { + FeatureIterator it(p->theDocument); + for(;!it.isEnd(); ++it) { + it.get()->invalidateMeta(); + } + } +} + +qreal Layer::getAlpha() const +{ + return p->alpha; +} + +void Layer::setId(const QString& id) +{ + Id = id; +} + +const QString& Layer::id() const +{ + if (Id.isEmpty()) + Id = QUuid::createUuid().toString(); + return Id; +} + +CoordBox Layer::boundingBox() +{ + if(p->Features.size()==0) return CoordBox(Coord(0,0),Coord(0,0)); + CoordBox Box; + bool haveFirst = false; + for (int i=0; i<p->Features.size(); ++i) { + if (p->Features.at(i)->isDeleted()) + continue; + if (p->Features.at(i)->notEverythingDownloaded()) + continue; + if (p->Features.at(i)->boundingBox().isNull()) + continue; + if (haveFirst) + Box.merge(p->Features.at(i)->boundingBox()); + else { + Box = p->Features.at(i)->boundingBox(); + haveFirst = true; + } + } + return Box; +} + +int Layer::incDirtyLevel(int inc) +{ + return p->dirtyLevel += inc; +} + +int Layer::decDirtyLevel(int inc) +{ + return p->dirtyLevel -= inc; +} + +int Layer::setDirtyLevel(int newLevel) +{ + return (p->dirtyLevel = newLevel); +} + +int Layer::getDirtyLevel() const +{ + return p->dirtyLevel; +} + +int Layer::getDisplaySize() const +{ + int objects = 0; + + QList<MapFeaturePtr>::const_iterator i; + for (i = p->Features.constBegin(); i != p->Features.constEnd(); i++) { + if ((*i)->isVirtual()) + continue; + ++objects; + } + + return objects; +} + +int Layer::getDirtySize() const +{ + int dirtyObjects = 0; + + QList<MapFeaturePtr>::const_iterator i; + for (i = p->Features.constBegin(); i != p->Features.constEnd(); i++) { + Feature* F = (*i); + if (F->isVirtual()) + continue; + else if (F->isDirty() && (!(F->isDeleted()) || (F->isDeleted() && F->hasOSMId()))) + ++dirtyObjects; + } + + return dirtyObjects; +} + +bool Layer::canDelete() const +{ + return (p->dirtyLevel == 0); +} + +QString Layer::toMainHtml() +{ + QString desc; + desc = QString("<big><b>%1</b></big><br/>").arg(p->Name); + if (!p->Description.isEmpty()) + desc += QString("<b>%1</b><br/>").arg(p->Description); + desc += QString("<small>(%1)</small>").arg(id()); + + QString S = + "<html><head/><body>" + "<small><i>" + QString(metaObject()->className()) + "</i></small><br/>" + + desc; + S += "<hr/>"; + S += "<i>"+QApplication::translate("Layer", "Size")+": </i>" + QApplication::translate("Layer", "%n features")+"<br/>"; + S += "%1"; + S += "</body></html>"; + + return S; +} + +QString Layer::toHtml() +{ + return toMainHtml().arg(""); +} + +QString Layer::toPropertiesHtml() +{ + QString h; + + h += "<u>" + p->Name + "</u><br/>"; + h += "<i>" + tr("Features") + ": </i>" + QString::number(getDirtySize()); + + return h; +} + +bool Layer::toXML(QXmlStreamWriter& stream, bool asTemplate, QProgressDialog * progress) +{ + Q_UNUSED(asTemplate); + Q_UNUSED(progress); + + stream.writeAttribute("xml:id", id()); + stream.writeAttribute("name", p->Name); + stream.writeAttribute("alpha", QString::number(p->alpha,'f',2)); + stream.writeAttribute("visible", QString((p->Visible ? "true" : "false"))); + stream.writeAttribute("selected", QString((p->selected ? "true" : "false"))); + stream.writeAttribute("enabled", QString((p->Enabled ? "true" : "false"))); + stream.writeAttribute("readonly", QString((p->Readonly ? "true" : "false"))); + stream.writeAttribute("uploadable", QString((p->Uploadable ? "true" : "false"))); + if (getDirtyLevel()) + stream.writeAttribute("dirtylevel", QString::number(getDirtyLevel())); + + return true; +} + +Layer * Layer::fromXML(Layer* l, Document* /*d*/, QXmlStreamReader& stream, QProgressDialog * /*progress*/) +{ + l->setId(stream.attributes().value("xml:id").toString()); + l->setAlpha(stream.attributes().value("alpha").toString().toDouble()); + l->setVisible((stream.attributes().value("visible") == "true" ? true : false)); + l->setSelected((stream.attributes().value("selected") == "true" ? true : false)); + l->setEnabled((stream.attributes().value("enabled") == "false" ? false : true)); + l->setReadonly((stream.attributes().value("readonly") == "true" ? true : false)); + l->setUploadable((stream.attributes().value("uploadable") == "false" ? false : true)); + l->setDirtyLevel((stream.attributes().hasAttribute("dirtylevel") ? stream.attributes().value("dirtylevel").toString().toInt() : 0)); + + return l; +} + +// DrawingLayer + +DrawingLayer::DrawingLayer() + : Layer() +{ + p->Visible = true; +} + +DrawingLayer::DrawingLayer(const QString & aName) + : Layer(aName) +{ + p->Visible = true; +} + +DrawingLayer::~ DrawingLayer() +{ +} + +LayerWidget* DrawingLayer::newWidget(void) +{ +// delete theWidget; + theWidget = new DrawingLayerWidget(this); + return theWidget; +} + + +bool DrawingLayer::toXML(QXmlStreamWriter& stream, bool asTemplate, QProgressDialog * progress) +{ + bool OK = true; + + stream.writeStartElement(metaObject()->className()); + Layer::toXML(stream, asTemplate, progress); + + if (!asTemplate) { + stream.writeStartElement("osm"); + stream.writeAttribute("version", "0.6"); + stream.writeAttribute("generator", QString("%1 %2").arg(STRINGIFY(PRODUCT)).arg(STRINGIFY(VERSION))); + + if (p->Features.size()) { + stream.writeStartElement("bound"); + CoordBox layBB = boundingBox(); + QString S = QString().number(layBB.bottomLeft().y(),'f',6) + ","; + S += QString().number(layBB.bottomLeft().x(),'f',6) + ","; + S += QString().number(layBB.topRight().y(),'f',6) + ","; + S += QString().number(layBB.topRight().x(),'f',6); + stream.writeAttribute("box", S); + stream.writeAttribute("origin", QString("http://www.openstreetmap.org/api/%1").arg(M_PREFS->apiVersion())); + stream.writeEndElement(); + } + + QList<MapFeaturePtr>::iterator it; + for(it = p->Features.begin(); it != p->Features.end(); it++) + (*it)->toXML(stream, progress); + stream.writeEndElement(); + + QList<CoordBox> downloadBoxes = p->theDocument->getDownloadBoxes(this); + if (downloadBoxes.size() && p->theDocument->getLastDownloadLayerTime().secsTo(QDateTime::currentDateTime()) < 12*3600) { // Do not export downloaded areas if older than 12h + stream.writeStartElement("DownloadedAreas"); + QListIterator<CoordBox>it(downloadBoxes); + while(it.hasNext()) { + it.next().toXML("DownloadedBoundingBox", stream); + } + stream.writeEndElement(); + } + } + stream.writeEndElement(); + + return OK; +} + +DrawingLayer * DrawingLayer::fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress) +{ + DrawingLayer* l = new DrawingLayer(stream.attributes().value("name").toString()); + Layer::fromXML(l, d, stream, progress); + d->add(l); + if (!DrawingLayer::doFromXML(l, d, stream, progress)) { + d->remove(l); + delete l; + return NULL; + } + return l; +} + +DrawingLayer * DrawingLayer::doFromXML(DrawingLayer* l, Document* d, QXmlStreamReader& stream, QProgressDialog * progress) +{ + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "osm") { + QSet<Way*> addedWays; + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "way") { + Way* R = Way::fromXML(d, l, stream); + if (R) + addedWays << R; + } else if (stream.name() == "relation") { + /* Relation* r = */ Relation::fromXML(d, l, stream); + } else if (stream.name() == "node") { + /* Node* N = */ Node::fromXML(d, l, stream); + } else if (stream.name() == "trkseg") { + /*TrackSegment* T = */ TrackSegment::fromXML(d, l, stream, progress); + } else if (stream.name() == "bound") { + stream.skipCurrentElement(); + } else if (!stream.isWhitespace()) { + qDebug() << "osm: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + QString el = stream.readElementText(QXmlStreamReader::IncludeChildElements); + } + + progress->setValue(stream.characterOffset()); + + if (progress->wasCanceled()) + break; + + stream.readNext(); + qApp->processEvents(); + } + } else if (stream.name() == "DownloadedAreas") { + if (d->getLastDownloadLayerTime().secsTo(QDateTime::currentDateTime()) < 12*3600) { // Do not import downloaded areas if older than 12h + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "DownloadedBoundingBox") { + d->addDownloadBox(l, CoordBox::fromXML(stream)); + stream.readNext(); + } + stream.readNext(); + } + } else + stream.skipCurrentElement(); + } else if (!stream.isWhitespace()) { + qDebug() << "DrLayer: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + + if (progress->wasCanceled()) + break; + + stream.readNext(); + } + return l; +} + +// TrackLayer + +TrackLayer::TrackLayer(const QString & aName, const QString& filename) + : Layer(aName), Filename(filename) +{ + p->Visible = true; + p->Readonly = M_PREFS->getReadonlyTracksDefault(); +} + +TrackLayer::~ TrackLayer() +{ +} + +LayerWidget* TrackLayer::newWidget(void) +{ + theWidget = new TrackLayerWidget(this); + return theWidget; +} + +void TrackLayer::extractLayer() +{ + DrawingLayer* extL = new DrawingLayer(tr("Extract - %1").arg(name())); + extL->setUploadable(false); + + TrackNode* P; + QList<TrackNode*> PL; + + const qreal coordPer10M = (double(COORD_MAX) * 2 / 40080000) * 2; + + for (int i=0; i < size(); i++) { + if (TrackSegment* S = dynamic_cast<TrackSegment*>(get(i))) { + + if (S->size() < 2) + continue; + + // Cope with walking tracks + qreal konstant = coordPer10M; + qreal meanSpeed = S->distance() / S->duration() * 3600; + if (meanSpeed < 10.) + konstant /= 3.; + + + PL.clear(); + + P = g_backend.allocTrackNode(extL, S->getNode(0)->position() ); + P->setTime(S->getNode(0)->time()); + P->setElevation(S->getNode(0)->elevation()); + P->setSpeed(S->getNode(0)->speed()); + PL.append(P); + int startP = 0; + + P = g_backend.allocTrackNode(extL, S->getNode(1)->position() ); + P->setTime(S->getNode(1)->time()); + P->setElevation(S->getNode(1)->elevation()); + P->setSpeed(S->getNode(1)->speed()); + PL.append(P); + int endP = 1; + + for (int j=2; j < S->size(); j++) { + P = g_backend.allocTrackNode(extL, S->getNode(j)->position() ); + P->setTime(S->getNode(j)->time()); + P->setElevation(S->getNode(j)->elevation()); + P->setSpeed(S->getNode(j)->speed()); + PL.append(P); + endP = PL.size()-1; + + LineF l(PL[startP]->position(), PL[endP]->position()); + for (int k=startP+1; k < endP; k++) { + qreal d = l.distance(PL[k]->position()); + if (d < konstant) { + Node* P = PL[k]; + PL.removeAt(k); + g_backend.deallocFeature(extL, P); + endP--; + } else + startP = k; + } + } + + Way* R = g_backend.allocWay(extL); + R->setLastUpdated(Feature::OSMServer); + extL->add(R); + for (int i=0; i < PL.size(); i++) { + extL->add(PL[i]); + R->add(PL[i]); + } + } + } + + p->theDocument->add(extL); +} + +const QString TrackLayer::getFilename() +{ + return Filename; +} + +QString TrackLayer::toHtml() +{ + QString S; + + int totSegment = 0; + int totSec = 0; + qreal totDistance = 0; + for (int i=0; i < size(); ++i) { + if (TrackSegment* S = CAST_SEGMENT(get(i))) { + totSegment++; + totSec += S->duration(); + totDistance += S->distance(); + } + } + + S += "<i>"+QApplication::translate("TrackLayer", "# of track segments")+": </i>" + QApplication::translate("TrackLayer", "%1").arg(QLocale().toString(totSegment))+"<br/>"; + S += "<i>"+QApplication::translate("TrackLayer", "Total distance")+": </i>" + QApplication::translate("TrackLayer", "%1 km").arg(QLocale().toString(totDistance, 'g', 3))+"<br/>"; + S += "<i>"+QApplication::translate("TrackLayer", "Total duration")+": </i>" + QApplication::translate("TrackLayer", "%1h %2m").arg(QLocale().toString(totSec/3600)).arg(QLocale().toString((totSec%3600)/60))+"<br/>"; + + return toMainHtml().arg(S); +} + +bool TrackLayer::toXML(QXmlStreamWriter& stream, bool asTemplate, QProgressDialog * progress) +{ + bool OK = true; + if (asTemplate) + return OK; + + stream.writeStartElement(metaObject()->className()); + Layer::toXML(stream, asTemplate, progress); + + stream.writeStartElement("gpx"); + stream.writeAttribute("version", "1.1"); + stream.writeAttribute("creator", "Merkaartor"); + stream.writeAttribute("xmlns", "http://www.topografix.com/GPX/1/1"); + + QList<Node*> waypoints; + QList<TrackSegment*> segments; + QList<MapFeaturePtr>::iterator it; + for(it = p->Features.begin(); it != p->Features.end(); it++) { + if (TrackSegment* S = CAST_SEGMENT(*it)) + segments.push_back(S); + if (Node* P = CAST_NODE(*it)) + if (!P->tagValue("_waypoint_","").isEmpty()) + waypoints.push_back(P); + } + + for (int i=0; i < waypoints.size(); ++i) { + waypoints[i]->toGPX(stream, progress, "wpt"); + } + + stream.writeStartElement("trk"); + for (int i=0; i < segments.size(); ++i) + segments[i]->toXML(stream, progress); + stream.writeEndElement(); + + stream.writeEndElement(); //gpx + stream.writeEndElement(); + + return OK; +} + +TrackLayer * TrackLayer::fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress) +{ + TrackLayer* l = new TrackLayer(stream.attributes().value("name").toString()); + Layer::fromXML(l, d, stream, progress); + d->add(l); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "gpx") { + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "trk") { + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "trkseg") { + TrackSegment::fromXML(d, l, stream, progress); + } + stream.readNext(); + } + } else if (stream.name() == "wpt") { + /* Node* N = */ TrackNode::fromGPX(d, l, stream); + //l->add(N); + progress->setValue(progress->value()+1); + } else if (!stream.isWhitespace()) { + qDebug() << "gpx: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + + progress->setValue(stream.characterOffset()); + + if (progress->wasCanceled()) + break; + + stream.readNext(); + qApp->processEvents(); + } + } else if (!stream.isWhitespace()) { + qDebug() << "TrLayer: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + + stream.readNext(); + } + return l; +} + +// SpecialLayer + +SpecialLayer::SpecialLayer(const QString &aName, Layer::LayerType type, const QString &filename) + : TrackLayer(aName, filename), m_type(type) +{ + setReadonly(true); +} + +LayerWidget* SpecialLayer::newWidget(void) +{ + theWidget = new SpecialLayerWidget(this); + return theWidget; +} + +void SpecialLayer::refreshLayer() +{ + if (m_type == Layer::MapDustLayer) { + g_Merk_MainWindow->on_layersMapdustAction_triggered(); + } +} + +// DirtyLayer + +DirtyLayer::DirtyLayer(const QString & aName) + : DrawingLayer(aName) +{ + p->Visible = true; +} + +DirtyLayer::~ DirtyLayer() +{ +} + +DirtyLayer* DirtyLayer::fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress) +{ + DirtyLayer* l = new DirtyLayer(stream.attributes().value("name").toString()); + Layer::fromXML(l, d, stream, progress); + d->add(l); + d->setDirtyLayer(l); + DrawingLayer::doFromXML(l, d, stream, progress); + return l; +} + +LayerWidget* DirtyLayer::newWidget(void) +{ + theWidget = new DirtyLayerWidget(this); + return theWidget; +} + +// UploadedLayer + +UploadedLayer::UploadedLayer(const QString & aName) + : DrawingLayer(aName) +{ + p->Visible = true; +} + +UploadedLayer::~ UploadedLayer() +{ +} + +UploadedLayer* UploadedLayer::fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress) +{ + UploadedLayer* l = new UploadedLayer(stream.attributes().value("name").toString()); + Layer::fromXML(l, d, stream, progress); + d->add(l); + d->setUploadedLayer(l); + DrawingLayer::doFromXML(l, d, stream, progress); + return l; +} + +LayerWidget* UploadedLayer::newWidget(void) +{ + theWidget = new UploadedLayerWidget(this); + return theWidget; +} + +// DeletedLayer + +DeletedLayer::DeletedLayer(const QString & aName) + : DrawingLayer(aName) +{ + p->Visible = false; + p->Enabled = false; +} + +DeletedLayer::~ DeletedLayer() +{ +} + +bool DeletedLayer::toXML(QXmlStreamWriter& , bool, QProgressDialog * ) +{ + return true; +} + +DeletedLayer* DeletedLayer::fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress) +{ + /* Only keep DeletedLayer for backward compatibility with MDC */ + Layer::fromXML(dynamic_cast<DrawingLayer*>(d->getDirtyOrOriginLayer()), d, stream, progress); + DrawingLayer::doFromXML(dynamic_cast<DrawingLayer*>(d->getDirtyOrOriginLayer()), d, stream, progress); + return NULL; +} + +LayerWidget* DeletedLayer::newWidget(void) +{ + return NULL; +} + +// FilterLayer + +FilterLayer::FilterLayer(const QString& aId, const QString & aName, const QString& aFilter) + : Layer(aName) + , theSelectorString(aFilter) +{ + setId(aId); + p->Visible = true; + theSelector = TagSelector::parse(theSelectorString); +} + +FilterLayer::~ FilterLayer() +{ +} + +void FilterLayer::setFilter(const QString& aFilter) +{ + theSelectorString = aFilter; + delete theSelector; + theSelector = TagSelector::parse(theSelectorString); + + FeatureIterator it(p->theDocument); + for(;!it.isEnd(); ++it) { + it.get()->updateFilters(); + } +} + +bool FilterLayer::toXML(QXmlStreamWriter& stream, bool asTemplate, QProgressDialog * progress) +{ + stream.writeStartElement(metaObject()->className()); + Layer::toXML(stream, asTemplate, progress); + stream.writeAttribute("filter", theSelectorString); + stream.writeEndElement(); + + return true; +} + +FilterLayer* FilterLayer::fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress) +{ + QString id; + if (stream.attributes().hasAttribute("xml:id")) + id = stream.attributes().value("xml:id").toString(); + else + id = QUuid::createUuid().toString(); + FilterLayer* l = new FilterLayer(id, stream.attributes().value("name").toString(), stream.attributes().value("filter").toString()); + Layer::fromXML(l, d, stream, progress); + stream.readNext(); + + d->add(l); + return l; +} + +LayerWidget* FilterLayer::newWidget(void) +{ + theWidget = new FilterLayerWidget(this); + return theWidget; +} + diff --git a/src/Layers/Layer.h b/src/Layers/Layer.h new file mode 100644 index 0000000..fe270c2 --- /dev/null +++ b/src/Layers/Layer.h @@ -0,0 +1,295 @@ +#ifndef LAYER_H_ +#define LAYER_H_ + +#include "MapTypedef.h" +#include "Coord.h" +#include "Feature.h" + +#include <QProgressDialog> + +#include "ILayer.h" + +class QString; +class QprogressDialog; + +class Feature; +class LayerPrivate; +class MapAdapter; +class Layer; +class LayerManager; +class LayerWidget; +class WMSMapAdapter; +class TileMapAdapter; +class TrackSegment; +class IMapAdapter; +class Document; + +struct IndexFindContext; + +class Layer : public QObject, public ILayer +{ + Q_OBJECT + +public: + Layer(); + Layer(const QString& aName); + +private: + Layer(const Layer& aLayer); + +public: + typedef enum { + UndefinedType, + DeletedLayerType, + DirtyLayerType, + DrawingLayerType, + ExtractedLayerType, + ImageLayerType, + TrackLayerType, + UploadedLayerType, + FilterLayerType, + OsmBugsLayer, /* Obsolete */ + MapDustLayer + } LayerType; + + enum LayerGroup { + None = 0x00000000, + Map = 0x00000001, + Draw = 0x00000002, + Tracks = 0x00000004, + Filters = 0x00000008, + Special = 0x00000010, + All = 0x0000ffff + }; + + Q_DECLARE_FLAGS(LayerGroups, LayerGroup) + +public: + virtual ~Layer(); + + void setName(const QString& aName); + const QString& name() const; + void setDescription(const QString& aDesc); + const QString& description() const; + bool isVisible() const; + bool isSelected() const; + bool isEnabled() const; + + virtual void add(Feature* aFeature); + virtual void remove(Feature* aFeature); + virtual void deleteFeature(Feature* aFeature); + virtual void clear(); + virtual void deleteAll(); + bool exists(Feature* aFeature) const; + int getDisplaySize() const; + virtual int size() const; + int get(Feature* aFeature); + QList<Feature *> get(); + Feature* get(int i); + const Feature* get(int i) const; + virtual Feature* get(const IFeature::FId& id); + void notifyIdUpdate(const IFeature::FId& id, Feature* aFeature); + + virtual void setDocument(Document* aDocument); + Document* getDocument(); + + LayerWidget* getWidget(void); + void deleteWidget(void); + virtual void updateWidget() {} + + virtual void setVisible(bool b); + virtual void setSelected(bool b); + virtual void setEnabled(bool b); + virtual void setReadonly(bool b); + virtual void setUploadable(bool b); + virtual LayerWidget* newWidget(void) = 0; + + virtual void setAlpha(const qreal alpha); + virtual qreal getAlpha() const; + + void setId(const QString& id); + const QString& id() const; + + virtual QString toMainHtml(); + virtual QString toHtml(); + virtual QString toPropertiesHtml(); + + virtual bool toXML(QXmlStreamWriter& stream, bool asTemplate, QProgressDialog * progress); + static Layer* fromXML(Layer* l, Document* d, QXmlStreamReader& stream, QProgressDialog * progress); + + virtual CoordBox boundingBox(); + + virtual /* const */ LayerType classType() const = 0; + virtual const LayerGroups classGroups() const = 0; + + int incDirtyLevel(int inc=1); + int decDirtyLevel(int inc=1); + int getDirtyLevel() const; + int setDirtyLevel(int newLevel); + int getDirtySize() const; + + virtual bool canDelete() const; + virtual bool isUploadable() const; + virtual bool isReadonly() const; + virtual bool isTrack() const {return false;} + +protected: + LayerPrivate* p; + LayerWidget* theWidget; + mutable QString Id; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(Layer::LayerGroups) + +class DrawingLayer : public Layer +{ + Q_OBJECT + +public: + DrawingLayer(); + DrawingLayer(const QString& aName); + virtual ~DrawingLayer(); + + virtual LayerWidget* newWidget(void); + + virtual bool toXML(QXmlStreamWriter& stream, bool asTemplate, QProgressDialog * progress); + static DrawingLayer* fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress); + static DrawingLayer* doFromXML(DrawingLayer* l, Document* d, QXmlStreamReader& stream, QProgressDialog * progress); + + virtual /* const */ LayerType classType() const {return Layer::DrawingLayerType;} + virtual const LayerGroups classGroups() const {return (Layer::Draw);} +}; + +class TrackLayer : public Layer +{ + Q_OBJECT +public: + TrackLayer(const QString& aName = QString(), const QString& filaname = QString()); + virtual ~TrackLayer(); + + virtual LayerWidget* newWidget(void); + + virtual void extractLayer(); + virtual const QString getFilename(); + + virtual QString toHtml(); + virtual bool toXML(QXmlStreamWriter& stream, bool asTemplate, QProgressDialog * progress); + static TrackLayer* fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress); + + virtual /* const */ LayerType classType() const {return Layer::TrackLayerType;} + virtual const LayerGroups classGroups() const {return(Layer::Tracks);} + + virtual bool isUploadable() const {return true;} + virtual bool isTrack() const {return true;} + +protected: + QString Filename; +}; + +class SpecialLayer : public TrackLayer +{ + Q_OBJECT +public: + SpecialLayer(const QString& aName = QString(), LayerType type=Layer::UndefinedType, const QString& filename = QString()); + + virtual LayerWidget* newWidget(void); + + virtual void refreshLayer(); + + virtual /* const */ LayerType classType() const {return m_type;} + virtual const LayerGroups classGroups() const {return(Layer::Special);} + + virtual bool isUploadable() const {return false;} + virtual bool isTrack() const {return true;} + +protected: + LayerType m_type; +}; + +class DirtyLayer : public DrawingLayer +{ + Q_OBJECT +public: + DirtyLayer(const QString& aName); + virtual ~DirtyLayer(); + + static DirtyLayer* fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress); + + virtual /* const */ LayerType classType() const {return Layer::DirtyLayerType;} + virtual const LayerGroups classGroups() const {return(Layer::Map|Layer::Draw);} + + virtual LayerWidget* newWidget(void); + + virtual bool canDelete() const { return false; } + +}; + +class UploadedLayer : public DrawingLayer +{ + Q_OBJECT +public: + UploadedLayer(const QString& aName); + virtual ~UploadedLayer(); + + static UploadedLayer* fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress); + + virtual /* const */ LayerType classType() const {return Layer::UploadedLayerType;} + virtual const LayerGroups classGroups() const {return(Layer::Map|Layer::Draw);} + + virtual LayerWidget* newWidget(void); + + virtual bool canDelete() const { return false; } +}; + +class DeletedLayer : public DrawingLayer +{ + Q_OBJECT +public: + DeletedLayer(const QString& aName); + virtual ~DeletedLayer(); + + virtual bool toXML(QXmlStreamWriter& stream, bool asTemplate, QProgressDialog * progress); + static DeletedLayer* fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress); + + virtual /* const */ LayerType classType() const {return Layer::DeletedLayerType;} + virtual const LayerGroups classGroups() const {return(Layer::None);} + virtual LayerWidget* newWidget(void); + + virtual bool isUploadable() const {return false;} + virtual bool canDelete() const { return false; } +}; + +class FilterLayer : public Layer +{ + Q_OBJECT +public: + FilterLayer(const QString& aId, const QString& aName, const QString& aFilter); + virtual ~FilterLayer(); + + bool toXML(QXmlStreamWriter& stream, bool asTemplate, QProgressDialog * progress); + static FilterLayer* fromXML(Document* d, QXmlStreamReader& stream, QProgressDialog * progress); + + virtual /* const */ LayerType classType() const {return Layer::FilterLayerType;} + virtual const LayerGroups classGroups() const {return(Layer::Filters);} + + virtual LayerWidget* newWidget(void); + + virtual bool canDelete() const { return true; } + +public: + virtual void setFilter(const QString& aFilter); + virtual QString filter() { return theSelectorString; } + virtual TagSelector* selector() { return theSelector; } + +protected: + QString theSelectorString; + TagSelector* theSelector; + +}; + + +Q_DECLARE_METATYPE ( QUuid ) + +#endif + + diff --git a/src/Layers/LayerIterator.h b/src/Layers/LayerIterator.h new file mode 100644 index 0000000..48cc546 --- /dev/null +++ b/src/Layers/LayerIterator.h @@ -0,0 +1,70 @@ +class IDocument; + +template <class L> +class LayerIterator +{ + +public: + LayerIterator(IDocument* aDoc) + : theDocument(aDoc), curLayerIdx(0), isAtEnd(false) + { + docSize = theDocument->layerSize(); + + if(!check() && !isAtEnd) + ++(*this); + } + virtual ~LayerIterator() {} + + bool isEnd() const + { + return isAtEnd; + } + + LayerIterator& operator ++() + { + docSize = theDocument->layerSize(); + + if (curLayerIdx < docSize-1) { + curLayerIdx++; + } else + isAtEnd = true; + while(!isAtEnd && !check()) { + if (curLayerIdx < docSize-1) { + curLayerIdx++; + } else + isAtEnd = true; + } + + return *this; + } + + L get() + { + return qobject_cast<L>(theDocument->getLayer(curLayerIdx)); + } + + int index() + { + return curLayerIdx; + } + +protected: + virtual bool check() + { + if (curLayerIdx >= docSize) { + isAtEnd = true; + return false; + } + if (qobject_cast<L>(theDocument->getLayer((curLayerIdx))) == NULL) + return false; + + return true; + } + + IDocument* theDocument; + int curLayerIdx; + bool isAtEnd; + int docSize; +}; + + diff --git a/src/Layers/LayerPrivate.h b/src/Layers/LayerPrivate.h new file mode 100644 index 0000000..c426341 --- /dev/null +++ b/src/Layers/LayerPrivate.h @@ -0,0 +1,40 @@ +#ifndef LAYERPRIVATE_H +#define LAYERPRIVATE_H + +class LayerPrivate +{ +public: + LayerPrivate() + { + theDocument = NULL; + selected = false; + Enabled = true; + Readonly = false; + Uploadable = true; + + IndexingBlocked = false; + VirtualsUpdatesBlocked = false; + } + ~LayerPrivate() + { + } + + QList<Feature*> Features; + QHash<qint64, MapFeaturePtr> IdMap; + + QString Name; + QString Description; + bool Visible; + bool selected; + bool Enabled; + bool Readonly; + bool Uploadable; + bool IndexingBlocked; + bool VirtualsUpdatesBlocked; + qreal alpha; + int dirtyLevel; + + Document* theDocument; +}; + +#endif // LAYERPRIVATE_H diff --git a/src/Layers/LayerWidget.cpp b/src/Layers/LayerWidget.cpp new file mode 100644 index 0000000..66c473e --- /dev/null +++ b/src/Layers/LayerWidget.cpp @@ -0,0 +1,725 @@ +#include "Global.h" + +#include "LayerWidget.h" +#include "LayerDock.h" + +#include "MainWindow.h" +#include "Document.h" +#include "Layer.h" +#include "MerkaartorPreferences.h" + +#include "IMapAdapterFactory.h" +#include "IMapAdapter.h" + +#include <QApplication> +#include <QMouseEvent> +#include <QStylePainter> +#include <QInputDialog> +#include <QMessageBox> +#include <QDrag> + +#include "SelectionDialog.h" + +#define LINEHEIGHT 25 + +LayerWidget::LayerWidget(Layer* aLayer, QWidget* aParent) +: QPushButton(aParent), theLayer(aLayer), ctxMenu(0), closeAction(0), actZoom(0), associatedMenu(0) +{ + ui.setupUi(this); + + setCheckable(true); +#ifdef Q_OS_MAC + setFlat(true); +#endif + setFocusPolicy(Qt::NoFocus); + setContextMenuPolicy(Qt::NoContextMenu); + + ui.cbVisible->blockSignals(true); + ui.cbVisible->setChecked(theLayer->isVisible()); + ui.cbVisible->blockSignals(false); +#ifdef Q_OS_MAC + ui.cbVisible->setMinimumWidth(30); +#endif + + ui.edName->setText(theLayer->name()); + ui.edName->setReadOnly(true); + ui.edName->setAttribute(Qt::WA_TransparentForMouseEvents); + + ui.edName->setFrame(false); + ui.edName->setCursorPosition(0); + ui.edName->setStyleSheet(" background: transparent; "); + + connect(this, SIGNAL(toggled(bool)), SLOT(checkedStatusToggled(bool))); +} + +LayerWidget::~LayerWidget() +{ + delete associatedMenu; +} + +void LayerWidget::paintEvent(QPaintEvent *) +{ + QStylePainter p(this); + QStyleOptionButton option; + initStyleOption(&option); + p.drawControl(QStyle::CE_PushButton, option); + + if (theLayer && !theLayer->isUploadable()) { + p.fillRect(rect().adjusted(20,0,0,-1),QBrush(Qt::red, Qt::BDiagPattern)); + } + +} + +void LayerWidget::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) + dragStartPosition = event->pos(); + + event->ignore(); +} + +void LayerWidget::mouseMoveEvent(QMouseEvent *event) +{ + if (!(event->buttons() & Qt::LeftButton)) + return; + if ((event->pos() - dragStartPosition).manhattanLength() + < QApplication::startDragDistance()) + return; + + QDrag *drag = new QDrag(this); + QMimeData *mimeData = new QMimeData; + mimeData->setData("application/x-layer", theLayer->id().toLatin1()); + drag->setMimeData(mimeData); + + QPixmap px(size()); + render(&px); + drag->setPixmap(px); + + /*Qt::DropAction dropAction =*/ drag->exec(Qt::MoveAction); +} + +void LayerWidget::mouseReleaseEvent(QMouseEvent* anEvent) +{ + anEvent->ignore(); +} + +void LayerWidget::on_cbVisible_stateChanged ( int state ) +{ + setLayerVisible((state > Qt::Unchecked)); +} + +void LayerWidget::mouseDoubleClickEvent(QMouseEvent */*event*/) +{ + ui.edName->setReadOnly(false); + ui.edName->setAttribute(Qt::WA_TransparentForMouseEvents, false); + ui.edName->setFrame(true); + ui.edName->setStyleSheet(""); + ui.edName->setFocus(); +} + +void LayerWidget::on_edName_editingFinished() +{ + ui.edName->setReadOnly(true); + ui.edName->setAttribute(Qt::WA_TransparentForMouseEvents, true); + ui.edName->setFrame(false); + ui.edName->setStyleSheet(" background: transparent; "); + + if (!ui.edName->text().isEmpty()) + theLayer->setName(ui.edName->text()); + else + ui.edName->setText(theLayer->name()); +} + +void LayerWidget::checkedStatusToggled(bool newVal) +{ + theLayer->setSelected(newVal); +} + +void LayerWidget::setName(const QString& s) +{ + ui.edName->setText(s); +} + +Layer* LayerWidget::getLayer() +{ + return theLayer; +} + +void LayerWidget::showContextMenu(QContextMenuEvent* anEvent) +{ + //initActions(); + + if (!ctxMenu) + return; + + if (actZoom) { + actZoom->setEnabled(theLayer->size()); + } + if (closeAction) + closeAction->setEnabled(theLayer->canDelete()); + ctxMenu->exec(anEvent->globalPos()); +} + +#define NUMOP 3 +void LayerWidget::initActions() +{ + SAFE_DELETE(ctxMenu); + SAFE_DELETE(associatedMenu); + + ctxMenu = new QMenu(this); + associatedMenu = new QMenu(theLayer->name()); + //connect(associatedMenu, SIGNAL(aboutToShow()), this, SLOT(associatedAboutToShow())); + + actVisible = new QAction(tr("Visible"), ctxMenu); + actVisible->setCheckable(true); + actVisible->setChecked(theLayer->isVisible()); + associatedMenu->addAction(actVisible); + connect(actVisible, SIGNAL(triggered(bool)), this, SLOT(visibleLayer(bool))); + + actReadonly = new QAction(tr("Readonly"), ctxMenu); + actReadonly->setCheckable(true); + actReadonly->setChecked(theLayer->isReadonly()); + associatedMenu->addAction(actReadonly); + ctxMenu->addAction(actReadonly); + connect(actReadonly, SIGNAL(triggered(bool)), this, SLOT(readonlyLayer(bool))); + + static const char *opStr[NUMOP] = { + QT_TR_NOOP("Low"), QT_TR_NOOP("High"), QT_TR_NOOP("Opaque")}; + + QActionGroup* actgrp = new QActionGroup(this); + QMenu* alphaMenu = new QMenu(tr("Opacity"), this); + for (int i=0; i<NUMOP; i++) { + QAction* act = new QAction(tr(opStr[i]), alphaMenu); + actgrp->addAction(act); + qreal a = M_PREFS->getAlpha(opStr[i]); + act->setData(a); + act->setCheckable(true); + if (int(theLayer->getAlpha()*100) == int(a*100)) + act->setChecked(true); + alphaMenu->addAction(act); + } + ctxMenu->addMenu(alphaMenu); + connect(alphaMenu, SIGNAL(triggered(QAction*)), this, SLOT(setOpacity(QAction*))); + associatedMenu->addMenu(alphaMenu); +} + +void LayerWidget::setOpacity(QAction *act) +{ + theLayer->setAlpha(act->data().toDouble()); + emit (layerChanged(this, false)); +} + +void LayerWidget::close() +{ + if (theLayer.data()->getDirtyLevel()) { + if (QMessageBox::question(this, tr("Layer CLose: Dirty objects present"), + tr("There are dirty features on this layer.\n" + "Are you sure you want to close it? (no Undo possible)"), + QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel) == QMessageBox::Cancel) + return; + } else if (theLayer.data()->size()) + if (QMessageBox::question(this, tr("Layer CLose: Not empty"), + tr("Are you sure you want to close this layer? (no Undo possible)"), + QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel) == QMessageBox::Cancel) + return; + + emit(layerClosed(theLayer)); +} + +void LayerWidget::clear() +{ + emit(layerCleared(theLayer)); +} + +void LayerWidget::zoomLayer() +{ + emit (layerZoom(theLayer)); +} + +void LayerWidget::visibleLayer(bool) +{ + setLayerVisible(actVisible->isChecked()); +} + +void LayerWidget::readonlyLayer(bool) +{ + setLayerReadonly(actReadonly->isChecked()); +} + +QMenu* LayerWidget::getAssociatedMenu() +{ + return associatedMenu; +} + +void LayerWidget::setLayerVisible(bool b, bool updateLayer) +{ + actVisible->blockSignals(true); + actVisible->setChecked(b); + actVisible->blockSignals(false); + + ui.cbVisible->blockSignals(true); + ui.cbVisible->setChecked(b); + ui.cbVisible->blockSignals(false); + + update(); + + if (updateLayer) { + theLayer->setVisible(b); + emit(layerChanged(this, false)); + } +} + +void LayerWidget::setLayerReadonly(bool b) +{ + theLayer->setReadonly(b); + actReadonly->setChecked(b); + update(); + emit(layerChanged(this, false)); +} + +void LayerWidget::associatedAboutToShow() +{ + initActions(); +} + + +// DrawingLayerWidget + +DrawingLayerWidget::DrawingLayerWidget(DrawingLayer* aLayer, QWidget* aParent) + : LayerWidget(aLayer, aParent) +{ + initActions(); +} + +void DrawingLayerWidget::initActions() +{ + LayerWidget::initActions(); + + ctxMenu->addSeparator(); + associatedMenu->addSeparator(); + + actZoom = new QAction(tr("Zoom"), ctxMenu); + ctxMenu->addAction(actZoom); + associatedMenu->addAction(actZoom); + connect(actZoom, SIGNAL(triggered(bool)), this, SLOT(zoomLayer())); + + closeAction = new QAction(tr("Close"), this); + connect(closeAction, SIGNAL(triggered()), this, SLOT(close())); + ctxMenu->addAction(closeAction); + associatedMenu->addAction(closeAction); + closeAction->setEnabled(theLayer->canDelete()); +} + +// ImageLayerWidget + +ImageLayerWidget::ImageLayerWidget(ImageMapLayer* aLayer, QWidget* aParent) +: LayerWidget(aLayer, aParent), wmsMenu(0) //, actgrWms(0) +{ + actNone = new QAction(tr("None"), this); + //actNone->setCheckable(true); + actNone->setChecked((M_PREFS->getBackgroundPlugin() == NONE_ADAPTER_UUID)); + actNone->setData(QVariant::fromValue(NONE_ADAPTER_UUID)); + connect(actNone, SIGNAL(triggered()), this, SLOT(setNone())); + + if (M_PREFS->getUseShapefileForBackground()) { + actShape = new QAction(tr("Shape adapter"), this); + //actShape->setCheckable(true); + actShape->setChecked((M_PREFS->getBackgroundPlugin() == SHAPE_ADAPTER_UUID)); + actShape->setData(QVariant::fromValue(SHAPE_ADAPTER_UUID)); + } + + initActions(); +} + +ImageLayerWidget::~ImageLayerWidget() +{ +} + +void ImageLayerWidget::setNone() +{ + ((ImageMapLayer *)theLayer.data())->setMapAdapter(NONE_ADAPTER_UUID); + + this->update(rect()); + emit (layerChanged(this, true)); +} + +void ImageLayerWidget::setWms(QAction* act) +{ + WmsServerList* L = M_PREFS->getWmsServers(); + WmsServer S = L->value(act->data().toString()); + M_PREFS->setSelectedServer(S.WmsName); + + ((ImageMapLayer *)theLayer.data())->setMapAdapter(WMS_ADAPTER_UUID, S.WmsName); + theLayer->setVisible(true); + + this->update(rect()); + emit (layerChanged(this, true)); +} + +void ImageLayerWidget::setTms(QAction* act) +{ + TmsServerList* L = M_PREFS->getTmsServers(); + TmsServer S = L->value(act->data().toString()); + M_PREFS->setSelectedServer(S.TmsName); + + ((ImageMapLayer *)theLayer.data())->setMapAdapter(TMS_ADAPTER_UUID, S.TmsName); + theLayer->setVisible(true); + + this->update(rect()); + emit (layerChanged(this, true)); +} + +void ImageLayerWidget::setPlugin(QAction* act) +{ + QUuid aUuid = act->data().value<QUuid>(); + if (aUuid.isNull()) + return; + + ((ImageMapLayer *)theLayer.data())->setMapAdapter(aUuid); + theLayer->setVisible(true); + + this->update(rect()); + emit (layerChanged(this, true)); +} + +void ImageLayerWidget::setProjection() +{ + IMapAdapter* ma = ((ImageMapLayer*)theLayer.data())->getMapAdapter(); + if (ma) { + emit (layerProjection(ma->projection())); + } +} + +void ImageLayerWidget::resetAlign() +{ + ((ImageMapLayer *)theLayer.data())->resetAlign(); + emit (layerChanged(this, true)); +} + +void ImageLayerWidget::initActions() +{ + //if (actgrWms) + // delete actgrWms; + //actgrWms = new QActionGroup(this); + + LayerWidget::initActions(); +// ImageMapLayer* il = ((ImageMapLayer *)theLayer.data()); + + actZoom = new QAction(tr("Zoom"), ctxMenu); + ctxMenu->addAction(actZoom); + associatedMenu->addAction(actZoom); + connect(actZoom, SIGNAL(triggered(bool)), this, SLOT(zoomLayer())); + + actReadonly->setVisible(false); + + actProjection = new QAction(tr("Set view projection to layer's"), this); + connect(actProjection, SIGNAL(triggered()), this, SLOT(setProjection())); + ctxMenu->addAction(actProjection); + associatedMenu->addAction(actProjection); + + actResetAlign = new QAction(tr("Reset alignment adjustment"), this); + connect(actResetAlign, SIGNAL(triggered()), this, SLOT(resetAlign())); + ctxMenu->addAction(actResetAlign); + associatedMenu->addAction(actResetAlign); + + closeAction = new QAction(tr("Close"), this); + connect(closeAction, SIGNAL(triggered()), this, SLOT(close())); + ctxMenu->addAction(closeAction); + associatedMenu->addAction(closeAction); + + ctxMenu->addSeparator(); + associatedMenu->addSeparator(); + + wmsMenu = new QMenu(tr("WMS adapter"), this); + WmsServerList* WmsServers = M_PREFS->getWmsServers(); + WmsServerListIterator wi(*WmsServers); + while (wi.hasNext()) { + wi.next(); + WmsServer S = wi.value(); + if (!S.deleted) { + QAction* act = new QAction(S.WmsName, wmsMenu); + act->setData(S.WmsName); + wmsMenu->addAction(act); + if (M_PREFS->getBackgroundPlugin() == WMS_ADAPTER_UUID) + if (S.WmsName == M_PREFS->getSelectedServer()) + act->setChecked(true); + } + } + + tmsMenu = new QMenu(tr("TMS adapter"), this); + TmsServerList* TmsServers = M_PREFS->getTmsServers(); + TmsServerListIterator ti(*TmsServers); + while (ti.hasNext()) { + ti.next(); + TmsServer S = ti.value(); + if (!S.deleted) { + QAction* act = new QAction(S.TmsName, tmsMenu); + act->setData(S.TmsName); + tmsMenu->addAction(act); + if (M_PREFS->getBackgroundPlugin() == TMS_ADAPTER_UUID) + if (S.TmsName == M_PREFS->getSelectedServer()) + act->setChecked(true); + } + } + + pluginsMenu = new QMenu(tr("Plugins"), this); + QMapIterator <QUuid, IMapAdapterFactory *> it(M_PREFS->getBackgroundPlugins()); + QMap<QString, QUuid> plugins; + while (it.hasNext()) { + it.next(); + + plugins[it.value()->getName()] = it.key(); + } + QMapIterator <QString, QUuid> pluginsIt(plugins); + while (pluginsIt.hasNext()) { + pluginsIt.next(); + + QAction* actBackPlug = new QAction(pluginsIt.key(), this); + actBackPlug->setChecked((M_PREFS->getBackgroundPlugin() == pluginsIt.value())); + actBackPlug->setData(QVariant::fromValue(pluginsIt.value())); + + pluginsMenu->addAction(actBackPlug); + } + + actNone->setChecked((M_PREFS->getBackgroundPlugin() == NONE_ADAPTER_UUID)); + if (M_PREFS->getUseShapefileForBackground()) + actShape->setChecked((M_PREFS->getBackgroundPlugin() == SHAPE_ADAPTER_UUID)); + + ctxMenu->addAction(actNone); + associatedMenu->addAction(actNone); + + ctxMenu->addMenu(wmsMenu); + associatedMenu->addMenu(wmsMenu); + connect(wmsMenu, SIGNAL(triggered(QAction*)), this, SLOT(setWms(QAction*))); + + ctxMenu->addMenu(tmsMenu); + associatedMenu->addMenu(tmsMenu); + connect(tmsMenu, SIGNAL(triggered(QAction*)), this, SLOT(setTms(QAction*))); + + ctxMenu->addMenu(pluginsMenu); + associatedMenu->addMenu(pluginsMenu); + connect(pluginsMenu, SIGNAL(triggered(QAction*)), this, SLOT(setPlugin(QAction*))); + + if (M_PREFS->getUseShapefileForBackground()) { + ctxMenu->addAction(actShape); + associatedMenu->addAction(actShape); + } +} + +void ImageLayerWidget::showContextMenu(QContextMenuEvent* anEvent) +{ + if (!ctxMenu) + return; + + ImageMapLayer* theMapLayer = qobject_cast<ImageMapLayer*>(theLayer); + QList<QAction*> plugActions; + + QAction* sep = new QAction(this); + sep->setSeparator(true); + + actZoom->setEnabled(false); + if (theMapLayer && theMapLayer->getMapAdapter()) { + if (!theMapLayer->getMapAdapter()->getBoundingbox().isNull()) + actZoom->setEnabled(true); + + if (theMapLayer->getMapAdapter()->getMenu()) { + ctxMenu->addAction(sep); + associatedMenu->addAction(sep); + plugActions << sep; + foreach (QAction* a, theMapLayer->getMapAdapter()->getMenu()->actions()) { + ctxMenu->addAction(a); + associatedMenu->addAction(a); + plugActions << a; + } + } + } + closeAction->setEnabled(theLayer->canDelete()); + + ctxMenu->exec(anEvent->globalPos()); + + foreach (QAction* a, plugActions) { + if (ctxMenu->actions().contains(a)) + ctxMenu->removeAction(a); + if (associatedMenu->actions().contains(a)) + associatedMenu->removeAction(a); + } + delete sep; +} + +// TrackLayerWidget + +TrackLayerWidget::TrackLayerWidget(TrackLayer* aLayer, QWidget* aParent) + : LayerWidget(aLayer, aParent) +{ + initActions(); +} + +void TrackLayerWidget::initActions() +{ + LayerWidget::initActions(); + ctxMenu->addSeparator(); + associatedMenu->addSeparator(); + + QAction* actExtract = new QAction(tr("Extract Drawing layer"), ctxMenu); + ctxMenu->addAction(actExtract); + associatedMenu->addAction(actExtract); + connect(actExtract, SIGNAL(triggered(bool)), this, SLOT(extractLayer(bool))); + + actZoom = new QAction(tr("Zoom"), ctxMenu); + ctxMenu->addAction(actZoom); + associatedMenu->addAction(actZoom); + connect(actZoom, SIGNAL(triggered(bool)), this, SLOT(zoomLayer())); + + ctxMenu->addSeparator(); + associatedMenu->addSeparator(); + + closeAction = new QAction(tr("Close"), this); + connect(closeAction, SIGNAL(triggered()), this, SLOT(close())); + ctxMenu->addAction(closeAction); + associatedMenu->addAction(closeAction); + closeAction->setEnabled(theLayer->canDelete()); +} + +TrackLayerWidget::~TrackLayerWidget() +{ +} + +void TrackLayerWidget::extractLayer(bool) +{ + ((TrackLayer*)theLayer.data())->extractLayer(); + emit (layerChanged(this, false)); +} + +// SpecialLayerWidget + +SpecialLayerWidget::SpecialLayerWidget(SpecialLayer* aLayer, QWidget* aParent) + : LayerWidget(aLayer, aParent) +{ + initActions(); +} + +void SpecialLayerWidget::initActions() +{ + LayerWidget::initActions(); + ctxMenu->addSeparator(); + associatedMenu->addSeparator(); + + QAction* actExtract = new QAction(tr("Refresh layer"), ctxMenu); + ctxMenu->addAction(actExtract); + associatedMenu->addAction(actExtract); + connect(actExtract, SIGNAL(triggered(bool)), this, SLOT(refreshLayer(bool))); + + closeAction = new QAction(tr("Close"), this); + connect(closeAction, SIGNAL(triggered()), this, SLOT(close())); + ctxMenu->addAction(closeAction); + associatedMenu->addAction(closeAction); + closeAction->setEnabled(theLayer->canDelete()); +} + +SpecialLayerWidget::~SpecialLayerWidget() +{ +} + +void SpecialLayerWidget::refreshLayer(bool) +{ + dynamic_cast<SpecialLayer*>(theLayer.data())->refreshLayer(); +} + +// DirtyLayerWidget + +DirtyLayerWidget::DirtyLayerWidget(DirtyLayer* aLayer, QWidget* aParent) + : LayerWidget(aLayer, aParent) +{ + initActions(); +} + +void DirtyLayerWidget::initActions() +{ + LayerWidget::initActions(); + ctxMenu->addSeparator(); + associatedMenu->addSeparator(); + + actZoom = new QAction(tr("Zoom"), ctxMenu); + ctxMenu->addAction(actZoom); + associatedMenu->addAction(actZoom); + connect(actZoom, SIGNAL(triggered(bool)), this, SLOT(zoomLayer())); +} + +// UploadLayerWidget + +UploadedLayerWidget::UploadedLayerWidget(UploadedLayer* aLayer, QWidget* aParent) + : LayerWidget(aLayer, aParent) +{ + initActions(); +} + +void UploadedLayerWidget::initActions() +{ + LayerWidget::initActions(); + ctxMenu->addSeparator(); + associatedMenu->addSeparator(); + + actZoom = new QAction(tr("Zoom"), ctxMenu); + ctxMenu->addAction(actZoom); + associatedMenu->addAction(actZoom); + connect(actZoom, SIGNAL(triggered(bool)), this, SLOT(zoomLayer())); + + closeAction = new QAction(tr("Clear"), this); + connect(closeAction, SIGNAL(triggered()), this, SLOT(clear())); + ctxMenu->addAction(closeAction); + associatedMenu->addAction(closeAction); + closeAction->setEnabled(theLayer->canDelete()); +} + +// FilterLayerWidget + +FilterLayerWidget::FilterLayerWidget(FilterLayer* aLayer, QWidget* aParent) + : LayerWidget(aLayer, aParent) +{ + initActions(); +} + +void FilterLayerWidget::initActions() +{ + LayerWidget::initActions(); + + ctxMenu->addSeparator(); + associatedMenu->addSeparator(); + + closeAction = new QAction(tr("Close"), this); + connect(closeAction, SIGNAL(triggered()), this, SLOT(close())); + ctxMenu->addAction(closeAction); + associatedMenu->addAction(closeAction); + closeAction->setEnabled(theLayer->canDelete()); +} + +void FilterLayerWidget::mouseDoubleClickEvent(QMouseEvent */*event*/) +{ + FilterLayer* Fl = dynamic_cast<FilterLayer*>(theLayer.data()); + + QDialog* dlg = new QDialog(this); + ui = new Ui::FilterEditDialog; + ui->setupUi(dlg); + ui->edName->setText(Fl->name()); + ui->edFilter->setText(Fl->filter()); + connect(ui->btFilterHelper, SIGNAL(clicked()), SLOT(on_filterHelperClicked())); + if (dlg->exec() == QDialog::Accepted) { + setName(ui->edName->text()); + Fl->setName(ui->edName->text()); + Fl->setFilter(ui->edFilter->text()); + } + delete ui; +} + +void FilterLayerWidget::on_filterHelperClicked() +{ + SelectionDialog* Sel = new SelectionDialog(g_Merk_MainWindow, false); + if (!Sel) + return; + + Sel->edTagQuery->setText(ui->edFilter->text()); + if (Sel->exec() == QDialog::Accepted) { + ui->edFilter->setText(Sel->edTagQuery->text()); + } +} + diff --git a/src/Layers/LayerWidget.h b/src/Layers/LayerWidget.h new file mode 100644 index 0000000..a8dee05 --- /dev/null +++ b/src/Layers/LayerWidget.h @@ -0,0 +1,207 @@ +#ifndef MERKATOR_LAYERWIDGET_H_ +#define MERKATOR_LAYERWIDGET_H_ + +#include "Layer.h" +#include "ImageMapLayer.h" + +#include <QActionGroup> +#include <QPushButton> + +#include "ui_LayerWidget.h" +#include "ui_FilterEditDialog.h" + +class MainWindow; +class Layer; + +class LayerWidget : public QPushButton +{ + Q_OBJECT + + friend class LayerDock; + +public: + LayerWidget(Layer* aLayer, QWidget* aParent = 0); + virtual ~LayerWidget(); + void paintEvent(QPaintEvent *); + + virtual void setName(const QString& s); + + virtual Layer* getLayer(); + virtual void setLayerVisible(bool b, bool updateLayer=true); + virtual void setLayerReadonly(bool b); + virtual void initActions(); + + QMenu* getAssociatedMenu(); + +protected: + virtual void showContextMenu(QContextMenuEvent* anEvent); + + virtual void mousePressEvent(QMouseEvent *event); + virtual void mouseMoveEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent* anEvent); + virtual void mouseDoubleClickEvent(QMouseEvent *event); + + QPointer<Layer> theLayer; + QMenu* ctxMenu; + QAction* closeAction; + QAction* actZoom; + QAction* actVisible; + QAction* actReadonly; + QAction* actSupMenu; + QMenu* associatedMenu; + QPoint dragStartPosition; + +signals: + void layerSelected(LayerWidget *); + void layerChanged(LayerWidget *, bool adjustViewport); + void layerClosed(Layer *); + void layerCleared(Layer *); + void layerZoom(Layer *); + void layerProjection(const QString&); + +protected slots: + void setOpacity(QAction*); + void zoomLayer(); + void visibleLayer(bool); + void readonlyLayer(bool); + void close(); + void clear(); + void associatedAboutToShow(); + + void on_cbVisible_stateChanged ( int state ); + void on_edName_editingFinished(); + + void checkedStatusToggled(bool newStatus); + +private: + Ui::LayerWidget ui; +}; + +class DrawingLayerWidget : public LayerWidget +{ + Q_OBJECT + + public: + DrawingLayerWidget(DrawingLayer* aLayer, QWidget* aParent = 0); + virtual ~DrawingLayerWidget() {}; + + public: + virtual void initActions(); + + private: + //DrawingMapLayer* theLayer; +}; + +class TrackLayerWidget : public LayerWidget +{ + Q_OBJECT + + public: + TrackLayerWidget(TrackLayer* aLayer, QWidget* aParent = 0); + virtual ~TrackLayerWidget(); + + public: + virtual void initActions(); + + private slots: + void extractLayer(bool); +}; + +class SpecialLayerWidget : public LayerWidget +{ + Q_OBJECT + + public: + SpecialLayerWidget(SpecialLayer* aLayer, QWidget* aParent = 0); + virtual ~SpecialLayerWidget(); + + public: + virtual void initActions(); + + private slots: + void refreshLayer(bool); +}; + +class ImageLayerWidget : public LayerWidget +{ + Q_OBJECT + + public: + ImageLayerWidget(ImageMapLayer* aLayer, QWidget* aParent = 0); + virtual ~ImageLayerWidget(); + + public: + virtual void initActions(); + + private: + QAction* actShape; + QAction* actNone; + QAction* actProjection; + QAction* actResetAlign; + QMenu* wmsMenu; + QMenu* tmsMenu; + QMenu* pluginsMenu; + + private slots: + void setNone(); + void setWms(QAction*); + void setTms(QAction*); + void setPlugin(QAction*); + + void setProjection(); + void resetAlign(); + + protected: + virtual void showContextMenu(QContextMenuEvent* anEvent); +}; + +class DirtyLayerWidget : public LayerWidget +{ + Q_OBJECT + + public: + DirtyLayerWidget(DirtyLayer* aLayer, QWidget* aParent = 0); + virtual ~DirtyLayerWidget() {}; + + public: + virtual void initActions(); +}; + +class UploadedLayerWidget : public LayerWidget +{ + Q_OBJECT + + public: + UploadedLayerWidget(UploadedLayer* aLayer, QWidget* aParent = 0); + virtual ~UploadedLayerWidget() {}; + + public: + virtual void initActions(); +}; + +class FilterLayerWidget : public LayerWidget +{ + Q_OBJECT + + public: + FilterLayerWidget(FilterLayer* aLayer, QWidget* aParent = 0); + virtual ~FilterLayerWidget() {}; + + protected: + void mouseDoubleClickEvent(QMouseEvent */*event*/); + + public: + virtual void initActions(); + + private: + Ui::FilterEditDialog* ui; + + protected slots: + void on_filterHelperClicked(); +}; + + + +#endif + + diff --git a/src/Layers/LayerWidget.ui b/src/Layers/LayerWidget.ui new file mode 100644 index 0000000..198309d --- /dev/null +++ b/src/Layers/LayerWidget.ui @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>LayerWidget</class> + <widget class="QWidget" name="LayerWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>207</width> + <height>31</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="spacing"> + <number>0</number> + </property> + <property name="margin"> + <number>2</number> + </property> + <item> + <widget class="QCheckBox" name="cbVisible"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edName"> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/Layers/Layers.pri b/src/Layers/Layers.pri new file mode 100644 index 0000000..1abaa48 --- /dev/null +++ b/src/Layers/Layers.pri @@ -0,0 +1,16 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/Layers +DEPENDPATH += $$MERKAARTOR_SRC_DIR/Layers + +HEADERS += Layer.h \ + ImageMapLayer.h \ + LayerIterator.h \ + LayerWidget.h \ + LayerPrivate.h \ + Layers/OsmRenderLayer.h +SOURCES += Layer.cpp \ + ImageMapLayer.cpp \ + LayerWidget.cpp \ + Layers/OsmRenderLayer.cpp +FORMS += LayerWidget.ui \ + FilterEditDialog.ui \ + LicenseDisplayDialog.ui diff --git a/src/Layers/LicenseDisplayDialog.ui b/src/Layers/LicenseDisplayDialog.ui new file mode 100755 index 0000000..477951a --- /dev/null +++ b/src/Layers/LicenseDisplayDialog.ui @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>LicenseDisplayDialog</class> + <widget class="QDialog" name="LicenseDisplayDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>786</width> + <height>171</height> + </rect> + </property> + <property name="windowTitle"> + <string>Licensing Terms</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="urlLabel"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="cbAgree"> + <property name="text"> + <string>I have read and agree to the licensing terms</string> + </property> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>LicenseDisplayDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>274</x> + <y>280</y> + </hint> + <hint type="destinationlabel"> + <x>396</x> + <y>247</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/Layers/OsmRenderLayer.cpp b/src/Layers/OsmRenderLayer.cpp new file mode 100644 index 0000000..520699c --- /dev/null +++ b/src/Layers/OsmRenderLayer.cpp @@ -0,0 +1,275 @@ +#include "Global.h" + +#include "OsmRenderLayer.h" + +#include "Document.h" +#include "MapRenderer.h" +#include "MerkaartorPreferences.h" + +#if QT_VERSION >= 0x050000 +#include <QtConcurrent> +#endif + +inline uint qHash(const QPoint& p) +{ + return (uint)(p.y() + (p.x() << 16)); +} + +#define TILE_SIZE 256 +#define TILE_CONSTRUCTOR(x, y) QPoint(x, y) +#define TILE_X(t) t.x() +#define TILE_Y(t) t.y() + +/* Static member declaration. */ +QReadWriteLock OsmRenderLayer::renderLock; + +/** + * This is a helper class to manage rendered tiles and their lifecycle. Any + * reference to the images here can vanish at any point in time. Do not escape + * the pointers! + */ +class TileContainer : public QObject +{ +public: + TileContainer(QObject* parent) : QObject(parent) {} + /** + * Insert and take ownership of the image contained. Replaced entries will + * be automatically deleted. + */ + void insert(const TILE_TYPE& k, QImage* v) + { + if (m_container.contains(k)) { + delete m_container.value(k); + } + m_container.insert(k, v); + } + bool contains(const TILE_TYPE& k) + { + return m_container.contains(k); + } + QImage* get(const TILE_TYPE& k) + { + return m_container.value(k, nullptr); + } + void clear() { + for ( auto value : m_container ) { + delete value; + } + m_container.clear(); + } +private: + QHash<const TILE_TYPE, QImage*> m_container; +}; + +/** + * A helper class for QtConcurrent::map(). An instance is created and the + * operator() is called for each element that needs processing. + */ +class RenderTile +{ +public: + RenderTile(OsmRenderLayer* orl) + : p(orl) { } + + typedef void result_type; + + void operator()(const TILE_TYPE& theTile) + { + if (!p->theDocument) + return; + + if (!p->renderLock.tryLockForRead()) return; + p->theDocument->lockPainters(); + + TILE_TYPE tile = theTile; + + QPointF projTL((TILE_X(tile)*p->tileSizeCoordW)+p->tileOriginCoord.x(), (TILE_Y(tile)*p->tileSizeCoordH)+p->tileOriginCoord.y()); + QPointF projBR(((TILE_X(tile)+1)*p->tileSizeCoordW)+p->tileOriginCoord.x(), ((TILE_Y(tile)+1)*p->tileSizeCoordH)+p->tileOriginCoord.y()); + QRectF projR(projTL, projBR); + +#define TILE_SURROUND 2.0 + qreal z = TILE_SURROUND * ((TILE_SIZE*TILE_SURROUND) / (p->theTransform.m11()*projR.width()*TILE_SURROUND)); // Adjust to main transform + qreal dlat = (projR.top()-projR.bottom())*(z-1)/2; + qreal dlon = (projR.right()-projR.left())*(z-1)/2; + projR.setBottom(projR.bottom()-dlat); + projR.setLeft(projR.left()-dlon); + projR.setTop(projR.top()+dlat); + projR.setRight(projR.right()+dlon); + + Coord tl = p->theProjection.inverse(projR.topLeft()); + Coord br = p->theProjection.inverse(projR.bottomRight()); + CoordBox invalidRect(tl, br); + + QMap<RenderPriority, QSet <Feature*> > theFeatures; + + g_backend.delayDeletes(); + for (int i=0; i<p->theDocument->layerSize(); ++i) + g_backend.getFeatureSet(p->theDocument->getLayer(i), theFeatures, invalidRect, p->theProjection); + + QImage* img = new QImage(TILE_SIZE, TILE_SIZE, QImage::Format_ARGB32); + img->fill(Qt::transparent); + + QPainter P(img); + if (M_PREFS->getUseAntiAlias()) + P.setRenderHint(QPainter::Antialiasing); + MapRenderer r; + r.render(&P, theFeatures, projR, /*QRect(0, 0, TILE_SIZE, TILE_SIZE)*/QRect(-((TILE_SIZE*TILE_SURROUND)-TILE_SIZE)/2, -((TILE_SIZE*TILE_SURROUND)-TILE_SIZE)/2, TILE_SIZE*TILE_SURROUND, TILE_SIZE*TILE_SURROUND), p->PixelPerM, p->ROptions); + P.end(); + g_backend.resumeDeletes(); + p->theDocument->unlockPainters(); + p->renderLock.unlock(); + + /* Insert the tile into the results map. Take care to remove the original item first. */ + p->tileLock.lockForWrite(); + p->tiles->insert(tile,img); + p->tileLock.unlock(); + } + + OsmRenderLayer* p; +}; + +/**************************/ + +OsmRenderLayer::OsmRenderLayer(QObject *parent) + : QObject(parent) + , theDocument(0) + , tiles(new TileContainer(this)) +{ + connect(&(renderGatheringWatcher), SIGNAL(finished()), SIGNAL(renderingDone())); +} + +void OsmRenderLayer::setDocument(Document *aDocument) +{ + theDocument = aDocument; +} + +void OsmRenderLayer::setTransform(const QTransform &aTransform) +{ + theTransform = aTransform; + theInvertedTransform = theTransform.inverted(); +} + +void OsmRenderLayer::setProjection(const Projection& aProjection) +{ + theProjection = aProjection; +} + +void OsmRenderLayer::forceRedraw(const Projection& aProjection, const QTransform &aTransform, const QRect& rect, qreal ppm, const RendererOptions& roptions) +{ + if (renderGathering.isRunning()) { + renderGathering.cancel(); + renderGathering.waitForFinished(); + } + + if (!theDocument) + return; + + if (!renderLock.tryLockForRead()) return; + + setProjection(aProjection); + setTransform(aTransform); + + PixelPerM = ppm; + ROptions = roptions; + + /* Clear the cache and rendered tiles. Any settings could have changed. */ + tileLock.lockForWrite(); + tiles->clear(); + tileLock.unlock(); + + tileOriginCoord = theInvertedTransform.map(QPointF(rect.topLeft())); + + QPointF tl = theInvertedTransform.map(QPointF(rect.topLeft())); + QPointF br = theInvertedTransform.map(QPointF(rect.bottomRight())+QPointF(1,1)); + projRect = QRectF(tl, br); + + tileSizeCoordW = (projRect.width()) / rect.width() * TILE_SIZE; + // tileSizeCoordH = (projRect.height()) / rect.height() * TILE_SIZE; + tileSizeCoordH = tileSizeCoordW * projRect.height() / fabs(projRect.height()); + + tileViewport.setLeft(((projRect.left()-tileOriginCoord.x()) / tileSizeCoordW) - 1); + tileViewport.setTop(((projRect.top()-tileOriginCoord.y()) / tileSizeCoordH) - 1); + tileViewport.setRight(((projRect.right()-tileOriginCoord.x()) / tileSizeCoordW) + 1); + tileViewport.setBottom(((projRect.bottom()-tileOriginCoord.y()) / tileSizeCoordH) + 1); + + tilesToRender.clear(); + for (int i=tileViewport.top(); i<=tileViewport.bottom(); ++i) { + for (int j=tileViewport.left(); j<=tileViewport.right(); ++j) { + TILE_TYPE tile = TILE_CONSTRUCTOR(j, i); + tilesToRender << tile; + } + } + + if (tilesToRender.size()) { + renderGathering = QtConcurrent::map(tilesToRender, RenderTile(this)); + renderGatheringWatcher.setFuture(renderGathering); + } + + renderLock.unlock(); +} + +void OsmRenderLayer::pan(QPoint delta) +{ + if (renderGathering.isRunning()) { + renderGathering.cancel(); + renderGathering.waitForFinished(); + } + + theTransform.translate((qreal)(delta.x())/theTransform.m11(), (qreal)(delta.y())/theTransform.m22()); + theInvertedTransform = theTransform.inverted(); + + projRect.translate(-(qreal)(delta.x())/theTransform.m11(), -(qreal)(delta.y())/theTransform.m22()); + + tileViewport.setLeft(((projRect.left()-tileOriginCoord.x()) / tileSizeCoordW) - 1); + tileViewport.setTop(((projRect.top()-tileOriginCoord.y()) / tileSizeCoordH) - 1); + tileViewport.setRight(((projRect.right()-tileOriginCoord.x()) / tileSizeCoordW) + 1); + tileViewport.setBottom(((projRect.bottom()-tileOriginCoord.y()) / tileSizeCoordH) + 1); + + tileLock.lockForWrite(); + tilesToRender.clear(); + for (int i=tileViewport.top(); i<=tileViewport.bottom(); ++i) + for (int j=tileViewport.left(); j<=tileViewport.right(); ++j) { + TILE_TYPE tile = TILE_CONSTRUCTOR(j, i); + if (!tiles->contains(tile)) { + tilesToRender << tile; + } + } + tileLock.unlock(); + + if (tilesToRender.size()) { + renderGathering = QtConcurrent::map(tilesToRender, RenderTile(this)); + renderGatheringWatcher.setFuture(renderGathering); + } +} + +void OsmRenderLayer::drawImage(QPainter *P) +{ + tileLock.lockForRead(); + QPointF origin = theTransform.map(tileOriginCoord); + for (int i=tileViewport.top(); i<=tileViewport.bottom(); ++i) { + for (int j=tileViewport.left(); j<=tileViewport.right(); ++j) { + if (tiles->contains(TILE_CONSTRUCTOR(j, i))) { + QPointF tl = QPointF((j*TILE_SIZE)+origin.x(), (i*TILE_SIZE)+origin.y()); + P->drawImage(tl, *(tiles->get(TILE_CONSTRUCTOR(j, i)))); + } + /* In some cases, the image is not accessible. This is OK if we are + * drawing on screen and not everything is ready yet. It might + * cause trouble when printing, but the code should wait until the + * rendering is done in that case. */ + } + } + tileLock.unlock(); +} + +bool OsmRenderLayer::isRenderingDone() +{ + return renderGathering.isFinished(); +} + +void OsmRenderLayer::stopRendering() { + renderLock.lockForWrite(); +} + +void OsmRenderLayer::resumeRendering() { + renderLock.unlock(); +} diff --git a/src/Layers/OsmRenderLayer.h b/src/Layers/OsmRenderLayer.h new file mode 100644 index 0000000..199b1e2 --- /dev/null +++ b/src/Layers/OsmRenderLayer.h @@ -0,0 +1,74 @@ +#ifndef OSMRENDERLAYER_H +#define OSMRENDERLAYER_H + +#include <QObject> +#include <QRect> +#include <QPointF> +#include <QFuture> +#include <QFutureWatcher> +#include <QTransform> + +#include "IRenderer.h" +#include "Projection.h" + +class Document; +class Projection; + +/* Private containers, defined in .cpp */ +class TileContainer; +#define TILE_TYPE QPoint + +class OsmRenderLayer : public QObject +{ + Q_OBJECT + + friend class RenderTile; + +public: + OsmRenderLayer(QObject*parent=0); + void setDocument(Document *aDocument); + void setTransform(const QTransform& aTransform); + void setProjection(const Projection& aProjection); + + void forceRedraw(const Projection& aProjection, const QTransform &aTransform, const QRect& rect, qreal ppm, const RendererOptions& roptions); + void pan(QPoint delta); + void drawImage(QPainter* P); + + bool isRenderingDone(); + + void stopRendering(); + void resumeRendering(); + +signals: + void renderingDone(); + +protected: + Document* theDocument; + + QRectF projRect; + qreal tileSizeCoordW; + qreal tileSizeCoordH; + QPointF tileOriginCoord; + QRect tileViewport; + + QFuture<void> renderGathering; + QFutureWatcher<void> renderGatheringWatcher; + + QTransform theTransform; + QTransform theInvertedTransform; + Projection theProjection; + + qreal PixelPerM; + RendererOptions ROptions; + + TileContainer* tiles; + /* Contains a list of tiles to be rendered using QtConcurrent. */ + QList<TILE_TYPE> tilesToRender; + QReadWriteLock tileLock; /* Protects 'tiles' variable */ + + /* Read locks indicate rendering threads, Write lock blocks them. This is a + * global object used to block all rendering used in some workarounds. */ + static QReadWriteLock renderLock; +}; + +#endif // OSMRENDERLAYER_H diff --git a/src/Main.cpp b/src/Main.cpp new file mode 100644 index 0000000..d03bd49 --- /dev/null +++ b/src/Main.cpp @@ -0,0 +1,302 @@ +#include "Global.h" + +#include <QApplication> +#include <QMessageBox> + +#include <QLibraryInfo> +#include <QSplashScreen> + +#include <qtsingleapplication.h> +#include "MainWindow.h" +#include "Preferences/MerkaartorPreferences.h" +#include "proj.h" +#include "gdal_version.h" +#include "Global.h" + +#include "IMapAdapterFactory.h" + +QLoggingCategory lc_Main("merk.Main"); + +FILE* pLogFile = NULL; + +void showVersion() +{ + QString o; + o = QString("%1 %2\n").arg(STRINGIFY(PRODUCT)).arg(STRINGIFY(REVISION)); + fprintf(stdout, "%s", o.toLatin1().data()); + o = QString("using Qt version %1 (built with %2)\n").arg(qVersion()).arg(QT_VERSION_STR); + fprintf(stdout, "%s", o.toLatin1().data()); + fprintf(stdout, "Copyright Bart Vanhauwaert, Chris Browet and others, 2006-2010\n"); + fprintf(stdout, "This program is licensed under the Version 2 of the GNU General Public License or any later version\n"); +} + +void showHelp() +{ + showVersion(); + fprintf(stdout, "\n"); + fprintf(stdout, "Usage: merkaartor [-h|--help] [-v|--version] [-l|--log logfilename] [filenames...]\n"); + fprintf(stdout, "\n"); + fprintf(stdout, " -h, --help\t\tShow help information\n"); + fprintf(stdout, " -l, --log logfilename\t\tSave debugging information to file \"logfilename\"\n"); + fprintf(stdout, " -v, --version\t\tShow version information\n"); + fprintf(stdout, " -n, --noreuse\t\tDo not reuse an existing instance\n"); + fprintf(stdout, " -p, --portable\t\tExecute as a portable application (all files saved in the application directory)\n"); + fprintf(stdout, " --enable_special_layers\t\tEnable old style \"Dirty\" and \"Uploaded\" layers\n"); + fprintf(stdout, " --importag-tags-as-is\t\tDo not add underscores to imported tags (allow for immediate upload)\n"); + fprintf(stdout, " --ignore-preferences\t\tIgnore saved preferences\n"); + fprintf(stdout, " --reset-preferences\t\tReset saved preferences to default\n"); + fprintf(stdout, " --ignore-startup-template\t\tIgnore the saved startup template document and start with a new document\n"); + fprintf(stdout, " [filenames]\t\tOpen designated files \n"); +} + +void loadPluginsFromDir( QDir & pluginsDir ) { + qInfo(lc_Main) << "Loading plugins from directory " << pluginsDir.absolutePath(); + foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { + QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); + QObject *plugin = loader.instance(); + qDebug(lc_Main) << " Loading" << fileName << "as plugin."; + if (plugin) { + IMapAdapterFactory *fac = qobject_cast<IMapAdapterFactory *>(plugin); + if (fac) { + M_PREFS->addBackgroundPlugin(fac); + qInfo(lc_Main) << " Plugin loaded: " << fileName << "."; + } else { + qWarning(lc_Main) << " Failed to load plugin: " << fileName << "."; + } + } else { + qDebug(lc_Main) << " Not a plugin: " << fileName << "."; + } + } +} + +void debugMessageHandler(QtMsgType, const QMessageLogContext&, const QString &msg) +{ + if (pLogFile) { + const auto bytes = msg.toUtf8(); + fwrite(bytes.constData(), 1, bytes.size(), pLogFile); +#if defined(Q_OS_UNIX) + constexpr const char * newline = " \n"; +#else + constexpr const char * newline = "\r\n"; +#endif + fwrite(newline, 1, 2, pLogFile); + fflush(pLogFile); + } +} + +int main(int argc, char** argv) +{ + QtSingleApplication instance(argc,argv); + + // Set logging message pattern early. + qSetMessagePattern("%{time process} (%{if-debug}DD%{endif}%{if-info}II%{endif}%{if-warning}WW%{endif}%{if-critical}CC%{endif}%{if-fatal}FF%{endif}) [ %{category} ] %{message}%{if-critical}%{backtrace}%{endif}"); + QLoggingCategory::setFilterRules("merk.*.debug=false"); + + bool reuse = true; + bool testImport = false; + QStringList argsIn = QCoreApplication::arguments(); + QStringList argsOut; + argsIn.removeFirst(); + for (int i=0; i < argsIn.size(); ++i) { + if (argsIn[i] == "-v" || argsIn[i] == "--version") { + showVersion(); + exit(0); + } else if (argsIn[i] == "-h" || argsIn[i] == "--help") { + showHelp(); + exit(0); + } else if (argsIn[i] == "-n" || argsIn[i] == "--noreuse") { + reuse = false; + } else if (argsIn[i] == "-p" || argsIn[i] == "--portable") { + g_Merk_Portable = true; + } else if (argsIn[i] == "--enable_special_layers") { + g_Merk_Frisius = false; + } else if (argsIn[i] == "--importag-tags-as-is") { + g_Merk_NoGuardedTagsImport = true; + } else if (argsIn[i] == "--ignore-preferences") { + g_Merk_Ignore_Preferences = true; + } else if (argsIn[i] == "--reset-preferences") { + g_Merk_Reset_Preferences = true; + } else if (argsIn[i] == "--ignore-startup-template") { + g_Merk_IgnoreStartupTemplate = true; + } else if (argsIn[i] == "--test-import") { + testImport = true; + } else if (argsIn[i] == "--selfclip") { + g_Merk_SelfClip = true; + } else + argsOut << argsIn[i]; + } + + QCoreApplication::setOrganizationName("Merkaartor"); + QCoreApplication::setOrganizationDomain("merkaartor.org"); +#ifdef FRISIUS_BUILD + QCoreApplication::setApplicationName("Frisius"); +#else + QCoreApplication::setApplicationName("Merkaartor"); +#endif + QString message = argsOut.join("$"); + if (reuse) + if (instance.sendMessage(message)) + return 0; + + QString logFilename; + QStringList fileNames; + for (int i=0; i < argsOut.size(); ++i) { + if (argsOut[i] == "-l" || argsOut[i] == "--log") { + ++i; + logFilename = argsOut[i]; + } else + fileNames.append(argsOut[i]); + } + + if (!logFilename.isNull()) { + pLogFile = fopen(logFilename.toLatin1(), "a"); + qInstallMessageHandler(debugMessageHandler); + } + + qInfo(lc_Main) << "**** " << QDateTime::currentDateTime().toString(Qt::ISODate) << " -- Starting " << QString("%1 %2").arg(qApp->applicationName()).arg(STRINGIFY(VERSION)); + qInfo(lc_Main) << "-------" << QString("using Qt version %1 (built with %2)").arg(qVersion()).arg(QT_VERSION_STR); + PJ_INFO projVer = proj_info(); + qInfo(lc_Main) << "-------" << QString("using PROJ version %1.%2.%3").arg(projVer.major).arg(projVer.minor).arg(projVer.patch); + qInfo(lc_Main) << "-------" << QString("using GDAL version %1").arg(GDAL_RELEASE_NAME); + qInfo(lc_Main) << "-------" << "with arguments: " << QCoreApplication::arguments(); + +#ifdef _MOBILE + QFont appFont = QApplication::font(); + appFont.setPointSize(6); + QApplication::setFont(appFont); +#endif + + qApp->setStyleSheet( + " LayerWidget { border: 1px solid black; min-height: 20px}" + " LayerWidget QLineEdit { color: black; }" + + " LayerWidget QCheckBox::indicator:checked { image: url(:Icons/eye.xpm); }" + " LayerWidget QCheckBox::indicator:unchecked { image: url(:Icons/empty.xpm); }" + + " DrawingLayerWidget { background-color: #a5d1ff; }" + " ImageLayerWidget { background-color: #ffffcc; }" + " TrackLayerWidget { background-color: #7acca6; }" + " DirtyLayerWidget { background-color: #c8c8c8; }" + " UploadedLayerWidget { background-color: #c8c8c8; }" + " OsbLayerWidget { background-color: #a2d1c0; }" + " FilterLayerWidget { background-color: #c8c8c8; }" + + " LayerWidget:checked { background-color: lightsteelblue; }" + ); + + QPixmap pixmap(QString(":/Splash/%1_splash.png").arg(qApp->applicationName())); + QSplashScreen splash(pixmap); + splash.show(); + instance.processEvents(); + + splash.showMessage(QString(instance.translate("Main", "%1 v%2\nLoading plugins...")).arg(qApp->applicationName()).arg(STRINGIFY(REVISION)), Qt::AlignBottom | Qt::AlignHCenter, Qt::black); + instance.processEvents(); + + /* Create configuration directory for non-portable build. */ + if (!g_Merk_Portable) { +#ifdef Q_OS_MAC + if (!QDir::home().exists(HOMEDIR)) + QDir::home().mkpath(HOMEDIR); +#else + if (!QDir::home().exists("." + qApp->applicationName().toLower())) + QDir::home().mkdir("." + qApp->applicationName().toLower()); +#endif + } + + + /* Load plugins if executed from build directory and in debug build. */ + QDir buildPluginsDir = QDir(qApp->applicationDirPath()); + if (buildPluginsDir.exists("CMakeCache.txt")) { + qWarning() << "Build directory detected. Looking for plugins in application directory first."; + QCoreApplication::addLibraryPath(buildPluginsDir.path()); + loadPluginsFromDir(buildPluginsDir); + } + + /* Load plugins; this handles different OS habits. */ +#if defined(Q_OS_WIN32) + QDir pluginsDir = QDir(qApp->applicationDirPath() + "/" + STRINGIFY(PLUGINS_DIR)); +#elif defined(Q_OS_MAC) + QDir pluginsDir = QDir(qApp->applicationDirPath()); + pluginsDir.cdUp(); + pluginsDir.cd("plugins"); +#elif defined(Q_OS_SYMBIAN) + QDir pluginsDir(QLibraryInfo::location(QLibraryInfo::PluginsPath)); +#else + + /* Try directory with the application first. */ + QDir pluginsDir = qApp->applicationDirPath() + "/plugins"; + if (!pluginsDir.exists()) + pluginsDir = QDir(STRINGIFY(PLUGINS_DIR)); +#endif + + QCoreApplication::addLibraryPath(pluginsDir.path()); + loadPluginsFromDir(pluginsDir); + + pluginsDir.cd("background"); + loadPluginsFromDir(pluginsDir); + + splash.showMessage(QString(instance.translate("Main", "%1 v%2\nInitializing...")).arg(qApp->applicationName()).arg(STRINGIFY(REVISION)), Qt::AlignBottom | Qt::AlignHCenter, Qt::black); + instance.processEvents(); + +// QFatFsHandler* fatHandler = new QFatFsHandler(50000, 8192); + //ZipEngineHandler* zipHandler = new ZipEngineHandler(); + + + MainWindow Main; + g_Merk_MainWindow = &Main; + instance.setActivationWindow(&Main, false); + QObject::connect(&instance, SIGNAL(messageReceived(const QString&)), + &instance, SLOT(activateWindow())); + QObject::connect(&instance, SIGNAL(messageReceived(const QString&)), + &Main, SLOT(handleMessage(const QString&))); +// QObject::connect(&Main, SIGNAL(needToShow()), &instance, SLOT(activateWindow())); + +#ifdef _MOBILE + instance.setActiveWindow(&Main); + Main.showMaximized(); +#else + Main.show(); +#endif + instance.processEvents(); + if (!testImport) { + Main.handleMessage(message); + } + + splash.finish(&Main); + + if (testImport) { + int testsFailed = 0; + for (auto& file : fileNames) { + bool ret = Main.testImport(file); + qDebug() << "Testing import of file" << file << "result:" << (ret ? "PASSED" : "FAILED"); + if (!ret) { + testsFailed++; + } + } + qDebug() << "All tests done, " << testsFailed << " tests failed."; + return testsFailed; + } + + int x; + try { + x = instance.exec(); + } catch (const std::bad_alloc &) { + qDebug(lc_Main) << "Out of memory"; + x = 254; + } catch (...) { + qDebug(lc_Main) << "Exception"; + x = 255; + } + + qDebug(lc_Main) << "**** " << QDateTime::currentDateTime().toString(Qt::ISODate) << " -- Ending " << QString("%1 %2").arg(qApp->applicationName()).arg(STRINGIFY(VERSION)); + if(pLogFile) { + fclose(pLogFile); + pLogFile = NULL; + } + +// delete fatHandler; + //delete zipHandler; + + return x; +} + diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp new file mode 100755 index 0000000..9c8fe1e --- /dev/null +++ b/src/MainWindow.cpp @@ -0,0 +1,4326 @@ +#include "Global.h" +#include "MainWindow.h" + +#include "LayerDock.h" +#include "MapView.h" +#include "PropertiesDock.h" +#include "InfoDock.h" +#include "DirtyDock.h" +#include "StyleDock.h" +#include "FeaturesDock.h" +#include "Command.h" +#include "DocumentCommands.h" +#include "FeatureCommands.h" +#include "RelationCommands.h" +#include "ImportExportOSC.h" +#include "ExportGPX.h" +#include "ImportExportKML.h" +#ifdef USE_PROTOBUF +#include "ImportExportPBF.h" +#endif +#include "ImportExportGdal.h" +#include "CreateAreaInteraction.h" +#include "CreateDoubleWayInteraction.h" +#include "CreateNodeInteraction.h" +#include "BuildBridgeInteraction.h" +#include "CreateRoundaboutInteraction.h" +#include "CreatePolygonInteraction.h" +#include "CreateSingleWayInteraction.h" +#include "EditInteraction.h" +#include "MoveNodeInteraction.h" +#include "RotateInteraction.h" +#include "ScaleInteraction.h" +#include "ZoomInteraction.h" +#include "ExtrudeInteraction.h" +#include "Coord.h" +#include "DownloadOSM.h" +#include "ImportGPX.h" +#include "ImportNGT.h" +#include "ImportOSM.h" +#include "Document.h" +#include "Layer.h" +#include "ImageMapLayer.h" +#include "Features.h" +#include "FeatureManipulations.h" +#include "LayerIterator.h" +#include "MasPaintStyle.h" +#include "MapCSSPaintstyle.h" +#include "PaintStyleEditor.h" +#include "Utils/Utils.h" +#include "DirtyList.h" +#include "DirtyListExecutorOSC.h" +#include "RemoteControlServer.hpp" + +#include <ui_MainWindow.h> +#include <ui_AboutDialog.h> +#include <ui_UploadMapDialog.h> +#include <ui_SelectionDialog.h> +#include <ui_ExportDialog.h> +#include <ui_PropertiesDialog.h> + +#include "Preferences/PreferencesDialog.h" +#include "Preferences/MerkaartorPreferences.h" +#include "Preferences/ProjectionsList.h" +#include "Preferences/WMSPreferencesDialog.h" +#include "Preferences/TMSPreferencesDialog.h" +#include "Preferences/ProjPreferencesDialog.h" +#include "Preferences/FilterPreferencesDialog.h" +#include "Utils/SelectionDialog.h" +#include "Utils/MDiscardableDialog.h" +#include "QMapControl/imagemanager.h" +#ifdef USE_WEBKIT + #include "QMapControl/browserimagemanager.h" +#endif +#include "QMapControl/mapadapter.h" +#include "QMapControl/wmsmapadapter.h" +#include "Tools/ActionsDialog.h" +#include "GotoDialog.h" +#include "TerraceDialog.h" + +#ifdef GEOIMAGE +#include "GeoImageDock.h" +#endif + +#include "Render/NativeRenderDialog.h" + +#include "qgps.h" +#include "qgpsdevice.h" + +#include <QtCore> +#include <QtGui> +#include <QTcpServer> +#include <QTcpSocket> +#include <QXmlStreamReader> +#include <QStyleFactory> +#include <QMessageBox> +#include <QFileDialog> +#include <QInputDialog> +#include <QToolTip> + +#include "qttoolbardialog.h" + +#include <locale.h> +#include <limits.h> + +#include "proj.h" +#include "gdal_version.h" + +#include "Utils/SlippyMapWidget.h" + +namespace { + +const QString MIME_OPENSTREETMAP_XML = "application/x-openstreetmap+xml"; +const QString MIME_GOOGLE_EARTH_KML = "application/vnd.google-earth.kml+xml"; +const QString MIME_GPX = "application/gpx+xml"; +const QString MIME_MERKAARTOR_UNDO_XML = "application/x-merkaartor-undo+xml"; + +} // namespace + +using namespace Merkaartor; + +class MainWindowPrivate +{ + public: + MainWindowPrivate() + : lastPrefTabIndex(0) + , projActgrp(0) + , theListeningServer(0) + , latSaveDirtyLevel(0) + #ifdef GEOIMAGE + , dropTarget(0) + #endif + , numImages(0) + { + title = QString("%1 v%2").arg(STRINGIFY(PRODUCT)).arg(STRINGIFY(REVISION)); + } + + QString FILTER_OPEN_NATIVE; + QString FILTER_OPEN_SUPPORTED; + QString FILTER_IMPORT_SUPPORTED; + int lastPrefTabIndex; + QString defStyle; + StyleDock* theStyle; + FeaturesDock* theFeats; + QString title; + QActionGroup* projActgrp; + RemoteControlServer* theListeningServer; + PropertiesDock* theProperties; + RendererOptions renderOptions; + int latSaveDirtyLevel; +#ifdef GEOIMAGE + Node *dropTarget; +#endif + int numImages; +}; + +namespace { + +void SetOptionValue(RendererOptions& options, + RendererOptions::RenderOption option, bool on) { + if (on) { + options.options |= option; + } else { + options.options &= ~option; + } +} + +} // namespace + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) + , theDocument(0) + , gpsRecLayer(0) + , curGpsTrackSegment(0) + , qtTranslator(0) + , merkaartorTranslator(0) + , toolBarManager(0) +{ + setlocale(LC_NUMERIC, "C"); // impose decimal point separator + qsrand(QDateTime::currentDateTime().toTime_t()); //initialize random generator + + p = new MainWindowPrivate; + + QString supported_import_formats("*.gpx *.osm *.osc *.ngt *.nmea *.nma *.kml *.csv"); +#ifdef GEOIMAGE + supported_import_formats += " *.jpg"; +#endif + supported_import_formats += " *.shp *.gml"; +#ifdef USE_PROTOBUF + supported_import_formats += " *.pbf"; +#endif + QString supported_import_formats_desc = + tr("GPS Exchange format (*.gpx)\n") \ + +tr("OpenStreetMap format (*.osm)\n") \ + +tr("OpenStreetMap change format (*.osc)\n") \ + +tr("Noni GPSPlot format (*.ngt)\n") \ + +tr("NMEA GPS log format (*.nmea *.nma)\n") \ + +tr("KML file (*.kml)\n") \ + +tr("Comma delimited format (*.csv)\n"); + +#ifdef GEOIMAGE + supported_import_formats_desc += tr("Geotagged images (*.jpg)\n"); +#endif + supported_import_formats_desc += tr("ESRI Shapefile (*.shp)\n") + tr("Geography Markup Language (*.gml)\n"); +#ifdef USE_PROTOBUF + supported_import_formats_desc += tr("Protobuf Binary Format (*.pbf)\n"); +#endif + + p->FILTER_OPEN_NATIVE = tr("Merkaartor document (*.mdc)\n"); + + p->FILTER_OPEN_SUPPORTED = QString(tr("Supported formats") + " (*.mdc %1)\n").arg(supported_import_formats); + p->FILTER_OPEN_SUPPORTED += tr("Merkaartor document (*.mdc)\n") + supported_import_formats_desc; + p->FILTER_OPEN_SUPPORTED += tr("All Files (*)"); + + p->FILTER_IMPORT_SUPPORTED = QString(tr("Supported formats") + " (%1)\n").arg(supported_import_formats); + p->FILTER_IMPORT_SUPPORTED += supported_import_formats_desc; + p->FILTER_IMPORT_SUPPORTED += tr("All Files (*)"); + + theProgressDialog = NULL; + theProgressBar = NULL; + theProgressLabel = NULL; + + if (M_PREFS->getMerkaartorStyle()) + QApplication::setStyle(QStyleFactory::create(M_PREFS->getMerkaartorStyleString())); + + ui->setupUi(this); + M_STYLE->loadPainters(M_PREFS->getDefaultStyle()); + + blockSignals(true); + + ViewportStatusLabel = new QLabel(this); + MeterPerPixelLabel = new QLabel(this); + AdjusmentMeterLabel = new QLabel(this); + + pbImages = new QProgressBar(this); + statusBar()->addPermanentWidget(ViewportStatusLabel); + statusBar()->addPermanentWidget(pbImages); + statusBar()->addPermanentWidget(MeterPerPixelLabel); + statusBar()->addPermanentWidget(AdjusmentMeterLabel); +#ifndef NDEBUG + PaintTimeLabel = new QLabel(this); + PaintTimeLabel->setMinimumWidth(23); + statusBar()->addPermanentWidget(PaintTimeLabel); +#endif + + updateLanguage(); + + ViewportStatusLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); + pbImages->setMaximumWidth(200); + pbImages->setFormat(tr("tile %v / %m")); +#ifdef _MOBILE + pbImages->setVisible(false); +#endif + + SlippyMapWidget::theSlippyCache = new SlippyMapCache; + + theView = new MapView(this); + setCentralWidget(theView); + + theInfo = new InfoDock(this); + connect(theInfo, SIGNAL(visibilityChanged(bool)), this, SLOT(updateWindowMenu(bool))); + + theLayers = new LayerDock(this); + connect(theLayers, SIGNAL(visibilityChanged(bool)), this, SLOT(updateWindowMenu(bool))); + + p->theProperties = new PropertiesDock(this); + connect(p->theProperties, SIGNAL(visibilityChanged(bool)), this, SLOT(updateWindowMenu(bool))); + on_editPropertiesAction_triggered(); + + theDirty = new DirtyDock(this); + connect(theDirty, SIGNAL(visibilityChanged(bool)), this, SLOT(updateWindowMenu(bool))); + + p->theStyle = new StyleDock(this); + connect(p->theStyle, SIGNAL(visibilityChanged(bool)), this, SLOT(updateWindowMenu(bool))); + + p->theFeats = new FeaturesDock(this); + connect(p->theFeats, SIGNAL(visibilityChanged(bool)), this, SLOT(updateWindowMenu(bool))); + connect(theView, SIGNAL(viewportChanged()), p->theFeats, SLOT(on_Viewport_changed()), Qt::QueuedConnection); + connect(this, SIGNAL(content_changed()), p->theFeats, SLOT(on_Viewport_changed()), Qt::QueuedConnection); + connect(this, SIGNAL(content_changed()), p->theProperties, SLOT(adjustSelection()), Qt::QueuedConnection); + + theGPS = new QGPS(this); + connect(theGPS, SIGNAL(visibilityChanged(bool)), this, SLOT(updateWindowMenu(bool))); + +#ifdef GEOIMAGE + theGeoImage = new GeoImageDock(this); + theGeoImage->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + addDockWidget(Qt::RightDockWidgetArea, theGeoImage); + connect(theGeoImage, SIGNAL(visibilityChanged(bool)), this, SLOT(updateWindowMenu(bool))); +#endif + + connect(theLayers, SIGNAL(layersChanged(bool)), this, SLOT(adjustLayers(bool))); + connect(theLayers, SIGNAL(layersCleared()), this, SIGNAL(content_changed())); + connect(theLayers, SIGNAL(layersClosed()), this, SIGNAL(content_changed())); + connect(theLayers, SIGNAL(layersProjection(const QString&)), this, SLOT(projectionSet(const QString&))); + + connect (M_PREFS, SIGNAL(bookmarkChanged()), this, SLOT(updateBookmarksMenu())); + updateBookmarksMenu(); + connect (ui->menuBookmarks, SIGNAL(triggered(QAction *)), this, SLOT(bookmarkTriggered(QAction *))); + + updateRecentOpenMenu(); + connect (ui->menuRecentOpen, SIGNAL(triggered(QAction *)), this, SLOT(recentOpenTriggered(QAction *))); + + updateRecentImportMenu(); + connect (ui->menuRecentImport, SIGNAL(triggered(QAction *)), this, SLOT(recentImportTriggered(QAction *))); + + updateStyleMenu(); + connect (ui->menuStyles, SIGNAL(triggered(QAction *)), this, SLOT(styleTriggered(QAction *))); + + ui->viewDownloadedAction->setChecked(M_PREFS->getDownloadedVisible()); + ui->viewDirtyAction->setChecked(M_PREFS->getDirtyVisible()); + ui->viewScaleAction->setChecked(M_PREFS->getScaleVisible()); + ui->viewPhotosAction->setChecked(M_PREFS->getPhotosVisible()); + ui->viewShowLatLonGridAction->setChecked(M_PREFS->getLatLonGridVisible()); + ui->viewStyleBackgroundAction->setChecked(M_PREFS->getBackgroundVisible()); + ui->viewStyleForegroundAction->setChecked(M_PREFS->getForegroundVisible()); + ui->viewStyleTouchupAction->setChecked(M_PREFS->getTouchupVisible()); + ui->viewNamesAction->setChecked(M_PREFS->getNamesVisible()); + ui->viewTrackPointsAction->setChecked(M_PREFS->getTrackPointsVisible()); + ui->viewTrackSegmentsAction->setChecked(M_PREFS->getTrackSegmentsVisible()); + ui->viewRelationsAction->setChecked(M_PREFS->getRelationsVisible()); + ui->viewVirtualNodesAction->setChecked(M_PREFS->getVirtualNodesVisible()); + ui->viewLockZoomAction->setChecked(M_PREFS->getZoomBoris()); + ui->viewWireframeAction->setChecked(M_PREFS->getWireframeView()); + + SetOptionValue(p->renderOptions, RendererOptions::BackgroundVisible, M_PREFS->getBackgroundVisible()); + SetOptionValue(p->renderOptions, RendererOptions::ForegroundVisible, M_PREFS->getForegroundVisible()); + SetOptionValue(p->renderOptions, RendererOptions::TouchupVisible, M_PREFS->getTouchupVisible()); + SetOptionValue(p->renderOptions, RendererOptions::NamesVisible, M_PREFS->getNamesVisible()); + SetOptionValue(p->renderOptions, RendererOptions::PhotosVisible, M_PREFS->getPhotosVisible()); + SetOptionValue(p->renderOptions, RendererOptions::VirtualNodesVisible, M_PREFS->getVirtualNodesVisible()); + SetOptionValue(p->renderOptions, RendererOptions::NodesVisible, M_PREFS->getTrackPointsVisible()); + SetOptionValue(p->renderOptions, RendererOptions::TrackSegmentVisible, M_PREFS->getTrackSegmentsVisible()); + SetOptionValue(p->renderOptions, RendererOptions::RelationsVisible, M_PREFS->getRelationsVisible()); + SetOptionValue(p->renderOptions, RendererOptions::DownloadedVisible, M_PREFS->getDownloadedVisible()); + SetOptionValue(p->renderOptions, RendererOptions::ScaleVisible, M_PREFS->getScaleVisible()); + SetOptionValue(p->renderOptions, RendererOptions::LatLonGridVisible, M_PREFS->getLatLonGridVisible()); + SetOptionValue(p->renderOptions, RendererOptions::LockZoom, M_PREFS->getZoomBoris()); + + updateMenu(); + + QActionGroup* actgrpArrows = new QActionGroup(this); + actgrpArrows->addAction(ui->viewArrowsNeverAction); + actgrpArrows->addAction(ui->viewArrowsOnewayAction); + actgrpArrows->addAction(ui->viewArrowsAlwaysAction); + switch (M_PREFS->getDirectionalArrowsVisible()) { + case RendererOptions::ArrowsNever: + ui->viewArrowsNeverAction->setChecked(true); + p->renderOptions.arrowOptions = RendererOptions::ArrowsNever; + break; + case RendererOptions::ArrowsOneway: + ui->viewArrowsOnewayAction->setChecked(true); + p->renderOptions.arrowOptions = RendererOptions::ArrowsOneway; + break; + case RendererOptions::ArrowsAlways: + ui->viewArrowsAlwaysAction->setChecked(true); + p->renderOptions.arrowOptions = RendererOptions::ArrowsAlways; + break; + } + + theView->setRenderOptions(p->renderOptions); + + ui->gpsCenterAction->setChecked(M_PREFS->getGpsMapCenter()); + + connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(clipboardChanged())); + +#ifndef _MOBILE + theLayers->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + addDockWidget(Qt::LeftDockWidgetArea, theLayers); + + p->theProperties->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + addDockWidget(Qt::LeftDockWidgetArea, p->theProperties); + + theInfo->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + addDockWidget(Qt::RightDockWidgetArea, theInfo); + + theDirty->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + addDockWidget(Qt::RightDockWidgetArea, theDirty); + + p->theStyle->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + addDockWidget(Qt::RightDockWidgetArea, p->theStyle); + + p->theFeats->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + addDockWidget(Qt::RightDockWidgetArea, p->theFeats); + + theGPS->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + addDockWidget(Qt::RightDockWidgetArea, theGPS); + +#else + p->theProperties->setVisible(false); + theInfo->setVisible(false); + theLayers->setVisible(false); + theDirty->setVisible(false); + theFeats->setVisible(false); + theGPS->setVisible(false); + + toolBar->setVisible(false); + mobileToolBar->setVisible(true); + + gpsPopupAction->setMenu(menuGps); + dynamic_cast<QToolButton*>(mobileToolBar->widgetForAction(gpsPopupAction))->setPopupMode(QToolButton::InstantPopup); + +#ifdef _WINCE + windowPropertiesAction->setText(tr("Properties...")); + menuBar()->setDefaultAction(windowPropertiesAction); +#endif // _WINCE +#endif // _MOBILE + +#ifndef OSMARENDER + ui->renderSVGAction->setVisible(false); +#endif + +#ifndef GEOIMAGE + ui->windowGeoimageAction->setVisible(false); + ui->viewPhotosAction->setVisible(false); +#endif + + ui->viewStyleBackgroundAction->setVisible(false); + ui->viewStyleForegroundAction->setVisible(false); + ui->viewStyleTouchupAction->setVisible(false); + + createToolBarManager(); // has to be before restorestate + M_PREFS->restoreMainWindowState( this ); + + if (!M_PREFS->getProjectionsList()->getProjections()->size()) { + qWarning() << "Projection list empty. (Projections.xml file could not be opened?)."; + } + +#define NUMOP 3 + static const char *opStr[NUMOP] = { + QT_TR_NOOP("Low"), QT_TR_NOOP("High"), QT_TR_NOOP("Opaque")}; + + int o = M_PREFS->getAreaOpacity(); + QActionGroup* actgrp = new QActionGroup(this); + for (int i=0; i<NUMOP; i++) { + QAction* act = new QAction(tr(opStr[i]), ui->mnuAreaOpacity); + actgrp->addAction(act); + qreal a = M_PREFS->getAlpha(opStr[i]); + act->setData(a); + act->setCheckable(true); + ui->mnuAreaOpacity->addAction(act); + if (o == int(a*100)) + act->setChecked(true); + } + connect(ui->mnuAreaOpacity, SIGNAL(triggered(QAction*)), this, SLOT(setAreaOpacity(QAction*))); + + if (!g_Merk_Frisius) { + ui->layersNewDrawingAction->setVisible(false); + } + + blockSignals(false); + + QTimer::singleShot( 0, this, SLOT(delayedInit()) ); +} + +void MainWindow::delayedInit() +{ + QList<QAction*> actions = findChildren<QAction*>(); + for (int i=0; i<actions.size(); i++) { + shortcutsDefault[actions[i]->objectName()] = actions[i]->shortcut().toString(); + } + QStringList shortcuts = M_PREFS->getShortcuts(); + for (int i=0; i<shortcuts.size(); i+=2) { + QAction* act = findChild<QAction*>(shortcuts[i]); + if (act) + act->setShortcut(QKeySequence(shortcuts[i+1])); + } + + updateWindowMenu(); + + p->theListeningServer = new RemoteControlServer(this); + connect( p->theListeningServer, &RemoteControlServer::requestReceived, + this, [this](QString url) { loadUrl(url); } ); + + if (M_PREFS->getLocalServer()) { + p->theListeningServer->listen(); + } + + if (M_PREFS->getHideToolbarLabels()) { + setToolButtonStyle(Qt::ToolButtonIconOnly); + } else { + setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + } + +// M_PREFS->initialPosition(theView); + on_fileNewAction_triggered(); + invalidateView(); +} + +void MainWindow::handleMessage(const QString &msg) +{ + QStringList args = msg.split("$", QString::SkipEmptyParts); + QStringList fileNames; + for (int i=0; i < args.size(); ++i) { + if (args[i] == "-l" || args[i] == "--log") { + ++i; + } else { + QUrl u(args[i]); + if (u.scheme() == "osm") { + loadUrl(u); + continue; + } + if (args[i].endsWith(".mdc", Qt::CaseInsensitive)) + loadDocument(args[i]); + else + fileNames.append(args[i]); + } + } + + if (fileNames.size() > 0) { + importFiles(theDocument, fileNames, NULL); + } +} + +MainWindow::~MainWindow(void) +{ + p->theProperties->setSelection(NULL); + + delete M_STYLE; + delete theDocument; + delete theView; + delete p->theProperties; + + delete qtTranslator; + delete merkaartorTranslator; + + delete SlippyMapWidget::theSlippyCache; + + delete p; + + delete M_PREFS; + delete ui; +} + +void MainWindow::launchInteraction(Interaction* anInteraction) +{ + QList<Feature*> theSnapList; + EditInteraction* EI = dynamic_cast<EditInteraction*>(theView->interaction()); + if (EI) { + theSnapList = EI->snapList(); + ui->editRemoveAction->setEnabled(false); + ui->editReverseAction->setEnabled(false); + } + if (!theSnapList.size()) + if (p->theProperties) + theSnapList = p->theProperties->selection(); + if (theView->interaction()) + delete theView->interaction(); + theView->setInteraction(anInteraction); + if (anInteraction) { + ui->editPropertiesAction->setChecked(dynamic_cast<EditInteraction*>(anInteraction) != NULL); + ui->editMoveAction->setChecked(dynamic_cast<MoveNodeInteraction*>(anInteraction) != NULL); + ui->editRotateAction->setChecked(dynamic_cast<RotateInteraction*>(anInteraction) != NULL); + ui->editScaleAction->setChecked(dynamic_cast<ScaleInteraction*>(anInteraction) != NULL); + ui->createNodeAction->setChecked(dynamic_cast<CreateNodeInteraction*>(anInteraction) != NULL); + ui->createRoadAction->setChecked(dynamic_cast<CreateSingleWayInteraction*>(anInteraction) != NULL); + ui->createAreaAction->setChecked(dynamic_cast<CreateAreaInteraction*>(anInteraction) != NULL); + ui->roadExtrudeAction->setChecked(dynamic_cast<ExtrudeInteraction*>(anInteraction) != NULL); + ui->markBridgeAction->setChecked(dynamic_cast<BuildBridgeInteraction*>(anInteraction) != NULL); + + EditInteraction* EI = dynamic_cast<EditInteraction*>(anInteraction); + if (EI) + EI->setSnap(theSnapList); + } else { +#ifndef _MOBILE + theView->setCursor(QCursor(Qt::ArrowCursor)); +#endif + launchInteraction(new EditInteraction(this)); + //Q_ASSERT(theView->interaction()); + } +} + +void MainWindow::onCustomcontextmenurequested(const QPoint & pos) +{ +#ifndef _MOBILE + if (/*EditInteraction* ei = */dynamic_cast<EditInteraction*>(theView->interaction()) || dynamic_cast<MoveNodeInteraction*>(theView->interaction())) { + QMenu menu; + + //FIXME Some of these actions on WIN32-MSVC corrupts the heap. + + //QMenu editMenu(tr("Edit")); + //for(int i=0; i<Main->menuEdit->actions().size(); ++i) { + // if (Main->menuEdit->actions()[i]->isEnabled()) + // editMenu.addAction(Main->menuEdit->actions()[i]); + //} + //if (editMenu.actions().size()) + // menu.addMenu(&editMenu); + + //QMenu createMenu(tr("Create")); + //for(int i=0; i<Main->menuCreate->actions().size(); ++i) { + // if (Main->menuCreate->actions()[i]->isEnabled()) + // createMenu.addAction(Main->menuCreate->actions()[i]); + //} + //if (createMenu.actions().size()) + // menu.addMenu(&createMenu); + + menu.addAction(ui->viewZoomOutAction); + menu.addAction(ui->viewZoomWindowAction); + menu.addAction(ui->viewZoomInAction); + + QMenu featureMenu(tr("Feature")); + for(int i=0; i<ui->menu_Feature->actions().size(); ++i) { + if (ui->menu_Feature->actions()[i]->isEnabled()) + featureMenu.addAction(ui->menu_Feature->actions()[i]); + } + if (featureMenu.actions().size()) + menu.addMenu(&featureMenu); + + + QMenu nodeMenu(tr("Node")); + for(int i=0; i<ui->menu_Node->actions().size(); ++i) { + if (ui->menu_Node->actions()[i]->isEnabled()) + nodeMenu.addAction(ui->menu_Node->actions()[i]); + } + if (nodeMenu.actions().size()) + menu.addMenu(&nodeMenu); + + QMenu roadMenu(tr("Way")); + for(int i=0; i<ui->menuRoad->actions().size(); ++i) { + if (ui->menuRoad->actions()[i]->isEnabled()) + roadMenu.addAction(ui->menuRoad->actions()[i]); + } + if (roadMenu.actions().size()) + menu.addMenu(&roadMenu); + + QMenu relationMenu(tr("Relation")); + for(int i=0; i<ui->menuRelation->actions().size(); ++i) { + if (ui->menuRelation->actions()[i]->isEnabled()) + relationMenu.addAction(ui->menuRelation->actions()[i]); + } + if (relationMenu.actions().size()) + menu.addMenu(&relationMenu); + + if (menu.actions().size()) { + if (menu.actions().size() == 1) { + for (int i=0; i < menu.actions()[0]->menu()->actions().size(); ++i) { + menu.addAction(menu.actions()[0]->menu()->actions()[i]); + } + menu.removeAction(menu.actions()[0]); + } + menu.exec(theView->mapToGlobal(pos)); + } + } +#endif +} + +void MainWindow::onImagerequested(ImageMapLayer *) +{ +#ifndef _MOBILE + ++p->numImages; + pbImages->setRange(0, p->numImages); + //pbImages->setValue(0); + pbImages->update(); + if (pbImages->value() < 0) + pbImages->setValue(0); +#endif +} + +void MainWindow::onImagereceived(ImageMapLayer *aLayer) +{ +#ifndef _MOBILE + if (pbImages->value() < pbImages->maximum()) + pbImages->setValue(pbImages->value()+1); +#endif + theView->on_imageReceived(aLayer); +} + +void MainWindow::onLoadingfinished(ImageMapLayer *) +{ + p->numImages = 0; +#ifndef _MOBILE + pbImages->reset(); +#endif +} + +void MainWindow::updateSegmentMode(QMouseEvent* mouseEvent) +{ + g_Merk_Segment_Mode = (mouseEvent->modifiers() & Qt::AltModifier) || dynamic_cast<ExtrudeInteraction*>(theView->interaction()); +} + +bool MainWindow::eventFilter(QObject */* watched */, QEvent *event) +{ + switch (event->type()) { + +#ifdef GEOIMAGE + case QEvent::DragEnter: { + QDragEnterEvent* devent = static_cast<QDragEnterEvent*>(event); + + if (devent->mimeData()->hasUrls() && devent->mimeData()->urls().first().toLocalFile().endsWith(".jpg", Qt::CaseInsensitive)) { + p->dropTarget = NULL; + event->accept(); + return true; + } else + event->ignore(); + + return false; + } + + case QEvent::DragMove: { + QDragMoveEvent* devent = static_cast<QDragMoveEvent*>(event); + + QMouseEvent mE(QEvent::MouseMove, devent->pos(), Qt::LeftButton, Qt::LeftButton, qApp->keyboardModifiers()); + theView->mouseMoveEvent(&mE); + + Node *tP; + for (VisibleFeatureIterator it(document()); !it.isEnd(); ++it) { + QList<Feature*> NoSnap; + if ((tP = CAST_NODE(it.get())) && tP->pixelDistance(devent->pos(), 5.01, NoSnap, theView) < 5.01) { + p->dropTarget = tP; + QRect acceptedRect(tP->projected().toPoint() - QPoint(3, 3), tP->projected().toPoint() + QPoint(3, 3)); + devent->acceptProposedAction(); + devent->accept(acceptedRect); + return true; + } + } + devent->acceptProposedAction(); + devent->accept(); + return true; + } + + case QEvent::Drop: { + QDropEvent* devent = static_cast<QDropEvent*>(event); + + // first save the image url because the even->mimeData() releases its data very soon + // this is probably because the drop action ends with calling of this event + // so the program that started the drag-action thinks the data isn't needed anymore + QList<QUrl> imageUrls = devent->mimeData()->urls(); + QStringList locFiles; + foreach(QUrl url, imageUrls) + locFiles << url.toLocalFile(); + + if (locFiles.size() > 1) + geoImage()->loadImages(locFiles); + else { + QMenu menu(this); + QString imageFn = locFiles[0]; + Coord mapC = theView->fromView(devent->pos()); + Coord pos = GeoImageDock::getGeoDataFromImage(imageFn); + + if (pos.isNull()) { + QAction *add, *load; + load = menu.addAction(tr("Load image")); + if (p->dropTarget) + add = menu.addAction(tr("Add node position to image")); + else + add = menu.addAction(tr("Geotag image with this position")); + menu.addSeparator(); + menu.addAction(tr("Cancel")); + QAction* res = menu.exec(QCursor::pos()); + if (res == add) { + if (p->dropTarget) + geoImage()->addGeoDataToImage(p->dropTarget->position(), imageFn); + else + geoImage()->addGeoDataToImage(mapC,imageFn); + geoImage()->loadImages(locFiles); + } else if (res == load) + geoImage()->loadImage(imageFn, mapC); + } else + geoImage()->loadImages(locFiles); + } + + return false; + } +#endif // GEOIMAGE + + case QEvent::MouseButtonDblClick: { + if (!theDocument) + return true; + + if (!theView->updatesEnabled()) + return true; + + if (!theView->interaction()) + return true; + + QMouseEvent* mevent = static_cast<QMouseEvent*>(event); + updateSegmentMode(mevent); + + theView->interaction()->mouseEvent(mevent); + + if (M_PREFS->getSelectModeCreation()) { + MoveNodeInteraction* MI = NULL; + if (!M_PREFS->getSeparateMoveMode()) { + MI = dynamic_cast<MoveNodeInteraction*>(theView->interaction()); + } + EditInteraction* EI = dynamic_cast<EditInteraction*>(theView->interaction()); + if ((EI && EI->isIdle()) || (MI && MI->isIdle())) { + if ((EI->lastSnap() && EI->lastSnap()->getType() & IFeature::LineString) || !EI->lastSnap()) + CreateNodeInteraction::createNode(theView->fromView(mevent->pos()), EI->lastSnap()); + else if (EI->lastSnap() && EI->lastSnap()->getType() == IFeature::Point) { + Node* N = CAST_NODE(EI->lastSnap()); + CreateSingleWayInteraction* CI = new CreateSingleWayInteraction(this, N, false); + N->invalidatePainter(); + launchInteraction(CI); + theInfo->setHtml(theView->interaction()->toHtml()); +#ifndef _MOBILE + theView->setCursor(CI->cursor()); +#endif + theView->update(); + return true; + } + } + } + + return false; + } + + case QEvent::MouseButtonPress: { + if (!theDocument) + return true; + + if (!theView->interaction()) + return true; + + QMouseEvent* mevent = static_cast<QMouseEvent*>(event); + updateSegmentMode(mevent); + + theView->interaction()->mouseEvent(mevent); + if (theInfo) + theInfo->setHtml(theView->interaction()->toHtml()); + + return false; + } + + case QEvent::MouseButtonRelease: { + if (!document()) + return true; + + if (!theView->interaction()) + return true; + + QMouseEvent* mevent = static_cast<QMouseEvent*>(event); + updateSegmentMode(mevent); + + theView->interaction()->mouseEvent(mevent); + + return false; + } + + case QEvent::MouseMove: { + if (!theDocument) + return true; + + if (!theView->updatesEnabled()) + return true; + + if (!theView->interaction()) + return false; + + QMouseEvent* mevent = static_cast<QMouseEvent*>(event); + updateSegmentMode(mevent); + + theView->interaction()->mouseEvent(mevent); + + if (!M_PREFS->getSeparateMoveMode()) { + EditInteraction* EI = dynamic_cast<EditInteraction*>(theView->interaction()); + if (EI && EI->isIdle()) { + if (EI->lastSnap() && p->theProperties->isSelected(EI->lastSnap())) { + MoveNodeInteraction* MI = new MoveNodeInteraction(this); + launchInteraction(MI); + // main()->info()->setHtml(interaction()->toHtml()); +#ifndef _MOBILE + theView->setCursor(MI->cursor()); +#endif + theView->update(); + return false; + } + } + MoveNodeInteraction* MI = dynamic_cast<MoveNodeInteraction*>(theView->interaction()); + if (MI && !MI->lastSnap() && MI->isIdle()) { + EditInteraction* EI = new EditInteraction(this); + launchInteraction(EI); +#ifndef _MOBILE + theView->setCursor(EI->cursor()); +#endif + theView->update(); + return false; + } + + } + + return false; + } + + case QEvent::Wheel: { + if (!theDocument) + return true; + + return false; + } + + case QEvent::ToolTip: { + QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event); + //Coord p = p->theProjection.inverse(helpEvent->pos()); + if (M_PREFS->getMapTooltip()) { + if (!toolTip().isEmpty()) + QToolTip::showText(helpEvent->globalPos(), toolTip()); + else + QToolTip::hideText(); + } + return true; + } + + case QEvent::KeyPress: { + QKeyEvent *ke = static_cast< QKeyEvent* >( event ); + switch ( ke->key() ) { + case Qt::Key_Space: + ke->accept(); + theView->setBackgroundOnlyPanZoom(true); + return true; + + case Qt::Key_Tab: + theView->setFocus(); + ke->accept(); + + // if (!isSelectionLocked()) + // lockSelection(); + // else + { + FeatureSnapInteraction* intr = dynamic_cast<FeatureSnapInteraction*>(theView->interaction()); + if (intr) + intr->nextSnap(); + } + return true; + + case Qt::Key_Backtab: + theView->setFocus(); + ke->accept(); + + // if (!isSelectionLocked()) + // lockSelection(); + // else + { + FeatureSnapInteraction* intr = dynamic_cast<FeatureSnapInteraction*>(theView->interaction()); + if (intr) + intr->nextSnap(); + } + return true; + + case Qt::Key_T: + { + theView->rotateScreen(theView->rect().center(), 15.); + return true; + } + + case Qt::Key_O: + { + CreateSingleWayInteraction* intr = dynamic_cast<CreateSingleWayInteraction*>(theView->interaction()); + if (!intr) + return false; + + theView->setFocus(); + ke->accept(); + intr->setSnapAngle(45.); + + return true; + } + + case Qt::Key_H: + { + CreateSingleWayInteraction* intr = dynamic_cast<CreateSingleWayInteraction*>(theView->interaction()); + if (!intr) + return false; + + theView->setFocus(); + ke->accept(); + intr->setSnapAngle(30.); + + return true; + } + + case Qt::Key_P: + { + CreateSingleWayInteraction* intr = dynamic_cast<CreateSingleWayInteraction*>(theView->interaction()); + if (!intr) + return false; + + theView->setFocus(); + ke->accept(); + intr->setParallelMode(true); + + return true; + } + + case Qt::Key_C: + { + CreateSingleWayInteraction* CI = dynamic_cast<CreateSingleWayInteraction*>(theView->interaction()); + if (CI) { + theView->setFocus(); + ke->accept(); + CI->closeAndFinish(); + } else { + CreateAreaInteraction* AI = dynamic_cast<CreateAreaInteraction*>(theView->interaction()); + if (AI) { + theView->setFocus(); + ke->accept(); + AI->closeAndFinish(); + } + else + return false; + } + return true; + } + + default: + break; + + } + } + break; + + case QEvent::KeyRelease: { + QKeyEvent *ke = static_cast< QKeyEvent* >( event ); + switch ( ke->key() ) { + case Qt::Key_Space: + ke->accept(); + theView->setBackgroundOnlyPanZoom(false); + return true; + + case Qt::Key_O: + case Qt::Key_H: + { + CreateSingleWayInteraction* intr = dynamic_cast<CreateSingleWayInteraction*>(theView->interaction()); + if (!intr) + return false; + + ke->accept(); + intr->setSnapAngle(0); + + return true; + } + + case Qt::Key_P: + { + CreateSingleWayInteraction* intr = dynamic_cast<CreateSingleWayInteraction*>(theView->interaction()); + if (!intr) + return false; + + ke->accept(); + intr->setParallelMode(false); + + return true; + } + + default: + break; + } + } + break; + + case QEvent::Leave: { + if (theInfo) + theInfo->unsetHoverHtml(); + FeatureSnapInteraction* intr = dynamic_cast<FeatureSnapInteraction*>(theView->interaction()); + if (intr) + intr->clearLastSnap(); + theView->update(); + } + + default: + break; + } + + return false; +} + +namespace { + +void AddActionsIntoManager(QtToolBarManager* manager, QWidget* widget, + const QString& label) { + foreach(QAction* a, widget->actions()) { + if (!a->isSeparator() && !a->menu()) + manager->addAction(a, label); + } +} + +} // namespace + +void MainWindow::createToolBarManager() +{ + toolBarManager = new QtToolBarManager(this); + toolBarManager->setMainWindow(this); + + AddActionsIntoManager(toolBarManager, ui->menuFile, tr("File")); + AddActionsIntoManager(toolBarManager, ui->menuEdit, tr("Edit")); + AddActionsIntoManager(toolBarManager, ui->menuView, tr("View")); + AddActionsIntoManager(toolBarManager, ui->menu_Show, tr("Show")); + AddActionsIntoManager(toolBarManager, ui->menuShow_directional_Arrows, tr("Directional Arrows")); + AddActionsIntoManager(toolBarManager, ui->menuGps, tr("GPS")); + AddActionsIntoManager(toolBarManager, ui->menuLayers, tr("Layers")); + AddActionsIntoManager(toolBarManager, ui->menuCreate, tr("Create")); + AddActionsIntoManager(toolBarManager, ui->menu_Feature, tr("Feature")); + AddActionsIntoManager(toolBarManager, ui->menu_Node, tr("Node")); + AddActionsIntoManager(toolBarManager, ui->menuRoad, tr("Way")); + AddActionsIntoManager(toolBarManager, ui->menuRelation, tr("Relation")); + AddActionsIntoManager(toolBarManager, ui->menuTools, tr("Tools")); + AddActionsIntoManager(toolBarManager, ui->menuWindow, tr("Windows")); + AddActionsIntoManager(toolBarManager, ui->menuHelp, tr("Help")); + + toolBarManager->addToolBar(ui->toolBar, QString()); + + QSettings* Sets = M_PREFS->getQSettings(); + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) + if (Sets->contains("MainWindow/Toolbars")) + toolBarManager->restoreState(Sets->value("MainWindow/Toolbars").toByteArray()); +} + +void MainWindow::on_toolsToolbarsAction_triggered() +{ + QtToolBarDialog dlg(this); + dlg.setToolBarManager(toolBarManager); + dlg.exec(); + + QSettings* Sets = M_PREFS->getQSettings(); + Sets->setValue("MainWindow/Toolbars", toolBarManager->saveState()); +} + +void MainWindow::createProgressDialog() +{ + theProgressDialog = new QProgressDialog(this); + theProgressDialog->setWindowModality(Qt::ApplicationModal); + theProgressDialog->setMinimumDuration(0); + + theProgressBar = new QProgressBar(theProgressDialog); + theProgressBar->setTextVisible(false); + theProgressDialog->setBar(theProgressBar); + + theProgressLabel = new QLabel(); + theProgressLabel->setAlignment(Qt::AlignCenter); + theProgressDialog->setLabel(theProgressLabel); + + theProgressDialog->setMaximum(11); + theProgressDialog->reset(); +} + +void MainWindow::deleteProgressDialog() +{ + SAFE_DELETE(theProgressDialog) + theProgressBar = NULL; + theProgressLabel = NULL; +} + +void MainWindow::setAreaOpacity(QAction *act) +{ + qreal a = act->data().toDouble(); + M_PREFS->setAreaOpacity(int(a*100)); + + theView->invalidate(true, true, false); +} + +void MainWindow::adjustLayers(bool adjustViewport) +{ + if (M_PREFS->getZoomBoris()) { + ImageMapLayer* l = NULL; + for (LayerIterator<ImageMapLayer*> ImgIt(theDocument); !ImgIt.isEnd(); ++ImgIt) { + l = ImgIt.get(); + break; + } + if (l && l->isTiled()) { + theView->projection().setProjectionType(l->projection()); + updateProjectionMenu(); + } + } + if (adjustViewport) { + CoordBox theVp; + theVp = theView->viewport(); + theView->setViewport(theVp, theView->rect()); + } + invalidateView(true); +} + +void MainWindow::invalidateView(bool UpdateDock) +{ + theView->setRenderOptions(p->renderOptions); + theView->invalidate(true, true, true); + //theLayers->updateContent(); + if (UpdateDock) + p->theProperties->resetValues(); +} + +void MainWindow::toggleButtonStyle() +{ + if (M_PREFS->getHideToolbarLabels()) { + M_PREFS->setHideToolbarLabels(false); + setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + } else { + M_PREFS->setHideToolbarLabels(true); + setToolButtonStyle(Qt::ToolButtonIconOnly); + } +} + +PropertiesDock* MainWindow::properties() +{ + return p->theProperties; +} + +InfoDock* MainWindow::info() +{ + return theInfo; +} + +#ifdef GEOIMAGE +GeoImageDock* MainWindow::geoImage() +{ + return theGeoImage; +} +#endif + +FeaturesDock* MainWindow::features() +{ + return p->theFeats; +} + +Document* MainWindow::document() +{ + return theDocument; +} + +void MainWindow::on_editCutAction_triggered() +{ + // Export + QClipboard *clipboard = QApplication::clipboard(); + QMimeData* md = new QMimeData(); + + QBuffer osmBuf; + osmBuf.open(QIODevice::WriteOnly); + + QList<Feature*> exportedFeatures = document()->exportCoreOSM(p->theProperties->selection()); + theDocument->exportOSM(this, &osmBuf, exportedFeatures); + md->setText(QString(osmBuf.data())); + md->setData(MIME_OPENSTREETMAP_XML, osmBuf.data()); + + ImportExportKML kmlexp(theDocument); + QBuffer kmlBuf; + kmlBuf.open(QIODevice::WriteOnly); + if (kmlexp.setDevice(&kmlBuf)) { + kmlexp.export_(p->theProperties->selection()); + md->setData(MIME_GOOGLE_EARTH_KML, kmlBuf.data()); + } + + ExportGPX gpxexp(theDocument); + QBuffer gpxBuf; + gpxBuf.open(QIODevice::WriteOnly); + if (gpxexp.setDevice(&gpxBuf)) { + gpxexp.export_(p->theProperties->selection()); + md->setData(MIME_GPX, gpxBuf.data()); + } + + //Deletion + QList<Feature*> Sel; + for (int i=0; i<p->theProperties->selectionSize(); ++i) + Sel.push_back(p->theProperties->selection(i)); + if (Sel.size() == 0) return; + + CommandList* theList = new CommandList(MainWindow::tr("Cut Features"), Sel[0]); + for (int i=0; i<Sel.size(); ++i) { + QList<Feature*> Alternatives; + theList->add(new RemoveFeatureCommand(document(), Sel[i], Alternatives)); + } + + if (theList->size()) { + document()->addHistory(theList); + } + else { + delete theList; + return; + } + + QString xml; + QXmlStreamWriter stream(&xml); + stream.setAutoFormatting(true); + stream.setAutoFormattingIndent(2); + stream.writeStartDocument(); + stream.writeStartElement("MerkaartorUndo"); + stream.writeAttribute("documentid", theDocument->id()); + theList->toXML(stream); + stream.writeEndElement(); + stream.writeEndDocument(); + md->setData(MIME_MERKAARTOR_UNDO_XML, xml.toUtf8()); +// qDebug() << doc.toString(2); + + clipboard->setMimeData(md); + + properties()->setSelection(0); + properties()->checkMenuStatus(); + view()->invalidate(true, true, false); +} + +void MainWindow::on_editCopyAction_triggered() +{ + QClipboard *clipboard = QApplication::clipboard(); + QMimeData* md = new QMimeData(); + + QBuffer osmBuf; + osmBuf.open(QIODevice::WriteOnly); + + QList<Feature*> exportedFeatures = document()->exportCoreOSM(p->theProperties->selection(), true); + theDocument->exportOSM(this, &osmBuf, exportedFeatures); + md->setText(QString(osmBuf.data())); + md->setData(MIME_OPENSTREETMAP_XML, osmBuf.data()); + + ImportExportKML kmlexp(theDocument); + QBuffer kmlBuf; + kmlBuf.open(QIODevice::WriteOnly); + if (kmlexp.setDevice(&kmlBuf)) { + kmlexp.export_(p->theProperties->selection()); + md->setData(MIME_GOOGLE_EARTH_KML, kmlBuf.data()); + } + + ExportGPX gpxexp(theDocument); + QBuffer gpxBuf; + gpxBuf.open(QIODevice::WriteOnly); + if (gpxexp.setDevice(&gpxBuf)) { + gpxexp.export_(p->theProperties->selection()); + md->setData(MIME_GPX, gpxBuf.data()); + } + + clipboard->setMimeData(md); + invalidateView(); +} + +void MainWindow::on_editPasteFeatureAction_triggered() +{ + DrawingLayer* l = dynamic_cast<DrawingLayer*>(theDocument->getDirtyOrOriginLayer()); + if (!l) + return; + + Document* doc; + + QClipboard *clipboard = QApplication::clipboard(); + if (clipboard->mimeData()->hasFormat(MIME_MERKAARTOR_UNDO_XML)) { + QDomDocument theXmlDoc; + if (!theXmlDoc.setContent(clipboard->mimeData()->data(MIME_MERKAARTOR_UNDO_XML))) { + // Do nothing. + } else { + QDomElement root = theXmlDoc.firstChildElement("MerkaartorUndo"); + if (!root.isNull()) { + QString docId = root.attribute("documentid"); + if (theDocument->id() == docId) { + + QDomNodeList nl = theXmlDoc.elementsByTagName("RemoveFeatureCommand"); + for (int i=0; i<nl.size(); ++i) { + nl.at(i).toElement().setAttribute("layer", l->id()); + } + + QString xml; + QTextStream tstr(&xml, QIODevice::ReadOnly); + root.firstChildElement("CommandList").save(tstr, 2); + QXmlStreamReader stream(xml); + + CommandList* theList = CommandList::fromXML(theDocument, stream); + theList->setReversed(true); + theList->redo(); + theList->setDescription("Paste Features"); + theDocument->addHistory(theList); + + view()->invalidate(true, true, false); + + return; + } + } + } + } + + if (!(doc = Document::getDocumentFromClipboard())) { + dieClipboardInvalid(); + return; + } + + CommandList* theList = new CommandList(); + theList->setDescription("Paste Features"); + QList<Feature*> theFeats = theDocument->mergeDocument(doc, theDocument->getDirtyOrOriginLayer(), theList); + + if (theList->size()) + document()->addHistory(theList); + else + delete theList; + + delete doc; + + p->theProperties->setSelection(theFeats); + view()->invalidate(true, true, false); +} + +void MainWindow::dieClipboardInvalid() +{ + QMessageBox::critical(this, tr("Clipboard invalid"), tr("Clipboard do not contain valid data.")); +} + +void MainWindow::on_editPasteOverwriteAction_triggered() +{ + QList<Feature*> sel = properties()->selection(); + if (!sel.size()) + return; + + Document* doc; + if (!(doc = Document::getDocumentFromClipboard())) { + dieClipboardInvalid(); + return; + } + + CommandList* theList = new CommandList(); + theList->setDescription("Paste tags (overwrite)"); + + for(int i=0; i < sel.size(); ++i) { + theList->add(new ClearTagsCommand(sel[i], theDocument->getDirtyOrOriginLayer(sel[i]->layer()))); + for (FeatureIterator k(doc); !k.isEnd(); ++k) { + // Allow any<->any pasting but only takes top level feature into account + if (k.get()->sizeParents()) + continue; + Feature::mergeTags(theDocument, theList, sel[i], k.get()); + } + } + + if (theList->size()) + document()->addHistory(theList); + else + delete theList; + + delete doc; + invalidateView(); +} + +void MainWindow::on_editPasteMergeAction_triggered() +{ + QList<Feature*> sel = properties()->selection(); + if (!sel.size()) + return; + + Document* doc; + if (!(doc = Document::getDocumentFromClipboard())) { + dieClipboardInvalid(); + return; + } + + CommandList* theList = new CommandList(); + theList->setDescription("Paste tags (merge)"); + + for(int i=0; i < sel.size(); ++i) { + for (FeatureIterator k(doc); !k.isEnd(); ++k) { + // Allow any<->any pasting but only takes top level feature into account + if (k.get()->sizeParents()) + continue; + Feature::mergeTags(theDocument, theList, sel[i], k.get()); + } + } + + if (theList->size()) + document()->addHistory(theList); + else + delete theList; + + delete doc; + invalidateView(); +} + +void MainWindow::clipboardChanged() +{ + ui->editPasteFeatureAction->setEnabled(false); + ui->editPasteMergeAction->setEnabled(false); + ui->editPasteOverwriteAction->setEnabled(false); + + QClipboard *clipboard = QApplication::clipboard(); + //qDebug() << "Clipboard mime: " << clipboard->mimeData()->formats(); + QDomDocument theXmlDoc; + bool ok = false; + // mimeData() returns nullptr if not supported by the platform + if (clipboard->mimeData()) { + if (clipboard->mimeData()->hasFormat(MIME_OPENSTREETMAP_XML)) + ok = theXmlDoc.setContent(clipboard->mimeData()->data(MIME_OPENSTREETMAP_XML)); + else if (clipboard->mimeData()->hasText()) + ok = theXmlDoc.setContent(clipboard->text()); + } + + if (!ok) { + return; + } + + QDomElement c = theXmlDoc.documentElement(); + + if (c.tagName() != "osm" && c.tagName() != "kml") { + return; + } + + ui->editPasteFeatureAction->setEnabled(true); + ui->editPasteMergeAction->setEnabled(true); + ui->editPasteOverwriteAction->setEnabled(true); +} + +void MainWindow::on_editRedoAction_triggered() +{ + theDocument->redoHistory(); + p->theProperties->adjustSelection(); + invalidateView(); +} + +void MainWindow::on_editUndoAction_triggered() +{ + theDocument->undoHistory(); + p->theProperties->adjustSelection(); + invalidateView(); +} + +void MainWindow::on_editPropertiesAction_triggered() +{ + if (theView->interaction() && dynamic_cast<EditInteraction*>(theView->interaction())) + p->theProperties->setSelection(0); + theView->unlockSelection(); +// theView->invalidate(true, true, false); + launchInteraction(new EditInteraction(this)); + view()->setInteracting(false); + theInfo->setHtml(theView->interaction()->toHtml()); +} + +void MainWindow::on_editRemoveAction_triggered() +{ + emit remove_triggered(); + emit content_changed(); +} + +void MainWindow::on_editMoveAction_triggered() +{ + if (M_PREFS->getSeparateMoveMode()) { + launchInteraction(new MoveNodeInteraction(this)); + theInfo->setHtml(theView->interaction()->toHtml()); + } +} + +void MainWindow::on_editRotateAction_triggered() +{ + launchInteraction(new RotateInteraction(this)); + theInfo->setHtml(theView->interaction()->toHtml()); +} + +void MainWindow::on_editScaleAction_triggered() +{ + launchInteraction(new ScaleInteraction(this)); + theInfo->setHtml(theView->interaction()->toHtml()); +} + +void MainWindow::on_editReverseAction_triggered() +{ + emit reverse_triggered(); +} + +void MainWindow::on_fileImportGDALAction_triggered() { + if (QMessageBox::warning(this, + MainWindow::tr("GDAL import warning"), + MainWindow::tr( + "You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out.\n" + "Please do report bugs in case of a crash, but don't be surprised about it.\n" + "\n" + "Continue with import?\n" + ), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) + { + importAction(true); + } +} + +void MainWindow::on_fileImportAction_triggered() { + importAction(false); + +} + +void MainWindow::importAction( bool useGdal ) { + QStringList fileNames = QFileDialog::getOpenFileNames( + this, + tr("Import file"), + QString(), p->FILTER_IMPORT_SUPPORTED); + + if (fileNames.isEmpty()) + return; + + view()->setUpdatesEnabled(false); + theLayers->setUpdatesEnabled(false); + + QStringList importedFiles; + importFiles(theDocument, fileNames, &importedFiles, useGdal); + + foreach (QString currentFileName, importedFiles) + M_PREFS->addRecentImport(currentFileName); + + updateRecentImportMenu(); + + view()->setUpdatesEnabled(true); + theLayers->setUpdatesEnabled(true); + + on_editPropertiesAction_triggered(); + theDocument->history().setActions(ui->editUndoAction, ui->editRedoAction, ui->fileUploadAction); +} + +static bool mayDiscardUnsavedChanges(QWidget* aWidget) +{ + return QMessageBox::question(aWidget, MainWindow::tr("Unsaved changes"), + MainWindow::tr("The current map contains unsaved changes that will be lost when starting a new one.\n" + "Do you want to cancel starting a new map or continue and discard the old changes?"), + QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel) == QMessageBox::Discard; +} + +static bool mayDiscardStyleChanges(QWidget* aWidget) +{ + return QMessageBox::question(aWidget, MainWindow::tr("Unsaved Style changes"), + MainWindow::tr("You have modified the current style.\n" + "Do you want to save your changes?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No; +} + +void MainWindow::startBusyCursor() { +#ifndef Q_OS_SYMBIAN + QApplication::setOverrideCursor(Qt::BusyCursor); +#endif +} + +void MainWindow::endBusyCursor() { +#ifndef Q_OS_SYMBIAN + QApplication::restoreOverrideCursor(); +#endif +} + +MainWindow::ImportStatus MainWindow::importFile(Document * mapDocument, const QString& fileName, Layer*& newLayer) { + MainWindow::ImportStatus result; + + qDebug() << "Importing file" << fileName << "using native parsers."; + + QString baseFileName = fileName.section('/', - 1); + if (fileName.toLower().endsWith(".gpx")) { + QList<TrackLayer*> theTracklayers; + newLayer = new TrackLayer( baseFileName + " - " + tr("Waypoints"), baseFileName); + mapDocument->add(newLayer); + theTracklayers.append((TrackLayer*) newLayer); + bool importOK = ImportGPX::import(this, fileName, mapDocument, theTracklayers); + if (!importOK) { + for (int i=0; i<theTracklayers.size(); i++) { + mapDocument->remove(theTracklayers[i]); + SAFE_DELETE(theTracklayers[i]); + } + newLayer = NULL; + } else { + if (!newLayer->size()) { + mapDocument->remove(newLayer); + SAFE_DELETE(newLayer); + } + for (int i=1; i<theTracklayers.size(); i++) { + if (theTracklayers[i]->name().isEmpty()) + theTracklayers[i]->setName(QString(baseFileName + " - " + tr("Track %1").arg(i))); + if (importOK && M_PREFS->getAutoExtractTracks()) { + theTracklayers[i]->extractLayer(); + } + } + } + result = importOK ? IMPORT_OK : IMPORT_ERROR; + } + else if (fileName.toLower().endsWith(".osm")) { + newLayer = new DrawingLayer( baseFileName ); + mapDocument->add(newLayer); + result = importOSM(this, fileName, mapDocument, newLayer) ? IMPORT_OK : IMPORT_ERROR; + } +#ifndef FRISIUS_BUILD + else if (fileName.toLower().endsWith(".osc")) { + if (g_Merk_Frisius) { + newLayer = new DrawingLayer( baseFileName ); + mapDocument->add(newLayer); + } else { + newLayer = mapDocument->getDirtyOrOriginLayer(); + } + result = mapDocument->importOSC(fileName, (DrawingLayer*)newLayer) ? IMPORT_OK : IMPORT_ERROR; + } +#endif + else if (fileName.toLower().endsWith(".ngt")) { + newLayer = new TrackLayer( baseFileName ); + newLayer->setUploadable(false); + mapDocument->add(newLayer); + bool importOK = importNGT(this, fileName, mapDocument, newLayer); + if (importOK && M_PREFS->getAutoExtractTracks()) { + ((TrackLayer *)newLayer)->extractLayer(); + } + result = importOK ? IMPORT_OK : IMPORT_ERROR; + } + else if (fileName.toLower().endsWith(".nmea") || (fileName.toLower().endsWith(".nma"))) { + newLayer = new TrackLayer( baseFileName ); + newLayer->setUploadable(false); + mapDocument->add(newLayer); + bool importOK = mapDocument->importNMEA(fileName, (TrackLayer *)newLayer); + if (importOK && M_PREFS->getAutoExtractTracks()) { + ((TrackLayer *)newLayer)->extractLayer(); + } + result = importOK ? IMPORT_OK : IMPORT_ERROR; + } + else if (fileName.toLower().endsWith(".kml")) { + if (QMessageBox::warning(this, MainWindow::tr("Big Fat Copyright Warning"), + MainWindow::tr( + "You are trying to import a KML file. Please be aware that:\n" + "\n" + " - You cannot import to OSM a KML file created from Google Earth. While you might\n" + " think that nodes you created from GE are yours, they are not!\n" + " They are still a derivative work from GE, and, as such, cannot be used in OSM.\n" + "\n" + " - If you downloaded it from the Internet, chances are that there is a copyright on it.\n" + " Please be absolutely sure that using those data in OSM is permitted by the author, or\n" + " that the data is public domain.\n" + "\n" + "If unsure, please seek advice on the \"legal\" or \"talk\" openstreetmap mailing lists.\n" + "\n" + "Are you absolutely sure this KML can legally be imported in OSM?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) + { + newLayer = new DrawingLayer( baseFileName ); + newLayer->setUploadable(false); + mapDocument->add(newLayer); + result = mapDocument->importKML(fileName, (TrackLayer *)newLayer) ? IMPORT_OK : IMPORT_ERROR; + } else + result = IMPORT_ABORTED; + } + else if (fileName.toLower().endsWith(".csv")) { +#ifndef Q_OS_SYMBIAN + QApplication::restoreOverrideCursor(); +#endif + newLayer = new DrawingLayer( baseFileName ); + newLayer->setUploadable(false); + mapDocument->add(newLayer); + result = mapDocument->importCSV(fileName, (DrawingLayer*)newLayer) ? IMPORT_OK : IMPORT_ERROR; + } +#ifdef USE_PROTOBUF + else if (fileName.toLower().endsWith(".pbf")) { + newLayer = new DrawingLayer( baseFileName ); + mapDocument->add(newLayer); + result = mapDocument->importPBF(fileName, (DrawingLayer*)newLayer) ? IMPORT_OK : IMPORT_ERROR; + } +#endif + else { + qDebug() << "File type not recognized. If this file was recognized by previous versions, use Import GDAL function."; + result = IMPORT_ERROR; + } + + if (result == IMPORT_ERROR && newLayer) { + mapDocument->remove(newLayer); + SAFE_DELETE(newLayer); + } + + return result; +} + +MainWindow::ImportStatus MainWindow::importFileUsingGDAL( Document* mapDocument, const QString& fileName, Layer*& newLayer ) { + MainWindow::ImportStatus result; + + qDebug() << "Importing file" << fileName << "using GDAL."; + + QString baseFileName = fileName.section('/', - 1); + newLayer = new DrawingLayer( baseFileName ); + newLayer->setUploadable(false); + mapDocument->add(newLayer); + result = mapDocument->importGDAL(fileName, (DrawingLayer*)newLayer) ? IMPORT_OK : IMPORT_ERROR; + if (result == IMPORT_ERROR) { + mapDocument->remove(newLayer); + SAFE_DELETE(newLayer); + } + + return result; +} + +/** + * Auxilary function to test the import functionality. May be removed when the + * import is decoupled from the whole app, but as of now that is too much work. + */ +bool MainWindow::testImport(const QString filePath) +{ + qDebug() << "Testing import with file: " << filePath; + Layer* newLayer = nullptr; + importFileUsingGDAL(theDocument, filePath, newLayer); + if (newLayer == nullptr) { + qDebug() << "FAILED"; + return false; + } else { + QRectF bbox = newLayer->boundingBox(); + int elements = newLayer->size(); + // Our test data are contained in this rectangle; only rough location is tested, mostly to check for swapper coordinates + QRectF testRect = QRectF(QPointF(4,50) , QPointF(5,51) ); + // Return true if nonzero elements were imported and they are contained in our testRect + return (elements > 0) && testRect.contains(bbox); + } +} + + +bool MainWindow::importFiles(Document * mapDocument, const QStringList & fileNames, QStringList * importedFileNames, bool useGdal ) +{ + createProgressDialog(); +#ifndef Q_OS_SYMBIAN + QApplication::setOverrideCursor(Qt::BusyCursor); +#endif + + bool foundImport = false; + + QStringList filesToProcess = fileNames; + +#ifdef GEOIMAGE + /* Geotagged images should be imported as a group, let's do it first. */ + QStringList images = fileNames.filter(".jpg", Qt::CaseInsensitive); + if (!images.isEmpty()) { + theGeoImage->loadImages(images); + QString cur; + foreach (cur, images) + filesToProcess.removeAll(cur); + foundImport = true; + } +#endif + + QStringListIterator it(filesToProcess); + while (it.hasNext()) + { + const QString & fn = it.next(); + + Layer* newLayer = NULL; + // TODO: The passing mechanism of newLayer is evil black magic. + ImportStatus fileImportResult; + if (useGdal) + fileImportResult = importFileUsingGDAL(mapDocument, fn, newLayer); + else + fileImportResult = importFile(mapDocument, fn, newLayer); + + switch (fileImportResult) { + case IMPORT_OK: + foundImport = true; + + if (importedFileNames) + importedFileNames->append(fn); + + emit content_changed(); + break; + case IMPORT_ERROR: + QMessageBox::warning(this, tr("No valid file"), tr("%1 could not be opened.").arg(fn)); + case IMPORT_ABORTED: + // noop + break; + } + } + endBusyCursor(); + deleteProgressDialog(); + invalidateView(false); + + return foundImport; +} + +void MainWindow::loadUrl(const QString& urlString) +{ + qDebug() << "Loading url: " << urlString; + loadUrl(QUrl(urlString)); +} + +void MainWindow::loadUrl(const QUrl& theUrl) +{ + activateWindow(); + +#ifdef QT5 + QUrlQuery theQuery(theUrl); +#define theQuery theQuery +#else +#define theQuery theUrl +#endif + if (theUrl.path() == "/load_object") { + QString obj = theQuery.queryItemValue("objects"); + IFeature::FId mId; + if (obj.startsWith("n")) { + obj.remove("n"); + mId.type = IFeature::Point; + mId.numId = obj.toLongLong(); + } else if (obj.startsWith("w")) { + obj.remove("w"); + mId.type = IFeature::LineString; + mId.numId = obj.toLongLong(); + } else if (obj.startsWith("r")) { + obj.remove("r"); + mId.type = IFeature::LineString; + mId.numId = obj.toLongLong(); + } else { + QMessageBox::critical(this, tr("Incoming Remote Control Request"), + tr("Wanted to load object '%1', but don't know how to do that. Sorry.").arg(theUrl.toString())); + return; + } + Feature* F = theDocument->getFeature(mId); + if (!F) { + /* The feature is missing, download it first. */ + createProgressDialog(); + downloadFeature(this, mId, theDocument, NULL); + deleteProgressDialog(); + F = theDocument->getFeature(mId); + } + /* The feature is on our map, just select it. */ + if (F) { /* If F existed, e.g., was not deleted*/ + if (theView) { + theView->setViewport(F->boundingBox(), theView->rect()); + on_fileDownloadMoreAction_triggered(); + } + properties()->setSelection(0); + properties()->addSelection(F); + emit content_changed(); + } + } else if (theUrl.path() == "/add_node") { + qreal lat = theQuery.queryItemValue("lat").toDouble(); + qreal lon = theQuery.queryItemValue("lon").toDouble(); + QString addtagsstring=theQuery.queryItemValue("addtags"); + Coord pos=Coord(lon,lat); + Node* N; + CommandList* theList; + Layer* l=document()->getDirtyOrOriginLayer(); + N = g_backend.allocNode(g_Merk_MainWindow->document()->getDirtyOrOriginLayer(), pos); + N->setDirtyLevel(1); + QString poiName="."; + if (addtagsstring.size()>0) { + QStringList addtags = QUrl::fromPercentEncoding(addtagsstring.toUtf8()).split("|"); + foreach (const QString &tag, addtags) { + QStringList kv = tag.split("="); + QString k=kv[0]; + QString v; + if (kv.size()>0) { + v=kv[1]; + if (k=="name") poiName=v; + } + N->setTag(k,v); + } + } + theList = new CommandList(MainWindow::tr("Remote add POI %1 %2").arg(N->id().numId).arg(poiName), N); + theList->add(new AddFeatureCommand(l,N,true)); + g_Merk_MainWindow->properties()->setSelection(0); + N->updateMeta(); + document()->addHistory(theList); + properties()->setSelection(0); + properties()->addSelection(N); + theView->invalidate(true, true, false); + CoordBox cb; + cb = N->boundingBox(); + if (!cb.isNull()) { + CoordBox mini(cb.center()-COORD_ENLARGE, cb.center()+COORD_ENLARGE); + cb.merge(mini); + cb = cb.zoomed(1.1); + theView->setViewport(cb, theView->rect()); + } + emit content_changed(); + } else if (theUrl.path() == "/load_and_zoom") { + qreal t = theQuery.queryItemValue("top").toDouble(); + qreal b = theQuery.queryItemValue("bottom").toDouble(); + qreal r = theQuery.queryItemValue("right").toDouble(); + qreal l = theQuery.queryItemValue("left").toDouble(); + + if (theView) { + CoordBox vp(Coord(l,b), Coord(r,t)); + theView->setViewport(vp, theView->rect()); + on_fileDownloadMoreAction_triggered(); + } + properties()->setSelection(0); + + Feature* F; + IFeature::FId mId; + QString sel = theQuery.queryItemValue("select"); + if (!sel.isNull()) { + QStringList sl = sel.split(","); + foreach (QString f, sl) { + if (f.startsWith("node")) { + f.remove("node"); + mId.type = IFeature::Point; + mId.numId = f.toLongLong(); + } else if (f.startsWith("way")) { + f.remove("way"); + mId.type = IFeature::LineString; + mId.numId = f.toLongLong(); + } else if (f.startsWith("relation")) { + f.remove("relation"); + mId.type = IFeature::OsmRelation; + mId.numId = f.toLongLong(); + } + F = theDocument->getFeature(mId); + if (F) + properties()->addSelection(F); + } + } + } else { + QMessageBox::critical(this, tr("Incoming Remote control request"), tr("Unknown action url: %1").arg(theUrl.toString())); + } +#undef theQuery +} + +void MainWindow::on_fileOpenAction_triggered() +{ + if (hasUnsavedChanges() && !mayDiscardUnsavedChanges(this)) + return; + + QString fileName = QFileDialog::getOpenFileName(this, tr("Open file"), QString(), p->FILTER_OPEN_NATIVE ); + + if (!fileName.isNull()) + loadDocument(fileName); +} + +void MainWindow::on_fileUploadAction_triggered() +{ + + if (QString(qVersion()) < "4.3.3") + { + if (QMessageBox::question(this, + tr("Old Qt version detected"), + tr("Your setup uses Qt %1, which contains various known errors in uploading " + "data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not " + "recommended).\n" + "For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor").arg(qVersion()),QMessageBox::Yes|QMessageBox::No) != QMessageBox::Yes) + return; + } + + while (M_PREFS->getOsmUser().isEmpty()) { + int ret = QMessageBox::warning(this, tr("Upload OSM"), tr("You don't seem to have specified your\n" + "OpenStreetMap username and password.\nDo you want to do this now?"), QMessageBox::Yes | QMessageBox::No); + if (ret == QMessageBox::Yes) { + toolsPreferencesAction_triggered(true); + } else + return; + } + on_editPropertiesAction_triggered(); + syncOSM(M_PREFS->getOsmApiUrl(), M_PREFS->getOsmUser(), M_PREFS->getOsmPassword()); + + theDocument->history().updateActions(); + theDirty->updateList(); + invalidateView(); +} + +void MainWindow::warnMapDownloadFailed() { + QMessageBox::warning(this, tr("Error downloading"), tr("The map could not be downloaded")); +} + +void MainWindow::on_fileDownloadAction_triggered() +{ + createProgressDialog(); + + if (downloadOSM(this, theView->viewport(), theDocument)) { + on_editPropertiesAction_triggered(); + } else + warnMapDownloadFailed(); + + deleteProgressDialog(); + + updateBookmarksMenu(); + + emit content_changed(); +} + +void MainWindow::on_fileDownloadMoreAction_triggered() +{ + createProgressDialog(); + + if (!downloadMoreOSM(this, theView->viewport(), theDocument)) { + warnMapDownloadFailed(); + } + + deleteProgressDialog(); + + emit content_changed(); +} + +void MainWindow::on_layersMapdustAction_triggered() +{ + SpecialLayer* sl = NULL; + for (int i=0; i<theDocument->layerSize(); ++i) { + if (theDocument->getLayer(i)->classType() == Layer::MapDustLayer) { + sl = dynamic_cast<SpecialLayer*>(theDocument->getLayer(i)); + while (sl->size()) + { + sl->deleteFeature(sl->get(0)); + } + } + } + + createProgressDialog(); + + if (!::downloadMapdust(this, theView->viewport(), theDocument, sl)) { + QMessageBox::warning(this, tr("Error downloading MapDust"), tr("The MapDust bugs could not be downloaded")); + } + + deleteProgressDialog(); +} + +void MainWindow::downloadFeatures(const QList<Feature*>& aDownloadList) +{ + createProgressDialog(); + + if (!::downloadFeatures(this, aDownloadList, theDocument)) { + QMessageBox::warning(this, tr("Error downloading"), tr("The map could not be downloaded")); + } + + deleteProgressDialog(); + + emit content_changed(); + +} + +void MainWindow::on_fileWorkOfflineAction_triggered() +{ + M_PREFS->setOfflineMode(!M_PREFS->getOfflineMode()); + updateMenu(); +} + +void MainWindow::on_filePrintAction_triggered() +{ + NativeRenderDialog osmR(theDocument, theView->viewport(), this); + osmR.exec(); +} + +void MainWindow::on_filePropertiesAction_triggered() +{ + QDialog dlg(this); + Ui::PropertiesDialog Prop; + Prop.setupUi(&dlg); + + QString h; + h += theView->toPropertiesHtml(); + h += "<br/>"; + h += theDocument->toPropertiesHtml(); + Prop.textBrowser->setHtml(h); + + dlg.exec(); +} + +void MainWindow::on_helpAboutAction_triggered() +{ + QDialog dlg(this); + Ui::AboutDialog About; + About.setupUi(&dlg); + dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowContextHelpButtonHint); + dlg.setWindowFlags(dlg.windowFlags() | Qt::MSWindowsFixedSizeDialogHint); + About.Version->setText(About.Version->text().arg(STRINGIFY(REVISION))); + About.QTVersion->setText(About.QTVersion->text().arg(qVersion()).arg(QT_VERSION_STR)); + PJ_INFO projVer = proj_info(); + About.ProjVersion->setText(About.ProjVersion->text().arg(QString("%1.%2.%3").arg(projVer.major).arg(projVer.minor).arg(projVer.patch))); + About.GdalVersion->setText(About.GdalVersion->text().arg(GDAL_RELEASE_NAME)); + + QFile ct(":/Utils/CHANGELOG"); + ct.open(QIODevice::ReadOnly); + QTextStream cl(&ct); + About.txtChangelog->setPlainText(cl.readAll()); + QPixmap px(":/Utils/Merkaartor_About.png"); + About.pxIcon->setPixmap(px); + About.lblUrl->setOpenExternalLinks(true); + dlg.exec(); +} + +void MainWindow::on_viewZoomAllAction_triggered() +{ + QPair<bool, CoordBox> BBox(theDocument->boundingBox()); + if (BBox.first) { + BBox.second.resize(1.01); + theView->setViewport(BBox.second, theView->rect()); + invalidateView(); + } +} + +void MainWindow::on_viewZoomInAction_triggered() +{ + theView->zoomIn(); +} + +void MainWindow::on_viewZoomOutAction_triggered() +{ + theView->zoomOut(); +} + +void MainWindow::on_viewZoomWindowAction_triggered() +{ + launchInteraction(new ZoomInteraction(this)); +} + +void MainWindow::on_viewLockZoomAction_triggered() +{ + M_PREFS->setZoomBoris(!M_PREFS->getZoomBoris()); + SetOptionValue(p->renderOptions, RendererOptions::LockZoom, M_PREFS->getZoomBoris()); + ui->viewLockZoomAction->setChecked(M_PREFS->getZoomBoris()); + ImageMapLayer* l = NULL; + for (LayerIterator<ImageMapLayer*> ImgIt(theDocument); !ImgIt.isEnd(); ++ImgIt) { + l = ImgIt.get(); + break; + } + if (l && l->isTiled()) { + theView->projection().setProjectionType(l->projection()); + theView->setViewport(theView->viewport(), theView->rect()); + } + theView->adjustZoomToBoris(); + updateProjectionMenu(); + invalidateView(); +} + +void MainWindow::on_viewDownloadedAction_triggered() +{ + M_PREFS->setDownloadedVisible(!M_PREFS->getDownloadedVisible()); + SetOptionValue(p->renderOptions, RendererOptions::DownloadedVisible, M_PREFS->getDownloadedVisible()); + ui->viewDownloadedAction->setChecked(M_PREFS->getDownloadedVisible()); + invalidateView(); +} + +void MainWindow::on_viewDirtyAction_triggered() +{ + M_PREFS->setDirtyVisible(!M_PREFS->getDirtyVisible()); + SetOptionValue(p->renderOptions, RendererOptions::DirtyVisible, M_PREFS->getDirtyVisible()); + ui->viewDirtyAction->setChecked(M_PREFS->getDirtyVisible()); + invalidateView(); +} + +void MainWindow::on_viewScaleAction_triggered() +{ + M_PREFS->setScaleVisible(!M_PREFS->getScaleVisible()); + SetOptionValue(p->renderOptions, RendererOptions::ScaleVisible, M_PREFS->getScaleVisible()); + ui->viewScaleAction->setChecked(M_PREFS->getScaleVisible()); + invalidateView(); +} + +void MainWindow::on_viewPhotosAction_triggered() +{ + M_PREFS->setPhotosVisible(!M_PREFS->getPhotosVisible()); + SetOptionValue(p->renderOptions, RendererOptions::PhotosVisible, M_PREFS->getPhotosVisible()); + ui->viewPhotosAction->setChecked(M_PREFS->getPhotosVisible()); + invalidateView(); +} + +void MainWindow::on_viewShowLatLonGridAction_triggered() +{ + M_PREFS->setLatLonGridVisible(!M_PREFS->getLatLonGridVisible()); + SetOptionValue(p->renderOptions, RendererOptions::LatLonGridVisible, M_PREFS->getLatLonGridVisible()); + ui->viewShowLatLonGridAction->setChecked(M_PREFS->getLatLonGridVisible()); + invalidateView(); +} + +void MainWindow::on_viewStyleBackgroundAction_triggered() +{ + M_PREFS->setBackgroundVisible(!M_PREFS->getBackgroundVisible()); + SetOptionValue(p->renderOptions, RendererOptions::BackgroundVisible, M_PREFS->getBackgroundVisible()); + ui->viewStyleBackgroundAction->setChecked(M_PREFS->getBackgroundVisible()); + invalidateView(); +} + +void MainWindow::on_viewStyleForegroundAction_triggered() +{ + M_PREFS->setForegroundVisible(!M_PREFS->getForegroundVisible()); + SetOptionValue(p->renderOptions, RendererOptions::ForegroundVisible, M_PREFS->getForegroundVisible()); + ui->viewStyleForegroundAction->setChecked(M_PREFS->getForegroundVisible()); + invalidateView(); +} + +void MainWindow::on_viewStyleTouchupAction_triggered() +{ + M_PREFS->setTouchupVisible(!M_PREFS->getTouchupVisible()); + SetOptionValue(p->renderOptions, RendererOptions::TouchupVisible, M_PREFS->getTouchupVisible()); + ui->viewStyleTouchupAction->setChecked(M_PREFS->getTouchupVisible()); + invalidateView(); +} + +void MainWindow::on_viewNamesAction_triggered() +{ + M_PREFS->setNamesVisible(!M_PREFS->getNamesVisible()); + SetOptionValue(p->renderOptions, RendererOptions::NamesVisible, M_PREFS->getNamesVisible()); + ui->viewNamesAction->setChecked(M_PREFS->getNamesVisible()); + invalidateView(); +} + +void MainWindow::on_viewVirtualNodesAction_triggered() +{ + M_PREFS->setVirtualNodesVisible(!M_PREFS->getVirtualNodesVisible()); + SetOptionValue(p->renderOptions, RendererOptions::VirtualNodesVisible, M_PREFS->getVirtualNodesVisible()); + ui->viewVirtualNodesAction->setChecked(M_PREFS->getVirtualNodesVisible()); + invalidateView(); +} + +void MainWindow::on_viewTrackPointsAction_triggered() +{ + M_PREFS->setTrackPointsVisible(!M_PREFS->getTrackPointsVisible()); + SetOptionValue(p->renderOptions, RendererOptions::NodesVisible, M_PREFS->getTrackPointsVisible()); + ui->viewTrackPointsAction->setChecked(M_PREFS->getTrackPointsVisible()); + invalidateView(); +} + +void MainWindow::on_viewTrackSegmentsAction_triggered() +{ + M_PREFS->setTrackSegmentsVisible(!M_PREFS->getTrackSegmentsVisible()); + SetOptionValue(p->renderOptions, RendererOptions::TrackSegmentVisible, M_PREFS->getTrackSegmentsVisible()); + ui->viewTrackSegmentsAction->setChecked(M_PREFS->getTrackSegmentsVisible()); + invalidateView(); +} + +void MainWindow::on_viewRelationsAction_triggered() +{ + M_PREFS->setRelationsVisible(!M_PREFS->getRelationsVisible()); + SetOptionValue(p->renderOptions, RendererOptions::RelationsVisible, M_PREFS->getRelationsVisible()); + ui->viewRelationsAction->setChecked(M_PREFS->getRelationsVisible()); + invalidateView(); +} + +void MainWindow::on_viewGotoAction_triggered() +{ + GotoDialog* Dlg = new GotoDialog(theView, this); + if (Dlg->exec() == QDialog::Accepted) { + if (!Dlg->newViewport().isNull() && !Dlg->newViewport().isEmpty()) { + theView->setViewport(Dlg->newViewport(), theView->rect()); + invalidateView(); + } + } + delete Dlg; +} + +void MainWindow::on_viewArrowsNeverAction_triggered(bool checked) +{ + if (checked) { + M_PREFS->setDirectionalArrowsVisible(RendererOptions::ArrowsNever); + p->renderOptions.arrowOptions = RendererOptions::ArrowsNever; + invalidateView(); + } +} + +void MainWindow::on_viewArrowsOnewayAction_triggered(bool checked) +{ + if (checked) { + M_PREFS->setDirectionalArrowsVisible(RendererOptions::ArrowsOneway); + p->renderOptions.arrowOptions = RendererOptions::ArrowsOneway; + invalidateView(); + } +} + +void MainWindow::on_viewArrowsAlwaysAction_triggered(bool checked) +{ + if (checked) { + M_PREFS->setDirectionalArrowsVisible(RendererOptions::ArrowsAlways); + p->renderOptions.arrowOptions = RendererOptions::ArrowsAlways; + invalidateView(); + } +} + +void MainWindow::on_fileNewAction_triggered() +{ + launchInteraction(0); + p->theProperties->setSelection(0); + + if (theDocument) + saveTemplateDocument(TEMPLATE_DOCUMENT); + + if (!theDocument || !hasUnsavedChanges() || mayDiscardUnsavedChanges(this)) { + p->theFeats->invalidate(); + SAFE_DELETE(theDocument); + theView->setDocument(NULL); + p->latSaveDirtyLevel = 0; + g_feat_rndId = 0; + + if (M_PREFS->getHasAutoLoadDocument()) + loadTemplateDocument(M_PREFS->getAutoLoadDocumentFilename()); + else if (!g_Merk_IgnoreStartupTemplate) + loadTemplateDocument(TEMPLATE_DOCUMENT); + + if (!theDocument) { + theDocument = new Document(theLayers); + theDocument->addDefaultLayers(); + theView->projection().setProjectionType(M_PREFS->getProjectionType()); + theView->setViewport(WORLD_COORDBOX, theView->rect()); + } + theView->setDocument(theDocument); + theDocument->history().setActions(ui->editUndoAction, ui->editRedoAction, ui->fileUploadAction); + connect (theDocument, SIGNAL(historyChanged()), theDirty, SLOT(updateList())); + connect (theDocument, SIGNAL(historyChanged()), this, SIGNAL(content_changed())); + connect(theDocument, SIGNAL(imageRequested(ImageMapLayer*)), + this, SLOT(onImagerequested(ImageMapLayer*)), Qt::QueuedConnection); + connect(theDocument, SIGNAL(imageReceived(ImageMapLayer*)), + this, SLOT(onImagereceived(ImageMapLayer*)), Qt::QueuedConnection); + connect(theDocument, SIGNAL(loadingFinished(ImageMapLayer*)), + this, SLOT(onLoadingfinished(ImageMapLayer*)), Qt::QueuedConnection); + theDirty->updateList(); + + currentProjectFile.clear(); + setWindowTitle(QString("%1 - %2").arg(theDocument->title()).arg(p->title)); + + updateProjectionMenu(); + + emit content_changed(); + on_editPropertiesAction_triggered(); + adjustLayers(true); + } + +#ifdef GEOIMAGE + if (theGeoImage) + theGeoImage->clear(); +#endif +} + +void MainWindow::on_createDoubleWayAction_triggered() +{ + launchInteraction(new CreateDoubleWayInteraction(this)); + theInfo->setHtml(theView->interaction()->toHtml()); +} + +void MainWindow::on_createRoundaboutAction_triggered() +{ + launchInteraction(new CreateRoundaboutInteraction(this)); + theInfo->setHtml(theView->interaction()->toHtml()); +} + +namespace { + +// TODO: Move Qt4/Qt5 wrappers to a separate file. +int getInteger(QWidget* parent, const QString& title, const QString& label, int value = 0, int minimum = INT_MIN, int maximum = INT_MAX, int step = 1, bool* ok = NULL) { +#ifdef QT5 + return QInputDialog::getInt(parent, title, label, value, minimum, maximum, step, ok); +#else + return QInputDialog::getInteger(parent, title, label, value, minimum, maximum, step, ok); +#endif +} + +} + +void MainWindow::on_createPolygonAction_triggered() +{ + QList< QPair <QString, QString> > tags; + int Sides = getInteger(this, tr("Create Polygon"), tr("Specify the number of sides"), M_PREFS->getPolygonSides(), 3); + M_PREFS->setPolygonSides(Sides); + launchInteraction(new CreatePolygonInteraction(this, Sides, tags)); + theInfo->setHtml(theView->interaction()->toHtml()); +} + +void MainWindow::on_createRectangleAction_triggered() +{ + QList< QPair <QString, QString> > tags; + tags << qMakePair(QString("building"), QString("yes")); + launchInteraction(new CreatePolygonInteraction(this, 4, tags)); + theInfo->setHtml(theView->interaction()->toHtml()); +} + +void MainWindow::on_createRoadAction_triggered() +{ + Node * firstPoint = NULL; + + if (p->theProperties->selectionSize() == 1) + { + Feature * feature = p->theProperties->selection(0); + firstPoint = dynamic_cast<Node*>(feature); + } + + launchInteraction(new CreateSingleWayInteraction(this, firstPoint, false)); + theInfo->setHtml(theView->interaction()->toHtml()); +} + +void MainWindow::on_createCurvedRoadAction_triggered() +{ + launchInteraction(new CreateSingleWayInteraction(this, NULL, true)); + theInfo->setHtml(theView->interaction()->toHtml()); +} + +void MainWindow::on_createAreaAction_triggered() +{ + launchInteraction(new CreateAreaInteraction(this)); + theInfo->setHtml(theView->interaction()->toHtml()); +} + +void MainWindow::on_createNodeAction_triggered() +{ + launchInteraction(new CreateNodeInteraction(this)); + theInfo->setHtml(theView->interaction()->toHtml()); +} + +void MainWindow::on_markBridgeAction_triggered() +{ + launchInteraction(new BuildBridgeInteraction(this)); + theInfo->setHtml(theView->interaction()->toHtml()); +} + +void MainWindow::on_roadJoinAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Join Ways"), NULL); + joinRoads(theDocument, theList, p->theProperties); + if (theList->empty()) + delete theList; + else + { + theDocument->addHistory(theList); + emit content_changed(); + invalidateView(); + } +} + +void MainWindow::on_roadSplitAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Split Ways"), NULL); + splitRoads(theDocument, theList, p->theProperties); + if (theList->empty()) + delete theList; + else + { + theDocument->addHistory(theList); + emit content_changed(); + invalidateView(); + } +} + +void MainWindow::on_roadBreakAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Break Ways"), NULL); + breakRoads(theDocument, theList, p->theProperties); + if (theList->empty()) + delete theList; + else + { + theDocument->addHistory(theList); + emit content_changed(); + invalidateView(); + } +} + +void MainWindow::on_roadSimplifyAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Simplify Ways"), NULL); + qreal threshold = 3.0; // in metres; TODO: allow user-specified threshold + simplifyRoads(theDocument, theList, p->theProperties, threshold); + if (theList->empty()) + delete theList; + else + { + theDocument->addHistory(theList); + emit content_changed(); + invalidateView(); + } +} + +void MainWindow::on_featureSelectChildrenAction_triggered() +{ + QList<Feature*> theFeatures; + foreach (Feature* F, p->theProperties->selection()) { + theFeatures << F; + for (int i=0; i<F->size(); ++i) + theFeatures << F->get(i); + } + p->theProperties->setSelection(theFeatures); + p->theProperties->checkMenuStatus(); + invalidateView(); +} + +void MainWindow::on_featureSelectParentsAction_triggered() +{ + QList<Feature*> theFeatures; + foreach (Feature* F, p->theProperties->selection()) { + for (int i=0; i<F->sizeParents(); ++i) { + Feature* Feat = STATIC_CAST_FEATURE(F->getParent(i)); + theFeatures << Feat; + } + } + p->theProperties->setSelection(theFeatures); + p->theProperties->checkMenuStatus(); + invalidateView(); +} + +void MainWindow::on_featureDownloadMissingChildrenAction_triggered() +{ +#ifndef _MOBILE + QList<Feature*> toResolve; + foreach (Feature* F, p->theProperties->selection()) { + if (F->notEverythingDownloaded()) { + toResolve.push_back(F); + } + } + downloadFeatures(toResolve); +#endif +} + +void MainWindow::on_featureDeleteAction_triggered() +{ + Feature* F = p->theProperties->selection(0); + if (!F) + return; + + while (F->sizeParents()) { + Feature* p = (Feature*)(F->getParent(0)); + if (p) + p->remove(F); + } + F->layer()->deleteFeature(F); + p->theProperties->setSelection(0); + + emit content_changed(); + invalidateView(); +} + +void MainWindow::on_featureCommitAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Force Feature upload"), NULL); + commitFeatures(theDocument, theList, p->theProperties); + if (theList->empty()) + delete theList; + else + { + theDocument->addHistory(theList); + invalidateView(); + } +} + +void MainWindow::on_roadCreateJunctionAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Create Junction"), NULL); + int n = createJunction(theDocument, theList, p->theProperties, false); + if (n > 1) { + MDiscardableMessage dlg(view(), + MainWindow::tr("Multiple intersection."), + MainWindow::tr("Those roads have multiple intersections.\nDo you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?")); + if (dlg.check() != QDialog::Accepted) + return; + } + createJunction(theDocument, theList, p->theProperties, true); + + if (theList->empty()) + delete theList; + else + { + theDocument->addHistory(theList); + invalidateView(); + } +} + +void MainWindow::on_roadAddStreetNumbersAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Add Street Numbers"), NULL); + + addStreetNumbers(theDocument, theList, p->theProperties); + + if (theList->empty()) + delete theList; + else + { + theDocument->addHistory(theList); + invalidateView(); + } +} + +void MainWindow::on_roadSubdivideAction_triggered() +{ +#if QT_VERSION < 0x040500 + { + int divisions = getInteger(this, tr("Number of segments to divide into"), tr("Specify the number of segments"), 2, 99); +#else + QInputDialog *Dlg = new QInputDialog(this); + Dlg->setInputMode(QInputDialog::IntInput); + Dlg->setIntRange(2, 99); + Dlg->setLabelText(tr("Number of segments to divide into")); + if (Dlg->exec() == QDialog::Accepted) { + int divisions = Dlg->intValue(); +#endif + CommandList* theList = new CommandList(MainWindow::tr("Subdivide way into %1").arg(divisions), NULL); + subdivideRoad(theDocument, theList, p->theProperties, divisions); + if (theList->empty()) + delete theList; + else { + theDocument->addHistory(theList); + invalidateView(); + } + } +#if QT_VERSION > 0x040499 + delete Dlg; +#endif +} + +void MainWindow::on_roadAxisAlignAction_triggered() +{ + const unsigned int max_axes = 16; + bool ok; + unsigned int axes; + + axes = axisAlignGuessAxes(p->theProperties, view()->projection(), max_axes); + if (!axes) + axes = 4; + axes = getInteger(this, tr("Axis Align"), + tr("Specify the number of regular axes to align edges on (e.g. 4 for rectangular)"), + axes, 3, max_axes, 1, &ok); + if (!ok) + return; + + // Create a command description + const QString special_names[] = { + tr("triangular"), + tr("rectangular"), + tr("pentagonal"), + tr("hexagonal"), + tr("heptagonal"), + tr("octagonal"), + }; + QString command_name; + if (axes < 3 + (sizeof(special_names)/sizeof(special_names[0]))) + command_name = tr("Align onto %1 axes").arg(special_names[axes-3]); + else + command_name = tr("Align onto %1 regular axes").arg(axes); + + // Do the manipulation + CommandList* theList = new CommandList(command_name, NULL); + AxisAlignResult result = axisAlignRoads(theDocument, theList, p->theProperties, view()->projection(), axes); + if (result != AxisAlignSuccess || theList->empty()) { + if (result == AxisAlignSharpAngles) + QMessageBox::critical(this, tr("Unable to align to axes"), + tr("Align to axes operation failed. Please adjust any sharp corners and try again.")); + else if (result == AxisAlignFail) + QMessageBox::critical(this, tr("Unable to align to axes"), + tr("Align to axes operation failed and did not converge on a solution.")); + delete theList; + } else { + theDocument->addHistory(theList); + invalidateView(); + } +} + +void MainWindow::on_roadExtrudeAction_triggered() +{ + launchInteraction(new ExtrudeInteraction(this)); + theInfo->setHtml(theView->interaction()->toHtml()); +} + +void MainWindow::on_roadBingExtractAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Bing Extract"), NULL); + bingExtract(theDocument, theList, p->theProperties, theView->viewport()); + if (theList->empty()) + delete theList; + else + { + theDocument->addHistory(theList); + // theView->properties()->setSelection(F); + invalidateView(); + } +} + +void MainWindow::on_nodeAlignAction_triggered() +{ + //MapFeature* F = theView->properties()->selection(0); + CommandList* theList = new CommandList(MainWindow::tr("Align Nodes"), NULL); + alignNodes(theDocument, theList, p->theProperties); + if (theList->empty()) + delete theList; + else + { + theDocument->addHistory(theList); + // theView->properties()->setSelection(F); + invalidateView(); + } +} + +void MainWindow::on_nodeSpreadAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Spread Nodes"), NULL); + spreadNodes(theDocument, theList, p->theProperties); + if (theList->empty()) + delete theList; + else + { + theDocument->addHistory(theList); + invalidateView(); + } +} + +void MainWindow::on_nodeMergeAction_triggered() +{ + Feature* F = p->theProperties->selection(0); + CommandList* theList = new CommandList(MainWindow::tr("Merge Nodes into %1").arg(F->id().numId), F); + mergeNodes(theDocument, theList, p->theProperties); + if (theList->empty()) + delete theList; + else + { + theDocument->addHistory(theList); + p->theProperties->setSelection(F); + invalidateView(); + } +} + +void MainWindow::on_nodeDetachAction_triggered() +{ + Feature* F = p->theProperties->selection(0); + CommandList* theList = new CommandList(MainWindow::tr("Detach Node %1").arg(F->id().numId), F); + detachNode(theDocument, theList, p->theProperties); + if (theList->empty()) + delete theList; + else + { + theDocument->addHistory(theList); + p->theProperties->setSelection(F); + invalidateView(); + } +} + +void MainWindow::on_relationAddMemberAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Add member to relation"), NULL); + addRelationMember(theDocument, theList, p->theProperties); + if (theList->empty()) + delete theList; + else { + theDocument->addHistory(theList); + invalidateView(); + } +} + +void MainWindow::on_relationRemoveMemberAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Remove member from relation"), NULL); + removeRelationMember(theDocument, theList, p->theProperties); + if (theList->empty()) + delete theList; + else { + theDocument->addHistory(theList); + invalidateView(); + } +} + +void MainWindow::on_relationAddToMultipolygonAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Add to Multipolygon"), NULL); + addToMultipolygon(theDocument, theList, p->theProperties); + if (theList->empty()) + delete theList; + else { + theDocument->addHistory(theList); + invalidateView(); + } +} + +void MainWindow::on_areaJoinAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Join areas"), NULL); + joinAreas(theDocument, theList, p->theProperties); + if (theList->empty()) + delete theList; + else { + theDocument->addHistory(theList); + invalidateView(); + } +} + +void MainWindow::on_areaSplitAction_triggered() +{ + CommandList* theList = new CommandList(MainWindow::tr("Split area"), NULL); + splitArea(theDocument, theList, p->theProperties); + if (theList->empty()) + delete theList; + else { + theDocument->addHistory(theList); + invalidateView(); + } +} + +void MainWindow::on_areaTerraceAction_triggered() +{ + TerraceDialog* Dlg = new TerraceDialog(this); + if (Dlg->exec() == QDialog::Accepted) { + int divisions = Dlg->numHouses(); + CommandList* theList = new CommandList(MainWindow::tr("Terrace area into %1").arg(divisions), NULL); + terraceArea(theDocument, theList, p->theProperties, divisions); + // Add the house numbers to the houses in the selection + if (Dlg->hasHouseNumbers()) { + QStringList numbers = Dlg->houseNumbers(); + QList<Feature*> areas = p->theProperties->selection(); + int i = 0; + foreach (Feature* area, areas) { + if (i >= numbers.size()) + break; + if (!numbers[i].isEmpty()) + theList->add(new SetTagCommand(area, "addr:housenumber", numbers[i])); + ++i; + } + } + if (theList->empty()) + delete theList; + else { + theDocument->addHistory(theList); + invalidateView(); + } + } + delete Dlg; +} + +void MainWindow::on_createRelationAction_triggered() +{ + Relation* R = g_backend.allocRelation(document()->getDirtyOrOriginLayer()); + CommandList* theList = new CommandList(MainWindow::tr("Create Relation %1").arg(R->description()), R); + theList->add( + new AddFeatureCommand(document()->getDirtyOrOriginLayer(), R, true)); + for (int i = 0; i < p->theProperties->selectionSize(); ++i) + theList->add(new RelationAddFeatureCommand(R, QString(), p->theProperties->selection(i))); + theDocument->addHistory(theList); + p->theProperties->setSelection(R); + invalidateView(); +} + +void MainWindow::on_editMapStyleAction_triggered() +{ + PaintStyleEditor* dlg = new PaintStyleEditor(this, M_STYLE->getGlobalPainter(), M_STYLE->getPainters()); + connect(dlg, SIGNAL(stylesApplied(GlobalPainter*, QList<Painter>* )), this, SLOT(applyPainters(GlobalPainter*, QList<Painter>* ))); + GlobalPainter saveGlobalPainter = M_STYLE->getGlobalPainter(); + QList<Painter> savePainters = M_STYLE->getPainters(); + if (dlg->exec() == QDialog::Accepted) { + applyPainters(&dlg->theGlobalPainter, &dlg->thePainters); + } else { + /* FIXME: Is it really needed? The painter should be already set up. */ + applyPainters(&saveGlobalPainter, &savePainters); + } + + delete dlg; +} + +void MainWindow::applyStyles(QString NewStyle) +{ + if (NewStyle != M_PREFS->getDefaultStyle()) + { + if (M_STYLE->isDirty() && !mayDiscardStyleChanges(this)) { + on_mapStyleSaveAction_triggered(); + } + M_PREFS->setDefaultStyle(NewStyle); + M_STYLE->loadPainters(M_PREFS->getDefaultStyle()); + theDocument->setPainters(M_STYLE->getPainters()); + invalidateView(false); + } +} + +void MainWindow::applyPainters(GlobalPainter* theGlobalPainter, QList<Painter>* thePainters) +{ + M_STYLE->setGlobalPainter(*theGlobalPainter); + M_STYLE->setPainters(*thePainters); + + theDocument->setPainters(*thePainters); + invalidateView(false); +} + +//MapLayer* MainWindow::activeLayer() +//{ +//// return theLayers->activeLayer(); +// //The "active" layer is always the dirty layer +// return theDocument->getDirtyLayer(); +//} + +MapView* MainWindow::view() +{ + return theView; +} + +void MainWindow::on_mapStyleSaveAction_triggered() +{ + QString f = M_STYLE->getFilename(); + if (f.isEmpty() || f.startsWith(":") || f.startsWith("qrc:")) { + on_mapStyleSaveAsAction_triggered(); + return; + } + M_STYLE->savePainters(f); +} + +void MainWindow::on_mapStyleSaveAsAction_triggered() +{ + QString f; + QFileDialog dlg(this, tr("Save map style"), M_PREFS->getCustomStyle(), tr("Merkaartor map style (*.mas)")); + dlg.setFileMode(QFileDialog::AnyFile); + dlg.setDefaultSuffix("mas"); + dlg.setAcceptMode(QFileDialog::AcceptSave); + + if (dlg.exec()) { + if (dlg.selectedFiles().size()) + f = dlg.selectedFiles()[0]; + } + if (!f.isNull()) { + M_STYLE->savePainters(f); + } + updateStyleMenu(); +} + +void MainWindow::on_mapStyleLoadAction_triggered() +{ + if (M_STYLE->isDirty() && !mayDiscardStyleChanges(this)) { + on_mapStyleSaveAction_triggered(); + } + + QString f = QFileDialog::getOpenFileName(this, tr("Load map style"), QString(), + tr("Supported formats")+" (*.mas *.css)\n" \ + + tr("Merkaartor map style (*.mas)\n") + + tr("MapCSS stylesheet (*.css)")); + if (!f.isNull()) { + if (f.endsWith("css")) + MapCSSPaintstyle::instance()->loadPainters(f); + else { + M_STYLE->loadPainters(f); + document()->setPainters(M_STYLE->getPainters()); + invalidateView(); + } + } +} + +void MainWindow::on_toolsWMSServersAction_triggered() +{ + WMSPreferencesDialog* WMSPref; + WMSPref = new WMSPreferencesDialog(); + if (WMSPref->exec() == QDialog::Accepted) { + for (LayerIterator<ImageMapLayer*> ImgIt(theDocument); !ImgIt.isEnd(); ++ImgIt) + ImgIt.get()->updateWidget(); + adjustLayers(true); + } +} + +void MainWindow::on_toolsTMSServersAction_triggered() +{ + TMSPreferencesDialog* TMSPref; + TMSPref = new TMSPreferencesDialog(); + if (TMSPref->exec() == QDialog::Accepted) { + for (LayerIterator<ImageMapLayer*> ImgIt(theDocument); !ImgIt.isEnd(); ++ImgIt) + ImgIt.get()->updateWidget(); + adjustLayers(true); + } +} + +void MainWindow::on_toolsProjectionsAction_triggered() +{ + ProjPreferencesDialog* prefDlg = new ProjPreferencesDialog(); + if (prefDlg->exec() == QDialog::Accepted) { + updateProjectionMenu(); + } +} + +void MainWindow::on_toolsFiltersAction_triggered() +{ + FilterPreferencesDialog* prefDlg = new FilterPreferencesDialog(); + prefDlg->exec(); +// if (prefDlg->exec() == QDialog::Accepted) { +// updateFilterMenu(); +// } +} + +void MainWindow::on_toolsResetDiscardableAction_triggered() +{ + QSettings* Sets = M_PREFS->getQSettings(); + Sets->remove("DiscardableDialogs"); +} + +void MainWindow::on_toolsRebuildHistoryAction_triggered() +{ + QMessageBox::StandardButton ret = QMessageBox::warning(this, tr("Rebuild History"), tr("An attempt will be made to rebuild the history.\nNo guarantee, though, and no Undo.\nAre you sure you want to try this? ") + , QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if (ret == QMessageBox::Yes) { + theDocument->rebuildHistory(); + theDirty->updateList(); + } +} + +namespace { + +void CollectActions(QList<QAction*>& collectedActions, const QWidget* widget) { + foreach(QAction* a, widget->actions()) { + if (!a->isSeparator() && !a->menu()) + collectedActions << a; + } +} + +} // namespace + +void MainWindow::on_toolsShortcutsAction_triggered() +{ + QList<QAction*> theActions; + + CollectActions(theActions, ui->menuFile); + CollectActions(theActions, ui->menuEdit); + CollectActions(theActions, ui->menuView); + CollectActions(theActions, ui->menu_Show); + CollectActions(theActions, ui->menuShow_directional_Arrows); + CollectActions(theActions, ui->menuGps); + CollectActions(theActions, ui->menuLayers); + CollectActions(theActions, ui->menuCreate); + CollectActions(theActions, ui->menu_Feature); + CollectActions(theActions, ui->menu_Node); + CollectActions(theActions, ui->menuRoad); + CollectActions(theActions, ui->menuRelation); + CollectActions(theActions, ui->menuTools); + CollectActions(theActions, ui->menuWindow); + CollectActions(theActions, ui->menuHelp); + + ActionsDialog(theActions, this).exec(); +} + +void MainWindow::toolsPreferencesAction_triggered(bool focusData) +{ + PreferencesDialog* Pref = new PreferencesDialog(this); + if (focusData) + Pref->tabPref->setCurrentWidget(Pref->tabData); + else + Pref->tabPref->setCurrentIndex(p->lastPrefTabIndex); + connect (Pref, SIGNAL(preferencesChanged(PreferencesDialog*)), this, SLOT(preferencesChanged(PreferencesDialog*))); + Pref->exec(); + p->lastPrefTabIndex = Pref->tabPref->currentIndex(); +} + +void MainWindow::preferencesChanged(PreferencesDialog* prefs) +{ + QString qVer = QString(qVersion()).replace('.', QChar()); + int iQVer = qVer.toInt(); + if (iQVer < 451) { + QApplication::setStyle(QStyleFactory::create("skulpture")); + } else { + if (!M_PREFS->getMerkaartorStyle()) { + if (QApplication::style()->objectName() != p->defStyle) + QApplication::setStyle(p->defStyle); + } else { + QApplication::setStyle(QStyleFactory::create(M_PREFS->getMerkaartorStyleString())); + } + } + ui->mnuProjections->menuAction()->setEnabled(true); + if (M_PREFS->getZoomBoris()) { + ImageMapLayer* l = NULL; + for (LayerIterator<ImageMapLayer*> ImgIt(theDocument); !ImgIt.isEnd(); ++ImgIt) { + l = ImgIt.get(); + break; + } + if (l && l->isTiled()) { + ui->mnuProjections->menuAction()->setEnabled(false); + view()->projection().setProjectionType(l->projection()); + view()->zoom(0.99, view()->rect().center()); + } + } + if (M_PREFS->getLocalServer()) { + p->theListeningServer->listen(); + } else { + p->theListeningServer->close(); + } + + applyStyles(prefs->cbStyles->itemData(prefs->cbStyles->currentIndex()).toString()); + updateStyleMenu(); + + updateMenu(); + launchInteraction(new EditInteraction(this)); + invalidateView(false); +} + +bool MainWindow::getPathToSave(const QString& title, const QString& extension, const QString& allowedTypes, QString* path) { + const QString defaultFile = QString("%1/%2.%3").arg(M_PREFS->getworkingdir()).arg(tr("untitled")).arg(extension); + QFileDialog dlg(this, title, defaultFile, allowedTypes); + dlg.setFileMode(QFileDialog::AnyFile); + dlg.setDefaultSuffix(extension); + dlg.setAcceptMode(QFileDialog::AcceptSave); + + if (dlg.exec() && dlg.selectedFiles().size() && !dlg.selectedFiles()[0].isEmpty()) { + *path = dlg.selectedFiles()[0]; + return true; + } + return false; +} + +void MainWindow::on_fileSaveAsAction_triggered() +{ + QString path; + if (getPathToSave(tr("Save Merkaartor document"), "mdc", tr("Merkaartor documents Files (*.mdc)") + "\n" + tr("All Files (*)"), &path)) { + saveDocument(path); + M_PREFS->addRecentOpen(path); + updateRecentOpenMenu(); + } +} + +void MainWindow::on_fileSaveAsTemplateAction_triggered() +{ + QString path; + if (getPathToSave(tr("Save Merkaartor template document"), "mdc", tr("Merkaartor documents Files (*.mdc)") + "\n" + tr("All Files (*)"), &path)) { + saveTemplateDocument(path); + } +} + +void MainWindow::on_fileSaveAction_triggered() +{ + if (!currentProjectFile.isEmpty()) { + saveDocument(currentProjectFile); + } else { + on_fileSaveAsAction_triggered(); + } +} + +void MainWindow::doSaveDocument(QFile* file, bool asTemplate) +{ + startBusyCursor(); + QXmlStreamWriter stream(file); + stream.setAutoFormatting(true); + stream.setAutoFormattingIndent(2); + stream.writeStartDocument(); + stream.writeStartElement("MerkaartorDocument"); + stream.writeAttribute("version", "1.2"); + stream.writeAttribute("creator", QString("%1").arg(p->title)); + + QProgressDialog progress("Saving document...", "Cancel", 0, 0); + progress.setWindowModality(Qt::WindowModal); + + theDocument->toXML(stream, asTemplate, &progress); + theView->toXML(stream); + + stream.writeEndDocument(); + + progress.setValue(progress.maximum()); + + theDocument->setTitle(QFileInfo(currentProjectFile).fileName()); + setWindowTitle(QString("%1 - %2").arg(theDocument->title()).arg(p->title)); + + endBusyCursor(); +} + +void MainWindow::saveDocument(const QString& fn) +{ + QFile file(fn); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QMessageBox::critical(this, tr("Unable to open save file"), tr("%1 could not be opened for writing.").arg(fn)); + on_fileSaveAsAction_triggered(); + return; + } + + doSaveDocument(&file); + file.close(); + currentProjectFile = fn; + + p->latSaveDirtyLevel = theDocument->getDirtySize(); +} + +void MainWindow::saveTemplateDocument(const QString& fn) +{ + QFile file(fn); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QMessageBox::critical(this, tr("Unable to open save template document"), tr("%1 could not be opened for writing.").arg(fn)); + return; + } + + doSaveDocument(&file, true); + file.close(); +} + +Document* MainWindow::doLoadDocument(QFile* file) +{ + QProgressDialog progress("Loading document...", "Cancel", 0, 0, this); + progress.setWindowModality(Qt::WindowModal); + + QXmlStreamReader stream(file); + while (stream.readNext() && stream.tokenType() != QXmlStreamReader::Invalid && stream.tokenType() != QXmlStreamReader::StartElement) + ; + if (stream.tokenType() != QXmlStreamReader::StartElement || stream.name() != "MerkaartorDocument") { + QMessageBox::critical(this, tr("Invalid file"), tr("%1 is not a valid Merkaartor document.").arg(file->fileName())); + return NULL; + } + double version = stream.attributes().value("version").toString().toDouble(); + + progress.setMaximum(file->size()); + + Document* newDoc = NULL; + + if (version < 2.) { + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "MapDocument") { + newDoc = Document::fromXML(QFileInfo(*file).fileName(), stream, version, theLayers, &progress); + + if (progress.wasCanceled()) + break; + } else if (stream.name() == "MapView") { + view()->fromXML(stream); + } else if (!stream.isWhitespace()) { + qDebug() << "Main: logic error: " << stream.name() << " : " << stream.tokenType() << " (" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + + if (progress.wasCanceled()) + break; + + stream.readNext(); + } + } + progress.reset(); + + updateProjectionMenu(); + +#ifdef GEOIMAGE + if (theGeoImage) + theGeoImage->clear(); +#endif + return newDoc; +} + +void MainWindow::loadDocument(QString fn) +{ + QFile file(fn); + if (!file.open(QIODevice::ReadOnly)) { + QMessageBox::critical(this, tr("Invalid file"), tr("%1 could not be opened.").arg(fn)); + return; + } + + Document* newDoc = doLoadDocument(&file); + file.close(); + + if (newDoc) { + theView->stopRendering(); + p->theProperties->setSelection(0); + p->theFeats->invalidate(); + delete theDocument; + theDocument = newDoc; + theView->setDocument(theDocument); + on_editPropertiesAction_triggered(); + theDocument->history().setActions(ui->editUndoAction, ui->editRedoAction, ui->fileUploadAction); + connect (theDocument, SIGNAL(historyChanged()), theDirty, SLOT(updateList())); + connect (theDocument, SIGNAL(historyChanged()), this, SIGNAL(content_changed())); + connect(theDocument, SIGNAL(imageRequested(ImageMapLayer*)), + this, SLOT(onImagerequested(ImageMapLayer*)), Qt::QueuedConnection); + connect(theDocument, SIGNAL(imageReceived(ImageMapLayer*)), + this, SLOT(onImagereceived(ImageMapLayer*)), Qt::QueuedConnection); + connect(theDocument, SIGNAL(loadingFinished(ImageMapLayer*)), + this, SLOT(onLoadingfinished(ImageMapLayer*)), Qt::QueuedConnection); + theDirty->updateList(); + currentProjectFile = fn; + setWindowTitle(QString("%1 - %2").arg(theDocument->title()).arg(p->title)); + p->latSaveDirtyLevel = theDocument->getDirtySize(); + theView->resumeRendering(); + } + + M_PREFS->addRecentOpen(fn); + updateRecentOpenMenu(); + + emit content_changed(); +} + +void MainWindow::loadTemplateDocument(QString fn) +{ + Document* newDoc = NULL; + QFile file(fn); + if (file.open(QIODevice::ReadOnly)) { + newDoc = doLoadDocument(&file); + file.close(); + } + + if (newDoc) { + theDocument = newDoc; + theDocument->setTitle(tr("untitled")); + } +} + +void MainWindow::on_exportOSMAction_triggered() +{ + QList<Feature*> theFeatures; + + createProgressDialog(); + if (!selectExportedFeatures(theFeatures)) + return; + + QString path; + if (getPathToSave(tr("Export OSM"), "osm", tr("OSM Files (*.osm)") + "\n" + tr("All Files (*)"), &path)) { + QFile file(path); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) + return; + + theDocument->exportOSM(this, &file, theFeatures); + file.close(); + } + deleteProgressDialog(); +} + +void MainWindow::on_exportOSCAction_triggered() +{ +#ifndef FRISIUS_BUILD + QString path; + if (getPathToSave(tr("Export osmChange"), "osc", tr("osmChange Files (*.osc)") + "\n" + tr("All Files (*)"), &path)) { + startBusyCursor(); + ImportExportOSC osc(document()); + if (osc.saveFile(path)) { + osc.export_(); + } + endBusyCursor(); + } +#endif +} + + +void MainWindow::on_exportGPXAction_triggered() +{ + QList<Feature*> theFeatures; + + createProgressDialog(); + if (!selectExportedFeatures(theFeatures)) + return; + + QString path; + if (getPathToSave(tr("Export GPX"), "gpx", tr("GPX Files (*.gpx)") + "\n" + tr("All Files (*)"), &path)) { + startBusyCursor(); + ExportGPX gpx(document()); + if (gpx.saveFile(path)) { + gpx.export_(theFeatures); + } + endBusyCursor(); + } + deleteProgressDialog(); +} + +void MainWindow::on_exportGDALAction_triggered() +{ + QList<Feature*> theFeatures; + + createProgressDialog(); + if (!selectExportedFeatures(theFeatures)) + return; + startBusyCursor(); + ImportExportGdal gdal(document()); + gdal.export_(theFeatures); + endBusyCursor(); + + deleteProgressDialog(); +} + +void MainWindow::on_exportKMLAction_triggered() +{ + QList<Feature*> theFeatures; + + createProgressDialog(); + if (!selectExportedFeatures(theFeatures)) + return; + + QString path; + if (getPathToSave(tr("Export KML"), "kml", tr("KML Files (*.kml)") + "\n" + tr("All Files (*)"), &path)) { + startBusyCursor(); + ImportExportKML kml(document()); + if (kml.saveFile(path)) { + kml.export_(theFeatures); + } + endBusyCursor(); + } + deleteProgressDialog(); +} + +bool MainWindow::selectExportedFeatures(QList<Feature*>& theFeatures) +{ + QDialog dlg(this); + Ui::ExportDialog dlgExport; + dlgExport.setupUi(&dlg); + switch(M_PREFS->getExportType()) { + case Export_All: + dlgExport.rbAll->setChecked(true); + break; + case Export_Viewport: + dlgExport.rbViewport->setChecked(true); + break; + case Export_Selected: + dlgExport.rbSelected->setChecked(true); + break; + default: + return false; + + } + if (dlg.exec()) { + if (dlgExport.rbAll->isChecked()) { + for (VisibleFeatureIterator i(document()); !i.isEnd(); ++i) { + if (i.get()->notEverythingDownloaded()) + continue; + + theFeatures.append(i.get()); + } + M_PREFS->setExportType(Export_All); + return true; + } + else if (dlgExport.rbViewport->isChecked()) { + CoordBox aCoordBox = view()->viewport(); + + theFeatures.clear(); + for (VisibleFeatureIterator i(document()); !i.isEnd(); ++i) { + if (i.get()->notEverythingDownloaded()) + continue; + + if (Node* P = dynamic_cast<Node*>(i.get())) { + if (aCoordBox.contains(P->position())) { + theFeatures.append(P); + } + } else + if (Way* G = dynamic_cast<Way*>(i.get())) { + if (aCoordBox.intersects(G->boundingBox())) { + for (int j=0; j < G->size(); j++) { + if (Node* P = dynamic_cast<Node*>(G->get(j))) + if (!aCoordBox.contains(P->position())) + theFeatures.append(P); + } + theFeatures.append(G); + } + } else + //FIXME Not working for relation (not made of point?) + if (Relation* G = dynamic_cast<Relation*>(i.get())) { + if (aCoordBox.intersects(G->boundingBox())) { + for (int j=0; j < G->size(); j++) { + if (Way* R = dynamic_cast<Way*>(G->get(j))) { + if (!aCoordBox.contains(R->boundingBox())) { + for (int k=0; k < R->size(); k++) { + if (Node* P = dynamic_cast<Node*>(R->get(k))) + if (!aCoordBox.contains(P->position())) + theFeatures.append(P); + } + theFeatures.append(R); + } + } + } + theFeatures.append(G); + } + } + } + M_PREFS->setExportType(Export_Viewport); + } + else if (dlgExport.rbSelected->isChecked()) { + theFeatures = p->theProperties->selection(); + M_PREFS->setExportType(Export_Selected); + } + + QProgressDialog* dlg = getProgressDialog(); + if (dlg) + dlg->setWindowTitle(tr("Feature extraction")); + + QProgressBar* Bar = getProgressBar(); + if (Bar) { + Bar->setTextVisible(false); + Bar->setMaximum(theFeatures.size()); + } + + QLabel* Lbl = getProgressLabel(); + if (Lbl) + Lbl->setText(tr("Extracting features...")); + + if (dlg) + dlg->show(); + + theFeatures = document()->exportCoreOSM(theFeatures, false, dlg); + return true; + } + return false; +} + +void MainWindow::on_editSelectAction_triggered() +{ + SelectionDialog* Sel = new SelectionDialog(this); + + if (Sel->exec() == QDialog::Accepted) { + QString out; + int idx = 0; + QString in = Sel->edTagQuery->text(); + QList<TagSelector*> terms; + while (idx < in.length()) { + TagSelector* t = TagSelector::parse(in, idx); + if (!t) break; + terms.append(t); + } + + if (terms.count()) { + out += terms[terms.count()-1]->asExpression(true); + for (int i=terms.count()-2; i>=0; --i) { + out += " and parent("; + out += terms[i]->asExpression(true); + out += ") "; + } + } else + return; + + qDebug() << out; + TagSelector* tsel = TagSelector::parse(out); + if (!tsel) + return; + qDebug() << tsel->asExpression(false); + + int selMaxResult = Sel->sbMaxResult->value(); + + QList <Feature *> selection; + int added = 0; + for (VisibleFeatureIterator i(theDocument); !i.isEnd() && (!selMaxResult || added < selMaxResult); ++i) { + Feature* F = i.get(); + if (tsel->matches(F, theView->pixelPerM())) { + selection.push_back(F); + ++added; + } + } + p->theProperties->setMultiSelection(selection); + p->theProperties->checkMenuStatus(); + } +} + +void MainWindow::closeEvent(QCloseEvent * event) +{ + if (hasUnsavedChanges() && !mayDiscardUnsavedChanges(this)) { + event->ignore(); + return; + } + + if (M_STYLE->isDirty() && !mayDiscardStyleChanges(this)) { + on_mapStyleSaveAction_triggered(); + } + + M_PREFS->saveMainWindowState( this ); +// M_PREFS->setInitialPosition(theView); + M_PREFS->setworkingdir(QDir::currentPath()); + + saveTemplateDocument(TEMPLATE_DOCUMENT); + M_PREFS->save(); + QMainWindow::closeEvent(event); +} + +QMenu *MainWindow::createPopupMenu() +{ + QMenu* mnu = QMainWindow::createPopupMenu(); + mnu->addSeparator(); + + QAction* toolbarstyle = new QAction(tr("Hide tool buttons labels"), mnu); + toolbarstyle->setCheckable(true); + toolbarstyle->setChecked(M_PREFS->getHideToolbarLabels()); + connect(toolbarstyle, SIGNAL(triggered()), SLOT(toggleButtonStyle())); + mnu->addAction(toolbarstyle); + + return mnu; +} + +void MainWindow::updateBookmarksMenu() +{ + for(int i=ui->menuBookmarks->actions().count()-1; i > 2 ; i--) { + ui->menuBookmarks->removeAction(ui->menuBookmarks->actions()[3]); + } + + BookmarkListIterator it(*(M_PREFS->getBookmarks())); + while (it.hasNext()) { + it.next(); + if (it.value().deleted == false) { + QAction* a = new QAction(it.key(), ui->menuBookmarks); + ui->menuBookmarks->addAction(a); + } + } +} + +void MainWindow::updateRecentOpenMenu() +{ + for(int i=ui->menuRecentOpen->actions().count()-1; i >= 0; i--) { + ui->menuRecentOpen->removeAction(ui->menuRecentOpen->actions()[0]); + } + + if (!M_PREFS->getRecentOpen().size()) { + ui->menuRecentOpen->setEnabled(false); + return; + } + + ui->menuRecentOpen->setEnabled(true); + QStringList RecentOpen = M_PREFS->getRecentOpen(); + for (int i=0; i<RecentOpen.size(); i++) { + QAction* a = new QAction(RecentOpen[i], ui->menuRecentOpen); + ui->menuRecentOpen->addAction(a); + } +} + +void MainWindow::updateRecentImportMenu() +{ + for(int i=ui->menuRecentImport->actions().count()-1; i >= 0; i--) { + ui->menuRecentImport->removeAction(ui->menuRecentImport->actions()[0]); + } + + if (!M_PREFS->getRecentImport().size()) { + ui->menuRecentImport->setEnabled(false); + return; + } + + ui->menuRecentImport->setEnabled(true); + QStringList RecentImport = M_PREFS->getRecentImport(); + for (int i=0; i<RecentImport.size(); i++) { + QAction* a = new QAction(RecentImport[i], ui->menuRecentImport); + ui->menuRecentImport->addAction(a); + } +} + +void MainWindow::updateProjectionMenu() +{ +#ifndef _MOBILE + SAFE_DELETE(p->projActgrp) + p->projActgrp = new QActionGroup(this); + bool projFound = false; + foreach (ProjectionItem it, *M_PREFS->getProjectionsList()->getProjections()) { + if (it.deleted) + continue; + QAction* a = new QAction(it.name, p->projActgrp); + a->setCheckable (true); + if (it.name.contains(theView->projection().getProjectionType(), Qt::CaseInsensitive)) { + a->setChecked(true); + projFound = true; + } + ui->mnuProjections->addAction(a); + } + if (!projFound) { + QAction* a = new QAction(theView->projection().getProjectionType(), p->projActgrp); + a->setCheckable (true); + a->setChecked(true); + ui->mnuProjections->addAction(a); + M_PREFS->getProjectionsList()->addProjection(ProjectionItem(theView->projection().getProjectionType(), theView->projection().getProjectionProj4())); + } + connect (ui->mnuProjections, SIGNAL(triggered(QAction *)), this, SLOT(projectionTriggered(QAction *))); +#endif + ui->mnuProjections->menuAction()->setEnabled(true); + if (M_PREFS->getZoomBoris() && theDocument) { + ImageMapLayer* l = NULL; + for (LayerIterator<ImageMapLayer*> ImgIt(theDocument); !ImgIt.isEnd(); ++ImgIt) { + l = ImgIt.get(); + break; + } + if (l && l->isTiled()) + ui->mnuProjections->menuAction()->setEnabled(false); + } +} + +void MainWindow::updateStyleMenu() +{ + for(int i=ui->menuStyles->actions().count()-1; i > 4 ; i--) { + ui->menuStyles->removeAction(ui->menuStyles->actions()[5]); + } + p->theStyle->clearItems(); + + QActionGroup* actgrp = new QActionGroup(this); + QDir intStyles(BUILTIN_STYLES_DIR); + for (int i=0; i < intStyles.entryList().size(); ++i) { + QAction* a = new QAction(QString(tr("%1 (int)")).arg(intStyles.entryList().at(i)), ui->menuStyles); + actgrp->addAction(a); + a->setCheckable(true); + a->setData(QVariant(intStyles.entryInfoList().at(i).absoluteFilePath())); + ui->menuStyles->addAction(a); + if (intStyles.entryInfoList().at(i).absoluteFilePath() == M_PREFS->getDefaultStyle()) + a->setChecked(true); + p->theStyle->addItem(a); + } + if (!M_PREFS->getCustomStyle().isEmpty()) { + QDir customStyles(M_PREFS->getCustomStyle(), "*.mas *.msz"); + for (int i=0; i < customStyles.entryList().size(); ++i) { + QAction* a = new QAction(customStyles.entryList().at(i), ui->menuStyles); + actgrp->addAction(a); + a->setCheckable(true); + a->setData(QVariant(customStyles.entryInfoList().at(i).absoluteFilePath())); + ui->menuStyles->addAction(a); + if (customStyles.entryInfoList().at(i).absoluteFilePath() == M_PREFS->getDefaultStyle()) + a->setChecked(true); + p->theStyle->addItem(a); + } + } +} + +void MainWindow::updateWindowMenu(bool) +{ + ui->windowPropertiesAction->setChecked(p->theProperties->isVisible()); + ui->windowLayersAction->setChecked(theLayers->isVisible()); + ui->windowInfoAction->setChecked(theInfo->isVisible()); + ui->windowDirtyAction->setChecked(theDirty->isVisible()); + ui->windowFeatsAction->setChecked(p->theFeats->isVisible()); + ui->windowGPSAction->setChecked(theGPS->isVisible()); +#ifdef GEOIMAGE + ui->windowGeoimageAction->setChecked(theGeoImage->isVisible()); +#endif + ui->windowStylesAction->setChecked(p->theStyle->isVisible()); +} + +void MainWindow::on_bookmarkAddAction_triggered() +{ + bool ok = true; + QString text; + + BookmarkList* Bookmarks = M_PREFS->getBookmarks(); + QStringList bkName; + BookmarkListIterator i(*Bookmarks); + while (i.hasNext()) { + i.next(); + if (i.value().deleted == false) + bkName.append(i.key()); + } + while (ok) { + text = QInputDialog::getItem(this, MainWindow::tr("Add Bookmark"), + MainWindow::tr("Specify the name of the bookmark."), bkName, 0, true, &ok); + if (ok) { + if (text.isEmpty()) { + QMessageBox::critical(this, tr("Invalid bookmark name"), + tr("Bookmark cannot be blank."), QMessageBox::Ok); + continue; + } + if (Bookmarks->contains(text)) { + QString newBk = QInputDialog::getText(this, MainWindow::tr("Warning: Bookmark name already exists"), + MainWindow::tr("Enter a new one, keep the same to overwrite or cancel."), QLineEdit::Normal, + text, &ok); + if (ok && Bookmarks->contains(newBk)) { + for(int i=2; i < ui->menuBookmarks->actions().count(); i++) { + if (ui->menuBookmarks->actions()[i]->text() == newBk) { + ui->menuBookmarks->removeAction(ui->menuBookmarks->actions()[i]); + break; + } + } + } + text = newBk; + } + break; + } + } + if (ok) { + CoordBox Clip = view()->viewport(); + Bookmark B(text, Clip); + Bookmarks->insert(text, B); + M_PREFS->save(); + + QAction* a = new QAction(text,ui-> menuBookmarks); + ui->menuBookmarks->addAction(a); + } +} + +void MainWindow::on_bookmarkRemoveAction_triggered() +{ + bool ok; + + BookmarkList* Bookmarks = M_PREFS->getBookmarks(); + QStringList bkName; + BookmarkListIterator i(*Bookmarks); + while (i.hasNext()) { + i.next(); + if (i.value().deleted == false) + bkName.append(i.key()); + } + QString item = QInputDialog::getItem(this, MainWindow::tr("Remove Bookmark"), + MainWindow::tr("Select the bookmark to remove."), bkName, 0, false, &ok); + if (ok) { + Bookmark B = Bookmarks->value(item); + B.deleted = true; + Bookmarks->insert(item, B); + M_PREFS->save(); + + for(int i=2; i < ui->menuBookmarks->actions().count(); i++) { + if (ui->menuBookmarks->actions()[i]->text() == item) { + ui->menuBookmarks->removeAction(ui->menuBookmarks->actions()[i]); + break; + } + } + } +} + +void MainWindow::bookmarkTriggered(QAction* anAction) +{ + if (anAction == ui->bookmarkAddAction || anAction == ui->bookmarkRemoveAction) + return; + BookmarkList* Bookmarks = M_PREFS->getBookmarks(); + theView->setViewport(Bookmarks->value(anAction->text()).Coordinates, theView->rect()); + + invalidateView(); +} + +void MainWindow::recentOpenTriggered(QAction* anAction) +{ + if (hasUnsavedChanges() && !mayDiscardUnsavedChanges(this)) + return; + + QString fileName(anAction->text()); + loadDocument(fileName); +} + +void MainWindow::recentImportTriggered(QAction* anAction) +{ + view()->setUpdatesEnabled(false); + theLayers->setUpdatesEnabled(false); + + QStringList fileNames(anAction->text()); + QStringList importedFiles; + importFiles(theDocument, fileNames, &importedFiles); + + foreach (QString currentFileName, importedFiles) + M_PREFS->addRecentImport(currentFileName); + + updateRecentImportMenu(); + + view()->setUpdatesEnabled(true); + theLayers->setUpdatesEnabled(true); + + on_editPropertiesAction_triggered(); + theDocument->history().setActions(ui->editUndoAction, ui->editRedoAction, ui->fileUploadAction); +} + +#ifndef _MOBILE +void MainWindow::projectionSet(const QString& prj) +{ + if(false == theView->projection().setProjectionType(prj)) + QMessageBox::critical(this, tr("Invalid projection"), tr("Unable to set projection \"%1\".").arg(prj)); + updateProjectionMenu(); + theView->setViewport(theView->viewport(), theView->rect()); + invalidateView(); +} + +void MainWindow::projectionTriggered(QAction* anAction) +{ + if(false == theView->projection().setProjectionType(anAction->text())) + QMessageBox::critical(this, tr("Invalid projection"), tr("Unable to set projection \"%1\".").arg(anAction->text())); + else + M_PREFS->setProjectionType(anAction->text()); + theView->setViewport(theView->viewport(), theView->rect()); + invalidateView(); +} +#endif + +void MainWindow::styleTriggered(QAction* anAction) +{ + if (!anAction->isCheckable()) + return; + + QString NewStyle = anAction->data().toString(); + p->theStyle->setCurrent(anAction); + applyStyles(NewStyle); +} + +void MainWindow::on_windowPropertiesAction_triggered() +{ + p->theProperties->setVisible(!p->theProperties->isVisible()); + ui->windowPropertiesAction->setChecked(p->theProperties->isVisible()); +} + +void MainWindow::on_windowLayersAction_triggered() +{ + theLayers->setVisible(!theLayers->isVisible()); + ui->windowLayersAction->setChecked(theLayers->isVisible()); +} + +void MainWindow::on_windowInfoAction_triggered() +{ + theInfo->setVisible(!theInfo->isVisible()); + ui->windowInfoAction->setChecked(theInfo->isVisible()); +} + +void MainWindow::on_windowDirtyAction_triggered() +{ + theDirty->setVisible(!theDirty->isVisible()); + ui->windowDirtyAction->setChecked(theDirty->isVisible()); +} + +void MainWindow::on_windowFeatsAction_triggered() +{ + p->theFeats->setVisible(!p->theFeats->isVisible()); + ui->windowFeatsAction->setChecked(p->theFeats->isVisible()); +} + +void MainWindow::on_windowToolbarAction_triggered() +{ + foreach (QObject* child, children()) { + if (QToolBar* tb = qobject_cast<QToolBar*>(child)) + tb->setVisible(!tb->isVisible()); + } +} + +void MainWindow::on_windowGPSAction_triggered() +{ + theGPS->setVisible(!theGPS->isVisible()); + ui->windowGPSAction->setChecked(theGPS->isVisible()); +} + +#ifdef GEOIMAGE +void MainWindow::on_windowGeoimageAction_triggered() +{ + theGeoImage->setVisible(!theGeoImage->isVisible()); + ui->windowGeoimageAction->setChecked(theGeoImage->isVisible()); +} +#endif + +void MainWindow::on_windowStylesAction_triggered() +{ + p->theStyle->setVisible(!p->theStyle->isVisible()); + ui->windowStylesAction->setChecked(p->theStyle->isVisible()); +} + +void MainWindow::on_windowHideAllAction_triggered() +{ + fullscreenState = saveState(1); + + ui->windowHideAllAction->setEnabled(false); + ui->windowHideAllAction->setVisible(false); + ui->windowShowAllAction->setEnabled(true); + ui->windowShowAllAction->setVisible(true); + +// ui->toolBar->setVisible(false); + theInfo->setVisible(false); + theDirty->setVisible(false); + p->theFeats->setVisible(false); + theLayers->setVisible(false); + p->theProperties->setVisible(false); + theGPS->setVisible(false); + p->theStyle->setVisible(false); +#ifdef GEOIMAGE + theGeoImage->setVisible(false); +#endif +} + +void MainWindow::on_windowShowAllAction_triggered() +{ + restoreState(fullscreenState, 1); + + ui->windowHideAllAction->setEnabled(true); + ui->windowHideAllAction->setVisible(true); + ui->windowShowAllAction->setEnabled(false); + ui->windowShowAllAction->setVisible(false); +} + +void MainWindow::on_gpsConnectAction_triggered() +{ +#ifndef Q_OS_SYMBIAN + QGPSDevice* aGps; + if (M_PREFS->getGpsUseGpsd()) + aGps = new QGPSDDevice("gpsd"); + else + aGps = new QGPSComDevice(M_PREFS->getGpsPort()); +#else + QGPSS60Device* aGps = new QGPSS60Device(); +#endif + if (aGps->openDevice()) { + connect(aGps, SIGNAL(updatePosition(qreal, qreal, QDateTime, qreal, qreal, qreal)), + this, SLOT(updateGpsPosition(qreal, qreal, QDateTime, qreal, qreal, qreal))); + + ui->gpsConnectAction->setEnabled(false); + ui->gpsReplayAction->setEnabled(false); + ui->gpsDisconnectAction->setEnabled(true); + ui->gpsRecordAction->setEnabled(true); + ui->gpsPauseAction->setEnabled(true); + theGPS->setGpsDevice(aGps); + theGPS->resetGpsStatus(); + theGPS->startGps(); + } else { + QMessageBox::critical(this, tr("GPS error"), + tr("Unable to open GPS port."), QMessageBox::Ok); + delete aGps; + } +} + +void MainWindow::on_gpsReplayAction_triggered() +{ + QString fileName = QFileDialog::getOpenFileName( + this, + tr("Open NMEA log file"), + "", "NMEA GPS log format (*.nmea *.nma)" ); + + if (fileName.isEmpty()) + return; + + QGPSFileDevice* aGps = new QGPSFileDevice(fileName); + if (aGps->openDevice()) { + connect(aGps, SIGNAL(updatePosition(qreal, qreal, QDateTime, qreal, qreal, qreal)), + this, SLOT(updateGpsPosition(qreal, qreal, QDateTime, qreal, qreal, qreal))); + + ui->gpsConnectAction->setEnabled(false); + ui->gpsReplayAction->setEnabled(false); + ui->gpsDisconnectAction->setEnabled(true); + ui->gpsRecordAction->setEnabled(true); + ui->gpsPauseAction->setEnabled(true); + + theGPS->setGpsDevice(aGps); + theGPS->resetGpsStatus(); + theGPS->startGps(); + } +} + +void MainWindow::on_gpsDisconnectAction_triggered() +{ + ui->gpsConnectAction->setEnabled(true); + ui->gpsReplayAction->setEnabled(true); + ui->gpsDisconnectAction->setEnabled(false); + ui->gpsRecordAction->setEnabled(false); + ui->gpsPauseAction->setEnabled(false); + ui->gpsRecordAction->setChecked(false); + ui->gpsPauseAction->setChecked(false); + + disconnect(theGPS->getGpsDevice(), SIGNAL(updatePosition(qreal, qreal, QDateTime, qreal, qreal, qreal)), + this, SLOT(updateGpsPosition(qreal, qreal, QDateTime, qreal, qreal, qreal))); + theGPS->stopGps(); + theGPS->resetGpsStatus(); +} + +void MainWindow::updateGpsPosition(qreal latitude, qreal longitude, QDateTime time, qreal altitude, qreal speed, qreal heading) +{ + Q_UNUSED(heading) + if (theGPS->getGpsDevice()) { + Coord gpsCoord(longitude,latitude); + if (M_PREFS->getGpsMapCenter()) { + CoordBox vp = theView->viewport(); + qreal lonDiff = vp.lonDiff(); + qreal latDiff = vp.latDiff(); + QRectF vpr = vp.adjusted(lonDiff / 4, -latDiff / 4, -lonDiff / 4, latDiff / 4); + if (!vpr.contains(gpsCoord)) { + theView->setCenter(gpsCoord, theView->rect()); + theView->invalidate(false, false, true); + } + } + + if (ui->gpsRecordAction->isChecked() && !ui->gpsPauseAction->isChecked()) { + TrackNode* pt = g_backend.allocTrackNode(gpsRecLayer, gpsCoord); + pt->setTime(time); + pt->setElevation(altitude); + pt->setSpeed(speed); + gpsRecLayer->add(pt); + curGpsTrackSegment->add(pt); + } + } + theView->update(); +} + +QGPS* MainWindow::gps() +{ + return theGPS; +} + +void MainWindow::on_gpsCenterAction_triggered() +{ + M_PREFS->setGpsMapCenter(!M_PREFS->getGpsMapCenter()); + ui->gpsCenterAction->setChecked(M_PREFS->getGpsMapCenter()); + invalidateView(); +} + +void MainWindow::on_gpsRecordAction_triggered() +{ + if (ui->gpsRecordAction->isChecked()) { + if (theDocument) { + QString fn = "log-" + QDateTime::currentDateTime().toString(Qt::ISODate); + fn.replace(':', '-'); + + gpsRecLayer = new TrackLayer(); + gpsRecLayer->setName(fn); + theDocument->add(gpsRecLayer); + + curGpsTrackSegment = g_backend.allocSegment(gpsRecLayer); + gpsRecLayer->add(curGpsTrackSegment); + } else { + ui->gpsRecordAction->setChecked(false); + } + } else { + ui->gpsPauseAction->setChecked(false); + } +} +void MainWindow::on_gpsPauseAction_triggered() +{ + if (ui->gpsPauseAction->isChecked()) { + if (!ui->gpsRecordAction->isChecked()) { + ui->gpsPauseAction->setChecked(false); + } + } else { + if (theDocument && ui->gpsRecordAction->isChecked()) { + curGpsTrackSegment = g_backend.allocSegment(gpsRecLayer); + gpsRecLayer->add(curGpsTrackSegment); + } + } +} + +void MainWindow::on_toolTemplatesSaveAction_triggered() +{ + QString path; + if (getPathToSave(tr("Save Tag Templates"), "mat", tr("Merkaartor tag templates (*.mat)") + "\n" + tr("All Files (*)"), &path)) { + p->theProperties->saveTemplates(path); + } +} + +void MainWindow::on_toolTemplatesMergeAction_triggered() +{ + QString fileName = QFileDialog::getOpenFileName( + this, + tr("Open Tag Templates"), + "", "Merkaartor tag templates (*.mat)" ); + + if (fileName.isEmpty()) + return; + + p->theProperties->mergeTemplates(fileName); + p->theProperties->resetValues(); +} + +void MainWindow::on_toolTemplatesLoadAction_triggered() +{ + QString fileName = QFileDialog::getOpenFileName( + this, + tr("Open Tag Templates"), + "", "Merkaartor tag templates (*.mat)" ); + + if (fileName.isEmpty()) + return; + + p->theProperties->loadTemplates(fileName); + p->theProperties->resetValues(); +} + + +#if defined(Q_OS_MAC) +QString MainWindow::macOsTranslationsPath() { + QDir resources = QDir(QCoreApplication::applicationDirPath()); + resources.cdUp(); + resources.cd("Resources"); + return resources.absolutePath(); +} +#endif + +QString MainWindow::makeAbsolute(const QString& path) { + if (QDir::isAbsolutePath(path)) + return path; + else + return QCoreApplication::applicationDirPath() + "/" + path; +} + +/* Compose the list of translation paths. */ +QStringList MainWindow::translationPaths() { + QStringList paths; + /* Try the macros first, as they are defined by the user. */ + paths << makeAbsolute(STRINGIFY(TRANSDIR_SYSTEM)); + paths << makeAbsolute(STRINGIFY(TRANSDIR_MERKAARTOR)); + paths << QCoreApplication::applicationDirPath(); + paths << QCoreApplication::applicationDirPath() + "/translations"; +#if defined(Q_OS_MAC) + paths << macOsTranslationsPath(); +#endif + paths << QLibraryInfo::location(QLibraryInfo::TranslationsPath); + return paths; +} + +bool MainWindow::tryLoadTranslator(const QString& languageFile, QTranslator* theTranslator) +{ + qDebug() << "Looking for translations file: " << languageFile; + QStringList paths = translationPaths(); + foreach (const QString &path, paths) { + qDebug() << " Trying directory " << path; + if (theTranslator->load(languageFile, path)) { + qDebug() << " Found it."; + return true; + } + } + qDebug() << " Not found."; + return false; +} + +void MainWindow::updateLanguage() +{ + if (qtTranslator) { + QCoreApplication::removeTranslator(qtTranslator); + } + if (merkaartorTranslator) { + QCoreApplication::removeTranslator(merkaartorTranslator); + } + QString language = getDefaultLanguage(); + if (language != "-" && language != "en") { + qtTranslator = new QTranslator; + const QString languagePrefix = language.left(2); + if (tryLoadTranslator("qt_"+languagePrefix, qtTranslator)) + QCoreApplication::installTranslator(qtTranslator); + + // Do not prevent Merkaartor translations to be loaded, even if there is no Qt translation for the language. + merkaartorTranslator = new QTranslator; + if (tryLoadTranslator("merkaartor_"+language, merkaartorTranslator)) + QCoreApplication::installTranslator(merkaartorTranslator); + else + statusBar()->showMessage(tr("Warning! Could not load the Merkaartor translations for the \"%1\" language. Switching to default English.").arg(language), 15000); + } + ui->retranslateUi(this); +} + +void MainWindow::updateMenu() +{ + if (M_PREFS->getOfflineMode()) { + ui->fileWorkOfflineAction->setChecked(true); + ui->fileDownloadAction->setEnabled(false); + ui->fileDownloadMoreAction->setEnabled(false); + ui->fileUploadAction->setEnabled(false); + } else { + ui->fileWorkOfflineAction->setChecked(false); + ui->fileDownloadAction->setEnabled(true); + ui->fileDownloadMoreAction->setEnabled(true); + ui->fileUploadAction->setEnabled(true); + } + + if (M_PREFS->getSeparateMoveMode()) + ui->editMoveAction->setVisible(true); + else + ui->editMoveAction->setVisible(false); +} + +void MainWindow::on_layersNewImageAction_triggered() +{ + if (theDocument) + theDocument->addImageLayer(); +} + +void MainWindow::on_layersNewDrawingAction_triggered() +{ + if (theDocument) + theDocument->addDrawingLayer(); +} + +void MainWindow::on_layersNewFilterAction_triggered() +{ + if (theDocument) + theDocument->addFilterLayer(); +} + +bool MainWindow::hasUnsavedChanges() +{ + if (!theDocument) + return false; + + if (theDocument->getDirtySize() == p->latSaveDirtyLevel) + return false; + + return true; +} + +void MainWindow::syncOSM(const QString& aWeb, const QString& aUser, const QString& aPwd) +{ +#ifndef FRISIUS_BUILD + if (checkForConflicts(theDocument)) { + QMessageBox::warning(this,tr("Unresolved conflicts"), tr("Please resolve existing conflicts first")); + return; + } + + DirtyListBuild Future; + theDocument->history().buildDirtyList(Future); + DirtyListDescriber Describer(theDocument,Future); + if (Describer.showChanges(this) && Describer.tasks()) { + Future.resetUpdates(); + DirtyListExecutorOSC Exec(theDocument,Future,aWeb,aUser,aPwd,Describer.tasks()); + if (Exec.executeChanges(this)) { + if (M_PREFS->getAutoHistoryCleanup() && !theDocument->getDirtyOrOriginLayer()->getDirtySize()) + theDocument->history().cleanup(); + + p->latSaveDirtyLevel = theDocument->getDirtySize(); + + if (!currentProjectFile.isEmpty()) { + if (M_PREFS->getAutoSaveDoc()) { + saveDocument(currentProjectFile); + } else { + if (QMessageBox::warning(this,tr("Unsaved changes"), + tr("It is strongly recommended to save the changes to your document after an upload.\nDo you want to do this now?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { + saveDocument(currentProjectFile); + + } + } + } + } + } +#endif +} + +void MainWindow::on_viewWireframeAction_toggled(bool val) +{ + M_PREFS->setWireframeView(val); + invalidateView(); +} diff --git a/src/MainWindow.h b/src/MainWindow.h new file mode 100644 index 0000000..b7a40fd --- /dev/null +++ b/src/MainWindow.h @@ -0,0 +1,350 @@ +#ifndef MERKATOR_MAINWINDOW_H_ +#define MERKATOR_MAINWINDOW_H_ + +#include "IMerkMainWindow.h" +#include "IProgressWindow.h" + +#include <QMainWindow> +#include <QtXml> +#include <QProgressBar> +#include <QLabel> + +namespace Ui { + class MainWindow; +} + +class MainWindowPrivate; +class LayerDock; +class Document; +class Layer; +class ImageMapLayer; +class MapView; +class Feature; +class PropertiesDock; +class InfoDock; +class DirtyDock; +class FeaturesDock; +class QGPS; +class GlobalPainter; +class Painter; +class TrackLayer; +class TrackSegment; +class Interaction; +class QtToolBarManager; +class PreferencesDialog; + +#ifdef GEOIMAGE +class GeoImageDock; +#endif + +class MainWindow : public QMainWindow, public IMerkMainWindow, public IProgressWindow +{ + Q_OBJECT + + friend class ActionsDialog; + friend class MerkaartorPreferences; + +public: + MainWindow(QWidget *parent = 0); + virtual ~MainWindow(); + + bool eventFilter ( QObject * watched, QEvent * event ); + +public slots: + void invalidateView(bool UpdateDock = true); + void toggleButtonStyle(); + + virtual void on_createRoundaboutAction_triggered(); + virtual void on_createPolygonAction_triggered(); + virtual void on_createRectangleAction_triggered(); + virtual void on_createDoubleWayAction_triggered(); + virtual void on_createNodeAction_triggered(); + virtual void on_markBridgeAction_triggered(); + virtual void on_createRoadAction_triggered(); + virtual void on_createCurvedRoadAction_triggered(); + virtual void on_createRelationAction_triggered(); + virtual void on_createAreaAction_triggered(); + virtual void on_editPropertiesAction_triggered(); + virtual void on_editUndoAction_triggered(); + virtual void on_editRedoAction_triggered(); + virtual void on_editMapStyleAction_triggered(); + virtual void on_editCutAction_triggered(); + virtual void on_editCopyAction_triggered(); + virtual void on_editPasteFeatureAction_triggered(); + virtual void on_editPasteOverwriteAction_triggered(); + virtual void on_editPasteMergeAction_triggered(); + + virtual void on_layersNewImageAction_triggered(); + virtual void on_layersNewDrawingAction_triggered(); + virtual void on_layersNewFilterAction_triggered(); + virtual void on_layersMapdustAction_triggered(); + + virtual void on_fileNewAction_triggered(); + virtual void on_fileDownloadAction_triggered(); + virtual void on_fileDownloadMoreAction_triggered(); + virtual void on_fileUploadAction_triggered(); + virtual void on_fileImportAction_triggered(); + virtual void on_fileImportGDALAction_triggered(); + virtual void on_fileOpenAction_triggered(); + virtual void on_fileSaveAsAction_triggered(); + virtual void on_fileSaveAsTemplateAction_triggered(); + virtual void on_fileSaveAction_triggered(); + virtual void on_fileWorkOfflineAction_triggered(); + virtual void on_filePrintAction_triggered(); + virtual void on_filePropertiesAction_triggered(); + + virtual void on_helpAboutAction_triggered(); + virtual void on_viewZoomAllAction_triggered(); + virtual void on_viewZoomInAction_triggered(); + virtual void on_viewZoomOutAction_triggered(); + virtual void on_viewZoomWindowAction_triggered(); + virtual void on_viewLockZoomAction_triggered(); + virtual void on_viewDownloadedAction_triggered(); + virtual void on_viewDirtyAction_triggered(); + virtual void on_viewScaleAction_triggered(); + virtual void on_viewPhotosAction_triggered(); + virtual void on_viewShowLatLonGridAction_triggered(); + virtual void on_viewStyleBackgroundAction_triggered(); + virtual void on_viewStyleForegroundAction_triggered(); + virtual void on_viewStyleTouchupAction_triggered(); + virtual void on_viewNamesAction_triggered(); + virtual void on_viewVirtualNodesAction_triggered(); + virtual void on_viewTrackPointsAction_triggered(); + virtual void on_viewTrackSegmentsAction_triggered(); + virtual void on_viewRelationsAction_triggered(); + virtual void on_viewGotoAction_triggered(); + virtual void on_viewArrowsNeverAction_triggered(bool checked); + virtual void on_viewArrowsOnewayAction_triggered(bool checked); + virtual void on_viewArrowsAlwaysAction_triggered(bool checked); + + virtual void on_editRemoveAction_triggered(); + virtual void on_editMoveAction_triggered(); + virtual void on_editRotateAction_triggered(); + virtual void on_editScaleAction_triggered(); + virtual void on_editReverseAction_triggered(); + + virtual void on_roadSplitAction_triggered(); + virtual void on_roadBreakAction_triggered(); + virtual void on_roadJoinAction_triggered(); + virtual void on_roadSimplifyAction_triggered(); + virtual void on_roadCreateJunctionAction_triggered(); + virtual void on_roadAddStreetNumbersAction_triggered(); + virtual void on_roadSubdivideAction_triggered(); + virtual void on_roadAxisAlignAction_triggered(); + virtual void on_roadExtrudeAction_triggered(); + virtual void on_roadBingExtractAction_triggered(); + + virtual void on_featureSelectChildrenAction_triggered(); + virtual void on_featureSelectParentsAction_triggered(); + virtual void on_featureDownloadMissingChildrenAction_triggered(); + virtual void on_featureDeleteAction_triggered(); + virtual void on_featureCommitAction_triggered(); + + virtual void on_nodeAlignAction_triggered(); + virtual void on_nodeSpreadAction_triggered(); + virtual void on_nodeMergeAction_triggered(); + virtual void on_nodeDetachAction_triggered(); + virtual void on_relationAddMemberAction_triggered(); + virtual void on_relationRemoveMemberAction_triggered(); + virtual void on_relationAddToMultipolygonAction_triggered(); + virtual void on_areaJoinAction_triggered(); + virtual void on_areaSplitAction_triggered(); + virtual void on_areaTerraceAction_triggered(); + + virtual void on_mapStyleSaveAction_triggered(); + virtual void on_mapStyleSaveAsAction_triggered(); + virtual void on_mapStyleLoadAction_triggered(); + virtual void on_exportOSMAction_triggered(); + virtual void on_exportOSCAction_triggered(); + virtual void on_exportGPXAction_triggered(); + virtual void on_exportKMLAction_triggered(); + virtual void on_exportGDALAction_triggered(); + virtual void on_editSelectAction_triggered(); + virtual void on_bookmarkAddAction_triggered(); + virtual void on_bookmarkRemoveAction_triggered(); + + virtual void on_toolsPreferencesAction_triggered() {toolsPreferencesAction_triggered();} + virtual void on_toolsShortcutsAction_triggered(); + virtual void on_toolsToolbarsAction_triggered(); + virtual void on_toolsWMSServersAction_triggered(); + virtual void on_toolsTMSServersAction_triggered(); + virtual void on_toolsProjectionsAction_triggered(); + virtual void on_toolsFiltersAction_triggered(); + virtual void toolsPreferencesAction_triggered(bool focusData=false); + virtual void on_toolsResetDiscardableAction_triggered(); + virtual void on_toolsRebuildHistoryAction_triggered(); + + virtual void on_windowPropertiesAction_triggered(); + virtual void on_windowLayersAction_triggered(); + virtual void on_windowInfoAction_triggered(); + virtual void on_windowDirtyAction_triggered(); + virtual void on_windowFeatsAction_triggered(); + virtual void on_windowToolbarAction_triggered(); + virtual void on_windowGPSAction_triggered(); +#ifdef GEOIMAGE + virtual void on_windowGeoimageAction_triggered(); +#endif + virtual void on_windowStylesAction_triggered(); + + virtual void on_windowHideAllAction_triggered(); + virtual void on_windowShowAllAction_triggered(); + virtual void on_gpsConnectAction_triggered(); + virtual void on_gpsReplayAction_triggered(); + virtual void on_gpsRecordAction_triggered(); + virtual void on_gpsPauseAction_triggered(); + virtual void on_gpsDisconnectAction_triggered(); + virtual void on_gpsCenterAction_triggered(); + virtual void preferencesChanged(PreferencesDialog* prefs); + virtual void clipboardChanged(); + + virtual void on_toolTemplatesSaveAction_triggered(); + virtual void on_toolTemplatesMergeAction_triggered(); + virtual void on_toolTemplatesLoadAction_triggered(); + + +protected slots: + void onCustomcontextmenurequested(const QPoint &pos); + void onImagerequested(ImageMapLayer*); + void onImagereceived(ImageMapLayer* aLayer); + void onLoadingfinished(ImageMapLayer*); + +signals: + void remove_triggered(); + void move_triggered(); + void add_triggered(); + void reverse_triggered(); + + void content_changed(); + +public: + MainWindowPrivate* p; + Ui::MainWindow *ui; + + QString currentProjectFile; + PropertiesDock* properties(); + FeaturesDock* features(); + InfoDock* info(); + QGPS* gps(); +#ifdef GEOIMAGE + GeoImageDock* geoImage(); +#endif + Document* document(); + //MapLayer* activeLayer(); + MapView* view(); + QByteArray fullscreenState; + + QProgressBar* pbImages; + QString StatusMessage; + QLabel* ViewportStatusLabel; + QLabel* PaintTimeLabel; + QLabel* MeterPerPixelLabel; + QLabel* AdjusmentMeterLabel; + +public slots: + void handleMessage(const QString& msg); + + void adjustLayers(bool adjustViewport); + void bookmarkTriggered(QAction* anAction); + void recentOpenTriggered(QAction* anAction); + void recentImportTriggered(QAction* anAction); +#ifndef _MOBILE + void projectionSet(const QString& prj); + void projectionTriggered(QAction* anAction); +#endif + void styleTriggered(QAction* anAction); + void updateGpsPosition(qreal latitude, qreal longitude, QDateTime time, qreal altitude, qreal speed, qreal heading); + void applyStyles(QString NewStyle); + void applyPainters(GlobalPainter* theGlobalPainter, QList<Painter>* thePainters); + +public: + bool testImport(const QString filePath); + bool importFiles(Document * mapDocument, const QStringList & filesNames, QStringList * importedFileNames = NULL, bool useGdal = false); + void loadUrl(const QString& urlString); + void loadUrl(const QUrl& u); + void loadDocument(QString fn); + void loadTemplateDocument(QString fn); + void saveDocument(const QString& fn); + void saveTemplateDocument(const QString& fn); + void downloadFeatures(const QList<Feature*>& aDownloadList); + + void createProgressDialog(); + void deleteProgressDialog(); + + void createToolBarManager(); + + void updateLanguage(); + + bool hasUnsavedChanges(); + + void launchInteraction(Interaction *anInteraction); + enum ImportStatus { IMPORT_OK, IMPORT_ABORTED, IMPORT_ERROR }; + bool getPathToSave(const QString& title, const QString& extension, const QString& allowedTypes, QString* path); + + QStringList translationPaths(); + +protected: + MapView* theView; + Document* theDocument; + InfoDock* theInfo; + DirtyDock* theDirty; + LayerDock* theLayers; +#ifdef GEOIMAGE + GeoImageDock* theGeoImage; +#endif + QGPS* theGPS; + + TrackLayer* gpsRecLayer; + TrackSegment* curGpsTrackSegment; + QHash<QString, QString> shortcutsDefault; + + QTranslator* qtTranslator; + QTranslator* merkaartorTranslator; + + QtToolBarManager *toolBarManager; + +private slots: + void delayedInit(); + void setAreaOpacity(QAction*); + void updateBookmarksMenu(); + void updateWindowMenu(bool b=false); + + void on_viewWireframeAction_toggled(bool arg1); + +private: + void importAction( bool useGdal = false ); + ImportStatus importFile(Document* mapDocument, const QString& fileName, Layer*& newLayer); + ImportStatus importFileUsingGDAL(Document* mapDocument, const QString& fileName, Layer*& newLayer); + void updateMenu(); + void updateRecentOpenMenu(); + void updateRecentImportMenu(); + void updateProjectionMenu(); + void updateStyleMenu(); + bool selectExportedFeatures(QList<Feature*>& theFeatures); + + Document* doLoadDocument(QFile* file); + void doSaveDocument(QFile* fn, bool asTemplate=false); + + QString makeAbsolute(const QString& path); +#if defined(Q_OS_MAC) + QString macOsTranslationsPath(); +#endif + + bool tryLoadTranslator(const QString& languageFile, QTranslator* theTranslator); + + void dieClipboardInvalid(); + void warnMapDownloadFailed(); + + void updateSegmentMode(QMouseEvent* mouseEvent); + + void startBusyCursor(); + void endBusyCursor(); + + void syncOSM(const QString &aWeb, const QString &aUser, const QString &aPwd); +protected: + void closeEvent(QCloseEvent * event); + virtual QMenu * createPopupMenu (); +}; + +#endif + + diff --git a/src/MainWindow.ui b/src/MainWindow.ui new file mode 100644 index 0000000..1b685c8 --- /dev/null +++ b/src/MainWindow.ui @@ -0,0 +1,2178 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>MainWindow</class> + <widget class="QMainWindow" name="MainWindow"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>1100</width> + <height>549</height> + </rect> + </property> + <property name="windowTitle"> + <string>Merkaartor</string> + </property> + <property name="windowIcon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/Merkaartor.xpm</normaloff>:/Icons/Merkaartor.xpm</iconset> + </property> + <widget class="QWidget" name="centralWidget"/> + <widget class="QMenuBar" name="theMenuBar"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>1100</width> + <height>19</height> + </rect> + </property> + <widget class="QMenu" name="menuHelp"> + <property name="title"> + <string>&Help</string> + </property> + <addaction name="helpAboutAction"/> + </widget> + <widget class="QMenu" name="menuCreate"> + <property name="title"> + <string>&Create</string> + </property> + <addaction name="createNodeAction"/> + <addaction name="createRoadAction"/> + <addaction name="createDoubleWayAction"/> + <addaction name="createRoundaboutAction"/> + <addaction name="createRectangleAction"/> + <addaction name="createPolygonAction"/> + <addaction name="createAreaAction"/> + <addaction name="createRelationAction"/> + </widget> + <widget class="QMenu" name="menuRoad"> + <property name="title"> + <string>Wa&y</string> + </property> + <addaction name="roadSplitAction"/> + <addaction name="roadBreakAction"/> + <addaction name="roadJoinAction"/> + <addaction name="editReverseAction"/> + <addaction name="roadSimplifyAction"/> + <addaction name="roadCreateJunctionAction"/> + <addaction name="roadAddStreetNumbersAction"/> + <addaction name="roadSubdivideAction"/> + <addaction name="areaJoinAction"/> + <addaction name="areaSplitAction"/> + <addaction name="areaTerraceAction"/> + <addaction name="roadAxisAlignAction"/> + <addaction name="separator"/> + <addaction name="roadBingExtractAction"/> + </widget> + <widget class="QMenu" name="menuEdit"> + <property name="title"> + <string>&Edit</string> + </property> + <addaction name="editUndoAction"/> + <addaction name="editRedoAction"/> + <addaction name="separator"/> + <addaction name="editCutAction"/> + <addaction name="editCopyAction"/> + <addaction name="editPasteFeatureAction"/> + <addaction name="editPasteMergeAction"/> + <addaction name="editPasteOverwriteAction"/> + <addaction name="separator"/> + <addaction name="editRemoveAction"/> + <addaction name="editMoveAction"/> + <addaction name="editRotateAction"/> + <addaction name="editScaleAction"/> + <addaction name="roadExtrudeAction"/> + <addaction name="editPropertiesAction"/> + <addaction name="separator"/> + <addaction name="editSelectAction"/> + </widget> + <widget class="QMenu" name="menuView"> + <property name="title"> + <string>&View</string> + </property> + <widget class="QMenu" name="menuBookmarks"> + <property name="title"> + <string>&Bookmarks</string> + </property> + <addaction name="bookmarkAddAction"/> + <addaction name="bookmarkRemoveAction"/> + <addaction name="separator"/> + </widget> + <widget class="QMenu" name="mnuProjections"> + <property name="title"> + <string>&Projection</string> + </property> + </widget> + <widget class="QMenu" name="mnuAreaOpacity"> + <property name="title"> + <string>Area &opacity</string> + </property> + </widget> + <addaction name="viewZoomAllAction"/> + <addaction name="viewZoomWindowAction"/> + <addaction name="viewZoomOutAction"/> + <addaction name="viewZoomInAction"/> + <addaction name="viewLockZoomAction"/> + <addaction name="separator"/> + <addaction name="viewWireframeAction"/> + <addaction name="mnuAreaOpacity"/> + <addaction name="mnuProjections"/> + <addaction name="separator"/> + <addaction name="viewGotoAction"/> + <addaction name="menuBookmarks"/> + </widget> + <widget class="QMenu" name="menuFile"> + <property name="title"> + <string>&File</string> + </property> + <widget class="QMenu" name="menuExport"> + <property name="title"> + <string>&Export</string> + </property> + <addaction name="exportOSMAction"/> + <addaction name="exportOSCAction"/> + <addaction name="exportGPXAction"/> + <addaction name="exportKMLAction"/> + <addaction name="exportGDALAction"/> + </widget> + <widget class="QMenu" name="menuRecentOpen"> + <property name="title"> + <string>Re&cently opened</string> + </property> + </widget> + <widget class="QMenu" name="menuRecentImport"> + <property name="title"> + <string>Recen&tly imported</string> + </property> + </widget> + <addaction name="fileNewAction"/> + <addaction name="fileOpenAction"/> + <addaction name="fileImportAction"/> + <addaction name="fileImportGDALAction"/> + <addaction name="menuRecentOpen"/> + <addaction name="menuRecentImport"/> + <addaction name="separator"/> + <addaction name="menuExport"/> + <addaction name="separator"/> + <addaction name="fileSaveAction"/> + <addaction name="fileSaveAsAction"/> + <addaction name="fileSaveAsTemplateAction"/> + <addaction name="separator"/> + <addaction name="fileDownloadAction"/> + <addaction name="fileDownloadMoreAction"/> + <addaction name="fileUploadAction"/> + <addaction name="separator"/> + <addaction name="filePrintAction"/> + <addaction name="separator"/> + <addaction name="filePropertiesAction"/> + <addaction name="separator"/> + <addaction name="fileWorkOfflineAction"/> + <addaction name="fileQuitAction"/> + </widget> + <widget class="QMenu" name="menuTools"> + <property name="title"> + <string>T&ools</string> + </property> + <widget class="QMenu" name="menuStyles"> + <property name="title"> + <string>&Style</string> + </property> + <addaction name="editMapStyleAction"/> + <addaction name="separator"/> + <addaction name="mapStyleSaveAction"/> + <addaction name="mapStyleSaveAsAction"/> + <addaction name="mapStyleLoadAction"/> + <addaction name="separator"/> + </widget> + <widget class="QMenu" name="designerMenu"> + <property name="title"> + <string>Ta&g templates</string> + </property> + <addaction name="toolTemplatesSaveAction"/> + <addaction name="toolTemplatesMergeAction"/> + <addaction name="toolTemplatesLoadAction"/> + </widget> + <addaction name="menuStyles"/> + <addaction name="designerMenu"/> + <addaction name="separator"/> + <addaction name="toolsToolbarsAction"/> + <addaction name="toolsShortcutsAction"/> + <addaction name="separator"/> + <addaction name="toolsWorldOsbAction"/> + <addaction name="toolsTMSServersAction"/> + <addaction name="toolsWMSServersAction"/> + <addaction name="toolsProjectionsAction"/> + <addaction name="toolsFiltersAction"/> + <addaction name="separator"/> + <addaction name="toolsResetDiscardableAction"/> + <addaction name="toolsRebuildHistoryAction"/> + <addaction name="separator"/> + <addaction name="toolsPreferencesAction"/> + </widget> + <widget class="QMenu" name="menu_Node"> + <property name="title"> + <string>&Node</string> + </property> + <addaction name="nodeMergeAction"/> + <addaction name="nodeAlignAction"/> + <addaction name="nodeSpreadAction"/> + <addaction name="nodeDetachAction"/> + </widget> + <widget class="QMenu" name="menuWindow"> + <property name="title"> + <string>&Window</string> + </property> + <widget class="QMenu" name="menu_Docks"> + <property name="title"> + <string>&Docks</string> + </property> + <addaction name="windowPropertiesAction"/> + <addaction name="windowLayersAction"/> + <addaction name="windowInfoAction"/> + <addaction name="windowDirtyAction"/> + <addaction name="windowGPSAction"/> + <addaction name="windowGeoimageAction"/> + <addaction name="windowStylesAction"/> + <addaction name="windowFeatsAction"/> + </widget> + <addaction name="menu_Docks"/> + <addaction name="windowToolbarAction"/> + <addaction name="separator"/> + <addaction name="windowHideAllAction"/> + <addaction name="windowShowAllAction"/> + </widget> + <widget class="QMenu" name="menu_Feature"> + <property name="title"> + <string>Fea&ture</string> + </property> + <addaction name="featureSelectChildrenAction"/> + <addaction name="featureSelectParentsAction"/> + <addaction name="separator"/> + <addaction name="featureDeleteAction"/> + <addaction name="featureCommitAction"/> + <addaction name="separator"/> + <addaction name="featureDownloadMissingChildrenAction"/> + </widget> + <widget class="QMenu" name="menuLayers"> + <property name="title"> + <string>&Layers</string> + </property> + <addaction name="layersNewImageAction"/> + <addaction name="layersNewDrawingAction"/> + <addaction name="layersNewFilterAction"/> + <addaction name="layersMapdustAction"/> + <addaction name="separator"/> + </widget> + <widget class="QMenu" name="menuGps"> + <property name="title"> + <string>&GPS</string> + </property> + <addaction name="gpsConnectAction"/> + <addaction name="gpsReplayAction"/> + <addaction name="separator"/> + <addaction name="gpsRecordAction"/> + <addaction name="gpsPauseAction"/> + <addaction name="gpsDisconnectAction"/> + <addaction name="separator"/> + <addaction name="gpsCenterAction"/> + </widget> + <widget class="QMenu" name="menuRelation"> + <property name="title"> + <string>Rel&ation</string> + </property> + <addaction name="relationAddMemberAction"/> + <addaction name="relationRemoveMemberAction"/> + <addaction name="relationAddToMultipolygonAction"/> + </widget> + <widget class="QMenu" name="menu_Show"> + <property name="title"> + <string>S&how</string> + </property> + <widget class="QMenu" name="menuShow_directional_Arrows"> + <property name="title"> + <string>Directional &arrows</string> + </property> + <addaction name="viewArrowsNeverAction"/> + <addaction name="viewArrowsOnewayAction"/> + <addaction name="viewArrowsAlwaysAction"/> + </widget> + <addaction name="viewDownloadedAction"/> + <addaction name="viewDirtyAction"/> + <addaction name="menuShow_directional_Arrows"/> + <addaction name="separator"/> + <addaction name="viewStyleForegroundAction"/> + <addaction name="viewStyleBackgroundAction"/> + <addaction name="viewStyleTouchupAction"/> + <addaction name="viewNamesAction"/> + <addaction name="separator"/> + <addaction name="viewTrackPointsAction"/> + <addaction name="viewVirtualNodesAction"/> + <addaction name="viewTrackSegmentsAction"/> + <addaction name="viewRelationsAction"/> + <addaction name="separator"/> + <addaction name="viewPhotosAction"/> + <addaction name="viewScaleAction"/> + <addaction name="viewShowLatLonGridAction"/> + </widget> + <addaction name="menuFile"/> + <addaction name="menuEdit"/> + <addaction name="menuView"/> + <addaction name="menu_Show"/> + <addaction name="menuGps"/> + <addaction name="menuLayers"/> + <addaction name="menuCreate"/> + <addaction name="menu_Feature"/> + <addaction name="menu_Node"/> + <addaction name="menuRoad"/> + <addaction name="menuRelation"/> + <addaction name="menuTools"/> + <addaction name="menuWindow"/> + <addaction name="separator"/> + <addaction name="menuHelp"/> + </widget> + <widget class="QStatusBar" name="StatusBar"/> + <widget class="QToolBar" name="toolBar"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="windowTitle"> + <string>Main toolbar</string> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <attribute name="toolBarArea"> + <enum>TopToolBarArea</enum> + </attribute> + <attribute name="toolBarBreak"> + <bool>false</bool> + </attribute> + <addaction name="fileDownloadAction"/> + <addaction name="fileDownloadMoreAction"/> + <addaction name="fileUploadAction"/> + <addaction name="fileSaveAction"/> + <addaction name="separator"/> + <addaction name="editCopyAction"/> + <addaction name="editPasteFeatureAction"/> + <addaction name="editPasteMergeAction"/> + <addaction name="editRemoveAction"/> + <addaction name="separator"/> + <addaction name="editUndoAction"/> + <addaction name="editRedoAction"/> + <addaction name="separator"/> + <addaction name="editPropertiesAction"/> + <addaction name="editMoveAction"/> + <addaction name="editRotateAction"/> + <addaction name="editScaleAction"/> + <addaction name="createNodeAction"/> + <addaction name="createRoadAction"/> + <addaction name="createAreaAction"/> + <addaction name="separator"/> + <addaction name="nodeAlignAction"/> + <addaction name="nodeSpreadAction"/> + <addaction name="nodeDetachAction"/> + <addaction name="roadSplitAction"/> + <addaction name="roadBreakAction"/> + <addaction name="roadJoinAction"/> + <addaction name="editReverseAction"/> + <addaction name="roadSubdivideAction"/> + <addaction name="areaJoinAction"/> + <addaction name="areaSplitAction"/> + <addaction name="areaTerraceAction"/> + <addaction name="roadAxisAlignAction"/> + <addaction name="separator"/> + <addaction name="markBridgeAction"/> + </widget> + <action name="fileQuitAction"> + <property name="text"> + <string>&Quit</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Q</string> + </property> + <property name="menuRole"> + <enum>QAction::QuitRole</enum> + </property> + </action> + <action name="helpAboutAction"> + <property name="text"> + <string>&About</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + <property name="menuRole"> + <enum>QAction::AboutRole</enum> + </property> + </action> + <action name="fileOpenAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/document_open.png</normaloff>:/Icons/actions/document_open.png</iconset> + </property> + <property name="text"> + <string>&Open</string> + </property> + <property name="statusTip"> + <string>Create a new document and import a file</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+O</string> + </property> + </action> + <action name="viewZoomAllAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/zoom_fit_best.png</normaloff>:/Icons/actions/zoom_fit_best.png</iconset> + </property> + <property name="text"> + <string>Zoom &all</string> + </property> + <property name="shortcut"> + <string notr="true">F2</string> + </property> + </action> + <action name="viewZoomWindowAction"> + <property name="text"> + <string>Zoom &window</string> + </property> + <property name="iconText"> + <string>Zoom window</string> + </property> + <property name="toolTip"> + <string>Zoom window</string> + </property> + <property name="shortcut"> + <string notr="true">F3</string> + </property> + </action> + <action name="viewZoomOutAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/zoom_out.png</normaloff>:/Icons/actions/zoom_out.png</iconset> + </property> + <property name="text"> + <string>Zoom &out</string> + </property> + <property name="shortcut"> + <string notr="true">-</string> + </property> + </action> + <action name="viewZoomInAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/zoom_in.png</normaloff>:/Icons/actions/zoom_in.png</iconset> + </property> + <property name="text"> + <string>Zoom &in</string> + </property> + <property name="iconText"> + <string>Zoom in</string> + </property> + <property name="toolTip"> + <string>Zoom in</string> + </property> + <property name="shortcut"> + <string notr="true">+</string> + </property> + </action> + <action name="createWayAction"> + <property name="text"> + <string>Curved link</string> + </property> + <property name="iconText"> + <string>Curved link</string> + </property> + <property name="toolTip"> + <string>Curved link</string> + </property> + <property name="shortcut"> + <string/> + </property> + </action> + <action name="editUndoAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/undo.png</normaloff>:/Icons/actions/undo.png</iconset> + </property> + <property name="text"> + <string>&Undo</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Z</string> + </property> + </action> + <action name="editRedoAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/redo.png</normaloff>:/Icons/actions/redo.png</iconset> + </property> + <property name="text"> + <string>&Redo</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Y</string> + </property> + </action> + <action name="editMoveAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/transform-move.png</normaloff>:/Icons/actions/transform-move.png</iconset> + </property> + <property name="text"> + <string>&Move</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+M</string> + </property> + </action> + <action name="fileImportGDALAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/document_import.png</normaloff>:/Icons/actions/document_import.png</iconset> + </property> + <property name="text"> + <string>Import using &GDAL</string> + </property> + <property name="statusTip"> + <string>Import a file into the current document using GDAL</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="fileImportAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/document_import.png</normaloff>:/Icons/actions/document_import.png</iconset> + </property> + <property name="text"> + <string>&Import</string> + </property> + <property name="statusTip"> + <string>Import a file into the current document</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="fileDownloadAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/download.png</normaloff>:/Icons/actions/download.png</iconset> + </property> + <property name="text"> + <string>&Download</string> + </property> + <property name="toolTip"> + <string>Download map data for a new area</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+D</string> + </property> + </action> + <action name="createLinearWayAction"> + <property name="text"> + <string>Link</string> + </property> + <property name="iconText"> + <string>Create link</string> + </property> + <property name="toolTip"> + <string>Create link</string> + </property> + <property name="shortcut"> + <string notr="true">L</string> + </property> + </action> + <action name="editPropertiesAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/select.png</normaloff>:/Icons/actions/select.png</iconset> + </property> + <property name="text"> + <string>&Select</string> + </property> + <property name="shortcut"> + <string notr="true">Esc</string> + </property> + </action> + <action name="fileUploadAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/upload.png</normaloff>:/Icons/actions/upload.png</iconset> + </property> + <property name="text"> + <string>&Upload</string> + </property> + <property name="toolTip"> + <string>Upload changes to the server</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+U</string> + </property> + </action> + <action name="editRemoveAction"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/edit_delete.png</normaloff>:/Icons/actions/edit_delete.png</iconset> + </property> + <property name="text"> + <string>R&emove</string> + </property> + <property name="toolTip"> + <string>Remove selected features</string> + </property> + <property name="shortcut"> + <string notr="true">Del</string> + </property> + </action> + <action name="createRoadAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/create_road.png</normaloff>:/Icons/actions/create_road.png</iconset> + </property> + <property name="text"> + <string>&Way</string> + </property> + <property name="toolTip"> + <string>Create new way</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+R</string> + </property> + </action> + <action name="createNodeAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/create_node.png</normaloff>:/Icons/actions/create_node.png</iconset> + </property> + <property name="text"> + <string>&Node</string> + </property> + <property name="toolTip"> + <string>Create new node</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+N</string> + </property> + </action> + <action name="editReverseAction"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/reverse_road.png</normaloff>:/Icons/actions/reverse_road.png</iconset> + </property> + <property name="text"> + <string>&Reverse</string> + </property> + <property name="toolTip"> + <string>Reverse way direction</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="viewGotoAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/goto.png</normaloff>:/Icons/actions/goto.png</iconset> + </property> + <property name="text"> + <string>&Go to…</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+G</string> + </property> + </action> + <action name="createDoubleWayAction"> + <property name="text"> + <string>&Parallel way</string> + </property> + <property name="toolTip"> + <string>Create a parallel way</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="createRoundaboutAction"> + <property name="text"> + <string>R&oundabout</string> + </property> + <property name="toolTip"> + <string>Create Roundabout</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + <property name="menuRole"> + <enum>QAction::NoRole</enum> + </property> + </action> + <action name="fileNewAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/document_new.png</normaloff>:/Icons/actions/document_new.png</iconset> + </property> + <property name="text"> + <string>&New</string> + </property> + <property name="statusTip"> + <string>New document</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="roadSplitAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/split_road.png</normaloff>:/Icons/actions/split_road.png</iconset> + </property> + <property name="text"> + <string>&Split</string> + </property> + <property name="toolTip"> + <string>Split way into separate (connected) ways</string> + </property> + <property name="shortcut"> + <string notr="true">Alt+S</string> + </property> + </action> + <action name="roadJoinAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/join_roads.png</normaloff>:/Icons/actions/join_roads.png</iconset> + </property> + <property name="text"> + <string>&Join</string> + </property> + <property name="toolTip"> + <string>Join connected ways into a single way</string> + </property> + <property name="shortcut"> + <string notr="true">Alt+J</string> + </property> + </action> + <action name="roadBreakAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/break_apart_roads.png</normaloff>:/Icons/actions/break_apart_roads.png</iconset> + </property> + <property name="text"> + <string>&Break apart</string> + </property> + <property name="iconText"> + <string>Break</string> + </property> + <property name="toolTip"> + <string>Break apart connected ways</string> + </property> + <property name="shortcut"> + <string notr="true">Alt+B</string> + </property> + </action> + <action name="createRelationAction"> + <property name="text"> + <string>Re&lation</string> + </property> + <property name="toolTip"> + <string>Create Relation</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="createAreaAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/create_area.png</normaloff>:/Icons/actions/create_area.png</iconset> + </property> + <property name="text"> + <string>&Area</string> + </property> + <property name="toolTip"> + <string>Create new area</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="editMapStyleAction"> + <property name="text"> + <string>&Edit…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="mapStyleSaveAsAction"> + <property name="text"> + <string>Save &as…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="mapStyleLoadAction"> + <property name="text"> + <string>&Load…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="createCurvedRoadAction"> + <property name="text"> + <string>&Curved way</string> + </property> + </action> + <action name="toolsPreferencesAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/preferences.png</normaloff>:/Icons/actions/preferences.png</iconset> + </property> + <property name="text"> + <string>&Preferences…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + <property name="menuRole"> + <enum>QAction::PreferencesRole</enum> + </property> + </action> + <action name="exportOSMAllAction"> + <property name="text"> + <string>&All…</string> + </property> + <property name="statusTip"> + <string>Export all visible layers to a file</string> + </property> + </action> + <action name="exportOSMBinAllAction"> + <property name="text"> + <string>&All…</string> + </property> + <property name="statusTip"> + <string>Export all visible layers to a file</string> + </property> + </action> + <action name="editSelectAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/find.png</normaloff>:/Icons/actions/find.png</iconset> + </property> + <property name="text"> + <string>&Find…</string> + </property> + <property name="toolTip"> + <string>Find</string> + </property> + <property name="statusTip"> + <string>Find and select items</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="exportOSMViewportAction"> + <property name="text"> + <string>&Viewport…</string> + </property> + <property name="statusTip"> + <string>Export the features in the viewport to a file</string> + </property> + </action> + <action name="exportOSMBinViewportAction"> + <property name="text"> + <string>&Viewport…</string> + </property> + <property name="statusTip"> + <string>Export the features in the viewport to a file</string> + </property> + </action> + <action name="bookmarkAddAction"> + <property name="text"> + <string>&Add…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="bookmarkRemoveAction"> + <property name="text"> + <string>&Remove…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="nodeMergeAction"> + <property name="text"> + <string>&Merge</string> + </property> + <property name="toolTip"> + <string>Node Merge</string> + </property> + <property name="statusTip"> + <string>Merge the selected nodes (first selected will remain)</string> + </property> + <property name="shortcut"> + <string notr="true">Alt+M</string> + </property> + </action> + <action name="fileSaveAsAction"> + <property name="text"> + <string>Save &as…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="fileSaveAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/save.png</normaloff>:/Icons/actions/save.png</iconset> + </property> + <property name="text"> + <string>&Save</string> + </property> + <property name="toolTip"> + <string>Save as file</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+S</string> + </property> + </action> + <action name="fileDownloadMoreAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/download_more.png</normaloff>:/Icons/actions/download_more.png</iconset> + </property> + <property name="text"> + <string>Download more</string> + </property> + <property name="toolTip"> + <string>Download more map data for the current area</string> + </property> + <property name="statusTip"> + <string>Download the current view into the previous download layer</string> + </property> + <property name="whatsThis"> + <string>Download the current view into the previous download layer</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Shift+D</string> + </property> + </action> + <action name="action_Docks"> + <property name="text"> + <string>&Docks</string> + </property> + </action> + <action name="windowPropertiesAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Properties</string> + </property> + <property name="toolTip"> + <string>Hide/show property dock</string> + </property> + <property name="statusTip"> + <string>Hide/Show the property dock</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+P</string> + </property> + </action> + <action name="windowLayersAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Layers</string> + </property> + <property name="toolTip"> + <string>Hide/show layer dock</string> + </property> + <property name="statusTip"> + <string>Hide/show layer dock</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+L</string> + </property> + </action> + <action name="windowInfoAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Info</string> + </property> + <property name="toolTip"> + <string>Hide/show info dock</string> + </property> + <property name="statusTip"> + <string>Hide/show info dock</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+I</string> + </property> + </action> + <action name="nodeAlignAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/align_nodes.png</normaloff>:/Icons/actions/align_nodes.png</iconset> + </property> + <property name="text"> + <string>&Align</string> + </property> + <property name="toolTip"> + <string>Align nodes</string> + </property> + <property name="statusTip"> + <string>Align selected nodes. First two selected give the line.</string> + </property> + <property name="shortcut"> + <string notr="true">Alt+A</string> + </property> + </action> + <action name="nodeSpreadAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/spread_nodes.png</normaloff>:/Icons/actions/spread_nodes.png</iconset> + </property> + <property name="text"> + <string>&Spread</string> + </property> + <property name="toolTip"> + <string>Spread nodes</string> + </property> + <property name="statusTip"> + <string>Align and spread selected nodes equally.</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="windowDirtyAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Undo</string> + </property> + <property name="toolTip"> + <string>Hide/show undo dock</string> + </property> + <property name="statusTip"> + <string>Hide/show undo dock</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+T</string> + </property> + </action> + <action name="viewDownloadedAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Downloaded areas</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+A</string> + </property> + </action> + <action name="editCopyAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/edit_copy.png</normaloff>:/Icons/actions/edit_copy.png</iconset> + </property> + <property name="text"> + <string>&Copy</string> + </property> + <property name="toolTip"> + <string>Copy selected features and tags to the clipboard</string> + </property> + <property name="statusTip"> + <string>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+C</string> + </property> + </action> + <action name="editPasteOverwriteAction"> + <property name="text"> + <string>Paste Tags (&Overwrite)</string> + </property> + <property name="statusTip"> + <string>Paste (and overwrite) the tags in the clipboard to the selected feature.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+V, O</string> + </property> + </action> + <action name="editPasteMergeAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/edit_paste_tags.png</normaloff>:/Icons/actions/edit_paste_tags.png</iconset> + </property> + <property name="text"> + <string>Paste Tags (&Merge)</string> + </property> + <property name="iconText"> + <string>Paste tags</string> + </property> + <property name="toolTip"> + <string>Paste tags from the clipboard (Merge with existing tags)</string> + </property> + <property name="statusTip"> + <string>Merge the tags in the clipboard with the ones of the selected feature.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+V, M</string> + </property> + </action> + <action name="exportOSMSelectedAction"> + <property name="text"> + <string>Selected…</string> + </property> + </action> + <action name="exportOSMBinSelectedAction"> + <property name="text"> + <string>Selected…</string> + </property> + </action> + <action name="editPasteFeatureAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/edit_paste.png</normaloff>:/Icons/actions/edit_paste.png</iconset> + </property> + <property name="text"> + <string>Paste feature(s)</string> + </property> + <property name="iconText"> + <string>Paste</string> + </property> + <property name="toolTip"> + <string>Paste features from the clipboard</string> + </property> + <property name="statusTip"> + <string>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+V, F</string> + </property> + </action> + <action name="exportOSMAction"> + <property name="text"> + <string>OSM (XML)</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="exportOSMBinAction"> + <property name="text"> + <string>OSM (binary)</string> + </property> + </action> + <action name="featureCommitAction"> + <property name="text"> + <string>&Force upload</string> + </property> + <property name="toolTip"> + <string>Commit feature to the dirty layer</string> + </property> + <property name="statusTip"> + <string>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</string> + </property> + <property name="whatsThis"> + <string>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="exportGPXAction"> + <property name="text"> + <string>GPX</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="exportKMLAction"> + <property name="text"> + <string>KML</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="windowToolbarAction"> + <property name="text"> + <string>Toggle toolbar</string> + </property> + <property name="toolTip"> + <string>Hide/show Toolbar</string> + </property> + <property name="statusTip"> + <string>Hide/Show toolbar</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="windowHideAllAction"> + <property name="text"> + <string>Hide all</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+F</string> + </property> + </action> + <action name="windowShowAllAction"> + <property name="text"> + <string>Show all</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+F</string> + </property> + <property name="visible"> + <bool>false</bool> + </property> + </action> + <action name="layersAddImageAction"> + <property name="text"> + <string>&Image layer</string> + </property> + </action> + <action name="renderNativeAction"> + <property name="text"> + <string>&Raster/SVG</string> + </property> + </action> + <action name="viewTrackPointsAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Nodes</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+P</string> + </property> + </action> + <action name="viewNamesAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Na&mes</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+N</string> + </property> + </action> + <action name="gpsConnectAction"> + <property name="text"> + <string>&Start</string> + </property> + <property name="toolTip"> + <string>Start GPS</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="gpsReplayAction"> + <property name="text"> + <string>&Replay…</string> + </property> + <property name="toolTip"> + <string>Replay GPS</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="windowGPSAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&GPS</string> + </property> + <property name="toolTip"> + <string>Hide/show GPS dock</string> + </property> + <property name="statusTip"> + <string>Hide/show GPS dock</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+W</string> + </property> + </action> + <action name="gpsDisconnectAction"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>S&top</string> + </property> + <property name="toolTip"> + <string>Stop GPS</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="gpsCenterAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Center on GPS</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="viewTrackSegmentsAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Track &segments</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+T</string> + </property> + </action> + <action name="viewScaleAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Scale</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+S</string> + </property> + </action> + <action name="viewRelationsAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Relations</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+R</string> + </property> + </action> + <action name="viewStyleForegroundAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Show road backgrounds</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="viewStyleBackgroundAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Show road boundaries</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="viewStyleTouchupAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Show touchup</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="gpsRecordAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Record</string> + </property> + <property name="iconText"> + <string>Record</string> + </property> + <property name="toolTip"> + <string>Record GPS</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="gpsPauseAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Pause</string> + </property> + <property name="toolTip"> + <string>Pause GPS</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="windowGeoimageAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>G&eoImage</string> + </property> + <property name="toolTip"> + <string>Hide/show GeoImage dock</string> + </property> + <property name="statusTip"> + <string>Hide/show GeoImage dock</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+E</string> + </property> + </action> + <action name="toolsWorldOsbAction"> + <property name="text"> + <string>World OSB manager…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + <property name="visible"> + <bool>false</bool> + </property> + </action> + <action name="toolsShortcutsAction"> + <property name="text"> + <string>&Shortcut editor…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="toolTemplatesLoadAction"> + <property name="text"> + <string>&Load…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="toolTemplatesMergeAction"> + <property name="text"> + <string>&Merge…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="toolTemplatesSaveAction"> + <property name="text"> + <string>&Save…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="relationAddMemberAction"> + <property name="text"> + <string>&Add member</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="relationRemoveMemberAction"> + <property name="text"> + <string>&Remove member</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="viewArrowsNeverAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Never</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="viewArrowsOnewayAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>For 'oneway' ways</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="viewArrowsAlwaysAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Always</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="nodeDetachAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/detach_node.png</normaloff>:/Icons/actions/detach_node.png</iconset> + </property> + <property name="text"> + <string>&Detach</string> + </property> + <property name="toolTip"> + <string>Detach node from a way</string> + </property> + <property name="statusTip"> + <string>Detach a node from a way</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="fileWorkOfflineAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/offline.png</normaloff>:/Icons/actions/offline.png</iconset> + </property> + <property name="text"> + <string>&Work offline</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="renderSVGAction"> + <property name="text"> + <string>SVG</string> + </property> + </action> + <action name="windowStylesAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Styles</string> + </property> + <property name="iconText"> + <string>Hide/show style dock</string> + </property> + <property name="toolTip"> + <string>Hide/show style dock</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+B</string> + </property> + </action> + <action name="toolsWMSServersAction"> + <property name="text"> + <string>&WMS servers editor…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="toolsTMSServersAction"> + <property name="text"> + <string>&TMS servers editor…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="toolsResetDiscardableAction"> + <property name="text"> + <string>&Reset discardable dialog status</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="gpsPopupAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/GPS.png</normaloff>:/Icons/actions/GPS.png</iconset> + </property> + <property name="text"> + <string>GPS menu</string> + </property> + </action> + <action name="cameraAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/camera.png</normaloff>:/Icons/actions/camera.png</iconset> + </property> + <property name="text"> + <string>Camera</string> + </property> + </action> + <action name="roadCreateJunctionAction"> + <property name="text"> + <string>Create &junction</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="editRotateAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/transform-rotate.png</normaloff>:/Icons/actions/transform-rotate.png</iconset> + </property> + <property name="text"> + <string>Rotate</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+A</string> + </property> + </action> + <action name="createPolygonAction"> + <property name="text"> + <string>&Polygon</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="createRectangleAction"> + <property name="text"> + <string>Equiangular &building</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="layersNewImageAction"> + <property name="text"> + <string>Add new &image layer</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="windowFeatsAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Features</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="roadAddStreetNumbersAction"> + <property name="text"> + <string>Add street &numbers (Karlsruhe schema)</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="roadSubdivideAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/subdivide_road.png</normaloff>:/Icons/actions/subdivide_road.png</iconset> + </property> + <property name="text"> + <string>&Subdivide</string> + </property> + <property name="toolTip"> + <string>Subdivide segment equally</string> + </property> + <property name="statusTip"> + <string>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="viewVirtualNodesAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Virtual nodes</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="viewShowLatLonGridAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Lat/Lon &grid</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="viewLockZoomAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Lock zoom to tiled background</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="toolsProjectionsAction"> + <property name="text"> + <string>&Projection editor…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="viewPhotosAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&Photos on map</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="exportOSCAction"> + <property name="text"> + <string>OsmChange (OSC)</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="featureDeleteAction"> + <property name="text"> + <string>Force delete</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="layersOpenstreetbugsAction"> + <property name="text"> + <string>Add new OpenStreet&Bugs layer</string> + </property> + </action> + <action name="featureOsbClose"> + <property name="text"> + <string>Close</string> + </property> + </action> + <action name="roadSimplifyAction"> + <property name="text"> + <string>S&implify</string> + </property> + <property name="toolTip"> + <string>Simplify road(s)</string> + </property> + <property name="statusTip"> + <string>Simplify way by removing unnecessary child nodes</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="toolsFiltersAction"> + <property name="text"> + <string>&Filter editor…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="filterNoneAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>&None</string> + </property> + </action> + <action name="areaJoinAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/join_areas.png</normaloff>:/Icons/actions/join_areas.png</iconset> + </property> + <property name="text"> + <string>&Join areas</string> + </property> + <property name="toolTip"> + <string>Join adjacent areas</string> + </property> + <property name="statusTip"> + <string>Join areas that touch each-other.</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="areaSplitAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/split_area.png</normaloff>:/Icons/actions/split_area.png</iconset> + </property> + <property name="text"> + <string>&Split area</string> + </property> + <property name="toolTip"> + <string>Split area between two nodes</string> + </property> + <property name="statusTip"> + <string>Split selected area between two selected nodes into two separate areas.</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="areaTerraceAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/terrace_building.png</normaloff>:/Icons/actions/terrace_building.png</iconset> + </property> + <property name="text"> + <string>&Terrace</string> + </property> + <property name="toolTip"> + <string>Terrace area into residences</string> + </property> + <property name="statusTip"> + <string>Split a selected area into terraced residences.</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="toolsToolbarsAction"> + <property name="text"> + <string>Toolbar editor…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="roadAxisAlignAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/axisalign.png</normaloff>:/Icons/actions/axisalign.png</iconset> + </property> + <property name="text"> + <string>A&xis Align</string> + </property> + <property name="toolTip"> + <string>Align edges to regular axes</string> + </property> + <property name="statusTip"> + <string>Align edges to a certain number of regularly spaced axis.</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="filePrintAction"> + <property name="text"> + <string>&Print…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="filePrintPreviewAction"> + <property name="text"> + <string>Print preview…</string> + </property> + </action> + <action name="filePropertiesAction"> + <property name="text"> + <string>Properties…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="viewDirtyAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Highlight dirt&y features</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="layersNewDrawingAction"> + <property name="text"> + <string>Add new &drawing layer</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="editCutAction"> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/edit-cut.png</normaloff>:/Icons/actions/edit-cut.png</iconset> + </property> + <property name="text"> + <string>Cu&t</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+X</string> + </property> + </action> + <action name="layersNewFilterAction"> + <property name="text"> + <string>Add new &filter layer</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="roadExtrudeAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>E&xtrude</string> + </property> + <property name="toolTip"> + <string>Extrude interaction for ways (JOSM style)</string> + </property> + <property name="shortcut"> + <string notr="true">Alt+X</string> + </property> + </action> + <action name="featureSelectAction"> + <property name="text"> + <string>Select toggle</string> + </property> + </action> + <action name="featureSelectChildrenAction"> + <property name="text"> + <string>Include children in selection</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="editScaleAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/transform-scale.png</normaloff>:/Icons/actions/transform-scale.png</iconset> + </property> + <property name="text"> + <string>Scale</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="fileSaveAsTemplateAction"> + <property name="text"> + <string>Save as template document…</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="actionCreate_Multipolygon"> + <property name="text"> + <string>Create multipolygon</string> + </property> + </action> + <action name="relationAddToMultipolygonAction"> + <property name="text"> + <string>Add to multi&polygon</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="mapStyleSaveAction"> + <property name="text"> + <string>&Save</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="exportGDALAction"> + <property name="text"> + <string>GDAL SQLite/SpatiLite</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="roadBingExtractAction"> + <property name="text"> + <string>Bing road detector</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="toolsRebuildHistoryAction"> + <property name="text"> + <string>Rebuild &history</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="layersMapdustAction"> + <property name="text"> + <string>Add new Map&dust layer</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="viewWireframeAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Wireframe</string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+Alt+W</string> + </property> + </action> + <action name="featureSelectParentsAction"> + <property name="text"> + <string>Select parent(s)</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="featureDownloadMissingChildrenAction"> + <property name="text"> + <string>Download missing children</string> + </property> + <property name="shortcut"> + <string notr="true"/> + </property> + </action> + <action name="markBridgeAction"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="icon"> + <iconset resource="../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/build_bridge.png</normaloff>:/Icons/actions/build_bridge.png</iconset> + </property> + <property name="text"> + <string>&Bridge</string> + </property> + <property name="toolTip"> + <string><html><head/><body><p>Transform way to a bridge</p></body></html></string> + </property> + <property name="shortcut"> + <string notr="true">Ctrl+B</string> + </property> + </action> + </widget> + <resources> + <include location="../Icons/AllIcons.qrc"/> + </resources> + <connections> + <connection> + <sender>fileQuitAction</sender> + <signal>triggered()</signal> + <receiver>MainWindow</receiver> + <slot>close()</slot> + <hints> + <hint type="sourcelabel"> + <x>-1</x> + <y>-1</y> + </hint> + <hint type="destinationlabel"> + <x>403</x> + <y>322</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/NameFinder/NameFinder.pri b/src/NameFinder/NameFinder.pri new file mode 100644 index 0000000..29e1d66 --- /dev/null +++ b/src/NameFinder/NameFinder.pri @@ -0,0 +1,14 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/NameFinder +DEPENDPATH += $$MERKAARTOR_SRC_DIR/NameFinder + + +SOURCES += xmlstreamreader.cpp \ + httpquery.cpp \ + namefindertablemodel.cpp \ + namefinderwidget.cpp +HEADERS += NameFinderResult.h \ + xmlstreamreader.h \ + httpquery.h \ + namefindertablemodel.h \ + namefinderwidget.h +FORMS += namefinderwidget.ui diff --git a/src/NameFinder/NameFinderResult.h b/src/NameFinder/NameFinderResult.h new file mode 100644 index 0000000..64e0069 --- /dev/null +++ b/src/NameFinder/NameFinderResult.h @@ -0,0 +1,60 @@ +/*************************************************************************** +* Copyright (C) 2008 by Łukasz Jernaś * +* deejay1@srem.org * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the 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 NAMEFINDERWIDGET_RESULT_H_ +#define NAMEFINDERWIDGET_RESULT_H_ + +#include <QList> +#include <QRectF> + +namespace NameFinder { +//! Structure holding a single result of a query to the NameFinder service. + /** + * @author Łukasz Jernaś <deejay1@srem.org> + */ + class NameFinderResult { +public: + //! Name of the place found + QString name; + //! Type of the place found + QString type; + //! Category of the place (maps to key concept) + QString category; + //! Value of the category + QString info; + //! Coord of the POI + QPointF coord; + //! BBox of the feature + QRectF bbox; + //! Distance from coord to viewport center + qreal distance; +// //! The description as returned by the service. +// QString description; +// //! QList holding places which are near the result. +// QList<NameFinderResult> near; + + bool operator<(const NameFinderResult &other) const + { + return distance < other.distance; + } + + }; +} +#endif diff --git a/src/NameFinder/httpquery.cpp b/src/NameFinder/httpquery.cpp new file mode 100644 index 0000000..73d0781 --- /dev/null +++ b/src/NameFinder/httpquery.cpp @@ -0,0 +1,93 @@ +/*************************************************************************** + * Copyright (C) 2008 by Łukasz Jernaś * + * deejay1@srem.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "httpquery.h" +#include <QtDebug> +#include "Global.h" + +#include "MerkaartorPreferences.h" + +namespace NameFinder +{ + + HttpQuery::HttpQuery ( QObject *parent ) : QObject ( parent ) + { + myService = M_PREFS->getNominatimUrl(); + } + HttpQuery::HttpQuery ( QObject *parent, QUrl service ) : QObject ( parent ) + { + myService = service; + } + + + HttpQuery::~HttpQuery() + { + } + + bool HttpQuery::startSearch ( QString question ) + { + connect(&connection,SIGNAL(finished(QNetworkReply*)),this,SLOT(on_requestFinished(QNetworkReply*))); + +#ifdef QT5 + QUrlQuery theQuery(myService); +#define theQuery theQuery +#else +#define theQuery myService +#endif + theQuery.addQueryItem ( "q",question ); + theQuery.addQueryItem ( "format","xml" ); +#ifdef QT5 + myService.setQuery(theQuery); +#endif +#undef theQuery + + QUrl url("http://"+myService.host()); + url.setPath(myService.path()); +#ifdef QT5 + url.setQuery(myService.query()); +#else + url.setEncodedQuery(myService.encodedQuery()); +#endif + + qDebug() << "HttpQuery: getting" << url; + QNetworkRequest req(url); + + req.setRawHeader(QByteArray("User-Agent"), USER_AGENT.toLatin1()); + + connection.setProxy(M_PREFS->getProxy(myService)); + + myReply = connection.get( req ); + return true; + } + + void HttpQuery::on_requestFinished ( QNetworkReply *reply ) + { + if (reply == myReply) { + if (!reply->error()) { + qDebug() << "HttpQuery: request completed without error."; + emit done(reply); + } else { + qDebug() << "HttpQuery: request returned with error" << reply->error() << ":" << reply->errorString(); + emit doneWithError(reply->error()); + } + } else { + qDebug() << "HttpQuery: reply received to unknown request"; + } + } +} diff --git a/src/NameFinder/httpquery.h b/src/NameFinder/httpquery.h new file mode 100644 index 0000000..9fec7b4 --- /dev/null +++ b/src/NameFinder/httpquery.h @@ -0,0 +1,60 @@ +/*************************************************************************** + * Copyright (C) 2008 by Łukasz Jernaś * + * deejay1@srem.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 NAMEFINDERHTTPQUERY_H +#define NAMEFINDERHTTPQUERY_H + +#include <QObject> +#include <QIODevice> +#include <QNetworkAccessManager> +#include <QNetworkReply> +#include <QUrl> + +namespace NameFinder { + + /** + @author Łukasz Jernaś <deejay1@srem.org> + */ +class HttpQuery : public QObject { + Q_OBJECT +public: + HttpQuery(QObject *parent ); + HttpQuery(QObject *parent, QUrl service ); + ~HttpQuery(); + + bool startSearch(QString question); + +signals: + void done(QIODevice *reply); + void doneWithError(QNetworkReply::NetworkError error); + +private: + QNetworkAccessManager connection; + QUrl url; + QString myQuestion; + QUrl myService; + QNetworkReply *myReply; + +private slots: + void on_requestFinished ( QNetworkReply *reply ); +}; + +} + +#endif diff --git a/src/NameFinder/namefindertablemodel.cpp b/src/NameFinder/namefindertablemodel.cpp new file mode 100644 index 0000000..2256c4e --- /dev/null +++ b/src/NameFinder/namefindertablemodel.cpp @@ -0,0 +1,119 @@ +/*************************************************************************** + * Copyright (C) 2008 by Łukasz Jernaś * + * deejay1@srem.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "namefindertablemodel.h" + +namespace NameFinder +{ + + NameFinderTableModel::NameFinderTableModel ( QObject *parent ) + : QAbstractTableModel ( parent ) + { + showColumns = 2; + myResults = NULL; + } + + + NameFinderTableModel::~NameFinderTableModel() + { + } + + + int NameFinderTableModel::rowCount ( const QModelIndex &parent ) const + { + Q_UNUSED(parent) + if ( myResults == NULL ) + return 0; + if ( !myResults->isEmpty() ) + return myResults->count(); + return 0; + } + + int NameFinderTableModel::columnCount ( const QModelIndex &parent ) const + { + Q_UNUSED(parent) + return showColumns; + } + + void NameFinderTableModel::setResults ( QList<NameFinderResult> *results ) + { + beginResetModel(); + myResults = results; + endResetModel(); + } + QVariant NameFinderTableModel::headerData ( int section, Qt::Orientation orientation, int role ) const + { + if ( role != Qt::DisplayRole ) + return QVariant(); + if ( orientation == Qt::Horizontal ) + { + switch ( section ) + { + case 0: + return QString ( tr ( "Class" ) ); + //break; + case 1: + return QString ( tr ( "Name" ) ); + //break; + default: + return QString ( tr ( "Unknown field" ) ); + } + } + else + { + return section; + } + return QVariant(); + } + + QVariant NameFinderTableModel::data ( const QModelIndex &index, int role ) const + { + if ( !index.isValid() ) + return QVariant(); + if ( role == Qt::TextAlignmentRole ) + { + return int ( Qt::AlignCenter | Qt::AlignVCenter ); + } + else if ( role == Qt::DisplayRole ) + { + if ( myResults == NULL ) + return QVariant(); + if ( !myResults->isEmpty() ) + { + switch ( index.column() ) + { + case 0: + return myResults->at ( index.row() ).category; + break; + case 1: + return myResults->at ( index.row() ).name; + break; + default: + return QVariant(); + } + } + return QVariant(); + } + return QVariant(); + } + NameFinderResult NameFinderTableModel::resultAt ( int index ) + { + return myResults->at ( index ); + } +} diff --git a/src/NameFinder/namefindertablemodel.h b/src/NameFinder/namefindertablemodel.h new file mode 100644 index 0000000..0fc2148 --- /dev/null +++ b/src/NameFinder/namefindertablemodel.h @@ -0,0 +1,57 @@ +/*************************************************************************** + * Copyright (C) 2008 by Łukasz Jernaś * + * deejay1@srem.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 NAMEFINDERNAMEFINDERTABLEMODEL_H +#define NAMEFINDERNAMEFINDERTABLEMODEL_H + +#include <QAbstractTableModel> +#include <NameFinderResult.h> +#include <QList> + +namespace NameFinder { + + /** This class implements a model for QTableView to filter out the unrelevant data as easy as possible + @author Łukasz Jernaś <deejay1@srem.org> + */ +class NameFinderTableModel : public QAbstractTableModel { + Q_OBJECT +public: + NameFinderTableModel(QObject *parent = 0); + + ~NameFinderTableModel(); + + int rowCount(const QModelIndex &parent) const; + //! Returns the number of columns to display - currently capped at 3 + int columnCount(const QModelIndex &parent) const; + QVariant data(const QModelIndex &index, int role) const; + QVariant headerData(int section, Qt::Orientation orientation, int role) const; + //! + void setResults(QList<NameFinderResult> *results); + NameFinderResult resultAt(int index); + QList<NameFinderResult> *myResults; + +private: + + //! How many columns to show + int showColumns; + }; + +} + +#endif diff --git a/src/NameFinder/namefinderwidget.cpp b/src/NameFinder/namefinderwidget.cpp new file mode 100644 index 0000000..a84360d --- /dev/null +++ b/src/NameFinder/namefinderwidget.cpp @@ -0,0 +1,146 @@ +/*************************************************************************** + * Copyright (C) 2008 by Łukasz Jernaś * + * deejay1@srem.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "namefinderwidget.h" +#include "ui_namefinderwidget.h" +#include "xmlstreamreader.h" +#include "NameFinderResult.h" + +#include <QList> +#include <QHeaderView> +#include <QMessageBox> + +#include "MerkaartorPreferences.h" + +namespace NameFinder +{ + NameFinderWidget::NameFinderWidget ( QWidget *parent ) : + QWidget ( parent ), + m_ui ( new Ui::NameFinderWidgetUi ) + { + m_ui->setupUi ( this ); + model = new NameFinderTableModel(); + m_ui->tableView->setModel ( model ); + m_ui->tableView->horizontalHeader()->setStretchLastSection(true); +// m_ui->tableView->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); + m_ui->tableView->verticalHeader()->setVisible(false); + selection = m_ui->tableView->selectionModel(); + connect(selection, SIGNAL(selectionChanged(const QItemSelection&,const QItemSelection&)), this,SLOT(selection_selectionChanged(const QItemSelection&,const QItemSelection&))); + connect(m_ui->tableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT (doubleClick())); + } + + NameFinderWidget::~NameFinderWidget() + { + delete m_ui; + delete model; + delete selection; + } + + void NameFinderWidget::changeEvent ( QEvent *e ) + { + switch ( e->type() ) + { + case QEvent::LanguageChange: + m_ui->retranslateUi ( this ); + break; + default: + break; + } + } + + void NameFinderWidget::search ( QString object, QPointF coord ) + { + theCenter = coord; + query = new HttpQuery ( this ); + connect ( query, SIGNAL ( done( QIODevice* ) ), this, SLOT ( display(QIODevice*) ) ); + connect ( query, SIGNAL ( doneWithError(QNetworkReply::NetworkError) ), this, SLOT ( displayError(QNetworkReply::NetworkError) )); + + query->startSearch ( object ); + } + + void NameFinderWidget::display(QIODevice *reply) + { + XmlStreamReader reader ( reply, theCenter ); + reader.read(); + model->setResults ( new QList<NameFinderResult> ( reader.getResults() ) ); + + emit done(); + } + + //! Displays a QMessageBox with the connection error + void NameFinderWidget::displayError(QNetworkReply::NetworkError error) + { + QMessageBox errorBox; + errorBox.setIcon(QMessageBox::Critical); + errorBox.setWindowTitle(tr("Error!")); + if (error == QNetworkReply::AuthenticationRequiredError) { + errorBox.setText(tr("Name finder service requires authentication.")); + } else { + QMetaObject meta = QNetworkReply::staticMetaObject; + for (int i=0; i < meta.enumeratorCount(); ++i) { + QMetaEnum m = meta.enumerator(i); + if (m.name() == QLatin1String("NetworkError")) { + errorBox.setText(QLatin1String(m.valueToKey(error))); + break; + } + } + } + errorBox.exec(); + emit done(); + } + + QPointF NameFinderWidget::selectedCoords() + { + QModelIndexList selectedIndexes = selection->selectedIndexes(); + QModelIndex selectedIndex; + NameFinderResult result; + foreach (selectedIndex, selectedIndexes) + { + result = model->resultAt ( selectedIndex.row() ); + return result.coord; + } + return QPointF (); + + } + + QRectF NameFinderWidget::selectedBbox() + { + QModelIndexList selectedIndexes = selection->selectedIndexes(); + QModelIndex selectedIndex; + NameFinderResult result; + foreach (selectedIndex, selectedIndexes) + { + result = model->resultAt ( selectedIndex.row() ); + return result.bbox; + } + return QRectF(); + } + + void NameFinderWidget::selection_selectionChanged(const QItemSelection & selected, const QItemSelection & deselected) + { + Q_UNUSED(selected) + Q_UNUSED(deselected) + emit selectionChanged(); + } + + void NameFinderWidget::doubleClick() + { + emit doubleClicked(); + } +} diff --git a/src/NameFinder/namefinderwidget.h b/src/NameFinder/namefinderwidget.h new file mode 100644 index 0000000..e44ac03 --- /dev/null +++ b/src/NameFinder/namefinderwidget.h @@ -0,0 +1,83 @@ +/*************************************************************************** + * Copyright (C) 2008 by Łukasz Jernaś * + * deejay1@srem.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 NAMEFINDERWIDGET_H +#define NAMEFINDERWIDGET_H + +#include <QWidget> +#include "httpquery.h" +#include <QBuffer> +#include "namefindertablemodel.h" + +namespace Ui { + class NameFinderWidgetUi; +} + +class QItemSelectionModel; +class QItemSelection; + +namespace NameFinder { + + + class NameFinderWidget : public QWidget { + Q_OBJECT + Q_DISABLE_COPY(NameFinderWidget) + public: + explicit NameFinderWidget(QWidget *parent = 0); + virtual ~NameFinderWidget(); + /** + * Executes the search + * @param object Specifies a feature to search for, can be + * any string which the service recognizes. + * WARNING: this widget currently + * doesn't do any data validation on it! + */ + void search(QString object, QPointF coord); + //! Returns the coordinates of selected map feature + QPointF selectedCoords(); + //! Returns the bbox of the selected map feature + QRectF selectedBbox(); + + signals: + void selectionChanged(); + void doubleClicked(); + void done(); + + protected: + virtual void changeEvent(QEvent *e); + + + private: + Ui::NameFinderWidgetUi *m_ui; + + HttpQuery *query; + NameFinderTableModel *model; + QList<NameFinderResult> *results; + QItemSelectionModel *selection; + QPointF theCenter; + + + private slots: + void display(QIODevice *reply); + void displayError(QNetworkReply::NetworkError); + void selection_selectionChanged(const QItemSelection & selected, const QItemSelection & deselected); + void doubleClick(); + }; +} +#endif // NAMEFINDERWIDGET_H diff --git a/src/NameFinder/namefinderwidget.ui b/src/NameFinder/namefinderwidget.ui new file mode 100644 index 0000000..0dfa27e --- /dev/null +++ b/src/NameFinder/namefinderwidget.ui @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>NameFinderWidgetUi</class> + <widget class="QWidget" name="NameFinderWidgetUi"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QTableView" name="tableView"> + <property name="contextMenuPolicy"> + <enum>Qt::NoContextMenu</enum> + </property> + <property name="editTriggers"> + <set>QAbstractItemView::NoEditTriggers</set> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::SingleSelection</enum> + </property> + <property name="selectionBehavior"> + <enum>QAbstractItemView::SelectRows</enum> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/NameFinder/xmlstreamreader.cpp b/src/NameFinder/xmlstreamreader.cpp new file mode 100644 index 0000000..54b0de4 --- /dev/null +++ b/src/NameFinder/xmlstreamreader.cpp @@ -0,0 +1,167 @@ +/*************************************************************************** + * Copyright (C) 2008 by Łukasz Jernaś * + * deejay1@srem.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "xmlstreamreader.h" + +#include <QStringList> +#include <QLineF> + +namespace NameFinder { + + XmlStreamReader::XmlStreamReader(QIODevice *device, QPointF coord) { + myDevice = device; + theCenter = coord; + } + + + XmlStreamReader::~XmlStreamReader() { + } + + bool XmlStreamReader::read() { + myDevice->open(QIODevice::ReadOnly | QIODevice::Text); + reader.setDevice(myDevice); + reader.readNext(); + while (!reader.atEnd()) { + if (reader.isStartElement()) { + if (reader.name() == "searchresults") { + readSearchResultsElement(); + } else { + reader.raiseError(QObject::tr("Not a proper results stream!")); + } + } else { + reader.readNext(); + } + } + myDevice->close(); + + qSort(myResults.begin(), myResults.end()); + +// Implement error handling + return true; + } + + void XmlStreamReader::readSearchResultsElement() { + reader.readNext(); + while (!reader.atEnd()) { + if (reader.isEndElement()) { + reader.readNext(); + break; + } + + if (reader.isStartElement()) { + if (reader.name() == "place") { + readNamedElement(&myResults); + } else { + skipElement(); + } + } else { + reader.readNext(); + } + } + + } + void XmlStreamReader::readNamedElement(QList<NameFinderResult> *results) { + NameFinderResult myResult; + myResult.name = reader.attributes().value("display_name").toString(); + myResult.type = reader.attributes().value("osm_type").toString(); + QStringList sBbox = reader.attributes().value("boundingbox").toString().split(","); + myResult.bbox = QRectF(QPointF(sBbox[2].toDouble(), sBbox[0].toDouble()), QPointF(sBbox[3].toDouble(), sBbox[1].toDouble())); + myResult.coord = QPointF(reader.attributes().value("lon").toString().toDouble(), reader.attributes().value("lat").toString().toDouble()); + myResult.category = reader.attributes().value("class").toString(); + myResult.info = reader.attributes().value("type").toString(); + + myResult.distance = QLineF(theCenter, myResult.coord).length(); + + reader.readNext(); + while (!reader.atEnd()) { + if (reader.isEndElement()) { + reader.readNext(); + break; + } + + if (reader.isStartElement()) { + if (reader.name() == "place") { + readNamedElement(results); +// } else if (reader.name() == "description") { +// readDescriptionElement(&myResult); +// } else if (reader.name() == "nearestplaces") { +// readNearestPlacesElement(&myResult); + } else { + skipElement(); + } + } else { + reader.readNext(); + } + + } + results->append(myResult); + } + + void XmlStreamReader::skipElement() { + reader.readNext(); + while (!reader.atEnd()) { + if (reader.isEndElement()) { + reader.readNext(); + break; + } + if (reader.isStartElement()) { + skipElement(); + } else { + reader.readNext(); + } + } + } + +// void XmlStreamReader::readDescriptionElement(NameFinderResult *result) { +// result->description = reader.readElementText(); +// while (!reader.atEnd()) { +// if (reader.isEndElement()) { +// reader.readNext(); +// break; +// } else { +// skipElement(); +// } +// } +// } +// +// void XmlStreamReader::readNearestPlacesElement(NameFinderResult *result) { +// reader.readNext(); +// while (!reader.atEnd()) { +// if (reader.isEndElement()) { +// reader.readNext(); +// break; +// } +// if (reader.isStartElement()) { +// if (reader.name() == "named") { +// QList<NameFinderResult> nearResults; +// readNamedElement(&nearResults); +// result->near = nearResults; +// } else { +// skipElement(); +// } +// } else { +// reader.readNext(); +// } +// } +// } + + QList<NameFinderResult> XmlStreamReader::getResults() { + return myResults; + } +} diff --git a/src/NameFinder/xmlstreamreader.h b/src/NameFinder/xmlstreamreader.h new file mode 100644 index 0000000..373396f --- /dev/null +++ b/src/NameFinder/xmlstreamreader.h @@ -0,0 +1,61 @@ +/*************************************************************************** + * Copyright (C) 2008 by Łukasz Jernaś * + * deejay1@srem.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 NAMEFINDERXMLSTREAMREADER_H +#define NAMEFINDERXMLSTREAMREADER_H + +#include <QXmlStreamReader> +#include <QIODevice> + +#include <NameFinderResult.h> + +namespace NameFinder { + + /** \brief Reads the XML file and places results in a QList of NameFinderResult + @author Łukasz Jernaś <deejay1@srem.org> + */ + class XmlStreamReader { +public: + XmlStreamReader(QIODevice *buffer, QPointF coord); + ~XmlStreamReader(); + //! Reads the XML result. + bool read(); + QList<NameFinderResult> getResults(); + +private: + NameFinderResult tmpResult; + QList<NameFinderResult> myResults; + QXmlStreamReader reader; + QIODevice *myDevice; + QPointF theCenter; + + void readSearchResultsElement(); + void readNamedElement(QList<NameFinderResult> *results); +// void readDescriptionElement(NameFinderResult *result); +// //! Reads nearby places from the query +// void readNearestPlacesElement(NameFinderResult *result); + void skipElement(); + int i; + + }; + +} + +#endif + diff --git a/src/PaintStyle/FeaturePainter.cpp b/src/PaintStyle/FeaturePainter.cpp new file mode 100644 index 0000000..4170ed3 --- /dev/null +++ b/src/PaintStyle/FeaturePainter.cpp @@ -0,0 +1,833 @@ +#include "MapRenderer.h" +#include "FeaturePainter.h" +#include "Painting.h" +#include "Projection.h" +#include "Features.h" +#include "LineF.h" +#include "SvgCache.h" + +#include <QtCore/QString> +#include <QtGui/QPainter> +#include <QtGui/QPainterPath> +#include <QMatrix> +#include <QDomElement> +#include <math.h> + +#define TEST_RFLAGS(x) theRenderer->theOptions.options.testFlag(x) +#define CAPSTYLE Qt::RoundCap +#define JOINSTYLE Qt::RoundJoin + +FeaturePainter::FeaturePainter() +: Painter(), theTagSelector(0){ +} + +FeaturePainter::FeaturePainter(const FeaturePainter& f) +: Painter(f), theTagSelector(0) +{ + if (f.theTagSelector) + theTagSelector = f.theTagSelector->copy(); + +} + +FeaturePainter& FeaturePainter::operator=(const FeaturePainter& f) +{ + if (&f == this) return *this; + delete theTagSelector; + if (f.theTagSelector) + theTagSelector = f.theTagSelector->copy(); + else + theTagSelector = 0; + ZoomLimitSet = f.ZoomLimitSet; + ZoomUnder = f.ZoomUnder; + ZoomUpper = f.ZoomUpper; + DrawBackground = f.DrawBackground; + BackgroundColor = f.BackgroundColor; + BackgroundScale = f.BackgroundScale; + BackgroundOffset = f.BackgroundOffset; + DrawForeground = f.DrawForeground; + ForegroundColor = f.ForegroundColor; + ForegroundScale = f.ForegroundScale; + ForegroundOffset = f.ForegroundOffset; + ForegroundDashSet = f.ForegroundDashSet ; + ForegroundDash = f.ForegroundDash; + ForegroundWhite = f.ForegroundWhite; + DrawTouchup = f.DrawTouchup; + TouchupColor = f.TouchupColor; + TouchupScale = f.TouchupScale; + TouchupOffset = f.TouchupOffset; + TouchupDashSet = f.TouchupDashSet; + TouchupDash = f.TouchupDash; + TouchupWhite = f.TouchupWhite; + ForegroundFill = f.ForegroundFill; + ForegroundFillFillColor = f.ForegroundFillFillColor; + DrawTrafficDirectionMarks = f.DrawTrafficDirectionMarks; + DrawIcon = f.DrawIcon; + IconName = f.IconName; + IconScale = f.IconScale; + IconOffset = f.IconOffset; + DrawLabel = f.DrawLabel; + LabelColor = f.LabelColor; + LabelScale = f.LabelScale; + LabelOffset = f.LabelOffset; + DrawLabelBackground = f.DrawLabelBackground; + LabelBackgroundColor = f.LabelBackgroundColor; + LabelFont = f.LabelFont; + LabelTag = f.LabelTag; + LabelBackgroundTag = f.LabelBackgroundTag; + LabelHalo = f.LabelHalo; + LabelArea = f.LabelArea; + return *this; +} + +FeaturePainter::FeaturePainter(const Painter& f) +: Painter(f), theTagSelector(0) +{ + if (!f.theSelector.isEmpty()) + theTagSelector = TagSelector::parse(f.theSelector); +} + +FeaturePainter& FeaturePainter::operator=(const Painter& f) +{ + if (&f == this) return *this; + delete theTagSelector; + if (!f.theSelector.isEmpty()) + theTagSelector = TagSelector::parse(f.theSelector); + else + theTagSelector = 0; + ZoomLimitSet = f.ZoomLimitSet; + ZoomUnder = f.ZoomUnder; + ZoomUpper = f.ZoomUpper; + DrawBackground = f.DrawBackground; + BackgroundColor = f.BackgroundColor; + BackgroundScale = f.BackgroundScale; + BackgroundOffset = f.BackgroundOffset; + DrawForeground = f.DrawForeground; + ForegroundColor = f.ForegroundColor; + ForegroundScale = f.ForegroundScale; + ForegroundOffset = f.ForegroundOffset; + ForegroundDashSet = f.ForegroundDashSet ; + ForegroundDash = f.ForegroundDash; + ForegroundWhite = f.ForegroundWhite; + DrawTouchup = f.DrawTouchup; + TouchupColor = f.TouchupColor; + TouchupScale = f.TouchupScale; + TouchupOffset = f.TouchupOffset; + TouchupDashSet = f.TouchupDashSet; + TouchupDash = f.TouchupDash; + TouchupWhite = f.TouchupWhite; + ForegroundFill = f.ForegroundFill; + ForegroundFillFillColor = f.ForegroundFillFillColor; + DrawTrafficDirectionMarks = f.DrawTrafficDirectionMarks; + DrawIcon = f.DrawIcon; + IconName = f.IconName; + IconScale = f.IconScale; + IconOffset = f.IconOffset; + DrawLabel = f.DrawLabel; + LabelColor = f.LabelColor; + LabelScale = f.LabelScale; + LabelOffset = f.LabelOffset; + DrawLabelBackground = f.DrawLabelBackground; + LabelBackgroundColor = f.LabelBackgroundColor; + LabelFont = f.LabelFont; + LabelTag = f.LabelTag; + LabelBackgroundTag = f.LabelBackgroundTag; + LabelHalo = f.LabelHalo; + LabelArea = f.LabelArea; + return *this; +} + +FeaturePainter::~FeaturePainter() +{ + delete theTagSelector; +} + +void FeaturePainter::setSelector(const QString& anExpression) +{ + delete theTagSelector; + theTagSelector = TagSelector::parse(anExpression); + theSelector = anExpression; +} + +void FeaturePainter::setSelector(TagSelector* aSel) +{ + delete theTagSelector; + theTagSelector = aSel; + theSelector = aSel->asExpression(false); +} + +TagSelectorMatchResult FeaturePainter::matchesTag(const Feature* F, MapRenderer* theRender) const +{ + TagSelectorMatchResult res; + + if (!theTagSelector) return TagSelect_NoMatch; + // Special casing for multipolygon roads + //if (const Road* R = dynamic_cast<const Road*>(F)) + //{ + // // TODO create a isPartOfMultiPolygon(R) function for this + // for (int i=0; i<R->sizeParents(); ++i) + // { + // if (const Relation* Parent = dynamic_cast<const Relation*>(R->getParent(i))) + // if (Parent->tagValue("type","") == "multipolygon") + // return TagSelect_NoMatch; + // } + //} + if (theRender) + res = theTagSelector->matches(F,theRender->thePixelPerM); + else + res = theTagSelector->matches(F,0); + if (res) + return res; + // Special casing for multipolygon relations + //if (const Relation* R = dynamic_cast<const Relation*>(F)) + //{ + // for (int i=0; i<R->size(); ++i) + // if ((res = theSelector->matches(R->get(i)))) + // return res; + //} + return TagSelect_NoMatch; +} + +/* +void buildPathFromRoad(Road *R, const Projection &theProjection, QPainterPath &Path) +{ + Path.moveTo(theProjection.project(R->get(0))); + for (int i=1; i<R->size(); ++i) + Path.lineTo(theProjection.project(R->get(i))); +} + +void buildPathFromRelation(Relation *R, const Projection &theProjection, QPainterPath &Path) +{ + for (int i=0; i<R->size(); ++i) + if (Road* M = dynamic_cast<Road*>(R->get(i))) + buildPathFromRoad(M, theProjection, Path); +} + +*/ + +void FeaturePainter::drawBackground(Node* N, QPainter* thePainter, MapRenderer* theRenderer) const +{ + if (!DrawBackground) + return; + + qreal PixelPerM = theRenderer->thePixelPerM; + qreal WW = PixelPerM*BackgroundScale+BackgroundOffset; + if (WW >= 0) + { + QPointF P(theRenderer->toView(N)); + QRect R(P.x()-WW/2, P.y()-WW/2, WW, WW); + thePainter->fillRect(R,BackgroundColor); + } +} + +void FeaturePainter::drawBackground(Way* R, QPainter* thePainter, MapRenderer* theRenderer) const +{ + if (!DrawBackground && !ForegroundFill && !ForegroundFillUseIcon) return; + + thePainter->setPen(Qt::NoPen); + if (M_PREFS->getAreaOpacity() != 100 && ForegroundFill) { + thePainter->setOpacity(qreal(M_PREFS->getAreaOpacity()) / 100); + } + if (DrawBackground) + { + qreal WW = theRenderer->thePixelPerM*R->widthOf()*BackgroundScale+BackgroundOffset; + if (WW >= 0) + { + if (BackgroundExterior || BackgroundInterior) { + QPen thePen(BackgroundColor,WW); + thePen.setCapStyle(CAPSTYLE); + thePen.setJoinStyle(Qt::BevelJoin); + thePainter->setPen(thePen); + + R->getLock(); + QPainterPath thePath = theRenderer->theTransform.map(R->getPath()); + R->releaseLock(); + QPainterPath aPath; + + for (int j=1; j < thePath.elementCount(); j++) { + QLineF l(QPointF(thePath.elementAt(j)), QPointF(thePath.elementAt(j-1))); + QLineF l1 = l.normalVector(); + if (BackgroundInterior) + l1.setAngle(l1.angle() + 180.); + l1.setLength(WW / 2.0); + if (j == 1) { + QLineF l3(l1); + l3.translate(l.p2() - l.p1()); + aPath.moveTo(l3.p2()); + } + if (j < thePath.elementCount() - 1) { + QLineF l4(QPointF(thePath.elementAt(j)), QPointF(thePath.elementAt(j+1))); + qreal theAngle = (l4.angle() - l.angle()) / 2.0; + if (BackgroundInterior) { + if (theAngle > 0.0) theAngle -= 180.0; + l1.setLength(-1/sin(angToRad(theAngle))*l1.length()); + } else { + if (theAngle < 0.0) theAngle += 180.0; + l1.setLength(1/sin(angToRad(theAngle))*l1.length()); + } + l1.setAngle(l.angle() + theAngle); + } + aPath.lineTo(l1.p2()); + } + thePainter->drawPath(aPath); + thePainter->setPen(Qt::NoPen); + } else { + QPen thePen(BackgroundColor,WW); + thePen.setCapStyle(CAPSTYLE); + thePen.setJoinStyle(JOINSTYLE); + ////thePainter->strokePath(R->getPath(),thePen); + thePainter->setPen(thePen); + } + } + } + + thePainter->setBrush(Qt::NoBrush); + if (R->size() > 2) { + if (ForegroundFillUseIcon) { + if (!IconName.isEmpty()) { + qreal PixelPerM = theRenderer->thePixelPerM; + qreal WW = PixelPerM*IconScale+IconOffset; + + QImage* pm = getSVGImageFromFile(IconName,int(WW)); + if (pm && !pm->isNull()) { + thePainter->setBrush(*pm); + } + } + } else if (ForegroundFill) { + thePainter->setBrush(ForegroundFillFillColor); + } + } + + R->getLock(); + thePainter->drawPath(theRenderer->theTransform.map(R->getPath())); + R->releaseLock(); +} + +void FeaturePainter::drawBackground(Relation* R, QPainter* thePainter, MapRenderer* theRenderer) const +{ + if (!DrawBackground && !ForegroundFill && !ForegroundFillUseIcon) return; + + thePainter->setPen(Qt::NoPen); + if (M_PREFS->getAreaOpacity() != 100 && ForegroundFill) { + thePainter->setOpacity(qreal(M_PREFS->getAreaOpacity()) / 100); + } + if (DrawBackground) + { + qreal PixelPerM = theRenderer->thePixelPerM; + qreal WW = PixelPerM*R->widthOf()*BackgroundScale+BackgroundOffset; + if (WW >= 0) + { + if (BackgroundExterior || BackgroundInterior) { + QPen thePen(BackgroundColor,WW); + thePen.setCapStyle(CAPSTYLE); + thePen.setJoinStyle(Qt::BevelJoin); + thePainter->setPen(thePen); + + R->getLock(); + QPainterPath thePath = theRenderer->theTransform.map(R->getPath()); + R->releaseLock(); + QPainterPath aPath; + + for (int j=1; j < thePath.elementCount(); j++) { + QLineF l(QPointF(thePath.elementAt(j)), QPointF(thePath.elementAt(j-1))); + QLineF l1 = l.normalVector(); + if (BackgroundInterior) + l1.setAngle(l1.angle() + 180.); + l1.setLength(WW / 2.0); + if (j == 1) { + QLineF l3(l1); + l3.translate(l.p2() - l.p1()); + aPath.moveTo(l3.p2()); + } + if (j < thePath.elementCount() - 1) { + QLineF l4(QPointF(thePath.elementAt(j)), QPointF(thePath.elementAt(j+1))); + qreal theAngle = (l4.angle() - l.angle()) / 2.0; + if (BackgroundInterior) { + if (theAngle > 0.0) theAngle -= 180.0; + l1.setLength(-1/sin(angToRad(theAngle))*l1.length()); + } else { + if (theAngle < 0.0) theAngle += 180.0; + l1.setLength(1/sin(angToRad(theAngle))*l1.length()); + } + l1.setAngle(l.angle() + theAngle); + } + aPath.lineTo(l1.p2()); + } + thePainter->drawPath(aPath); + thePainter->setPen(Qt::NoPen); + } else { + QPen thePen(BackgroundColor,WW); + thePen.setCapStyle(CAPSTYLE); + thePen.setJoinStyle(JOINSTYLE); + ////thePainter->strokePath(R->getPath(),thePen); + thePainter->setPen(thePen); + } + } + } + + thePainter->setBrush(Qt::NoBrush); + if (ForegroundFillUseIcon) { + if (!IconName.isEmpty()) { + qreal PixelPerM = theRenderer->thePixelPerM; + qreal WW = PixelPerM*IconScale+IconOffset; + + QImage* pm = getSVGImageFromFile(IconName,int(WW)); + if (pm && !pm->isNull()) { + thePainter->setBrush(*pm); + } + } + } else if (ForegroundFill) { + thePainter->setBrush(ForegroundFillFillColor); + } + + R->getLock(); + thePainter->drawPath(theRenderer->theTransform.map(R->getPath())); + R->releaseLock(); +} + +void FeaturePainter::drawForeground(Node* N, QPainter* thePainter, MapRenderer* theRenderer) const +{ + if (!DrawForeground) + return; + + qreal PixelPerM = theRenderer->thePixelPerM; + qreal WW = PixelPerM*ForegroundScale+ForegroundOffset; + if (WW >= 0) + { + QPointF P(theRenderer->toView(N)); + QRect R(P.x()-WW/2, P.y()-WW/2, WW, WW); + thePainter->fillRect(R,ForegroundColor); + } +} + +void FeaturePainter::drawForeground(Way* R, QPainter* thePainter, MapRenderer* theRenderer) const +{ + if (!DrawForeground) return; + + qreal WW = 0.0; + if (DrawForeground) + { + qreal PixelPerM = theRenderer->thePixelPerM; + WW = PixelPerM*R->widthOf()*ForegroundScale+ForegroundOffset; + if (WW < 0) return; + QPen thePen(ForegroundColor,WW); + thePen.setCapStyle(CAPSTYLE); + thePen.setJoinStyle(JOINSTYLE); + if (ForegroundDashSet) + { + QVector<qreal> Pattern; + Pattern << ForegroundDash << ForegroundWhite; + thePen.setDashPattern(Pattern); + } + thePainter->setPen(thePen); + } + else + thePainter->setPen(Qt::NoPen); + + thePainter->setBrush(Qt::NoBrush); + + R->getLock(); + thePainter->drawPath(theRenderer->theTransform.map(R->getPath())); + R->releaseLock(); +} + +void FeaturePainter::drawForeground(Relation* R, QPainter* thePainter, MapRenderer* theRenderer) const +{ + if (!DrawForeground) return; + + qreal WW = 0.0; + if (DrawForeground) + { + qreal PixelPerM = theRenderer->thePixelPerM; + WW = PixelPerM*R->widthOf()*ForegroundScale+ForegroundOffset; + if (WW < 0) return; + QPen thePen(ForegroundColor,WW); + thePen.setCapStyle(CAPSTYLE); + thePen.setJoinStyle(JOINSTYLE); + if (ForegroundDashSet) + { + QVector<qreal> Pattern; + Pattern << ForegroundDash << ForegroundWhite; + thePen.setDashPattern(Pattern); + } + thePainter->setPen(thePen); + } + else + thePainter->setPen(Qt::NoPen); + + thePainter->setBrush(Qt::NoBrush); + + R->getLock(); + thePainter->drawPath(theRenderer->theTransform.map(R->getPath())); + R->releaseLock(); +} + + +void FeaturePainter::drawTouchup(Node* Pt, QPainter* thePainter, MapRenderer* theRenderer) const +{ + bool IconOK = false; + if (DrawIcon) + { + if (!IconName.isEmpty()) { + qreal PixelPerM = theRenderer->thePixelPerM; + qreal WW = PixelPerM*IconScale+IconOffset; + + QImage* pm = getSVGImageFromFile(IconName,int(WW)); + if (pm && !pm->isNull()) { + IconOK = true; + QPointF C(theRenderer->theTransform.map(Pt->projected())); + // cbro-20090109: Don't draw the dot if there is an icon + // thePainter->fillRect(QRect(C-QPoint(2,2),QSize(4,4)),QColor(0,0,0,128)); + thePainter->drawImage( int(C.x()-pm->width()/2), int(C.y()-pm->height()/2) , *pm); + } + } + if (!IconOK) + { + QColor theColor = QColor(0,0,0,128); + if (DrawForeground) + theColor = ForegroundColor; + else + if (DrawBackground) + theColor = BackgroundColor; + + QPointF P(theRenderer->toView(Pt)); + qreal WW = theRenderer->NodeWidth; + if (WW >= 1) { + if (Pt->layer()->classGroups() & Layer::Special) { + QRect R2(P.x()-WW*4/3/2, P.y()-WW*4/3/2, WW*4/3, WW*4/3); + thePainter->fillRect(R2,QColor(255,0,255,192)); + } else if (Pt->isWaypoint()) { + QRect R2(P.x()-WW*4/3/2, P.y()-WW*4/3/2, WW*4/3, WW*4/3); + thePainter->fillRect(R2,QColor(255,0,0,192)); + } + + QRect R(P.x()-WW/2, P.y()-WW/2, WW, WW); + thePainter->fillRect(R,theColor); + } + } + } +} + +void FeaturePainter::drawTouchup(Way* R, QPainter* thePainter, MapRenderer* theRenderer) const +{ + if (DrawTouchup) + { + qreal PixelPerM = theRenderer->thePixelPerM; + qreal WW = PixelPerM*R->widthOf()*TouchupScale+TouchupOffset; + if (WW > 0) + { + QPen thePen(TouchupColor,WW); + thePen.setCapStyle(CAPSTYLE); + thePen.setJoinStyle(JOINSTYLE); + if (TouchupDashSet) + { + QVector<qreal> Pattern; + Pattern << TouchupDash << TouchupWhite; + thePen.setDashPattern(Pattern); + } + R->getLock(); + thePainter->strokePath(theRenderer->theTransform.map(R->getPath()),thePen); + R->releaseLock(); + } + } + if (DrawIcon && !ForegroundFillUseIcon) + { + if (!IconName.isEmpty()) { + qreal PixelPerM = theRenderer->thePixelPerM; + qreal WW = PixelPerM*IconScale+IconOffset; + + QImage* pm = getSVGImageFromFile(IconName,int(WW)); + if (pm && !pm->isNull()) { + R->getLock(); + QPointF C(theRenderer->theTransform.map(R->getPath().boundingRect().center())); + R->releaseLock(); + thePainter->drawImage( int(C.x()-pm->width()/2), int(C.y()-pm->height()/2) , *pm); + } + } + } + if ( ((DrawTrafficDirectionMarks) && (theRenderer->theOptions.arrowOptions == RendererOptions::ArrowsOneway)) || theRenderer->theOptions.arrowOptions == RendererOptions::ArrowsAlways) + { + Feature::TrafficDirectionType TT = trafficDirection(R); + if ( (TT != Feature::UnknownDirection) || (theRenderer->theOptions.arrowOptions == RendererOptions::ArrowsAlways) ) + { + qreal theWidth = theRenderer->thePixelPerM*R->widthOf()-4; + if (theWidth > 8) + theWidth = 8; + qreal DistFromCenter = 2*(theWidth+4); + if (theWidth > 0) + { + if ( theRenderer->theOptions.arrowOptions == RendererOptions::ArrowsAlways ) + thePainter->setPen(QPen(QColor(255,0,0), 2)); + else + thePainter->setPen(QPen(TrafficDirectionMarksColor, 2)); + + + for (int i=1; i<R->size(); ++i) + { + QPointF FromF(theRenderer->theTransform.map(R->getNode(i-1)->projected())); + QPointF ToF(theRenderer->theTransform.map(R->getNode(i)->projected())); + if (distance(FromF,ToF) > (DistFromCenter*2+4)) + { + QPoint H(FromF.toPoint()+ToF.toPoint()); + H *= 0.5; + if (!theRenderer->theScreen.contains(H)) + continue; + qreal A = angle(FromF-ToF); + QPoint T(qRound(DistFromCenter*cos(A)),qRound(DistFromCenter*sin(A))); + QPoint V1(qRound(theWidth*cos(A+M_PI/6)),qRound(theWidth*sin(A+M_PI/6))); + QPoint V2(qRound(theWidth*cos(A-M_PI/6)),qRound(theWidth*sin(A-M_PI/6))); + if ( (TT == Feature::OtherWay) || (TT == Feature::BothWays) ) + { + thePainter->drawLine(H+T,H+T-V1); + thePainter->drawLine(H+T,H+T-V2); + } + if ( (TT == Feature::OneWay) || (TT == Feature::BothWays) ) + { + thePainter->drawLine(H-T,H-T+V1); + thePainter->drawLine(H-T,H-T+V2); + } + else + { + if ( theRenderer->theOptions.arrowOptions == RendererOptions::ArrowsAlways ) + { + thePainter->drawLine(H-T,H-T+V1); + thePainter->drawLine(H-T,H-T+V2); + } + } + } + } + } + } + } +} + +#define LABEL_PATH_DISTANCE 3 +#define LABEL_STRAIGHT_DISTANCE 50 +#define BG_SPACING 6 +#define BG_PEN_SZ 2 + +void FeaturePainter::drawPointLabel(QPointF C, QString str, QString strBg, QPainter* thePainter, MapRenderer* theRenderer) const +{ + LineParameters lp = labelBoundary(); + qreal PixelPerM = theRenderer->thePixelPerM; + qreal WW = PixelPerM*lp.Proportional+lp.Fixed; + if (WW < 10) return; + + QFont font = getLabelFont(); + font.setPixelSize(int(WW)); + QFontMetrics metrics(font); + + int modX = 0; + int modY = 0; + QPainterPath textPath; + QPainterPath bgPath; + + if (!str.isEmpty()) { + modX = - (metrics.width(str)/2); + if (DrawIcon && !IconName.isEmpty() ) + { + QImage pm(IconName); + modY = - pm.height(); + if (DrawLabelBackground) + modY -= BG_SPACING; + } + textPath.addText(modX, modY, font, str); + thePainter->translate(C); + } + if (DrawLabelBackground && !strBg.isEmpty()) { + modX = - (metrics.width(strBg)/2); + if (DrawIcon && !IconName.isEmpty() ) + { + QImage pm(IconName); + modY = - pm.height(); + if (DrawLabelBackground) + modY -= BG_SPACING; + } + + textPath.addText(modX, modY, font, strBg); + thePainter->translate(C); + + bgPath.addRect(textPath.boundingRect().adjusted(-BG_SPACING, -BG_SPACING, BG_SPACING, BG_SPACING)); + thePainter->setPen(QPen(LabelColor, BG_PEN_SZ)); + thePainter->setBrush(LabelBackgroundColor); + thePainter->drawPath(bgPath); + } + if (getLabelHalo()) { + thePainter->setPen(QPen(Qt::white, font.pixelSize()/5)); + thePainter->drawPath(textPath); + } + thePainter->setPen(Qt::NoPen); + thePainter->setBrush(LabelColor); + thePainter->drawPath(textPath); + + if (DrawLabelBackground && !strBg.isEmpty()) { + QRegion rg = thePainter->clipRegion(); + rg -= textPath.boundingRect().toRect().translated(C.toPoint()); + thePainter->setClipRegion(theRenderer->theTransform.map(rg)); + } +} + + +void FeaturePainter::drawLabel(Node* Pt, QPainter* thePainter, MapRenderer* theRenderer) const +{ + if (!DrawLabel) + return; + + QString str = Pt->tagValue(getLabelTag(), QString()); + QString strBg = Pt->tagValue(getLabelBackgroundTag(), QString()); + + if (str.isEmpty() && strBg.isEmpty()) + return; + + QPointF C(theRenderer->theTransform.map(Pt->projected())); + drawPointLabel(C, str, strBg, thePainter, theRenderer); +} + +void FeaturePainter::drawLabel(Way* R, QPainter* thePainter, MapRenderer* theRenderer) const +{ + if (!DrawLabel) + return; + + QString str = R->tagValue(getLabelTag(), QString()); + QString strBg = R->tagValue(getLabelBackgroundTag(), QString()); + if (str.isEmpty() && strBg.isEmpty()) + return; + + if (getLabelArea()) { + R->getLock(); + QPointF C(theRenderer->theTransform.map(R->getPath().boundingRect().center())); + R->releaseLock(); +// if (rg.contains(C.toPoint())) { + drawPointLabel(C, str, strBg, thePainter, theRenderer); +// } + return; + } + + LineParameters lp = labelBoundary(); + qreal PixelPerM = theRenderer->thePixelPerM; + qreal WW = PixelPerM*R->widthOf()*lp.Proportional+lp.Fixed; + if (WW < 10 && !TEST_RFLAGS(RendererOptions::PrintAllLabels)) return; + //qreal WWR = qMax(PixelPerM*R->widthOf()*BackgroundScale+BackgroundOffset, PixelPerM*R->widthOf()*ForegroundScale+ForegroundOffset); + + R->getLock(); + QPainterPath tranformedRoadPath = theRenderer->theTransform.map(R->getPath()); + R->releaseLock(); + QFont font = getLabelFont(); +//#if QT_VERSION >= 0x040700 || defined(FORCE_46) +// qreal pathSurface = tranformedRoadPath.controlPointRect().width() * tranformedRoadPath.controlPointRect().height(); +// if (pathSurface > theRenderer->theScreen.width() * theRenderer->theScreen.height() * 3) { +// QPainterPath clipPath; +// clipPath.addRect(theRenderer->theScreen.adjusted(-500, -500, 500, 500)); + +// tranformedRoadPath = clipPath.intersected(tranformedRoadPath); +// } +//#endif + + if (!str.isEmpty()) { + font.setPixelSize(int(WW)); + QFontMetricsF metrics(font); + qreal strWidth = metrics.width(str); + + if ((font.pixelSize() >= 5 || TEST_RFLAGS(RendererOptions::PrintAllLabels)) && tranformedRoadPath.length() > strWidth) { + thePainter->setFont(font); + + int repeat = int((tranformedRoadPath.length() / ((strWidth * LABEL_PATH_DISTANCE))) - 0.5); + int numSegment = repeat+1; + qreal lenSegment = tranformedRoadPath.length() / numSegment; + qreal startSegment = 0; + QPainterPath textPath; + do { + qreal curLen = startSegment + ((lenSegment - strWidth) / 2); + int modIncrement = 1; + qreal modAngle = 0; + qreal modY = 0; + if (cos(angToRad(tranformedRoadPath.angleAtPercent((startSegment+(lenSegment/2))/tranformedRoadPath.length()))) < 0) { + modIncrement = -1; + modAngle = 180.0; + curLen += strWidth; + } + for (int i = 0; i < str.length(); ++i) { + qreal t = tranformedRoadPath.percentAtLength(curLen); + QPointF pt = tranformedRoadPath.pointAtPercent(t); + +// if (!theRenderer->theScreen.contains(pt.toPoint())) +// continue; + + qreal angle = tranformedRoadPath.angleAtPercent(t); +// modY = (metrics.ascent()/2)-3; + modY = (metrics.height()/2)-metrics.descent(); + + QMatrix m; + m.translate(pt.x(), pt.y()); + m.rotate(-angle+modAngle); + + QPainterPath charPath; + charPath.addText(0, modY, font, str.mid(i, 1)); + charPath = charPath * m; + + textPath.addPath(charPath); + + qreal incremenet = metrics.width(str[i]); + curLen += (incremenet * modIncrement); + } + startSegment += lenSegment; + } while (--repeat >= 0); + + if (getLabelHalo()) { + thePainter->setPen(QPen(Qt::white, font.pixelSize()/6)); + thePainter->drawPath(textPath); + } + thePainter->setPen(Qt::NoPen); + thePainter->setBrush(LabelColor); + thePainter->drawPath(textPath); + } + } + if (DrawLabelBackground && !strBg.isEmpty()) { + QRegion rg = thePainter->clipRegion(); + font.setPixelSize(int(WW)); + QFontMetrics metrics(font); + qreal strWidth = metrics.width(strBg); + + int repeat = int((tranformedRoadPath.length() / (strWidth * LABEL_STRAIGHT_DISTANCE)) - 0.5); + int numSegment = repeat+1; + qreal lenSegment = tranformedRoadPath.length() / numSegment; + qreal startSegment = 0; + do { + int modX = 0; + int modY = 0; + + qreal curLen = startSegment + (lenSegment / 2); + qreal t = tranformedRoadPath.percentAtLength(curLen); + QPointF pt = tranformedRoadPath.pointAtPercent(t); + + modX = - (strWidth/2); + //modX = WW; + modY = (metrics.ascent()/2); + + QPainterPath textPath, bgPath; + textPath.addText(modX, modY, font, strBg); + bgPath.addRect(textPath.boundingRect().adjusted(-BG_SPACING, -BG_SPACING, BG_SPACING, BG_SPACING)); + + if (rg.contains(bgPath.boundingRect().toRect().translated(pt.toPoint()))) { + thePainter->translate(pt); + + thePainter->setPen(QPen(LabelColor, BG_PEN_SZ)); + thePainter->setBrush(LabelBackgroundColor); + thePainter->drawPath(bgPath); + + if (getLabelHalo()) { + thePainter->setPen(QPen(Qt::white, font.pixelSize()/5)); + thePainter->drawPath(textPath); + } + thePainter->setPen(Qt::NoPen); + thePainter->setBrush(LabelColor); + thePainter->drawPath(textPath); + + rg -= bgPath.boundingRect().toRect().translated(pt.toPoint()); + } + + startSegment += lenSegment; + } while (--repeat >= 0); + + thePainter->setClipRegion(rg); + } +} diff --git a/src/PaintStyle/FeaturePainter.h b/src/PaintStyle/FeaturePainter.h new file mode 100644 index 0000000..17c1d2f --- /dev/null +++ b/src/PaintStyle/FeaturePainter.h @@ -0,0 +1,61 @@ +#ifndef MERKAARTOR_FEATUREPAINTER_H_ +#define MERKAARTOR_FEATUREPAINTER_H_ + +#include <QtCore/QString> +#include <QtGui/QColor> +#include <QFont> + +#include <QList> +#include <QPair> +#include <QPointF> + +#include <Painter.h> +#include "TagSelector.h" + +class MapRenderer; +class Feature; +class Projection; +class Relation; +class Way; +class TagSelector; +class Node; +class QPainter; +class QPainterPath; +class QFont; +class QDomElement; + +class FeaturePainter : public Painter +{ +public: + FeaturePainter(); + FeaturePainter(const FeaturePainter& f); + FeaturePainter& operator=(const FeaturePainter& F); + FeaturePainter(const Painter& f); + FeaturePainter& operator=(const Painter& F); + ~FeaturePainter(); + + void setSelector(const QString& aName); + void setSelector(TagSelector* aSelector); + TagSelectorMatchResult matchesTag(const Feature* F, MapRenderer* theRender) const; + + QString toXML(QString filename) const; + static FeaturePainter fromXML(const QDomElement& e, QString filename); + + virtual void drawBackground(Node *N, QPainter *thePainter, MapRenderer *theRender) const; + virtual void drawBackground(Way* R, QPainter* thePainter, MapRenderer* theRender) const; + virtual void drawBackground(Relation* R, QPainter* thePainter, MapRenderer* theRender) const; + virtual void drawForeground(Node *N, QPainter *thePainter, MapRenderer* theRender) const; + virtual void drawForeground(Way* R, QPainter* thePainter, MapRenderer* theRender) const; + virtual void drawForeground(Relation* R, QPainter* thePainter, MapRenderer* theRender) const; + virtual void drawTouchup(Way* R, QPainter* thePainter, MapRenderer* theRender) const; + virtual void drawTouchup(Node* R, QPainter* thePainter, MapRenderer* theRender) const; + virtual void drawLabel(Way* R, QPainter* thePainter, MapRenderer* theRender) const; + virtual void drawPointLabel(QPointF C, QString str, QString strBG, QPainter* thePainter, MapRenderer* theRender) const; + virtual void drawLabel(Node* Pt, QPainter* thePainter, MapRenderer* theRender) const; + +public: + TagSelector* theTagSelector; +}; + +#endif + diff --git a/src/PaintStyle/IPaintStyle.h b/src/PaintStyle/IPaintStyle.h new file mode 100644 index 0000000..a12db3c --- /dev/null +++ b/src/PaintStyle/IPaintStyle.h @@ -0,0 +1,28 @@ +#ifndef IPAINTSTYLE_H +#define IPAINTSTYLE_H + +#include "Painter.h" + +class MapView; + +#include <QList> + +class IPaintStyle +{ +public: + virtual int painterSize() = 0; + virtual const GlobalPainter& getGlobalPainter() const = 0; + virtual void setGlobalPainter(GlobalPainter aGlobalPainter) = 0; + virtual const Painter* getPainter(int i) const = 0; + virtual QList<Painter> getPainters() const = 0; + virtual void setPainters(QList<Painter> aPainters) = 0; + virtual bool isDirty() = 0; + + virtual QString getFilename() = 0; + virtual void savePainters(const QString& filename) = 0; + virtual void loadPainters(const QString& filename) = 0; + + virtual ~IPaintStyle() {}; +}; + +#endif // IPAINTSTYLE_H diff --git a/src/PaintStyle/MapCSSPaintstyle.cpp b/src/PaintStyle/MapCSSPaintstyle.cpp new file mode 100644 index 0000000..216a76e --- /dev/null +++ b/src/PaintStyle/MapCSSPaintstyle.cpp @@ -0,0 +1,134 @@ +#include "MapCSSPaintstyle.h" +#include "TagSelector.h" + +#include <QtCore/QFile> +#include <QtCore/QTextStream> +#include <QtGui/QPainter> +#include <QtGui/QPainterPath> +#include <QtXml/QDomDocument> +#include <QtXml/QDomNode> + +#include <QHash> +#include <QDebug> + +#include <math.h> +#include <utility> + +//#define GLOBALZOOM 0.002 + +MapCSSPaintstyle* MapCSSPaintstyle::m_MapCSSInstance = 0; + +#define ALWAYS 10e6 + +/* Zoom boundaries : expressed in Pixel per Meter + + eg 0.01->ALWAYS means show a feature from a zoom level of 0.01 Pixel Per M, + or 100 Meter per Pixel. For a screen of 1000px wide this is when viewing + 100km or less across. + + eg 0.2->ALWAYS means show a feature from a zoom level 0.2 Px/M or 5M/Px which + is viewing 5km or less across a screen of 1000Px. */ + +/* EDITPAINTSTYLE */ + +MapCSSPaintstyle::MapCSSPaintstyle() +{ +} + +MapCSSPaintstyle::~MapCSSPaintstyle(void) +{ +} + +void MapCSSPaintstyle::savePainters(const QString& /*filename*/) +{ +} + +QString parseSelector(QString in) +{ + QString out = in; +// int idx = 0; + +// QList<TagSelector*> terms; +// while (idx < in.length()) { +// TagSelector* t = TagSelector::parse(in, idx); +// if (!t) break; +// terms.append(t); +// } + +// if (terms.length()) { +// out += terms[terms.length()-1]->asExpression(true); +// for (int i=terms.length()-2; i>=0; --i) { +// out += " and parent("; +// out += terms[i]->asExpression(true); +// out += ") "; +// } +// } + + return out; +} + +void MapCSSPaintstyle::loadPainters(const QString& filename) +{ + QFile file(filename); + if (!file.open(QIODevice::ReadOnly)) + return; + QByteArray css = file.readAll(); + QString cssS(css); + file.close(); + + /* Remove comments */ + QRegExp cssComments("/\\*.*\\*/"); + cssComments.setMinimal(true); + cssS.replace(cssComments, ""); + + /* Styles */ + QRegExp cssStyle("\\s*(.*)\\s*\\{(.*)\\}"); + cssStyle.setMinimal(true); + + QRegExp blanks("\\s*"); + QRegExp attSep("\\s*;\\s*"); + QHash <QString, QStringList> styles; + int pos=0; + while (cssStyle.indexIn(cssS, pos) != -1) { + QString selector = parseSelector(cssStyle.capturedTexts().at(1).trimmed()); + QString attributes = cssStyle.capturedTexts().at(2).trimmed(); + styles[selector] = attributes.split(attSep); + + pos += cssStyle.matchedLength(); + } + qDebug() << styles; + + +} + +int MapCSSPaintstyle::painterSize() +{ + return Painters.size(); +} + +const GlobalPainter& MapCSSPaintstyle::getGlobalPainter() const +{ + return globalPainter; +} + +void MapCSSPaintstyle::setGlobalPainter(GlobalPainter aGlobalPainter) +{ + globalPainter = aGlobalPainter; +} + +const Painter* MapCSSPaintstyle::getPainter(int i) const +{ + return &(Painters[i]); +} + +QList<Painter> MapCSSPaintstyle::getPainters() const +{ + return Painters; +} + +void MapCSSPaintstyle::setPainters(QList<Painter> aPainters) +{ + Painters = aPainters; +} + + diff --git a/src/PaintStyle/MapCSSPaintstyle.h b/src/PaintStyle/MapCSSPaintstyle.h new file mode 100644 index 0000000..61eb425 --- /dev/null +++ b/src/PaintStyle/MapCSSPaintstyle.h @@ -0,0 +1,43 @@ +#ifndef MERKAARTOR_MAPCSSPAINTSTYLE_H_ +#define MERKAARTOR_MAPCSSPAINTSTYLE_H_ + +#include "Painter.h" + +class MapView; +class PaintStylePrivate; + +#include <QList> + +class MapCSSPaintstyle +{ + public: + static MapCSSPaintstyle* instance() { + if (!m_MapCSSInstance) { + m_MapCSSInstance = new MapCSSPaintstyle; + } + + return m_MapCSSInstance; + } + + MapCSSPaintstyle(); + virtual ~MapCSSPaintstyle(); + void initialize(QPainter& P, MapView& theView); + + int painterSize(); + const GlobalPainter& getGlobalPainter() const; + void setGlobalPainter(GlobalPainter aGlobalPainter); + const Painter* getPainter(int i) const; + QList<Painter> getPainters() const; + void setPainters(QList<Painter> aPainters); + + void savePainters(const QString& filename); + void loadPainters(const QString& filename); + + private: + QList<Painter> Painters; + GlobalPainter globalPainter; + + static MapCSSPaintstyle* m_MapCSSInstance; +}; + +#endif diff --git a/src/PaintStyle/MasPaintStyle.cpp b/src/PaintStyle/MasPaintStyle.cpp new file mode 100644 index 0000000..6730b21 --- /dev/null +++ b/src/PaintStyle/MasPaintStyle.cpp @@ -0,0 +1,140 @@ +#include "MasPaintStyle.h" + +#include <QtCore/QFile> +#include <QtCore/QTextStream> +#include <QtGui/QPainter> +#include <QtGui/QPainterPath> +#include <QtXml/QDomDocument> +#include <QtXml/QDomNode> +#include <QFileInfo> + + +#include <math.h> +#include <utility> + +//#define GLOBALZOOM 0.002 + +#define ALWAYS 10e6 + +/* Zoom boundaries : expressed in Pixel per Meter + + eg 0.01->ALWAYS means show a feature from a zoom level of 0.01 Pixel Per M, + or 100 Meter per Pixel. For a screen of 1000px wide this is when viewing + 100km or less across. + + eg 0.2->ALWAYS means show a feature from a zoom level 0.2 Px/M or 5M/Px which + is viewing 5km or less across a screen of 1000Px. */ + +/* EDITPAINTSTYLE */ + +MasPaintStyle::MasPaintStyle() + : m_isDirty(false) +{ +} + +MasPaintStyle::~MasPaintStyle(void) +{ +} + +void MasPaintStyle::savePainters(const QString& filename) +{ + QFile data(filename); + if (data.open(QFile::WriteOnly | QFile::Truncate)) + { + QTextStream out(&data); + out << "<mapStyle>\n"; + out << globalPainter.toXML(); + for (int i=0; i<Painters.size(); ++i) + { + QString s = Painters[i].toXML(filename); + out << s; + } + out << "</mapStyle>\n"; + } + m_isDirty = false; +} + +void MasPaintStyle::loadPainters(const QString& fn) +{ + QString filename = fn; + if (filename.endsWith("msz", Qt::CaseInsensitive)) { + QFileInfo fi(filename); + QString basename = fi.baseName(); + filename = fn + "/" + basename + ".mas"; + } + + QDomDocument doc; + QFile file(filename); + if (!file.open(QIODevice::ReadOnly)) + return; + if (!doc.setContent(&file)) + { + file.close(); + return; + } + file.close(); + GlobalPainter gp; + globalPainter = gp; + Painters.clear(); + QDomElement docElem = doc.documentElement(); + QDomNode n = docElem.firstChild(); + while(!n.isNull()) + { + QDomElement e = n.toElement(); // try to convert the node to an element. + if(!e.isNull() && e.tagName() == "global") + { + globalPainter = GlobalPainter::fromXML(e); + } else + if(!e.isNull() && e.tagName() == "painter") + { + Painter FP = Painter::fromXML(e, filename); + Painters.push_back(FP); + } + n = n.nextSibling(); + } + m_isDirty = false; + m_filename = filename; +} + +int MasPaintStyle::painterSize() +{ + return Painters.size(); +} + +const GlobalPainter& MasPaintStyle::getGlobalPainter() const +{ + return globalPainter; +} + +void MasPaintStyle::setGlobalPainter(GlobalPainter aGlobalPainter) +{ + globalPainter = aGlobalPainter; +} + +const Painter* MasPaintStyle::getPainter(int i) const +{ + return &(Painters[i]); +} + +QList<Painter> MasPaintStyle::getPainters() const +{ + return Painters; +} + +void MasPaintStyle::setPainters(QList<Painter> aPainters) +{ + Painters = aPainters; + m_isDirty = true; +} + +bool MasPaintStyle::isDirty() +{ + return m_isDirty; +} + +QString MasPaintStyle::getFilename() +{ + return m_filename; +} + + diff --git a/src/PaintStyle/MasPaintStyle.h b/src/PaintStyle/MasPaintStyle.h new file mode 100644 index 0000000..b3f8294 --- /dev/null +++ b/src/PaintStyle/MasPaintStyle.h @@ -0,0 +1,36 @@ +#ifndef MERKAARTOR_EDITPAINTSTYLE_H_ +#define MERKAARTOR_EDITPAINTSTYLE_H_ + +#include "IPaintStyle.h" +#include "Painter.h" + +class MapView; + +#include <QList> + +class MasPaintStyle : public IPaintStyle +{ +public: + MasPaintStyle(); + virtual ~MasPaintStyle(); + + int painterSize(); + const GlobalPainter& getGlobalPainter() const; + void setGlobalPainter(GlobalPainter aGlobalPainter); + const Painter* getPainter(int i) const; + QList<Painter> getPainters() const; + void setPainters(QList<Painter> aPainters); + bool isDirty(); + + QString getFilename(); + void savePainters(const QString& filename); + void loadPainters(const QString& filename); + +private: + bool m_isDirty; + QString m_filename; + QList<Painter> Painters; + GlobalPainter globalPainter; +}; + +#endif diff --git a/src/PaintStyle/PaintStyle.pri b/src/PaintStyle/PaintStyle.pri new file mode 100644 index 0000000..b0657e8 --- /dev/null +++ b/src/PaintStyle/PaintStyle.pri @@ -0,0 +1,17 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/PaintStyle +DEPENDPATH += $$MERKAARTOR_SRC_DIR/PaintStyle + +# Header files +HEADERS += \ + MasPaintStyle.h \ + MapCSSPaintstyle.h \ + PrimitivePainter.h \ + Painter.h \ + IPaintStyle.h + +# Source files +SOURCES += \ + MasPaintStyle.cpp \ + MapCSSPaintstyle.cpp \ + PrimitivePainter.cpp \ + Painter.cpp diff --git a/src/PaintStyle/PaintStyleEditor.cpp b/src/PaintStyle/PaintStyleEditor.cpp new file mode 100644 index 0000000..b6cb0ed --- /dev/null +++ b/src/PaintStyle/PaintStyleEditor.cpp @@ -0,0 +1,855 @@ +#include "Global.h" + +#include "PaintStyleEditor.h" +#include "Painter.h" +#include "MainWindow.h" +#include "Document.h" + +#include "SelectionDialog.h" + +#include <QCheckBox> +#include <QColorDialog> +#include <QDoubleSpinBox> +#include <QIcon> +#include <QListWidget> +#include <QPainter> +#include <QPixmap> +#include <QToolButton> + +static void makeBoundaryIcon(QToolButton* bt, QColor C) +{ + QPixmap pm(36, 18); + pm.fill(QColor(255, 255, 255)); + QPainter p(&pm); + p.setPen(C); + p.setBrush(C); + p.drawRect(0, 6, 36, 6); + bt->setIcon(pm); +} + +PaintStyleEditor::PaintStyleEditor(QWidget *aParent, const GlobalPainter& aGlobalPainter, const QList<Painter>& aPainters) + : QDialog(aParent), theGlobalPainter(aGlobalPainter), thePainters(aPainters), FreezeUpdate(true) +{ + setupUi(this); + + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint); + + BackgroundColor->setIconSize(QSize(36, 18)); + ForegroundColor->setIconSize(QSize(36, 18)); + TouchupColor->setIconSize(QSize(36, 18)); + TrafficDirectionMarksColor->setIconSize(QSize(36, 18));; + FillColor->setIconSize(QSize(36, 18)); + LabelColor->setIconSize(QSize(36, 18)); + LabelBackgroundlColor->setIconSize(QSize(36, 18)); + GlobalBackgroundColor->setIconSize(QSize(36, 18)); + GlobalNodesColor->setIconSize(QSize(36, 18)); + + updatePaintList(); + + LowerZoomBoundary->setSpecialValueText(tr("Always")); + UpperZoomBoundary->setSpecialValueText(tr("Always")); + + DrawGlobalBackground->setChecked(theGlobalPainter.getDrawBackground()); + makeBoundaryIcon(GlobalBackgroundColor, theGlobalPainter.getBackgroundColor()); + on_PaintList_itemSelectionChanged(); + + DrawGlobalNodes->setChecked(theGlobalPainter.getDrawNodes()); + makeBoundaryIcon(GlobalNodesColor, theGlobalPainter.getNodesColor()); + GlobalNodesProportional->setEnabled(theGlobalPainter.getDrawNodes()); + GlobalNodesFixed->setEnabled(theGlobalPainter.getDrawNodes()); + GlobalNodesProportional->setValue(theGlobalPainter.NodesProportional); + GlobalNodesFixed->setValue(theGlobalPainter.NodesFixed); + + FreezeUpdate = false; + + resize(1, 1); +} + +void PaintStyleEditor::updatePaintList() +{ + QListWidgetItem* it; + QString curName; + if (PaintList->currentItem()) + curName = PaintList->currentItem()->text(); + PaintList->clear(); + for (int i = 0; i < thePainters.size(); ++i) { + it = new QListWidgetItem(thePainters[i].userName()); + it->setData(Qt::UserRole, i); + if (edFilter->text().isEmpty()) { + PaintList->addItem(it); + } else + if (thePainters[i].userName().contains(edFilter->text(), Qt::CaseInsensitive)) { + it = new QListWidgetItem(thePainters[i].userName()); + it->setData(Qt::UserRole, i); + PaintList->addItem(it); + } + if (!curName.isEmpty() && thePainters[i].userName().contains(curName, Qt::CaseInsensitive)) + PaintList->setCurrentItem(it); + } + if (curName.isEmpty()) + PaintList->setCurrentRow(0); +} + +void PaintStyleEditor::on_AddButton_clicked() +{ + thePainters.push_back(FeaturePainter()); + QListWidgetItem* it = new QListWidgetItem(thePainters[thePainters.size()-1].userName()); + it->setData(Qt::UserRole, thePainters.size()-1); + PaintList->addItem(it); + PaintList->setCurrentItem(it); + on_PaintList_itemSelectionChanged(); +} + +void PaintStyleEditor::on_DuplicateButton_clicked() +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx < 0 || idx >= thePainters.size()) + return; + //QList<FeaturePainter>::iterator theIterator = thePainters.begin(); + thePainters.insert(thePainters.begin() + idx, Painter(thePainters[idx])); + idx++; + it = new QListWidgetItem(thePainters[idx].userName()); + it->setData(Qt::UserRole, idx); + PaintList->insertItem(PaintList->currentRow()+1, it); + PaintList->setCurrentItem(it); + on_PaintList_itemSelectionChanged(); +} + +void PaintStyleEditor::on_RemoveButton_clicked() +{ + FreezeUpdate = true; + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx < 0 || idx >= thePainters.size()) + return; + thePainters.erase(thePainters.begin() + idx); + delete PaintList->takeItem(idx); + + if (idx && (idx >= thePainters.size())) + --idx; + PaintList->setCurrentRow(idx); + updatePaintList(); + on_PaintList_itemSelectionChanged(); +} + +void PaintStyleEditor::on_btUp_clicked() +{ + if (PaintList->currentRow() <= 0) + return; + + int idx = PaintList->item(PaintList->currentRow())->data(Qt::UserRole).toInt(); + int idxup = PaintList->item(PaintList->currentRow()-1)->data(Qt::UserRole).toInt(); + + Painter fp = thePainters[idxup]; + thePainters[idxup] = thePainters[idx]; + thePainters[idx] = fp; + PaintList->item(PaintList->currentRow()-1)->setText(thePainters[idxup].userName()); + PaintList->item(PaintList->currentRow())->setText(thePainters[idx].userName()); + PaintList->setCurrentRow(PaintList->currentRow()-1); +} + +void PaintStyleEditor::on_btDown_clicked() +{ + if (PaintList->currentRow() >= PaintList->count()-1) + return; + + int idx = PaintList->item(PaintList->currentRow())->data(Qt::UserRole).toInt(); + int idxdn = PaintList->item(PaintList->currentRow()+1)->data(Qt::UserRole).toInt(); + + Painter fp = thePainters[idxdn]; + thePainters[idxdn] = thePainters[idx]; + thePainters[idx] = fp; + PaintList->item(PaintList->currentRow()+1)->setText(thePainters[idxdn].userName()); + PaintList->item(PaintList->currentRow())->setText(thePainters[idx].userName()); + PaintList->setCurrentRow(PaintList->currentRow()+1); +} + +void PaintStyleEditor::on_PaintList_itemSelectionChanged() +{ + QListWidgetItem* it = PaintList->currentItem(); + + int idx = -1; + if (it) + idx = it->data(Qt::UserRole).toInt(); + + if (idx < 0) { + FreezeUpdate = false; + + editArea->setEnabled(false); + DuplicateButton->setEnabled(false); + RemoveButton->setEnabled(false); + return; + } else { + editArea->setEnabled(true); + DuplicateButton->setEnabled(true); + RemoveButton->setEnabled(true); + } + if (idx >= thePainters.size()) + return; + + FreezeUpdate = true; + Painter& FP(thePainters[idx]); + TagSelection->setText(FP.userName()); + if (FP.zoomBoundaries().first == 0) + LowerZoomBoundary->setValue(0); + else + LowerZoomBoundary->setValue(1 / FP.zoomBoundaries().first); + if ((FP.zoomBoundaries().second == 0) || (FP.zoomBoundaries().second > 10e5)) + UpperZoomBoundary->setValue(0); + else + UpperZoomBoundary->setValue(1 / FP.zoomBoundaries().second); + DrawBackground->setChecked(FP.backgroundBoundary().Draw); + ProportionalBackground->setValue(FP.backgroundBoundary().Proportional); + FixedBackground->setValue(FP.backgroundBoundary().Fixed); + makeBoundaryIcon(BackgroundColor, FP.backgroundBoundary().Color); + BackgroundInterior->setChecked(FP.getBackgroundInterior()); + BackgroundExterior->setChecked(FP.getBackgroundExterior()); + DrawForeground->setChecked(FP.foregroundBoundary().Draw); + ProportionalForeground->setValue(FP.foregroundBoundary().Proportional); + FixedForeground->setValue(FP.foregroundBoundary().Fixed); + makeBoundaryIcon(ForegroundColor, FP.foregroundBoundary().Color); + ForegroundDashed->setChecked(FP.foregroundBoundary().Dashed); + ForegroundDashOn->setValue(FP.foregroundBoundary().DashOn); + ForegroundDashOff->setValue(FP.foregroundBoundary().DashOff); + DrawTouchup->setChecked(FP.touchupBoundary().Draw); + ProportionalTouchup->setValue(FP.touchupBoundary().Proportional); + FixedTouchup->setValue(FP.touchupBoundary().Fixed); + makeBoundaryIcon(TouchupColor, FP.touchupBoundary().Color); + TouchupDashed->setChecked(FP.touchupBoundary().Dashed); + TouchupDashOn->setValue(FP.touchupBoundary().DashOn); + TouchupDashOff->setValue(FP.touchupBoundary().DashOff); + DrawTrafficDirectionMarks->setChecked(FP.DrawTrafficDirectionMarks); + makeBoundaryIcon(TrafficDirectionMarksColor, FP.TrafficDirectionMarksColor); + DrawFill->setChecked(FP.fillColor().isValid()); + makeBoundaryIcon(FillColor, FP.fillColor()); + DrawFillIcon->setChecked(FP.ForegroundFillUseIcon);; + DrawIcon->setChecked(FP.icon().Draw); + IconName->setText(FP.icon().Name); + ProportionalIcon->setValue(FP.icon().Proportional); + FixedIcon->setValue(FP.icon().Fixed); + DrawLabel->setChecked(FP.labelBoundary().Draw); + makeBoundaryIcon(LabelColor, FP.labelBoundary().Color); + ProportionalLabel->setValue(FP.labelBoundary().Proportional); + FixedLabel->setValue(FP.labelBoundary().Fixed); + DrawLabelBackground->setChecked(FP.labelBackgroundColor().isValid()); + makeBoundaryIcon(LabelBackgroundlColor, FP.labelBackgroundColor()); + LabelFont->setCurrentFont(FP.getLabelFont()); + LabelTag->setText(FP.getLabelTag()); + LabelBackgroundTag->setText(FP.getLabelBackgroundTag()); + LabelHalo->setChecked(FP.getLabelHalo()); + LabelArea->setChecked(FP.getLabelArea()); + + updatePagesIcons(); + + FreezeUpdate = false; +} + +void PaintStyleEditor::updatePagesIcons() +{ + if (DrawForeground->isChecked() || DrawFill->isChecked()) + tbStyle->setItemIcon(0, QIcon(":/Icons/actions/software-update-available.png")); + else + tbStyle->setItemIcon(0, QIcon()); + + if (DrawBackground->isChecked()) + tbStyle->setItemIcon(1, QIcon(":/Icons/actions/software-update-available.png")); + else + tbStyle->setItemIcon(1, QIcon()); + + if (DrawTouchup->isChecked() || DrawIcon->isChecked()) + tbStyle->setItemIcon(2, QIcon(":/Icons/actions/software-update-available.png")); + else + tbStyle->setItemIcon(2, QIcon()); + + if (DrawLabel->isChecked()) + tbStyle->setItemIcon(3, QIcon(":/Icons/actions/software-update-available.png")); + else + tbStyle->setItemIcon(3, QIcon()); +} + +void PaintStyleEditor::on_TagSelection_editingFinished() +{ + refreshPainter(); +} + +void PaintStyleEditor::on_LowerZoomBoundary_valueChanged() +{ + if (FreezeUpdate) + return; + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + QPair<qreal, qreal> Result(0, 0); + if (LowerZoomBoundary->value() > 10e-6) + Result.first = 1 / LowerZoomBoundary->value(); + if (UpperZoomBoundary->value() > 10e-6) + Result.second = 1 / UpperZoomBoundary->value(); + else + Result.second = 10e6; + FP.zoomBoundary(Result.first, Result.second); +} + +void PaintStyleEditor::on_UpperZoomBoundary_valueChanged() +{ + on_LowerZoomBoundary_valueChanged(); +} + +void PaintStyleEditor::on_DrawGlobalBackground_clicked(bool b) +{ + theGlobalPainter.backgroundActive(b); +} + +void PaintStyleEditor::on_GlobalBackgroundColor_clicked() +{ + QColor rgb = QColorDialog::getColor(theGlobalPainter.getBackgroundColor(), this +#if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) + , tr("Select Color"), QColorDialog::ShowAlphaChannel +#endif + ); + if (rgb.isValid()) { + makeBoundaryIcon(GlobalBackgroundColor, rgb); + theGlobalPainter.background(rgb); + } +} + +void PaintStyleEditor::on_DrawGlobalNodes_clicked(bool b) +{ + theGlobalPainter.nodesActive(b); +} + +void PaintStyleEditor::on_GlobalNodesColor_clicked() +{ + QColor rgb = QColorDialog::getColor(theGlobalPainter.getNodesColor(), this +#if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) + , tr("Select Color"), QColorDialog::ShowAlphaChannel +#endif + ); + if (rgb.isValid()) { + makeBoundaryIcon(GlobalNodesColor, rgb); + theGlobalPainter.nodes(rgb); + } +} + +void PaintStyleEditor::on_GlobalNodesProportional_valueChanged() +{ + theGlobalPainter.NodesProportional = GlobalNodesProportional->value(); +} + +void PaintStyleEditor::on_GlobalNodesFixed_valueChanged() +{ + theGlobalPainter.NodesFixed = GlobalNodesFixed->value(); +} + +void PaintStyleEditor::on_DrawBackground_clicked(bool b) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].backgroundActive(b); + + updatePagesIcons(); +} + +void PaintStyleEditor::on_BackgroundColor_clicked() +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + QColor rgb = QColorDialog::getColor(FP.backgroundBoundary().Color, this +#if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) + , tr("Select Color"), QColorDialog::ShowAlphaChannel +#endif + ); + if (rgb.isValid()) { + makeBoundaryIcon(BackgroundColor, rgb); + FP.background(rgb, ProportionalBackground->value(), FixedBackground->value()); + } +} + +void PaintStyleEditor::on_ProportionalBackground_valueChanged() +{ + if (FreezeUpdate) + return; + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + FP.background(FP.backgroundBoundary().Color, ProportionalBackground->value(), FixedBackground->value()); +} + +void PaintStyleEditor::on_FixedBackground_valueChanged() +{ + on_ProportionalBackground_valueChanged(); +} + +void PaintStyleEditor::on_DrawForeground_clicked(bool b) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].foregroundActive(b); + + updatePagesIcons(); +} + +void PaintStyleEditor::on_BackgroundInterior_clicked(bool b) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].BackgroundInterior = b; + + if (b) { + BackgroundExterior->blockSignals(true); + BackgroundExterior->setChecked(false); + thePainters[idx].BackgroundExterior = false; + BackgroundExterior->blockSignals(false); + } +} + +void PaintStyleEditor::on_BackgroundExterior_clicked(bool b) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].BackgroundExterior = b; + + if (b) { + BackgroundInterior->blockSignals(true); + BackgroundInterior->setChecked(false); + thePainters[idx].BackgroundInterior = false; + BackgroundInterior->blockSignals(false); + } +} + +void PaintStyleEditor::on_ForegroundColor_clicked() +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + QColor rgb = QColorDialog::getColor(FP.foregroundBoundary().Color, this +#if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) + , tr("Select Color"), QColorDialog::ShowAlphaChannel +#endif + ); + if (rgb.isValid()) { + makeBoundaryIcon(ForegroundColor, rgb); + FP.foreground(rgb, ProportionalForeground->value(), FixedForeground->value()); + } +} + +void PaintStyleEditor::on_DrawFillIcon_clicked(bool b) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + + FP.ForegroundFillUseIcon = b; +} + +void PaintStyleEditor::on_ProportionalForeground_valueChanged() +{ + if (FreezeUpdate) + return; + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + FP.foreground(FP.foregroundBoundary().Color, ProportionalForeground->value(), FixedForeground->value()); +} + +void PaintStyleEditor::on_FixedForeground_valueChanged() +{ + on_ProportionalForeground_valueChanged(); +} + + +void PaintStyleEditor::on_ForegroundDashed_clicked() +{ + if (FreezeUpdate) + return; + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + if (ForegroundDashed->isChecked()) + FP.foregroundDash(ForegroundDashOn->value(), ForegroundDashOff->value()); + else + FP.clearForegroundDash(); +} + +void PaintStyleEditor::on_ForegroundDashOff_valueChanged() +{ + on_ForegroundDashed_clicked(); +} + +void PaintStyleEditor::on_ForegroundDashOn_valueChanged() +{ + on_ForegroundDashed_clicked(); +} + +void PaintStyleEditor::on_DrawTouchup_clicked(bool b) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].touchupActive(b); + + updatePagesIcons(); +} + +void PaintStyleEditor::on_TouchupColor_clicked() +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + QColor rgb = QColorDialog::getColor(FP.touchupBoundary().Color, this +#if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) + , tr("Select Color"), QColorDialog::ShowAlphaChannel +#endif + ); + if (rgb.isValid()) { + makeBoundaryIcon(TouchupColor, rgb); + FP.touchup(rgb, ProportionalTouchup->value(), FixedTouchup->value()); + } +} + +void PaintStyleEditor::on_DrawTrafficDirectionMarks_clicked(bool b) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].drawTrafficDirectionMarks(b); + + updatePagesIcons(); +} + +void PaintStyleEditor::on_TrafficDirectionMarksColor_clicked() +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + QColor rgb = QColorDialog::getColor(FP.TrafficDirectionMarksColor, this +#if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) + , tr("Select Color"), QColorDialog::ShowAlphaChannel +#endif + ); + if (rgb.isValid()) { + makeBoundaryIcon(TrafficDirectionMarksColor, rgb); + FP.TrafficDirectionMarksColor = rgb; + } +} + +void PaintStyleEditor::on_ProportionalTouchup_valueChanged() +{ + if (FreezeUpdate) + return; + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + FP.touchup(FP.touchupBoundary().Color, ProportionalTouchup->value(), FixedTouchup->value()); +} + +void PaintStyleEditor::on_FixedTouchup_valueChanged() +{ + on_ProportionalTouchup_valueChanged(); +} + + +void PaintStyleEditor::on_TouchupDashed_clicked() +{ + if (FreezeUpdate) + return; + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + if (TouchupDashed->isChecked()) + FP.touchupDash(TouchupDashOn->value(), TouchupDashOff->value()); + else + FP.clearTouchupDash(); +} + +void PaintStyleEditor::on_TouchupDashOff_valueChanged() +{ + on_TouchupDashed_clicked(); +} + +void PaintStyleEditor::on_TouchupDashOn_valueChanged() +{ + on_TouchupDashed_clicked(); +} + +void PaintStyleEditor::on_DrawFill_clicked(bool b) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].fillActive(b); + + updatePagesIcons(); +} + +void PaintStyleEditor::on_FillColor_clicked() +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + QColor rgb = QColorDialog::getColor(FP.fillColor(), this +#if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) + , tr("Select Color"), QColorDialog::ShowAlphaChannel +#endif + ); + if (rgb.isValid()) { + makeBoundaryIcon(FillColor, rgb); + FP.foregroundFill(rgb); + } +} + +void PaintStyleEditor::on_DrawIcon_clicked(bool b) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].iconActive(b); + + updatePagesIcons(); +} + +void PaintStyleEditor::on_IconName_textEdited() +{ + if (FreezeUpdate) + return; + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + FP.setIcon(IconName->text(), ProportionalIcon->value(), FixedIcon->value()); +} + +void PaintStyleEditor::on_ProportionalIcon_valueChanged() +{ + on_IconName_textEdited(); +} + +void PaintStyleEditor::on_FixedIcon_valueChanged() +{ + on_IconName_textEdited(); +} + +void PaintStyleEditor::on_DrawLabel_clicked(bool b) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].labelActive(b); + + updatePagesIcons(); +} + +void PaintStyleEditor::on_LabelHalo_clicked(bool b) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].labelHalo(b); +} + +void PaintStyleEditor::on_LabelArea_clicked(bool b) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].labelArea(b); +} + +void PaintStyleEditor::on_LabelTag_textEdited() +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].labelTag(LabelTag->text()); +} + +void PaintStyleEditor::on_LabelBackgroundTag_textEdited() +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].labelBackgroundTag(LabelBackgroundTag->text()); +} + +void PaintStyleEditor::on_LabelColor_clicked() +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + QColor rgb = QColorDialog::getColor(FP.labelBoundary().Color, this +#if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) + , tr("Select Color"), QColorDialog::ShowAlphaChannel +#endif + ); + if (rgb.isValid()) { + makeBoundaryIcon(LabelColor, rgb); + FP.label(rgb, ProportionalLabel->value(), FixedLabel->value()); + } +} + +void PaintStyleEditor::on_ProportionalLabel_valueChanged() +{ + if (FreezeUpdate) + return; + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + FP.label(FP.labelBoundary().Color, ProportionalLabel->value(), FixedLabel->value()); +} + +void PaintStyleEditor::on_FixedLabel_valueChanged() +{ + on_ProportionalLabel_valueChanged(); +} + +void PaintStyleEditor::on_DrawLabelBackground_clicked(bool b) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].labelBackgroundActive(b); +} + +void PaintStyleEditor::on_LabelBackgroundlColor_clicked() +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + QColor rgb = QColorDialog::getColor(FP.labelBackgroundColor(), this +#if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) + , tr("Select Color"), QColorDialog::ShowAlphaChannel +#endif + ); + if (rgb.isValid()) { + makeBoundaryIcon(LabelBackgroundlColor, rgb); + FP.labelBackground(rgb); + } +} + +void PaintStyleEditor::on_LabelFont_currentFontChanged(const QFont & font) +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + + if (idx >= thePainters.size()) + return; + thePainters[idx].setLabelFont(font.toString()); +} + +void PaintStyleEditor::refreshPainter() +{ + QListWidgetItem* it = PaintList->currentItem(); + int idx = it->data(Qt::UserRole).toInt(); + if (idx >= thePainters.size()) + return; + Painter& FP(thePainters[idx]); + FP.setSelector(TagSelection->text()); + PaintList->currentItem()->setText(FP.userName()); +} + +void PaintStyleEditor::on_buttonBox_clicked(QAbstractButton * button) +{ + if (buttonBox->buttonRole(button) == QDialogButtonBox::ApplyRole) { + emit(stylesApplied(&theGlobalPainter, &thePainters)); + } +} + +void PaintStyleEditor::on_edFilter_textChanged(const QString &/*text*/) +{ + updatePaintList(); +} + +void PaintStyleEditor::on_btSelectorHelper_clicked() +{ + SelectionDialog* Sel = new SelectionDialog(g_Merk_MainWindow, false); + if (!Sel) + return; + + Sel->edTagQuery->setText(TagSelection->text()); + if (Sel->exec() == QDialog::Accepted) { + TagSelection->setText(Sel->edTagQuery->text()); + } +} diff --git a/src/PaintStyle/PaintStyleEditor.h b/src/PaintStyle/PaintStyleEditor.h new file mode 100644 index 0000000..26fa508 --- /dev/null +++ b/src/PaintStyle/PaintStyleEditor.h @@ -0,0 +1,94 @@ +#ifndef MERKAARTOR_PAINTSTYLE_EDITOR_H_ +#define MERKAARTOR_PAINTSTYLE_EDITOR_H_ + +#include <ui_PaintStyleEditor.h> +#include "Painter.h" + +#include <QDialog> + +#include <QList> + +class PaintStyleEditor : public QDialog, public Ui::PaintStyleEditor +{ + Q_OBJECT + + public: + PaintStyleEditor(QWidget* aParent, const GlobalPainter& aGlobalPainter, const QList<Painter>& aPainters); + + public slots: + void on_DrawGlobalBackground_clicked(bool b); + void on_GlobalBackgroundColor_clicked(); + void on_DrawGlobalNodes_clicked(bool b); + void on_GlobalNodesColor_clicked(); + void on_GlobalNodesProportional_valueChanged(); + void on_GlobalNodesFixed_valueChanged(); + + void on_PaintList_itemSelectionChanged(); + void on_TagSelection_editingFinished(); + void on_LowerZoomBoundary_valueChanged(); + void on_UpperZoomBoundary_valueChanged(); + void on_DrawBackground_clicked(bool b); + void on_BackgroundColor_clicked(); + void on_ProportionalBackground_valueChanged(); + void on_FixedBackground_valueChanged(); + void on_BackgroundInterior_clicked(bool b); + void on_BackgroundExterior_clicked(bool b); + void on_DrawForeground_clicked(bool b); + void on_DrawFillIcon_clicked(bool b); + void on_ForegroundColor_clicked(); + void on_ProportionalForeground_valueChanged(); + void on_FixedForeground_valueChanged(); + void on_ForegroundDashed_clicked(); + void on_ForegroundDashOn_valueChanged(); + void on_ForegroundDashOff_valueChanged(); + void on_DrawTrafficDirectionMarks_clicked(bool b); + void on_TrafficDirectionMarksColor_clicked(); + void on_DrawTouchup_clicked(bool b); + void on_TouchupColor_clicked(); + void on_ProportionalTouchup_valueChanged(); + void on_FixedTouchup_valueChanged(); + void on_TouchupDashed_clicked(); + void on_TouchupDashOn_valueChanged(); + void on_TouchupDashOff_valueChanged(); + void on_DrawFill_clicked(bool b); + void on_FillColor_clicked(); + void on_DrawIcon_clicked(bool b); + void on_IconName_textEdited(); + void on_ProportionalIcon_valueChanged(); + void on_FixedIcon_valueChanged(); + void on_DrawLabel_clicked(bool b); + void on_LabelColor_clicked(); + void on_LabelTag_textEdited(); + void on_ProportionalLabel_valueChanged(); + void on_FixedLabel_valueChanged(); + void on_DrawLabelBackground_clicked(bool b); + void on_LabelBackgroundlColor_clicked(); + void on_LabelFont_currentFontChanged(const QFont & font); + void on_LabelBackgroundTag_textEdited(); + void on_AddButton_clicked(); + void on_RemoveButton_clicked(); + void on_DuplicateButton_clicked(); + void on_btUp_clicked(); + void on_btDown_clicked(); + void on_buttonBox_clicked(QAbstractButton * button); + void on_LabelHalo_clicked(bool b); + void on_LabelArea_clicked(bool b); + + void on_edFilter_textChanged(const QString& text); + void on_btSelectorHelper_clicked(); + + public: + GlobalPainter theGlobalPainter; + QList<Painter> thePainters; + private: + void refreshPainter(); + void updatePaintList(); + void updatePagesIcons(); + + signals: + void stylesApplied(GlobalPainter* theGlobalPainter, QList<Painter>* thePainters); + private: + bool FreezeUpdate; +}; + +#endif diff --git a/src/PaintStyle/PaintStyleEditor.pri b/src/PaintStyle/PaintStyleEditor.pri new file mode 100644 index 0000000..b1bbc4f --- /dev/null +++ b/src/PaintStyle/PaintStyleEditor.pri @@ -0,0 +1,11 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/PaintStyle +DEPENDPATH += $$MERKAARTOR_SRC_DIR/PaintStyle + +# Header files +HEADERS += PaintStyleEditor.h + +# Source files +SOURCES += PaintStyleEditor.cpp + +# Forms +FORMS += PaintStyleEditor.ui diff --git a/src/PaintStyle/PaintStyleEditor.ui b/src/PaintStyle/PaintStyleEditor.ui new file mode 100644 index 0000000..bf5ca32 --- /dev/null +++ b/src/PaintStyle/PaintStyleEditor.ui @@ -0,0 +1,2358 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PaintStyleEditor</class> + <widget class="QDialog" name="PaintStyleEditor"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>786</width> + <height>625</height> + </rect> + </property> + <property name="windowTitle"> + <string>Map style editor</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_6"> + <item> + <widget class="QGroupBox" name="groupBox_5"> + <property name="title"> + <string>Global</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_6"> + <property name="spacing"> + <number>4</number> + </property> + <item> + <widget class="QCheckBox" name="DrawGlobalBackground"> + <property name="text"> + <string>Background</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="GlobalBackgroundColor"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_6"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_9"> + <property name="spacing"> + <number>4</number> + </property> + <item> + <widget class="QCheckBox" name="DrawGlobalNodes"> + <property name="text"> + <string>Nodes</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="GlobalNodesColor"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_10"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="_6"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_22"> + <property name="text"> + <string>Proportional thickness</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="GlobalNodesProportional"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="decimals"> + <number>1</number> + </property> + <property name="singleStep"> + <double>0.500000000000000</double> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_23"> + <property name="text"> + <string>Fixed thickness</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="GlobalNodesFixed"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="decimals"> + <number>1</number> + </property> + <property name="singleStep"> + <double>0.500000000000000</double> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_8"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <item> + <widget class="QLabel" name="label_21"> + <property name="text"> + <string>Filter</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edFilter"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QPushButton" name="AddButton"> + <property name="text"> + <string>Add</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="RemoveButton"> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="DuplicateButton"> + <property name="text"> + <string>Duplicate</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QListWidget" name="PaintList"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout_7"> + <item> + <widget class="QToolButton" name="btUp"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="arrowType"> + <enum>Qt::UpArrow</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="btDown"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="arrowType"> + <enum>Qt::DownArrow</enum> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </item> + <item> + <widget class="QWidget" name="editArea" native="true"> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <property name="spacing"> + <number>0</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>0</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <layout class="QGridLayout" name="TagSelectionLayout"> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Tag selection</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="TagSelection"/> + </item> + <item row="0" column="2"> + <widget class="QToolButton" name="btSelectorHelper"> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QGridLayout"> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <item row="0" column="2"> + <widget class="QLabel" name="label_6"> + <property name="text"> + <string>meter/pixel</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QDoubleSpinBox" name="LowerZoomBoundary"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="decimals"> + <number>0</number> + </property> + <property name="minimum"> + <double>0.000000000000000</double> + </property> + <property name="maximum"> + <double>99999.000000000000000</double> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Visible up to</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Visible from scale</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QDoubleSpinBox" name="UpperZoomBoundary"> + <property name="decimals"> + <number>0</number> + </property> + <property name="minimum"> + <double>0.000000000000000</double> + </property> + <property name="maximum"> + <double>99999.000000000000000</double> + </property> + <property name="singleStep"> + <double>100.000000000000000</double> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>meter/pixel</string> + </property> + </widget> + </item> + <item row="0" column="3"> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QToolBox" name="tbStyle"> + <property name="minimumSize"> + <size> + <width>400</width> + <height>350</height> + </size> + </property> + <property name="currentIndex"> + <number>2</number> + </property> + <property name="tabSpacing"> + <number>6</number> + </property> + <widget class="QWidget" name="pgBackground"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>455</width> + <height>184</height> + </rect> + </property> + <attribute name="label"> + <string>Background</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_9"> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QCheckBox" name="DrawForeground"> + <property name="text"> + <string>Draw with color</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="ForegroundColor"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Proportional thickness</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="ProportionalForeground"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="decimals"> + <number>1</number> + </property> + <property name="singleStep"> + <double>0.500000000000000</double> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_11"> + <property name="text"> + <string>Fixed thickness</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="FixedForeground"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="decimals"> + <number>1</number> + </property> + <property name="singleStep"> + <double>0.500000000000000</double> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="ForegroundDashed"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Dashed</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="ForegroundDashOn"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_12"> + <property name="text"> + <string>off</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="ForegroundDashOff"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QCheckBox" name="DrawFill"> + <property name="text"> + <string>Fill area</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="FillColor"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="_3"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <spacer name="horizontalSpacer_7"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Maximum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="DrawFillIcon"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Fill with Touchup icon</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="pgBoundary"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>455</width> + <height>116</height> + </rect> + </property> + <attribute name="label"> + <string>Boundary</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QCheckBox" name="DrawBackground"> + <property name="text"> + <string>Draw with color</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="BackgroundColor"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>Proportional thickness</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="ProportionalBackground"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="decimals"> + <number>1</number> + </property> + <property name="singleStep"> + <double>0.500000000000000</double> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_9"> + <property name="text"> + <string>Fixed thickness</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="FixedBackground"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="decimals"> + <number>1</number> + </property> + <property name="singleStep"> + <double>0.500000000000000</double> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_8"> + <item> + <spacer name="horizontalSpacer_8"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="BackgroundInterior"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Interior</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="BackgroundExterior"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Exteriror</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_9"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="pgTouchup"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>460</width> + <height>226</height> + </rect> + </property> + <attribute name="label"> + <string>Touchup</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QCheckBox" name="DrawTouchup"> + <property name="text"> + <string>Draw steps</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="TouchupColor"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_14"> + <property name="text"> + <string>Proportional thickness</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="ProportionalTouchup"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="decimals"> + <number>1</number> + </property> + <property name="singleStep"> + <double>0.500000000000000</double> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_15"> + <property name="text"> + <string>Fixed thickness</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="FixedTouchup"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="decimals"> + <number>1</number> + </property> + <property name="singleStep"> + <double>0.500000000000000</double> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="TouchupDashed"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Dashed</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="TouchupDashOn"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_13"> + <property name="text"> + <string>off</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="TouchupDashOff"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QCheckBox" name="DrawIcon"> + <property name="text"> + <string>Draw icon</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="IconName"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="_2"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_19"> + <property name="text"> + <string>Proportional thickness</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="ProportionalIcon"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="decimals"> + <number>1</number> + </property> + <property name="singleStep"> + <double>0.500000000000000</double> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_20"> + <property name="text"> + <string>Fixed thickness</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="FixedIcon"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="decimals"> + <number>1</number> + </property> + <property name="singleStep"> + <double>0.500000000000000</double> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_10"> + <item> + <widget class="QCheckBox" name="DrawTrafficDirectionMarks"> + <property name="text"> + <string>Draw Traffic Direction Marks</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="TrafficDirectionMarksColor"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_11"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer_4"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="pgLabel"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>458</width> + <height>221</height> + </rect> + </property> + <attribute name="label"> + <string>Label</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <layout class="QHBoxLayout" name="_5"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QCheckBox" name="DrawLabel"> + <property name="text"> + <string>Draw with color</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="LabelColor"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Font</string> + </property> + </widget> + </item> + <item> + <widget class="QFontComboBox" name="LabelFont"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Label tag</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="LabelTag"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontallayout_3"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_16"> + <property name="text"> + <string>Proportional thickness</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="ProportionalLabel"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="decimals"> + <number>1</number> + </property> + <property name="singleStep"> + <double>0.500000000000000</double> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_17"> + <property name="text"> + <string>Fixed thickness</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="FixedLabel"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="decimals"> + <number>1</number> + </property> + <property name="singleStep"> + <double>0.500000000000000</double> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_5"> + <item> + <spacer name="horizontalSpacer_4"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="LabelHalo"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Halo</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="LabelArea"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Area</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_5"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="_4"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="DrawLabelBackground"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Draw with background color</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="LabelBackgroundlColor"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Minimum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>60</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_18"> + <property name="text"> + <string>Label with background tag</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="LabelBackgroundTag"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer_5"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>AddButton</tabstop> + <tabstop>RemoveButton</tabstop> + <tabstop>PaintList</tabstop> + <tabstop>TagSelection</tabstop> + <tabstop>UpperZoomBoundary</tabstop> + <tabstop>LowerZoomBoundary</tabstop> + <tabstop>DrawForeground</tabstop> + <tabstop>ForegroundColor</tabstop> + <tabstop>ProportionalForeground</tabstop> + <tabstop>FixedForeground</tabstop> + <tabstop>ForegroundDashed</tabstop> + <tabstop>ForegroundDashOn</tabstop> + <tabstop>ForegroundDashOff</tabstop> + <tabstop>DrawFill</tabstop> + <tabstop>FillColor</tabstop> + <tabstop>DrawBackground</tabstop> + <tabstop>BackgroundColor</tabstop> + <tabstop>ProportionalBackground</tabstop> + <tabstop>FixedBackground</tabstop> + <tabstop>DrawTouchup</tabstop> + <tabstop>TouchupColor</tabstop> + <tabstop>ProportionalTouchup</tabstop> + <tabstop>FixedTouchup</tabstop> + <tabstop>TouchupDashed</tabstop> + <tabstop>TouchupDashOn</tabstop> + <tabstop>TouchupDashOff</tabstop> + <tabstop>DrawIcon</tabstop> + <tabstop>IconName</tabstop> + <tabstop>DrawLabel</tabstop> + <tabstop>LabelColor</tabstop> + <tabstop>DrawLabelBackground</tabstop> + <tabstop>LabelBackgroundlColor</tabstop> + <tabstop>ProportionalLabel</tabstop> + <tabstop>FixedLabel</tabstop> + <tabstop>buttonBox</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>PaintStyleEditor</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>335</x> + <y>615</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>PaintStyleEditor</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>403</x> + <y>615</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawBackground</sender> + <signal>toggled(bool)</signal> + <receiver>BackgroundColor</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>263</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawBackground</sender> + <signal>toggled(bool)</signal> + <receiver>ProportionalBackground</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>296</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawBackground</sender> + <signal>toggled(bool)</signal> + <receiver>FixedBackground</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>296</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawTouchup</sender> + <signal>toggled(bool)</signal> + <receiver>ProportionalTouchup</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>424</x> + <y>350</y> + </hint> + <hint type="destinationlabel"> + <x>581</x> + <y>387</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawTouchup</sender> + <signal>toggled(bool)</signal> + <receiver>FixedTouchup</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>424</x> + <y>350</y> + </hint> + <hint type="destinationlabel"> + <x>753</x> + <y>387</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawTouchup</sender> + <signal>toggled(bool)</signal> + <receiver>TouchupDashed</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>424</x> + <y>350</y> + </hint> + <hint type="destinationlabel"> + <x>447</x> + <y>419</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawTouchup</sender> + <signal>toggled(bool)</signal> + <receiver>TouchupDashOff</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>424</x> + <y>350</y> + </hint> + <hint type="destinationlabel"> + <x>608</x> + <y>422</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawIcon</sender> + <signal>toggled(bool)</signal> + <receiver>IconName</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>414</x> + <y>454</y> + </hint> + <hint type="destinationlabel"> + <x>764</x> + <y>457</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawTouchup</sender> + <signal>toggled(bool)</signal> + <receiver>TouchupDashOn</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>424</x> + <y>350</y> + </hint> + <hint type="destinationlabel"> + <x>516</x> + <y>422</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawLabelBackground</sender> + <signal>toggled(bool)</signal> + <receiver>LabelBackgroundlColor</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>398</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>398</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawLabel</sender> + <signal>toggled(bool)</signal> + <receiver>LabelColor</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>263</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawLabel</sender> + <signal>toggled(bool)</signal> + <receiver>DrawLabelBackground</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>398</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawLabel</sender> + <signal>toggled(bool)</signal> + <receiver>ProportionalLabel</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>333</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawLabel</sender> + <signal>toggled(bool)</signal> + <receiver>FixedLabel</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>333</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawLabel</sender> + <signal>toggled(bool)</signal> + <receiver>LabelFont</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>505</x> + <y>260</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawLabel</sender> + <signal>toggled(bool)</signal> + <receiver>LabelTag</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>298</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawLabelBackground</sender> + <signal>toggled(bool)</signal> + <receiver>LabelBackgroundTag</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>398</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>431</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawIcon</sender> + <signal>toggled(bool)</signal> + <receiver>ProportionalIcon</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>414</x> + <y>454</y> + </hint> + <hint type="destinationlabel"> + <x>581</x> + <y>492</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawIcon</sender> + <signal>toggled(bool)</signal> + <receiver>FixedIcon</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>414</x> + <y>454</y> + </hint> + <hint type="destinationlabel"> + <x>753</x> + <y>492</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawLabel</sender> + <signal>toggled(bool)</signal> + <receiver>LabelHalo</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>368</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawLabel</sender> + <signal>toggled(bool)</signal> + <receiver>LabelArea</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>368</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawGlobalBackground</sender> + <signal>toggled(bool)</signal> + <receiver>GlobalBackgroundColor</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>42</x> + <y>43</y> + </hint> + <hint type="destinationlabel"> + <x>142</x> + <y>50</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawFill</sender> + <signal>toggled(bool)</signal> + <receiver>FillColor</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>366</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>366</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawForeground</sender> + <signal>toggled(bool)</signal> + <receiver>ForegroundColor</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>263</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawForeground</sender> + <signal>toggled(bool)</signal> + <receiver>ProportionalForeground</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>296</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawForeground</sender> + <signal>toggled(bool)</signal> + <receiver>FixedForeground</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>296</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawForeground</sender> + <signal>toggled(bool)</signal> + <receiver>ForegroundDashed</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>331</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawForeground</sender> + <signal>toggled(bool)</signal> + <receiver>ForegroundDashOn</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>331</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawForeground</sender> + <signal>toggled(bool)</signal> + <receiver>ForegroundDashOff</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>331</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawFill</sender> + <signal>toggled(bool)</signal> + <receiver>DrawFillIcon</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>366</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>399</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawBackground</sender> + <signal>toggled(bool)</signal> + <receiver>BackgroundInterior</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>331</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawBackground</sender> + <signal>toggled(bool)</signal> + <receiver>BackgroundExterior</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>423</x> + <y>263</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>331</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawGlobalNodes</sender> + <signal>toggled(bool)</signal> + <receiver>GlobalNodesColor</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>32</x> + <y>70</y> + </hint> + <hint type="destinationlabel"> + <x>140</x> + <y>85</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawGlobalNodes</sender> + <signal>toggled(bool)</signal> + <receiver>GlobalNodesProportional</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>43</x> + <y>71</y> + </hint> + <hint type="destinationlabel"> + <x>278</x> + <y>118</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawGlobalNodes</sender> + <signal>toggled(bool)</signal> + <receiver>GlobalNodesFixed</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>24</x> + <y>66</y> + </hint> + <hint type="destinationlabel"> + <x>450</x> + <y>118</y> + </hint> + </hints> + </connection> + <connection> + <sender>DrawTrafficDirectionMarks</sender> + <signal>toggled(bool)</signal> + <receiver>TrafficDirectionMarksColor</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>442</x> + <y>518</y> + </hint> + <hint type="destinationlabel"> + <x>564</x> + <y>519</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/PaintStyle/Painter.cpp b/src/PaintStyle/Painter.cpp new file mode 100644 index 0000000..20d10d0 --- /dev/null +++ b/src/PaintStyle/Painter.cpp @@ -0,0 +1,745 @@ +#include "Painter.h" +#include "SvgCache.h" + +#include <QtCore/QString> +#include <QtGui/QPainter> +#include <QtGui/QPainterPath> +#include <QMatrix> +#include <QDomElement> +#include <QFileInfo> +#include <QDir> + +Painter::Painter() +: ZoomLimitSet(false), ZoomUnder(0), ZoomUpper(10e6), + DrawBackground(false), BackgroundScale(0), BackgroundOffset(3), + DrawForeground(false), ForegroundScale(0), ForegroundOffset(2), + ForegroundDashSet(false), + DrawTouchup(false), TouchupScale(0), TouchupOffset(1), + TouchupDashSet(false), + ForegroundFill(false), ForegroundFillUseIcon(false), + DrawTrafficDirectionMarks(false), + DrawIcon(false), IconScale(0), IconOffset(0), + DrawLabel(false), LabelScale(0), LabelOffset(0), + DrawLabelBackground(false), LabelHalo(false), LabelArea(false), + BackgroundInterior(false), BackgroundExterior(false) +{ +} + +Painter::Painter(const Painter& f) +: ZoomLimitSet(f.ZoomLimitSet), ZoomUnder(f.ZoomUnder), ZoomUpper(f.ZoomUpper), + DrawBackground(f.DrawBackground), BackgroundColor(f.BackgroundColor), + BackgroundScale(f.BackgroundScale), BackgroundOffset(f.BackgroundOffset), + DrawForeground(f.DrawForeground), ForegroundColor(f.ForegroundColor), + ForegroundScale(f.ForegroundScale), ForegroundOffset(f.ForegroundOffset), + ForegroundDashSet(f.ForegroundDashSet), ForegroundDash(f.ForegroundDash), ForegroundWhite(f.ForegroundWhite), + DrawTouchup(f.DrawTouchup), TouchupColor(f.TouchupColor), + TouchupScale(f.TouchupScale), TouchupOffset(f.TouchupOffset), + TouchupDashSet(f.TouchupDashSet), + TouchupDash(f.TouchupDash), TouchupWhite(f.TouchupWhite), + ForegroundFill(f.ForegroundFill), ForegroundFillFillColor(f.ForegroundFillFillColor), ForegroundFillUseIcon(f.ForegroundFillUseIcon), + DrawTrafficDirectionMarks(f.DrawTrafficDirectionMarks), TrafficDirectionMarksColor(f.TrafficDirectionMarksColor), + DrawIcon(f.DrawIcon), IconName(f.IconName), IconScale(f.IconScale), IconOffset(f.IconOffset), + DrawLabel(f.DrawLabel), LabelTag(f.LabelTag), LabelColor(f.LabelColor), LabelScale(f.LabelScale), LabelOffset(f.LabelOffset), + DrawLabelBackground(f.DrawLabelBackground), LabelBackgroundColor(f.LabelBackgroundColor), LabelBackgroundTag(f.LabelBackgroundTag), + LabelFont(f.LabelFont), LabelHalo(f.LabelHalo), LabelArea(f.LabelArea), + BackgroundInterior(f.BackgroundInterior), BackgroundExterior(f.BackgroundExterior), + theSelector(f.theSelector) +{ +} + +Painter& Painter::operator=(const Painter& f) +{ + if (&f == this) return *this; + + ZoomLimitSet = f.ZoomLimitSet; + ZoomUnder = f.ZoomUnder; + ZoomUpper = f.ZoomUpper; + DrawBackground = f.DrawBackground; + BackgroundColor = f.BackgroundColor; + BackgroundScale = f.BackgroundScale; + BackgroundOffset = f.BackgroundOffset; + DrawForeground = f.DrawForeground; + ForegroundColor = f.ForegroundColor; + ForegroundScale = f.ForegroundScale; + ForegroundOffset = f.ForegroundOffset; + ForegroundDashSet = f.ForegroundDashSet ; + ForegroundDash = f.ForegroundDash; + ForegroundWhite = f.ForegroundWhite; + DrawTouchup = f.DrawTouchup; + TouchupColor = f.TouchupColor; + TouchupScale = f.TouchupScale; + TouchupOffset = f.TouchupOffset; + TouchupDashSet = f.TouchupDashSet; + TouchupDash = f.TouchupDash; + TouchupWhite = f.TouchupWhite; + ForegroundFill = f.ForegroundFill; + ForegroundFillFillColor = f.ForegroundFillFillColor; + ForegroundFillUseIcon = f.ForegroundFillUseIcon; + DrawTrafficDirectionMarks = f.DrawTrafficDirectionMarks; + TrafficDirectionMarksColor = f.TrafficDirectionMarksColor; + DrawIcon = f.DrawIcon; + IconName = f.IconName; + IconScale = f.IconScale; + IconOffset = f.IconOffset; + DrawLabel = f.DrawLabel; + LabelColor = f.LabelColor; + LabelScale = f.LabelScale; + LabelOffset = f.LabelOffset; + DrawLabelBackground = f.DrawLabelBackground; + LabelBackgroundColor = f.LabelBackgroundColor; + LabelFont = f.LabelFont; + LabelTag = f.LabelTag; + LabelBackgroundTag = f.LabelBackgroundTag; + LabelHalo = f.LabelHalo; + LabelArea = f.LabelArea; + theSelector = f.theSelector; + BackgroundInterior = f.BackgroundInterior; + BackgroundExterior = f.BackgroundExterior; + + return *this; +} + +Painter::~Painter() +{ +} + +QString paddedHexa(int i) +{ + QString r=QString::number(i,16); + if (r.length() < 2) + r = "0"+r; + return r; +} + +QString asXML(const QColor& c) +{ + return "#"+paddedHexa(c.red())+paddedHexa(c.green())+paddedHexa(c.blue())+paddedHexa(c.alpha()); +} + +QString colorAsXML(const QString& name, const QColor& c) +{ + return + name+"Color=\""+asXML(c)+"\"\n"; +} + +QString boundaryAsXML(const QString& name, const QColor& c, qreal Scale, qreal Offset) +{ + return + name+"Color=\""+asXML(c)+"\" "+name+"Scale=\""+QString::number(Scale)+"\" "+name+"Offset=\""+QString::number(Offset)+"\"\n"; +} + +QString iconAsXML(const QString& name, const QString& fn, qreal Scale, qreal Offset) +{ + return + name+"=\""+fn+"\" "+name+"Scale=\""+QString::number(Scale)+"\" "+name+"Offset=\""+QString::number(Offset)+"\"\n"; +} + +QColor toColor(const QString& s) +{ + return + QColor( + s.mid(1,2).toInt(0,16), + s.mid(3,2).toInt(0,16), + s.mid(5,2).toInt(0,16), + s.mid(7,2).toInt(0,16)); +} + + +QString Painter::toXML(QString filename) const +{ + QString r; + r += "<painter\n"; + if (ZoomLimitSet) + r += " zoomUnder=\""+QString::number(ZoomUnder)+"\" zoomUpper=\""+QString::number(ZoomUpper)+"\"\n"; + if (DrawBackground) + r += " " + boundaryAsXML("background",BackgroundColor, BackgroundScale, BackgroundOffset); + if (BackgroundInterior) + r += " interior=\"yes\""; + if (BackgroundExterior) + r += " exterior=\"yes\""; + if (DrawForeground) + r += " " + boundaryAsXML("foreground",ForegroundColor, ForegroundScale, ForegroundOffset); + if (ForegroundDashSet && DrawForeground) + r += " foregroundDashDown=\""+QString::number(ForegroundDash)+"\" foregroundDashUp=\""+QString::number(ForegroundWhite)+"\"\n"; + if (DrawTouchup) + r += " " + boundaryAsXML("touchup",TouchupColor, TouchupScale, TouchupOffset); + if (TouchupDashSet && DrawTouchup) + r += " touchupDashDown=\""+QString::number(TouchupDash)+"\" touchupDashUp=\""+QString::number(TouchupWhite)+"\"\n"; + if (ForegroundFill) + r += " fillColor=\""+::asXML(ForegroundFillFillColor)+"\"\n"; + if (ForegroundFillUseIcon) + r += " fillWithIcon=\"yes\""; + if (!IconName.isEmpty() && DrawIcon) + { + QString iconFilename; + if (!IconName.startsWith(':')) { + iconFilename = QFileInfo(filename).absoluteDir().relativeFilePath(QFileInfo(IconName).absoluteFilePath()); + } else { + iconFilename = IconName; + } + r += " " + iconAsXML("icon",iconFilename, IconScale, IconOffset); + } + if (DrawTrafficDirectionMarks) + r += " drawTrafficDirectionMarks=\"yes\" trafficDirectionMarksColor=\"" + ::asXML(TrafficDirectionMarksColor) +"\"\n"; + if (DrawLabel) { + r += " " + boundaryAsXML("label",LabelColor, LabelScale, LabelOffset); + r += " labelFont=\"" + LabelFont.toString() + "\""; + r += " labelTag=\"" + LabelTag + "\""; + if (LabelHalo) + r += " labelHalo=\"yes\""; + if (LabelArea) + r += " labelArea=\"yes\""; + } + if (DrawLabelBackground) { + r += " labelBackgroundColor=\""+::asXML(LabelBackgroundColor)+"\""; + r += " labelBackgroundTag=\""+ LabelBackgroundTag +"\"\n"; + } + r += ">\n"; + + if (!theSelector.isEmpty()) + r += " <selector expr=\""+theSelector+"\"/>\n"; + + r += "</painter>\n"; + return r; +} + +Painter Painter::fromXML(const QDomElement& e, QString filename) +{ + Painter FP; + + if (e.hasAttribute("zoomUnder") || e.hasAttribute("zoomUpper")) + FP.zoomBoundary(e.attribute("zoomUnder","0").toDouble(),e.attribute("zoomUpper","10e6").toDouble()); + if (e.hasAttribute("foregroundColor")) + { + FP.foreground( + toColor(e.attribute("foregroundColor")),e.attribute("foregroundScale").toDouble(),e.attribute("foregroundOffset").toDouble()); + if (e.hasAttribute("foregroundDashDown")) + FP.foregroundDash(e.attribute("foregroundDashDown").toDouble(),e.attribute("foregroundDashUp").toDouble()); + } + if (e.hasAttribute("fillWithIcon")) + FP.foregroundUseIcon(e.attribute("fillWithIcon") == "yes"); + if (e.hasAttribute("backgroundColor")) + FP.background( + toColor(e.attribute("backgroundColor")),e.attribute("backgroundScale").toDouble(),e.attribute("backgroundOffset").toDouble()); + if (e.attribute("interior") == "yes") + FP.BackgroundInterior = true; + if (e.attribute("exterior") == "yes") + FP.BackgroundExterior = true; + if (e.hasAttribute("touchupColor")) + { + FP.touchup( + toColor(e.attribute("touchupColor")),e.attribute("touchupScale").toDouble(),e.attribute("touchupOffset").toDouble()); + if (e.hasAttribute("touchupDashDown")) + FP.touchupDash(e.attribute("touchupDashDown").toDouble(),e.attribute("touchupDashUp").toDouble()); + } + if (e.hasAttribute("fillColor")) + FP.foregroundFill(toColor(e.attribute("fillColor"))); + if (e.hasAttribute("icon")) + { + QString iconFilename = e.attribute("icon"); + if (!QFileInfo(iconFilename).isAbsolute()) + iconFilename = QFileInfo(filename).absolutePath().append("/").append(iconFilename); + FP.setIcon(iconFilename,e.attribute("iconScale", "0.0").toDouble(),e.attribute("iconOffset", "0.0").toDouble()); + } + if (e.attribute("drawTrafficDirectionMarks") == "yes") + FP.drawTrafficDirectionMarks(true); + if (e.hasAttribute("trafficDirectionMarksColor")) + FP.TrafficDirectionMarksColor = toColor((e.attribute("trafficDirectionMarksColor"))); + if (e.hasAttribute("labelColor")) + { + FP.label( + toColor(e.attribute("labelColor")),e.attribute("labelScale").toDouble(),e.attribute("labelOffset").toDouble()); + FP.setLabelFont(e.attribute("labelFont")); + FP.labelTag(e.attribute("labelTag")); + if (e.hasAttribute("labelHalo")) + FP.labelHalo((e.attribute("labelHalo") == "yes")); + if (e.hasAttribute("labelArea")) + FP.labelArea((e.attribute("labelArea") == "yes")); + if (e.hasAttribute("labelBackgroundColor")) + FP.labelBackground(toColor(e.attribute("labelBackgroundColor"))); + if (e.hasAttribute("labelBackgroundTag")) + FP.labelBackgroundTag(e.attribute("labelBackgroundTag")); + } + + QDomNode n = e.firstChild(); + QList<QPair<QString,QString> > Pairs; + while (!n.isNull()) + { + if (n.isElement()) + { + QDomElement t = n.toElement(); + if (t.tagName() == "selector") + { + if (!t.attribute("key").isEmpty()) + Pairs.push_back(qMakePair(t.attribute("key"),t.attribute("value"))); + else + { + FP.setSelector(t.attribute("expr")); + return FP; + } + } + } + n = n.nextSibling(); + } + if (Pairs.size() == 1) + FP.setSelector(Pairs[0].first+"="+Pairs[0].second); + else if (Pairs.size()) + { + bool Same = true; + for (int i=1; i<Pairs.size(); ++i) + if (Pairs[0].first != Pairs[i].first) + Same = false; + if (Same) + { + QStringList Options; + for (int i=0; i<Pairs.size(); ++i) + Options.push_back(Pairs[i].second); + FP.setSelector("["+ Pairs[0].first +"] isoneof ("+ Options.join(",") + ")"); + } + else + { + QStringList Options; + for (int i=0; i<Pairs.size(); ++i) + Options.push_back(Pairs[i].first+"="+Pairs[i].second); + FP.setSelector(Options.join(" or ")); + } + } + + return FP; +} + +QString Painter::userName() const +{ + if (!theSelector.isEmpty()) + return theSelector; + return "Unnamed"; +} + +QPair<qreal, qreal> Painter::zoomBoundaries() const +{ + if (ZoomLimitSet) + return qMakePair(ZoomUnder,ZoomUpper); + return qMakePair((qreal)0.0,(qreal)0.0); +} + +QColor Painter::fillColor() const +{ + if (!ForegroundFill) + return QColor(); + return ForegroundFillFillColor; +} + +bool Painter::isFilled() const +{ + return ForegroundFill; +} + +Painter& Painter::drawTrafficDirectionMarks(bool b) +{ + DrawTrafficDirectionMarks = b; + return *this; +} + +Painter& Painter::zoomBoundary(qreal anUnder, qreal anUpper) +{ + ZoomLimitSet = true; + ZoomUnder = anUnder; + ZoomUpper = anUpper; + return *this; +} + +Painter& Painter::fillActive(bool b) +{ + ForegroundFill = b; + if (ForegroundFill && !ForegroundFillFillColor.isValid()) + ForegroundFillFillColor.setRgb(0,0,0); + return *this; +} + +Painter& Painter::foregroundFill(QColor FillColor) +{ + ForegroundFill = true; + ForegroundFillFillColor = FillColor; + return *this; +} + +Painter& Painter::backgroundActive(bool b) +{ + DrawBackground = b; + return *this; +} + +Painter& Painter::background(QColor Color, qreal Scale, qreal Offset) +{ + DrawBackground = true; + BackgroundColor = Color; + BackgroundScale = Scale; + BackgroundOffset = Offset; + return *this; +} + +LineParameters Painter::backgroundBoundary() const +{ + LineParameters P; + P.Draw = DrawBackground; + P.Color = BackgroundColor; + P.Proportional = BackgroundScale; + P.Fixed = BackgroundOffset; + P.Dashed = false; + P.DashOn = P.DashOff = 0; + return P; +} + +Painter& Painter::touchupActive(bool b) +{ + DrawTouchup = b; + return *this; +} + +Painter& Painter::touchupDash(qreal Dash, qreal White) +{ + TouchupDashSet = true; + TouchupDash = Dash; + TouchupWhite = White; + return *this; +} + +Painter& Painter::touchup(QColor Color, qreal Scale, qreal Offset) +{ + DrawTouchup = true; + TouchupColor = Color; + TouchupScale = Scale; + TouchupOffset = Offset; + TouchupDashSet = false; + return *this; +} + +Painter& Painter::foregroundActive(bool b) +{ + DrawForeground = b; + return *this; +} + +Painter& Painter::foregroundDash(qreal Dash, qreal White) +{ + ForegroundDashSet = true; + ForegroundDash = Dash; + ForegroundWhite = White; + return *this; +} + +Painter& Painter::foreground(QColor Color, qreal Scale, qreal Offset) +{ + DrawForeground = true; + ForegroundColor = Color; + ForegroundScale = Scale; + ForegroundOffset = Offset; + ForegroundDashSet = false; + return *this; +} + +Painter& Painter::foregroundUseIcon(bool b) +{ + ForegroundFillUseIcon = b; + return *this; +} + +void Painter::clearForegroundDash() +{ + ForegroundDashSet = false; +} + +Painter& Painter::labelActive(bool b) +{ + DrawLabel = b; + return *this; +} + +Painter& Painter::labelHalo(bool b) +{ + LabelHalo = b; + return *this; +} + +Painter& Painter::labelArea(bool b) +{ + LabelArea = b; + return *this; +} + +Painter& Painter::labelTag(const QString& val) +{ + LabelTag = val; + return *this; +} + +Painter& Painter::labelBackgroundTag(const QString& val) +{ + LabelBackgroundTag = val; + return *this; +} + +Painter& Painter::label(QColor Color, qreal Scale, qreal Offset) +{ + DrawLabel = true; + LabelColor = Color; + LabelScale = Scale; + LabelOffset = Offset; + return *this; +} + +Painter& Painter::labelBackgroundActive(bool b) +{ + DrawLabelBackground = b; + if (DrawLabelBackground && !LabelBackgroundColor.isValid()) + LabelBackgroundColor.setRgb(0,0,0); + return *this; +} + +Painter& Painter::labelBackground(QColor bgColor) +{ + DrawLabelBackground = true; + LabelBackgroundColor = bgColor; + return *this; +} + +Painter& Painter::setLabelFont(const QString& descFont) +{ + LabelFont.fromString(descFont); + return *this; +} + +QColor Painter::labelBackgroundColor() const +{ + if (!DrawLabelBackground) + return QColor(); + return LabelBackgroundColor; +} + +QFont Painter::getLabelFont() const +{ + return LabelFont; +} + +QString Painter::getLabelTag() const +{ + return LabelTag; +} + +bool Painter::getLabelHalo() const +{ + return LabelHalo; +} + +bool Painter::getLabelArea() const +{ + return LabelArea; +} + +QString Painter::getLabelBackgroundTag() const +{ + return LabelBackgroundTag; +} + +bool Painter::getBackgroundInterior() const +{ + return BackgroundInterior; +} + +bool Painter::getBackgroundExterior() const +{ + return BackgroundExterior; +} + +LineParameters Painter::foregroundBoundary() const +{ + LineParameters P; + P.Draw = DrawForeground; + P.Color = ForegroundColor; + P.Proportional = ForegroundScale; + P.Fixed = ForegroundOffset; + P.Dashed = ForegroundDashSet; + P.DashOn = ForegroundDash; + P.DashOff = ForegroundWhite; + if (!P.Dashed) + P.DashOff = P.DashOn = 0; + return P; +} + +void Painter::clearTouchupDash() +{ + TouchupDashSet = false; +} + +LineParameters Painter::touchupBoundary() const +{ + LineParameters P; + P.Draw = DrawTouchup; + P.Color = TouchupColor; + P.Proportional = TouchupScale; + P.Fixed = TouchupOffset; + P.Dashed = TouchupDashSet; + P.DashOn = TouchupDash; + P.DashOff = TouchupWhite; + if (!P.Dashed) + P.DashOff = P.DashOn = 0; + return P; +} + +LineParameters Painter::labelBoundary() const +{ + LineParameters P; + P.Draw = DrawLabel; + P.Color = LabelColor; + P.Proportional = LabelScale; + P.Fixed = LabelOffset; + P.Dashed = false; + if (!P.Dashed) + P.DashOff = P.DashOn = 0.0; + return P; +} + +Painter& Painter::setIcon(const QString& Name, qreal Scale, qreal Offset) +{ + DrawIcon = true; + IconName = Name; + IconScale = Scale; + IconOffset = Offset; + return *this; +} + +IconParameters Painter::icon() const +{ + IconParameters P; + P.Draw = DrawIcon; + P.Name = IconName; + P.Proportional = IconScale; + P.Fixed = IconOffset; + return P; +} + +Painter& Painter::iconActive(bool b) +{ + DrawIcon = b; + return *this; +} + +void Painter::setSelector(const QString& anExpression) +{ + theSelector = anExpression; +} + +bool Painter::matchesZoom(qreal PixelPerM) const +{ + if (ZoomLimitSet) + return (ZoomUnder <= PixelPerM) && (PixelPerM <= ZoomUpper); + return true; +} + +/* GlobalPainter */ + +GlobalPainter::GlobalPainter() + : DrawBackground(false), DrawNodes(false) +{ +} + +GlobalPainter::GlobalPainter(const GlobalPainter& f) + : DrawBackground(f.DrawBackground), BackgroundColor(f.BackgroundColor) + , DrawNodes(f.DrawNodes), NodesColor(f.NodesColor), NodesProportional(f.NodesProportional), NodesFixed(f.NodesFixed) +{ +} + +GlobalPainter& GlobalPainter::operator=(const GlobalPainter& f) +{ + if (&f == this) return *this; + + DrawBackground = f.DrawBackground; + BackgroundColor = f.BackgroundColor; + + DrawNodes = f.DrawNodes; + NodesColor = f.NodesColor; + NodesProportional = f.NodesProportional; + NodesFixed = f.NodesFixed; + + return *this; +} + +GlobalPainter::~GlobalPainter() +{ +} + +QString GlobalPainter::toXML() const +{ + QString r; + r += "<global\n"; + if (DrawBackground) + r += " " + colorAsXML("background",BackgroundColor); + if (DrawNodes) + r += " " + boundaryAsXML("nodes",NodesColor, NodesProportional, NodesFixed); + r += "/>\n"; + return r; +} + +GlobalPainter GlobalPainter::fromXML(const QDomElement& e) +{ + GlobalPainter FP; + + if (e.hasAttribute("backgroundColor")) { + FP.backgroundActive(true); + FP.background(toColor(e.attribute("backgroundColor"))); + } + if (e.hasAttribute("nodesColor")) { + FP.nodesActive(true); + FP.NodesColor = toColor(e.attribute("nodesColor")); + FP.NodesProportional = e.attribute("nodesScale").toDouble(); + FP.NodesFixed = e.attribute("nodesOffset").toDouble(); + } + + return FP; +} + +GlobalPainter& GlobalPainter::backgroundActive(bool b) +{ + DrawBackground = b; + return *this; +} + +bool GlobalPainter::getDrawBackground() const +{ + return DrawBackground; +} + +GlobalPainter& GlobalPainter::background(QColor Color) +{ + DrawBackground = true; + BackgroundColor = Color; + return *this; +} + +QColor GlobalPainter::getBackgroundColor() const +{ + return BackgroundColor; +} + +GlobalPainter & GlobalPainter::nodesActive(bool b) +{ + DrawNodes = b; + return *this; +} + +GlobalPainter & GlobalPainter::nodes(QColor Color) +{ + DrawNodes = true; + NodesColor = Color; + return *this; +} + +bool GlobalPainter::getDrawNodes() const +{ + return DrawNodes; +} + +QColor GlobalPainter::getNodesColor() const +{ + return NodesColor; +} diff --git a/src/PaintStyle/Painter.h b/src/PaintStyle/Painter.h new file mode 100644 index 0000000..7e88401 --- /dev/null +++ b/src/PaintStyle/Painter.h @@ -0,0 +1,174 @@ +#ifndef MERKAARTOR_PAINTER_H_ +#define MERKAARTOR_PAINTER_H_ + +#include <QtCore/QString> +#include <QtGui/QColor> +#include <QFont> + +#include <QList> +#include <QPair> +#include <QPointF> + +class QFont; +class QDomElement; + +class LineParameters +{ +public: + bool Draw; + bool Dashed; + QColor Color; + qreal Proportional; + qreal Fixed; + qreal DashOn; + qreal DashOff; +}; + +class IconParameters +{ +public: + bool Draw; + QString Name; + qreal Proportional; + qreal Fixed; +}; + +class Painter +{ +public: + typedef enum {NoZoomLimit, GlobalZoom, RegionalZoom, LocalZoom } ZoomType; + + Painter(); + Painter(const Painter& f); + Painter& operator=(const Painter& F); + virtual ~Painter(); + + virtual void setSelector(const QString& aName); + + bool isFilled() const; + bool matchesZoom(qreal PixelPerM) const; + Painter& backgroundActive(bool b); + Painter& background(QColor Color, qreal Scale, qreal Offset); + Painter& foregroundActive(bool b); + Painter& foregroundUseIcon(bool b); + Painter& foreground(QColor Color, qreal Scale, qreal Offset); + Painter& foregroundDash(qreal Dash, qreal White); + Painter& touchupActive(bool b); + Painter& touchup(QColor Color, qreal Scale, qreal Offset); + Painter& touchupDash(qreal Dash, qreal White); + Painter& foregroundFill(QColor FillColor); + Painter& zoomBoundary(qreal anUnder, qreal anUpper); + Painter& drawTrafficDirectionMarks(bool b); + Painter& trackPointIcon(const QString& Filename); + Painter& fillActive(bool b); + Painter& iconActive(bool b); + Painter& setIcon(const QString& Name, qreal Scale, qreal Offset); + Painter& labelActive(bool b); + Painter& labelTag(const QString& val); + Painter& label(QColor Color, qreal Scale, qreal Offset); + Painter& setLabelFont(const QString& descFont); + Painter& labelBackgroundActive(bool b); + Painter& labelBackground(QColor bgColor); + Painter& labelBackgroundTag(const QString& val); + Painter& labelHalo(bool b); + Painter& labelArea(bool b); + + QString userName() const; + QPair<qreal, qreal> zoomBoundaries() const; + LineParameters backgroundBoundary() const; + LineParameters foregroundBoundary() const; + LineParameters labelBoundary() const; + IconParameters icon() const; + void clearForegroundDash(); + LineParameters touchupBoundary() const; + void clearTouchupDash(); + QColor fillColor() const; + QColor labelBackgroundColor() const; + QFont getLabelFont() const; + QString getLabelTag() const; + QString getLabelBackgroundTag() const; + bool getLabelHalo() const; + bool getLabelArea() const; + bool getBackgroundInterior() const; + bool getBackgroundExterior() const; + + QString toXML(QString filename) const; + static Painter fromXML(const QDomElement& e, QString filename); + +public: + bool ZoomLimitSet; + qreal ZoomUnder, ZoomUpper; + bool DrawBackground; + QColor BackgroundColor; + qreal BackgroundScale; + qreal BackgroundOffset; + bool BackgroundInterior, BackgroundExterior; + bool DrawForeground; + QColor ForegroundColor; + qreal ForegroundScale; + qreal ForegroundOffset; + bool ForegroundDashSet; + qreal ForegroundDash, ForegroundWhite; + bool DrawTouchup; + QColor TouchupColor; + qreal TouchupScale; + qreal TouchupOffset; + bool TouchupDashSet; + qreal TouchupDash, TouchupWhite; + bool ForegroundFill; + QColor ForegroundFillFillColor; + bool ForegroundFillUseIcon; + bool DrawTrafficDirectionMarks; + QColor TrafficDirectionMarksColor; + bool DrawIcon; + QString IconName; + qreal IconScale; + qreal IconOffset; + bool DrawLabel; + QString LabelTag; + QColor LabelColor; + qreal LabelScale; + qreal LabelOffset; + bool DrawLabelBackground; + QColor LabelBackgroundColor; + QString LabelBackgroundTag; + QFont LabelFont; + bool LabelHalo; + bool LabelArea; + + QString theSelector; +}; + +class GlobalPainter +{ +public: + GlobalPainter(); + GlobalPainter(const GlobalPainter& f); + GlobalPainter& operator=(const GlobalPainter& F); + ~GlobalPainter(); + + GlobalPainter& backgroundActive(bool b); + GlobalPainter& background(QColor Color); + bool getDrawBackground() const; + QColor getBackgroundColor() const; + + GlobalPainter& nodesActive(bool b); + GlobalPainter& nodes(QColor Color); + bool getDrawNodes() const; + QColor getNodesColor() const; + + QString toXML() const; + static GlobalPainter fromXML(const QDomElement& e); + +public: + bool DrawBackground; + QColor BackgroundColor; + + bool DrawNodes; + QColor NodesColor; + qreal NodesProportional; + qreal NodesFixed; +}; + +#endif + diff --git a/src/PaintStyle/PrimitivePainter.cpp b/src/PaintStyle/PrimitivePainter.cpp new file mode 100644 index 0000000..7a82c92 --- /dev/null +++ b/src/PaintStyle/PrimitivePainter.cpp @@ -0,0 +1,537 @@ +#include "PrimitivePainter.h" +#include "IFeature.h" + +#include "SvgCache.h" + +#include <QtCore/QString> +#include <QtGui/QPainter> +#include <QtGui/QPainterPath> +#include <QMatrix> +#include <math.h> + +#define CAPSTYLE Qt::RoundCap +#define JOINSTYLE Qt::RoundJoin + +PrimitivePainter::PrimitivePainter() +: Painter(), theTagSelector(0){ +} + +PrimitivePainter::PrimitivePainter(const PrimitivePainter& f) +: Painter(f), theTagSelector(0) +{ + if (f.theTagSelector) + theTagSelector = f.theTagSelector->copy(); + +} + +PrimitivePainter& PrimitivePainter::operator=(const PrimitivePainter& f) +{ + if (&f == this) return *this; + delete theTagSelector; + if (f.theTagSelector) + theTagSelector = f.theTagSelector->copy(); + else + theTagSelector = 0; + ZoomLimitSet = f.ZoomLimitSet; + ZoomUnder = f.ZoomUnder; + ZoomUpper = f.ZoomUpper; + DrawBackground = f.DrawBackground; + BackgroundColor = f.BackgroundColor; + BackgroundScale = f.BackgroundScale; + BackgroundOffset = f.BackgroundOffset; + DrawForeground = f.DrawForeground; + ForegroundColor = f.ForegroundColor; + ForegroundScale = f.ForegroundScale; + ForegroundOffset = f.ForegroundOffset; + ForegroundDashSet = f.ForegroundDashSet ; + ForegroundDash = f.ForegroundDash; + ForegroundWhite = f.ForegroundWhite; + DrawTouchup = f.DrawTouchup; + TouchupColor = f.TouchupColor; + TouchupScale = f.TouchupScale; + TouchupOffset = f.TouchupOffset; + TouchupDashSet = f.TouchupDashSet; + TouchupDash = f.TouchupDash; + TouchupWhite = f.TouchupWhite; + ForegroundFill = f.ForegroundFill; + ForegroundFillFillColor = f.ForegroundFillFillColor; + DrawTrafficDirectionMarks = f.DrawTrafficDirectionMarks; + DrawIcon = f.DrawIcon; + IconName = f.IconName; + IconScale = f.IconScale; + IconOffset = f.IconOffset; + DrawLabel = f.DrawLabel; + LabelColor = f.LabelColor; + LabelScale = f.LabelScale; + LabelOffset = f.LabelOffset; + DrawLabelBackground = f.DrawLabelBackground; + LabelBackgroundColor = f.LabelBackgroundColor; + LabelFont = f.LabelFont; + LabelTag = f.LabelTag; + LabelBackgroundTag = f.LabelBackgroundTag; + LabelHalo = f.LabelHalo; + LabelArea = f.LabelArea; + return *this; +} + +PrimitivePainter::PrimitivePainter(const Painter& f) +: Painter(f), theTagSelector(0) +{ + if (!f.theSelector.isEmpty()) + theTagSelector = TagSelector::parse(f.theSelector); +} + +PrimitivePainter& PrimitivePainter::operator=(const Painter& f) +{ + if (&f == this) return *this; + delete theTagSelector; + if (!f.theSelector.isEmpty()) + theTagSelector = TagSelector::parse(f.theSelector); + else + theTagSelector = 0; + ZoomLimitSet = f.ZoomLimitSet; + ZoomUnder = f.ZoomUnder; + ZoomUpper = f.ZoomUpper; + DrawBackground = f.DrawBackground; + BackgroundColor = f.BackgroundColor; + BackgroundScale = f.BackgroundScale; + BackgroundOffset = f.BackgroundOffset; + DrawForeground = f.DrawForeground; + ForegroundColor = f.ForegroundColor; + ForegroundScale = f.ForegroundScale; + ForegroundOffset = f.ForegroundOffset; + ForegroundDashSet = f.ForegroundDashSet ; + ForegroundDash = f.ForegroundDash; + ForegroundWhite = f.ForegroundWhite; + DrawTouchup = f.DrawTouchup; + TouchupColor = f.TouchupColor; + TouchupScale = f.TouchupScale; + TouchupOffset = f.TouchupOffset; + TouchupDashSet = f.TouchupDashSet; + TouchupDash = f.TouchupDash; + TouchupWhite = f.TouchupWhite; + ForegroundFill = f.ForegroundFill; + ForegroundFillFillColor = f.ForegroundFillFillColor; + DrawTrafficDirectionMarks = f.DrawTrafficDirectionMarks; + DrawIcon = f.DrawIcon; + IconName = f.IconName; + IconScale = f.IconScale; + IconOffset = f.IconOffset; + DrawLabel = f.DrawLabel; + LabelColor = f.LabelColor; + LabelScale = f.LabelScale; + LabelOffset = f.LabelOffset; + DrawLabelBackground = f.DrawLabelBackground; + LabelBackgroundColor = f.LabelBackgroundColor; + LabelFont = f.LabelFont; + LabelTag = f.LabelTag; + LabelBackgroundTag = f.LabelBackgroundTag; + LabelHalo = f.LabelHalo; + LabelArea = f.LabelArea; + return *this; +} + +PrimitivePainter::~PrimitivePainter() +{ + delete theTagSelector; +} + +void PrimitivePainter::setSelector(const QString& anExpression) +{ + delete theTagSelector; + theTagSelector = TagSelector::parse(anExpression); + theSelector = anExpression; +} + +void PrimitivePainter::setSelector(TagSelector* aSel) +{ + delete theTagSelector; + theTagSelector = aSel; + theSelector = aSel->asExpression(false); +} + +TagSelectorMatchResult PrimitivePainter::matchesTag(const IFeature* F, qreal PixelPerM) const +{ + TagSelectorMatchResult res; + + if (!theTagSelector) return TagSelect_NoMatch; + + if ((res = theTagSelector->matches(F,PixelPerM))) + return res; + + return TagSelect_NoMatch; +} + +void PrimitivePainter::drawBackground(QPainterPath* R, QPainter* thePainter, qreal PixelPerM) const +{ + if (!DrawBackground && !ForegroundFill) return; + + thePainter->setPen(Qt::NoPen); + if (DrawBackground) + { + qreal WW = PixelPerM*BackgroundScale+BackgroundOffset; + if (WW >= 0) + { + QPen thePen(BackgroundColor,WW); + thePen.setCapStyle(CAPSTYLE); + thePen.setJoinStyle(JOINSTYLE); + ////thePainter->strokePath(R->getPath(),thePen); + thePainter->setPen(thePen); + } + } + + if (ForegroundFill && (R->elementCount() > 2)) + { + thePainter->setBrush(ForegroundFillFillColor); + } + else + thePainter->setBrush(Qt::NoBrush); + + thePainter->drawPath(*R); +} + +void PrimitivePainter::drawForeground(QPainterPath* R, QPainter* thePainter, qreal PixelPerM) const +{ + if (!DrawForeground) return; + + qreal WW = 0.0; + WW = PixelPerM*ForegroundScale+ForegroundOffset; + if (WW < 0) return; + QPen thePen(ForegroundColor,WW); + thePen.setCapStyle(CAPSTYLE); + thePen.setJoinStyle(JOINSTYLE); + if (ForegroundDashSet) + { + QVector<qreal> Pattern; + Pattern << ForegroundDash << ForegroundWhite; + thePen.setDashPattern(Pattern); + } + thePainter->setPen(thePen); + thePainter->setBrush(Qt::NoBrush); + + thePainter->drawPath(*R); +} + +void PrimitivePainter::drawTouchup(QPointF* Pt, QPainter* thePainter, qreal PixelPerM) const +{ + bool IconOK = false; + if (DrawIcon) + { + if (!IconName.isEmpty()) { + qreal WW = PixelPerM*IconScale+IconOffset; + + QImage* pm = getSVGImageFromFile(IconName,int(WW)); + if (pm && !pm->isNull()) { + IconOK = true; + thePainter->drawImage( int(Pt->x()-pm->width()/2), int(Pt->y()-pm->height()/2) , *pm); + } + } + } + if (!IconOK) + { + QColor theColor = QColor(0,0,0,128); + if (DrawForeground) + theColor = ForegroundColor; + else + if (DrawBackground) + theColor = BackgroundColor; + + QRectF R(*Pt-QPointF(2,2),QSize(4,4)); + thePainter->fillRect(R,theColor); + } +} + +void PrimitivePainter::drawTouchup(QPainterPath* R, QPainter* thePainter, qreal PixelPerM) const +{ + if (DrawTouchup) + { + qreal WW = PixelPerM*TouchupScale+TouchupOffset; + if (WW > 0) + { + QPen thePen(TouchupColor,WW); + thePen.setCapStyle(CAPSTYLE); + thePen.setJoinStyle(JOINSTYLE); + if (TouchupDashSet) + { + QVector<qreal> Pattern; + Pattern << TouchupDash << TouchupWhite; + thePen.setDashPattern(Pattern); + } + thePainter->strokePath(*R, thePen); + } + } +// if (DrawTrafficDirectionMarks) +// { +// Feature::TrafficDirectionType TT = trafficDirection(R); +// if ( (TT != Feature::UnknownDirection) || (theView->renderOptions().arrowOptions == RendererOptions::ArrowsAlways) ) +// { +// qreal theWidth = theView->pixelPerM()*R->widthOf()-4; +// if (theWidth > 8) +// theWidth = 8; +// qreal DistFromCenter = 2*(theWidth+4); +// if (theWidth > 0) +// { +// if ( theView->renderOptions().arrowOptions == RendererOptions::ArrowsAlways ) +// thePainter->setPen(QPen(QColor(255,0,0), 2)); +// else +// thePainter->setPen(QPen(QColor(0,0,255), 2)); + + +// for (int i=1; i<R->size(); ++i) +// { +// QPointF FromF(theView->transform().map(theView->projection().project(R->getNode(i-1)))); +// QPointF ToF(theView->transform().map(theView->projection().project(R->getNode(i)))); +// if (distance(FromF,ToF) > (DistFromCenter*2+4)) +// { +// QPoint H(FromF.toPoint()+ToF.toPoint()); +// H *= 0.5; +// if (!theView->rect().contains(H)) +// continue; +// qreal A = angle(FromF-ToF); +// QPoint T(qRound(DistFromCenter*cos(A)),qRound(DistFromCenter*sin(A))); +// QPoint V1(qRound(theWidth*cos(A+M_PI/6)),qRound(theWidth*sin(A+M_PI/6))); +// QPoint V2(qRound(theWidth*cos(A-M_PI/6)),qRound(theWidth*sin(A-M_PI/6))); +// if ( (TT == Feature::OtherWay) || (TT == Feature::BothWays) ) +// { +// thePainter->drawLine(H+T,H+T-V1); +// thePainter->drawLine(H+T,H+T-V2); +// } +// if ( (TT == Feature::OneWay) || (TT == Feature::BothWays) ) +// { +// thePainter->drawLine(H-T,H-T+V1); +// thePainter->drawLine(H-T,H-T+V2); +// } +// else +// { +// if ( theView->renderOptions().arrowOptions == RendererOptions::ArrowsAlways ) +// { +// thePainter->drawLine(H-T,H-T+V1); +// thePainter->drawLine(H-T,H-T+V2); +// } +// } +// } +// } +// } +// } +// } +} + +#define LABEL_PATH_DISTANCE 3 +#define LABEL_STRAIGHT_DISTANCE 50 +#define BG_SPACING 6 +#define BG_PEN_SZ 2 + +void PrimitivePainter::drawPointLabel(QPointF C, QString str, QString strBg, QPainter* thePainter, qreal PixelPerM) const +{ + LineParameters lp = labelBoundary(); + qreal WW = PixelPerM*lp.Proportional+lp.Fixed; + if (WW < 10) return; + + QFont font = getLabelFont(); + font.setPixelSize(int(WW)); + QFontMetrics metrics(font); + + int modX = 0; + int modY = 0; + QPainterPath textPath; + QPainterPath bgPath; + + if (!str.isEmpty()) { + modX = - (metrics.width(str)/2); + if (DrawIcon && !IconName.isEmpty() ) + { + QImage pm(IconName); + modY = - pm.height(); + if (DrawLabelBackground) + modY -= BG_SPACING; + } + textPath.addText(modX, modY, font, str); + thePainter->translate(C); + } + if (DrawLabelBackground && !strBg.isEmpty()) { + modX = - (metrics.width(strBg)/2); + if (DrawIcon && !IconName.isEmpty() ) + { + QImage pm(IconName); + modY = - pm.height(); + if (DrawLabelBackground) + modY -= BG_SPACING; + } + + textPath.addText(modX, modY, font, strBg); + thePainter->translate(C); + + bgPath.addRect(textPath.boundingRect().adjusted(-BG_SPACING, -BG_SPACING, BG_SPACING, BG_SPACING)); + thePainter->setPen(QPen(LabelColor, BG_PEN_SZ)); + thePainter->setBrush(LabelBackgroundColor); + thePainter->drawPath(bgPath); + } + if (getLabelHalo()) { + thePainter->setPen(QPen(Qt::white, font.pixelSize()/5)); + thePainter->drawPath(textPath); + } + thePainter->setPen(Qt::NoPen); + thePainter->setBrush(LabelColor); + thePainter->drawPath(textPath); + + if (DrawLabelBackground && !strBg.isEmpty()) { + QRegion rg = thePainter->clipRegion(); + rg -= textPath.boundingRect().toRect().translated(C.toPoint()); + thePainter->setClipRegion(rg); + } +} + + +void PrimitivePainter::drawLabel(QPointF* Pt, QPainter* thePainter, qreal PixelPerM, QString str, QString strBg) const +{ + if (!DrawLabel) + return; + + if (str.isEmpty() && strBg.isEmpty()) + return; + + thePainter->save(); + drawPointLabel(*Pt, str, strBg, thePainter, PixelPerM); + thePainter->restore(); +} + +void PrimitivePainter::drawLabel(QPainterPath* R, QPainter* thePainter, qreal PixelPerM, QString str, QString strBg) const +{ + if (!DrawLabel) + return; + + if (str.isEmpty() && strBg.isEmpty()) + return; + + thePainter->save(); + if (getLabelArea()) { + QPointF C(R->boundingRect().center()); + drawPointLabel(C, str, strBg, thePainter, PixelPerM); + thePainter->restore(); + return; + } + + LineParameters lp = labelBoundary(); + qreal WW = PixelPerM*lp.Proportional+lp.Fixed; + if (WW < 10) return; + //qreal WWR = qMax(PixelPerM*R->widthOf()*BackgroundScale+BackgroundOffset, PixelPerM*R->widthOf()*ForegroundScale+ForegroundOffset); + + QPainterPath textPath; + QPainterPath tranformedRoadPath = *R; + QFont font = getLabelFont(); + + if (!str.isEmpty()) { + QRegion rg = thePainter->clipRegion(); + font.setPixelSize(int(WW)); + QFontMetrics metrics(font); + + if (font.pixelSize() >= 5 && tranformedRoadPath.length() > metrics.width(str)) { + thePainter->setFont(font); + + int repeat = int((tranformedRoadPath.length() / ((metrics.width(str) * LABEL_PATH_DISTANCE))) - 0.5); + int numSegment = repeat+1; + qreal lenSegment = tranformedRoadPath.length() / numSegment; + qreal startSegment = 0; + QPainterPath textPath; + do { + QRegion rg = thePainter->clipRegion(); + + qreal curLen = startSegment + ((lenSegment - metrics.width(str)) / 2); + int modIncrement = 1; + qreal modAngle = 0; + int modY = 0; + if (cos(angToRad(tranformedRoadPath.angleAtPercent((startSegment+(lenSegment/2))/tranformedRoadPath.length()))) < 0) { + modIncrement = -1; + modAngle = 180.0; + curLen += metrics.width(str); + } + for (int i = 0; i < str.length(); ++i) { + qreal t = tranformedRoadPath.percentAtLength(curLen); + QPointF pt = tranformedRoadPath.pointAtPercent(t); + qreal angle = tranformedRoadPath.angleAtPercent(t); + modY = (metrics.ascent()/2)-3; + + QMatrix m; + m.translate(pt.x(), pt.y()); + m.rotate(-angle+modAngle); + + QPainterPath charPath; + charPath.addText(0, modY, font, str.mid(i, 1)); + charPath = charPath * m; + + textPath.addPath(charPath); + + qreal incremenet = metrics.width(str[i]); + curLen += (incremenet * modIncrement); + } + startSegment += lenSegment; + } while (--repeat >= 0); + + if (getLabelHalo()) { + thePainter->setPen(QPen(Qt::white, font.pixelSize()/6)); + thePainter->drawPath(textPath); + } + thePainter->setPen(Qt::NoPen); + thePainter->setBrush(LabelColor); + thePainter->drawPath(textPath); + thePainter->setClipRegion(rg); + } + } + if (DrawLabelBackground && !strBg.isEmpty()) { + QRegion rg = thePainter->clipRegion(); + font.setPixelSize(int(WW)); + QFontMetrics metrics(font); + + int repeat = int((tranformedRoadPath.length() / (metrics.width(strBg) * LABEL_STRAIGHT_DISTANCE)) - 0.5); + int numSegment = repeat+1; + qreal lenSegment = tranformedRoadPath.length() / numSegment; + qreal startSegment = 0; + do { + + int modX = 0; + int modY = 0; + + qreal curLen = startSegment + (lenSegment / 2); + qreal t = tranformedRoadPath.percentAtLength(curLen); + QPointF pt = tranformedRoadPath.pointAtPercent(t); + + modX = - (metrics.width(strBg)/2); + //modX = WW; + modY = (metrics.ascent()/2); + + QPainterPath textPath, bgPath; + textPath.addText(modX, modY, font, strBg); + bgPath.addRect(textPath.boundingRect().adjusted(-BG_SPACING, -BG_SPACING, BG_SPACING, BG_SPACING)); + + bool rgContains = false; + for (int i=0; i<rg.rects().size(); i++) { + if (rg.rects()[i].contains(bgPath.boundingRect().toRect().translated(pt.toPoint()))) { + rgContains = true; + break; + } + } + if (rgContains) { + thePainter->translate(pt); + + thePainter->setPen(QPen(LabelColor, BG_PEN_SZ)); + thePainter->setBrush(LabelBackgroundColor); + thePainter->drawPath(bgPath); + + if (getLabelHalo()) { + thePainter->setPen(QPen(Qt::white, font.pixelSize()/5)); + thePainter->drawPath(textPath); + } + thePainter->setPen(Qt::NoPen); + thePainter->setBrush(LabelColor); + thePainter->drawPath(textPath); + + rg -= bgPath.boundingRect().toRect().translated(pt.toPoint()); + } + + startSegment += lenSegment; + } while (--repeat >= 0); + + thePainter->setClipRegion(rg); + } + thePainter->restore(); +} diff --git a/src/PaintStyle/PrimitivePainter.h b/src/PaintStyle/PrimitivePainter.h new file mode 100644 index 0000000..5b81e90 --- /dev/null +++ b/src/PaintStyle/PrimitivePainter.h @@ -0,0 +1,58 @@ +#ifndef MERKAARTOR_PRIMITIVEPAINTER_H_ +#define MERKAARTOR_PRIMITIVEPAINTER_H_ + +#include <QtCore/QString> +#include <QtGui/QColor> +#include <QFont> + +#include <QList> +#include <QPair> +#include <QPointF> + +#include <Painter.h> +#include "TagSelector.h" + +#include "math.h" + +class MapView; +class IFeature; +class TagSelector; +class QPainter; +class QPainterPath; +class QFont; +class QDomElement; + +class PrimitivePainter : public Painter +{ +public: + PrimitivePainter(); + PrimitivePainter(const PrimitivePainter& f); + PrimitivePainter& operator=(const PrimitivePainter& F); + PrimitivePainter(const Painter& f); + PrimitivePainter& operator=(const Painter& F); + ~PrimitivePainter(); + + void setSelector(const QString& aName); + void setSelector(TagSelector* aSelector); + TagSelectorMatchResult matchesTag(const IFeature* F, qreal PixelPerM) const; + + void drawBackground(QPainterPath* R, QPainter* thePainter, qreal PixelPerM) const; + void drawForeground(QPainterPath* R, QPainter* thePainter, qreal PixelPerM) const; + void drawTouchup(QPainterPath* R, QPainter* thePainter, qreal PixelPerM) const; + void drawTouchup(QPointF* R, QPainter* thePainter, qreal PixelPerM) const; + void drawLabel(QPainterPath* R, QPainter* thePainter, qreal PixelPerM, QString str, QString strBg = QString()) const; + void drawPointLabel(QPointF C, QString str, QString strBG, QPainter* thePainter, qreal PixelPerM) const; + void drawLabel(QPointF* Pt, QPainter* thePainter, qreal PixelPerM, QString str, QString strBg = QString()) const; + +public: + TagSelector* theTagSelector; + +private: + static inline qreal angToRad(qreal a) + { + return a*M_PI/180.; + } +}; + +#endif + diff --git a/src/Preferences/BookmarksList.cpp b/src/Preferences/BookmarksList.cpp new file mode 100644 index 0000000..2840ef5 --- /dev/null +++ b/src/Preferences/BookmarksList.cpp @@ -0,0 +1,143 @@ +// +// C++ Implementation: BookmarksList +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include <QApplication> + +#include "BookmarksList.h" +#include "MerkaartorPreferences.h" + +Bookmark::Bookmark() +{ + Bookmark(QApplication::translate("MerkaartorPreferences","New Bookmark"), CoordBox()); +} + +Bookmark::Bookmark(QString aName, CoordBox aCoord, bool Deleted) + : Name(aName), Coordinates(aCoord), deleted(Deleted) +{ + if (Name.isEmpty()) { + Name = QApplication::translate("MerkaartorPreferences","New Bookmark"); + } +} + +void Bookmark::toXml(QDomElement parent) +{ + QDomElement p = parent.ownerDocument().createElement("Bookmark"); + parent.appendChild(p); + p.setAttribute("name", Name); + if (deleted) + p.setAttribute("deleted", "true"); + + Coordinates.toXML("Coordinates", p); +} + +Bookmark Bookmark::fromXml(QDomElement parent) +{ + Bookmark theBookmark; + + if (parent.tagName() == "Bookmark") { + theBookmark.Name = parent.attribute("name"); + theBookmark.deleted = (parent.attribute("deleted") == "true" ? true : false); + + theBookmark.Coordinates = CoordBox::fromXML(parent.firstChildElement("Coordinates")); + } + + return theBookmark; +} + +/** **/ + +void BookmarksList::add(BookmarksList aBookmarksList) +{ + QMapIterator <QString, Bookmark> it(*(aBookmarksList.getBookmarks())); + while (it.hasNext()) { + it.next(); + + Bookmark anItem = it.value(); + if (!theBookmarks.contains(anItem.Name)) + theBookmarks.insert(anItem.Name, anItem); + } +} + +BookmarkList* BookmarksList::getBookmarks() +{ + return &theBookmarks; +} + +void BookmarksList::addBookmark(Bookmark aBookmark) +{ + theBookmarks.insert(aBookmark.Name, aBookmark); +} + +bool BookmarksList::contains(QString name) const +{ + if (theBookmarks.contains(name)) + return true; + else { + BookmarkListIterator it(theBookmarks); + while (it.hasNext()) { + it.next(); + + if (it.key().contains(name, Qt::CaseInsensitive)) + return true; + } + } + return false; +} + +Bookmark BookmarksList::getBookmark(QString name) const +{ + if (theBookmarks.contains(name)) + return theBookmarks.value(name); + else { + BookmarkListIterator it(theBookmarks); + while (it.hasNext()) { + it.next(); + + if (it.key().contains(name, Qt::CaseInsensitive)) + return it.value(); + } + } + return Bookmark(); +} + +void BookmarksList::toXml(QDomElement parent) +{ + QDomElement rt = parent.ownerDocument().createElement("Bookmarks"); + parent.appendChild(rt); + rt.setAttribute("creator", QString("%1 v%2%3").arg(STRINGIFY(PRODUCT)).arg(STRINGIFY(VERSION)).arg(STRINGIFY(REVISION))); + + BookmarkListIterator it(theBookmarks); + while (it.hasNext()) { + it.next(); + + Bookmark i = it.value(); + i.toXml(rt); + } +} + +BookmarksList BookmarksList::fromXml(QDomElement parent) +{ + BookmarksList theBookmarksList; + + if (parent.nodeName() == "Bookmarks") { + QDomElement c = parent.firstChildElement(); + while(!c.isNull()) { + if (c.tagName() == "Bookmark") { + theBookmarksList.addBookmark(Bookmark::fromXml(c)); + } + + c = c.nextSiblingElement(); + } + } + + return theBookmarksList; +} diff --git a/src/Preferences/BookmarksList.h b/src/Preferences/BookmarksList.h new file mode 100644 index 0000000..ffe768b --- /dev/null +++ b/src/Preferences/BookmarksList.h @@ -0,0 +1,54 @@ +// +// C++ Interface: BookmarksList +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef BOOKMARKS_LIST_H +#define BOOKMARKS_LIST_H + +#include <QString> +#include <QMap> +#include <QtXml> + +#include "Coord.h" + +class Bookmark +{ + public: + Bookmark(); + Bookmark(QString aName, CoordBox aCoord, bool Deleted=false); + + void toXml(QDomElement parent); + static Bookmark fromXml(QDomElement parent); + + public: + QString Name; + CoordBox Coordinates; + bool deleted; +}; +typedef QMap<QString, Bookmark> BookmarkList; +typedef QMapIterator<QString, Bookmark> BookmarkListIterator; + +class BookmarksList +{ + public: + void add(BookmarksList aBookmarksList); + void addBookmark(Bookmark aBookmark); + bool contains(QString name) const; + BookmarkList* getBookmarks(); + Bookmark getBookmark(QString name) const; + void toXml(QDomElement parent); + static BookmarksList fromXml(QDomElement parent); + + private: + BookmarkList theBookmarks; +}; + +#endif // BOOKMARKS_LIST_H diff --git a/src/Preferences/FilterList.cpp b/src/Preferences/FilterList.cpp new file mode 100644 index 0000000..9995fe3 --- /dev/null +++ b/src/Preferences/FilterList.cpp @@ -0,0 +1,128 @@ +// +// C++ Implementation: FilterList +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "FilterList.h" + +#define STRINGIFY(x) XSTRINGIFY(x) +#define XSTRINGIFY(x) #x + +FilterItem::FilterItem () + : name(""), filter(""), deleted(false) +{ + id = QUuid::createUuid(); +} + +FilterItem::FilterItem (QUuid aId, QString aName, QString aFilter, bool aDeleted) + : id(aId), name(aName), filter(aFilter), deleted(aDeleted) +{ +} + +void FilterItem::toXml(QDomElement parent) +{ + QDomElement p = parent.ownerDocument().createElement("Filter"); + parent.appendChild(p); + p.setAttribute("xml:id", id.toString()); + p.setAttribute("name", name); + if (deleted) + p.setAttribute("deleted", "true"); + + QDomText t = parent.ownerDocument().createTextNode(filter); + p.appendChild(t); +} + +FilterItem FilterItem::fromXml(QDomElement parent) +{ + FilterItem theFilter; + + if (parent.tagName() == "Filter") { + theFilter.filter = parent.text().trimmed(); + if (parent.hasAttribute("xml:id")) + theFilter.id = QUuid(parent.attribute("xml:id")); + else + theFilter.id = QUuid::createUuid(); + theFilter.name = parent.attribute("name"); + theFilter.deleted = (parent.attribute("deleted") == "true" ? true : false); + } + + return theFilter; +} + +void FiltersList::add(FiltersList aFilterList) +{ + FilterListIterator it(*(aFilterList.getFilters())); + while (it.hasNext()) { + it.next(); + + FilterItem anItem = it.value(); + if (!theFilters.contains(anItem.name)) + theFilters.insert(anItem.name, anItem); + } +} + +void FiltersList::addFilter(FilterItem aFilter) +{ + theFilters.insert(aFilter.name, aFilter); +} + +FilterItem FiltersList::getFilter(QString name) const +{ + if (theFilters.contains(name)) + return theFilters.value(name); + else { + QMapIterator <QString, FilterItem> it(theFilters); + while (it.hasNext()) { + it.next(); + + if (it.key().contains(name, Qt::CaseInsensitive)) + return it.value(); + } + } + return FilterItem(); +} + +QMap <QString, FilterItem>* FiltersList::getFilters() +{ + return &theFilters; +} + +void FiltersList::toXml(QDomElement parent) +{ + QDomElement rt = parent.ownerDocument().createElement("Filters"); + parent.appendChild(rt); + rt.setAttribute("creator", QString("%1 v%2%3").arg(STRINGIFY(PRODUCT)).arg(STRINGIFY(VERSION)).arg(STRINGIFY(REVISION))); + + QMapIterator <QString, FilterItem> it(theFilters); + while (it.hasNext()) { + it.next(); + + FilterItem i = it.value(); + i.toXml(rt); + } +} + +FiltersList FiltersList::fromXml(QDomElement parent) +{ + FiltersList theFilters; + + if (parent.nodeName() == "Filters") { + QDomElement c = parent.firstChildElement(); + while(!c.isNull()) { + if (c.tagName() == "Filter") { + theFilters.addFilter(FilterItem::fromXml(c)); + } + + c = c.nextSiblingElement(); + } + } + + return theFilters; +} diff --git a/src/Preferences/FilterList.h b/src/Preferences/FilterList.h new file mode 100644 index 0000000..460fda3 --- /dev/null +++ b/src/Preferences/FilterList.h @@ -0,0 +1,52 @@ +// +// C++ Interface: FilterList +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef FILTER_LIST_H +#define FILTER_LIST_H + +#include <QString> +#include <QMap> +#include <QtXml> + +class FilterItem +{ + public: + FilterItem (); + FilterItem (QUuid aId, QString aName, QString aProjection, bool aDeleted = false); + QUuid id; + QString name; + QString filter; + bool deleted; + + public: + void toXml(QDomElement parent); + static FilterItem fromXml(QDomElement parent); +}; + +typedef QMap <QString, FilterItem> FilterList; +typedef QMapIterator<QString, FilterItem> FilterListIterator; + +class FiltersList +{ + public: + void add(FiltersList aFilterList); + void addFilter(FilterItem aProjItem); + FilterItem getFilter(QString name) const; + FilterList* getFilters(); + void toXml(QDomElement parent); + static FiltersList fromXml(QDomElement parent); + + private: + FilterList theFilters; +}; + +#endif // FILTER_LIST_H diff --git a/src/Preferences/FilterPreferencesDialog.cpp b/src/Preferences/FilterPreferencesDialog.cpp new file mode 100644 index 0000000..822b8c8 --- /dev/null +++ b/src/Preferences/FilterPreferencesDialog.cpp @@ -0,0 +1,200 @@ +// +// C++ Implementation: FilterPreferencesDialog +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, Bart Vanhauwaert (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "Global.h" + +#include "FilterPreferencesDialog.h" +#include "TagSelector.h" +#include "MainWindow.h" + +#include "SelectionDialog.h" + +#include <QMessageBox> +#include <QDir> +#include <QUrl> +#include <QTextEdit> +#include <QComboBox> + +FilterPreferencesDialog::FilterPreferencesDialog(QWidget* parent) + : QDialog(parent) +{ + setupUi(this); + btAdd->setEnabled(false); + btApply->setEnabled(false); + btDel->setEnabled(false); + + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + loadPrefs(); +} + +FilterPreferencesDialog::~FilterPreferencesDialog() +{ +} + +void FilterPreferencesDialog::addFilter(const FilterItem & srv) +{ + theItems.push_back(srv); + if (!srv.deleted) { + QListWidgetItem* item = new QListWidgetItem(srv.name); + item->setData(Qt::UserRole, (int) theItems.size()-1); + lvFilters->addItem(item); + } + + TagSelector* t = TagSelector::parse(srv.filter); + qDebug() << t->asExpression(false); +} + +void FilterPreferencesDialog::on_btApply_clicked(void) +{ + int idx = static_cast<int>(lvFilters->currentItem()->data(Qt::UserRole).toInt()); + if (idx >= theItems.size()) + return; + TagSelector* t = TagSelector::parse(edFilterString->text()); + if (!t) + return; + + FilterItem& item(theItems[idx]); + item.name = edFilterName->text(); + item.filter = t->asExpression(false); + + lvFilters->currentItem()->setText(item.name); + selectedItem = item.name; +} + +void FilterPreferencesDialog::on_btAdd_clicked(void) +{ + TagSelector* t = TagSelector::parse(edFilterString->text()); + if (!t) + return; + + addFilter(FilterItem(QUuid::createUuid(), edFilterName->text(), t->asExpression(false))); + lvFilters->setCurrentRow(lvFilters->count() - 1); + on_lvFilters_itemSelectionChanged(); +} + +void FilterPreferencesDialog::on_btDel_clicked(void) +{ + int idx = static_cast<int>(lvFilters->currentItem()->data(Qt::UserRole).toInt()); + if (idx >= theItems.size()) + return; + + theItems[idx].deleted = true; + + delete lvFilters->takeItem(lvFilters->currentRow()); + on_lvFilters_itemSelectionChanged(); +} + +void FilterPreferencesDialog::on_btFilterHelper_clicked() +{ + SelectionDialog* Sel = new SelectionDialog(g_Merk_MainWindow, false); + if (!Sel) + return; + + Sel->edTagQuery->setText(edFilterString->text()); + if (Sel->exec() == QDialog::Accepted) { + edFilterString->setText(Sel->edTagQuery->text()); + } +} + +void FilterPreferencesDialog::on_lvFilters_itemSelectionChanged() +{ + if (lvFilters->currentRow() < 0) + { + selectedItem.clear(); + edFilterName->setText(selectedItem); + edFilterString->setText(selectedItem); + btDel->setEnabled(false); + btApply->setEnabled(false); + return; + } + + QListWidgetItem* it = lvFilters->item(lvFilters->currentRow()); + on_lvFilters_itemClicked(it); +} + +void FilterPreferencesDialog::on_lvFilters_itemClicked(QListWidgetItem * it) +{ + int idx = it->data(Qt::UserRole).toInt(); + if (idx >= theItems.size()) { + btDel->setEnabled(false); + btApply->setEnabled(false); + return; + } + + FilterItem& item(theItems[idx]); + edFilterName->setText(item.name); + edFilterString->setText(item.filter); + + selectedItem = item.name; + btDel->setEnabled(true); + btApply->setEnabled(true); +} + +void FilterPreferencesDialog::on_edFilterName_textChanged(const QString & text) +{ + btApply->setEnabled(false); + btDel->setEnabled(false); + if (text.isEmpty()) { + btAdd->setEnabled(false); + } else { + btAdd->setEnabled(true); + } +} + +void FilterPreferencesDialog::on_edFilterString_textChanged(const QString & /*text*/) +{ +} + +QString FilterPreferencesDialog::getSelectedItem() +{ + return selectedItem; +} + +void FilterPreferencesDialog::setSelectedItem(QString theValue) +{ + QList<QListWidgetItem *> L = lvFilters->findItems(theValue, Qt::MatchExactly); + lvFilters->setCurrentItem(L[0]); + on_lvFilters_itemSelectionChanged(); +} + +void FilterPreferencesDialog::on_buttonBox_clicked(QAbstractButton * button) +{ + if (button == buttonBox->button(QDialogButtonBox::Apply)) { + savePrefs(); + } else + if (button == buttonBox->button(QDialogButtonBox::Ok)) { + savePrefs(); + this->accept(); + } +} + +void FilterPreferencesDialog::loadPrefs() +{ + FilterList* L = M_PREFS->getFiltersList()->getFilters(); + FilterListIterator i(*L); + while (i.hasNext()) { + i.next(); + addFilter(i.value()); + } +} + +void FilterPreferencesDialog::savePrefs() +{ + FilterList* L = M_PREFS->getFiltersList()->getFilters(); + L->clear(); + for (int i = 0; i < theItems.size(); ++i) { + FilterItem S(theItems[i]); + L->insert(theItems[i].name, S); + } + M_PREFS->save(); +} + diff --git a/src/Preferences/FilterPreferencesDialog.h b/src/Preferences/FilterPreferencesDialog.h new file mode 100644 index 0000000..9c6c078 --- /dev/null +++ b/src/Preferences/FilterPreferencesDialog.h @@ -0,0 +1,67 @@ +// +// C++ Interface: FilterPreferencesDialog +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef FilterPreferencesDialog_H +#define FilterPreferencesDialog_H + +#include <QWidget> +#include <QBuffer> + + +#include <ui_FilterPreferencesDialog.h> +#include "MerkaartorPreferences.h" +#include "FilterList.h" + +#include <QList> + +/** + @author cbro <cbro@semperpax.com> +*/ + +class FilterPreferencesDialog : public QDialog, public Ui::FilterPreferencesDialog +{ + Q_OBJECT + +public: + FilterPreferencesDialog(QWidget* parent = 0); + ~FilterPreferencesDialog(); + + void addFilter(const FilterItem & item); + +public slots: + void on_btApply_clicked(); + void on_btAdd_clicked(); + void on_btDel_clicked(); + void on_btFilterHelper_clicked(); + void on_lvFilters_itemSelectionChanged(); + void on_lvFilters_itemClicked(QListWidgetItem * item); + + void on_buttonBox_clicked(QAbstractButton * button); + + void on_edFilterName_textChanged(const QString & text); + void on_edFilterString_textChanged(const QString & text); + +private: + void loadPrefs(); + void savePrefs(); +public: + QList<FilterItem> theItems; + QString getSelectedItem(); + void setSelectedItem(QString theValue); + +private: + QString selectedItem; + int httpGetId; + QBuffer* buf; + +}; + +#endif diff --git a/src/Preferences/FilterPreferencesDialog.ui b/src/Preferences/FilterPreferencesDialog.ui new file mode 100644 index 0000000..75690a7 --- /dev/null +++ b/src/Preferences/FilterPreferencesDialog.ui @@ -0,0 +1,198 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>FilterPreferencesDialog</class> + <widget class="QDialog" name="FilterPreferencesDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>640</width> + <height>360</height> + </rect> + </property> + <property name="windowTitle"> + <string>Filters setup</string> + </property> + <layout class="QVBoxLayout"> + <item> + <widget class="QGroupBox" name="grpFilters"> + <property name="title"> + <string>Filters</string> + </property> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>1</number> + </property> + <property name="margin"> + <number>1</number> + </property> + <item> + <widget class="QFrame" name="frame_2"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>5</number> + </property> + <property name="margin"> + <number>5</number> + </property> + <item> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Filter list:</string> + </property> + </widget> + </item> + <item> + <widget class="QListWidget" name="lvFilters"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QFrame" name="frame"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label_11"> + <property name="text"> + <string>Name:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edFilterName"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Filter</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLineEdit" name="edFilterString"/> + </item> + <item> + <widget class="QToolButton" name="btFilterHelper"> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="btApply"> + <property name="text"> + <string>Apply</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btAdd"> + <property name="text"> + <string>Add</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btDel"> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>FilterPreferencesDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>FilterPreferencesDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/Preferences/MerkaartorPreferences.cpp b/src/Preferences/MerkaartorPreferences.cpp new file mode 100644 index 0000000..3e9dce4 --- /dev/null +++ b/src/Preferences/MerkaartorPreferences.cpp @@ -0,0 +1,1719 @@ +// +// C++ Implementation: MerkaartorPreferences +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, bvh, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "Global.h" +#include "IFeature.h" +#include "MerkaartorPreferences.h" + +#include <QApplication> +#include <QByteArray> +#include <QMessageBox> + + +#include "MainWindow.h" +#ifndef _MOBILE +#include <ui_MainWindow.h> +#endif +#include "MapView.h" + +#include "IMapAdapterFactory.h" +#include "IPaintStyle.h" +#include "MasPaintStyle.h" + +#include <QLoggingCategory> + +QLoggingCategory lc_MerkaartorPreferences("merk.MerkaartorPreferences"); + + +// TODO: Replace 'g_Merk_Ignore_Preferences' by having two implementations +// of the "preferences API": one that behaves as if +// g_Merk_Ignore_Preferences == false, and one that ignores writes +// and always returns default settings. + +#define M_PARAM_IMPLEMENT_BOOL(Param, Category, Default) \ + bool mb_##Param = false; \ + void MerkaartorPreferences::set##Param(bool theValue) \ + { \ + m_##Param = theValue; \ + if (!g_Merk_Ignore_Preferences) { \ + Sets->setValue(#Category"/"#Param, theValue); \ + } \ + } \ + bool MerkaartorPreferences::get##Param() \ + { \ + if (!::mb_##Param) { \ + ::mb_##Param = true; \ + if (g_Merk_Ignore_Preferences || g_Merk_Reset_Preferences) \ + m_##Param = Default; \ + else \ + m_##Param = Sets->value(#Category"/"#Param, Default).toBool(); \ + } \ + return m_##Param; \ + } + +#define M_PARAM_IMPLEMENT_STRING(Param, Category, Default) \ + bool mb_##Param = false; \ + void MerkaartorPreferences::set##Param(const QString& theValue) \ + { \ + m_##Param = theValue; \ + if (!g_Merk_Ignore_Preferences) { \ + Sets->setValue(#Category"/"#Param, theValue); \ + } \ + } \ + QString MerkaartorPreferences::get##Param() \ + { \ + if (!::mb_##Param) { \ + ::mb_##Param = true; \ + if (g_Merk_Ignore_Preferences || g_Merk_Reset_Preferences) \ + m_##Param = Default; \ + else \ + m_##Param = Sets->value(#Category"/"#Param, Default).toString(); \ + } \ + return m_##Param; \ + } + +#define M_PARAM_IMPLEMENT_STRINGLIST(Param, Category, Default) \ + bool mb_##Param = false; \ + void MerkaartorPreferences::set##Param(const QStringList& theValue) \ + { \ + m_##Param = theValue; \ + if (!g_Merk_Ignore_Preferences) { \ + Sets->setValue(#Category"/"#Param, theValue); \ + } \ + } \ + QStringList& MerkaartorPreferences::get##Param() \ + { \ + if (!::mb_##Param) { \ + ::mb_##Param = true; \ + if (g_Merk_Ignore_Preferences || g_Merk_Reset_Preferences) \ + m_##Param = QString(Default).split("#"); \ + else \ + m_##Param = Sets->value(#Category"/"#Param, QVariant(QString(Default).split("#"))).toStringList(); \ + } \ + return m_##Param; \ + } + +#define M_PARAM_IMPLEMENT_INT(Param, Category, Default) \ + bool mb_##Param = false; \ + void MerkaartorPreferences::set##Param(int theValue) \ + { \ + m_##Param = theValue; \ + if (!g_Merk_Ignore_Preferences) { \ + Sets->setValue(#Category"/"#Param, theValue); \ + } \ + } \ + int MerkaartorPreferences::get##Param() \ + { \ + if (!::mb_##Param) { \ + ::mb_##Param = true; \ + if (g_Merk_Ignore_Preferences || g_Merk_Reset_Preferences) \ + m_##Param = Default; \ + else \ + m_##Param = Sets->value(#Category"/"#Param, Default).toInt(); \ + } \ + return m_##Param; \ + } +#define M_PARAM_IMPLEMENT_INT_DELAYED(Param, Category, Default) \ + bool mb_##Param = false; \ + void MerkaartorPreferences::set##Param(int theValue) \ + { \ + m_##Param = theValue; \ + } \ + void MerkaartorPreferences::save##Param() \ + { \ + if (!g_Merk_Ignore_Preferences) { \ + Sets->setValue(#Category"/"#Param, m_##Param); \ + } \ + } \ + int MerkaartorPreferences::get##Param() \ + { \ + if (!::mb_##Param) { \ + ::mb_##Param = true; \ + if (g_Merk_Ignore_Preferences || g_Merk_Reset_Preferences) \ + m_##Param = Default; \ + else \ + m_##Param = Sets->value(#Category"/"#Param, Default).toInt(); \ + } \ + return m_##Param; \ + } + +#define M_PARAM_IMPLEMENT_DOUBLE(Param, Category, Default) \ + bool mb_##Param = false; \ + void MerkaartorPreferences::set##Param(qreal theValue) \ + { \ + m_##Param = theValue; \ + if (!g_Merk_Ignore_Preferences) { \ + Sets->setValue(#Category"/"#Param, theValue); \ + } \ + } \ + qreal MerkaartorPreferences::get##Param() \ + { \ + if (!::mb_##Param) { \ + ::mb_##Param = true; \ + if (g_Merk_Ignore_Preferences || g_Merk_Reset_Preferences) \ + m_##Param = Default; \ + else \ + m_##Param = Sets->value(#Category"/"#Param, Default).toDouble(); \ + } \ + return m_##Param; \ + } + +#define M_PARAM_IMPLEMENT_COLOR(Param, Category, Default) \ + bool mb_##Param = false; \ + void MerkaartorPreferences::set##Param(const QColor& theValue) \ + { \ + m_##Param = theValue; \ + if (!g_Merk_Ignore_Preferences) { \ + Sets->setValue(#Category"/"#Param, QVariant(theValue)); \ + } \ + } \ + QColor MerkaartorPreferences::get##Param() \ + { \ + if (!::mb_##Param) { \ + ::mb_##Param = true; \ + if (g_Merk_Ignore_Preferences || g_Merk_Reset_Preferences) \ + m_##Param = Default; \ + else { \ + QString sColor = Sets->value(#Category"/"#Param, QString()).toString(); \ + if (sColor.isEmpty() || !QColor(sColor).isValid()) \ + m_##Param = Default; \ + else \ + m_##Param = Sets->value(#Category"/"#Param).value<QColor>(); \ + } \ + } \ + return m_##Param; \ + } + +/***************************/ + +MerkaartorPreferences* MerkaartorPreferences::m_prefInstance = 0; +MerkaartorPreferences* MerkaartorPreferences::instance() { + if (!m_prefInstance) { + m_prefInstance = new MerkaartorPreferences; + } + + return m_prefInstance; +} + + +IPaintStyle* MerkaartorPreferences::m_EPSInstance = 0; +IPaintStyle* MerkaartorPreferences::styleinstance() { + if (!m_EPSInstance) { + m_EPSInstance = new MasPaintStyle; + } + + return m_EPSInstance; +} + +Tool::Tool(QString Name, QString Path) + : ToolName(Name), ToolPath(Path) +{ +} + +Tool::Tool() +{ +} + +/* MekaartorPreferences */ + +namespace { + +QSettings* getSettings() { + if (!g_Merk_Portable) { + return new QSettings(); + } else { + return new QSettings(qApp->applicationDirPath() + "/merkaartor.ini", QSettings::IniFormat); + } +} + +} // namespace + +MerkaartorPreferences::MerkaartorPreferences() +{ + if (!g_Merk_Ignore_Preferences) { + Sets = getSettings(); + + QSettings oldSettings("BartVanhauwaert", "Merkaartor"); + QStringList oldKeys = oldSettings.allKeys(); + foreach(QString k, oldKeys) { + Sets->setValue(k, oldSettings.value(k)); + Sets->sync(); + oldSettings.remove(k); + } + oldSettings.clear(); + version = Sets->value("version/version", "0").toString(); + } + + connect(&httpRequest, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)), this, SLOT(on_authenticationRequired(QNetworkReply*, QAuthenticator*))); + connect(&httpRequest, SIGNAL(finished(QNetworkReply*)),this,SLOT(on_requestFinished(QNetworkReply*))); + connect(&httpRequest, SIGNAL(sslErrors(QNetworkReply *, const QList<QSslError>&)), this, SLOT(on_sslErrors(QNetworkReply*, const QList<QSslError>&))); + +#ifdef USE_LIBPROXY + // Initialise libproxy + proxyFactory = px_proxy_factory_new(); + + // Map libproxy URL schemes to QNetworkProxy types + proxyTypeMap["direct"] = QNetworkProxy::NoProxy; + proxyTypeMap["socks" ] = QNetworkProxy::Socks5Proxy; + proxyTypeMap["socks5"] = QNetworkProxy::Socks5Proxy; + proxyTypeMap["http" ] = QNetworkProxy::HttpCachingProxy; +#endif + + initialize(); +} + +MerkaartorPreferences::~MerkaartorPreferences() +{ + delete Sets; +#ifdef USE_LIBPROXY + px_proxy_factory_free(proxyFactory); +#endif +} + +void MerkaartorPreferences::save(bool UserPwdChanged) +{ + if (g_Merk_Ignore_Preferences || !saveOnline) + return; + + Sets->setValue("version/version", QString("%1").arg(STRINGIFY(VERSION))); + setTools(); + setAlphaList(); + + saveProjections(); + saveFilters(); + saveWMSes(); + saveTMSes(); + saveBookmarks(); + saveOsmServers(); + + saveTagListFirstColumnWidth(); + Sets->sync(); + + /* If OSM login info has been changed, it might be a good idea to load new + * preferences from that user account. */ + if (UserPwdChanged) + fromOsmPref(); + + toOsmPref(); +} + +void MerkaartorPreferences::toOsmPref() +{ + qDebug(lc_MerkaartorPreferences) << "MerkaartorPreferences::toOsmPref"; + if (getOfflineMode()) return; + + if (getOsmUser().isEmpty() || getOsmPassword().isEmpty()) return; + + QDomDocument theXmlDoc; + + theXmlDoc.appendChild(theXmlDoc.createProcessingInstruction("xml", "version=\"1.0\"")); + + QDomElement root = theXmlDoc.createElement("MerkaartorLists"); + theXmlDoc.appendChild(root); + + theProjectionsList.toXml(root); + theBookmarkList.toXml(root); + theTmsServerList.toXml(root); + theWmsServerList.toXml(root); + theFiltersList.toXml(root); + + QByteArray ba = qCompress(theXmlDoc.toString().toUtf8()); + QByteArray PrefsXML = ba.toBase64(); + + // TODO: Why is it required to load from PrefsXML in chunk of 254? + QStringList slicedPrefs; + for (int i=0; i<PrefsXML.size(); i+=254) { + QString s = PrefsXML.mid(i, 254); + slicedPrefs.append(s); + if (s.size() < 254) + break; + } + + QMap<QString, QString> OsmPref; + + QString k = QString("MerkaartorSizePrefsXML"); + QString v = QString::number(slicedPrefs.size()); + OsmPref.insert(k, v); + + for (int i=0; i<slicedPrefs.size(); i++) { + k = QString("MerkaartorPrefsXML%1").arg(i, 3, 10, QLatin1Char('0')); + v = slicedPrefs[i]; + OsmPref.insert(k, v); + } + + QMapIterator<QString, QString> it(OsmPref); + while(it.hasNext()) { + it.next(); + putOsmPref(it.key(), it.value()); + } + +} + +void MerkaartorPreferences::fromOsmPref() +{ + if (getOfflineMode()) return; + + qDebug(lc_MerkaartorPreferences) << "Requesting preferences from OSM server."; + + if (getOsmUser().isEmpty() || getOsmPassword().isEmpty()) return; + + QUrl osmWeb(getOsmApiUrl()+"/user/preferences"); + + QNetworkRequest req(osmWeb); + req.setRawHeader(QByteArray("User-Agent"), USER_AGENT.toLatin1()); + + httpRequest.setProxy(getProxy(osmWeb)); + OsmPrefLoadReply = httpRequest.get(req); +} + +void MerkaartorPreferences::on_authenticationRequired( QNetworkReply *reply, QAuthenticator *auth ) { + static QNetworkReply *lastReply = NULL; + + /* Only provide authentication the first time we see this reply, to avoid + * infinite loop providing the same credentials. */ + if (lastReply != reply) { + lastReply = reply; + qDebug(lc_MerkaartorPreferences) << "Authentication required and provided."; + auth->setUser(getOsmUser()); + auth->setPassword(getOsmPassword()); + } +} + +void MerkaartorPreferences::on_sslErrors(QNetworkReply *reply, const QList<QSslError>& errors) { + Q_UNUSED(reply); + qDebug(lc_MerkaartorPreferences) << "We stumbled upon some SSL errors: "; + foreach ( QSslError error, errors ) { + qDebug(lc_MerkaartorPreferences) << "1:"; + qDebug(lc_MerkaartorPreferences) << error.errorString(); + } +} + +void MerkaartorPreferences::on_requestFinished ( QNetworkReply *reply ) +{ + int error = reply->error(); + if (error != QNetworkReply::NoError) { + //qDebug(lc_MerkaartorPreferences) << "Received response with code " << error << "(" << reply->errorString() << ")"; + switch (error) { + case QNetworkReply::HostNotFoundError: + qWarning() << "MerkaartorPreferences: Host not found, preferences won't be synchronized with your profile."; + /* We don't want to save local changes online, and possibly corrupt the store */ + saveOnline = false; + break; + case 406: + QMessageBox::critical(NULL,QApplication::translate("MerkaartorPreferences","Preferences upload failed"), QApplication::translate("MerkaartorPreferences","Duplicate key")); + return; + case 413: + QMessageBox::critical(NULL,QApplication::translate("MerkaartorPreferences","Preferences upload failed"), QApplication::translate("MerkaartorPreferences","More than 150 preferences")); + return; + default: + QMessageBox::critical(NULL,QApplication::translate("MerkaartorPreferences","Preferences communication failed"), QApplication::translate("MerkaartorPreferences", "Communication error")+":\n"+reply->errorString()); + return; + } + } + + if (reply != OsmPrefLoadReply) + return; + + qDebug(lc_MerkaartorPreferences) << "Reading preferences from online profile."; + + QDomDocument aOsmPrefDoc; + aOsmPrefDoc.setContent(reply, false); + + QDomNodeList prefList = aOsmPrefDoc.elementsByTagName("preference"); + + int sz = 0; + for (int i=0; i < prefList.size(); ++i) { + QDomElement e = prefList.at(i).toElement(); + if (e.attribute("k").startsWith("MerkaartorSizePrefsXML")) { + sz = e.attribute("v").toInt(); + break; + } + } + + if (!sz) + return; + + QVector<QString> slicedPrefs(sz); + QString k, v; + for (int i=0; i < prefList.size(); ++i) { + QDomElement e = prefList.at(i).toElement(); + k = e.attribute("k"); + v = e.attribute("v"); + if (k.startsWith("MerkaartorPrefsXML")) { + int idx = k.right(3).toInt(); + if (idx < sz) + slicedPrefs[idx] = v; + } + } + + QByteArray PrefsXML; + for (int i=0; i<sz; i++) + PrefsXML.append(slicedPrefs[i].toLatin1()); + + //qDebug(lc_MerkaartorPreferences) << "Size: " << PrefsXML.size(); + + QDomDocument theXmlDoc; + QByteArray ba = QByteArray::fromBase64(PrefsXML); + if (!theXmlDoc.setContent(qUncompress(ba))) { + qDebug(lc_MerkaartorPreferences) << "Invalid OSM Prefs XML"; + return; + } + + QDomElement docElem = theXmlDoc.documentElement(); + if (docElem.tagName() != "MerkaartorLists") { + qDebug(lc_MerkaartorPreferences) << "Invalid OSM Prefs XML root element: " << docElem.tagName(); + return; + } + + //qDebug(lc_MerkaartorPreferences) << theXmlDoc.toString(); + + QDomElement c = docElem.firstChildElement(); + while(!c.isNull()) { + if (c.tagName() == "Projections") { + ProjectionsList aProjList = ProjectionsList::fromXml(c); + theProjectionsList.add(aProjList); + } else + if (c.tagName() == "Bookmarks") { + BookmarksList aBkList = BookmarksList::fromXml(c); + theBookmarkList.add(aBkList); + } else + if (c.tagName() == "TmsServers") { + TmsServersList aTmsList = TmsServersList::fromXml(c); + theTmsServerList.add(aTmsList); + } else + if (c.tagName() == "WmsServers") { + WmsServersList aWmsList = WmsServersList::fromXml(c); + theWmsServerList.add(aWmsList); + } else + if (c.tagName() == "Filters") { + FiltersList aFiltList = FiltersList::fromXml(c); + theFiltersList.add(aFiltList); + } + + c = c.nextSiblingElement(); + } + + reply->deleteLater(); +} + + +void MerkaartorPreferences::putOsmPref(const QString& k, const QString& v) +{ + qDebug(lc_MerkaartorPreferences) << "Saving OSM preference online: " << k << "=" << v; + QUrl osmWeb(getOsmApiUrl()+QString("/user/preferences/%1").arg(k)); + + QByteArray ba(v.toUtf8()); + QBuffer Buf(&ba); + + QNetworkRequest req(osmWeb); + + httpRequest.setProxy(getProxy(osmWeb)); + OsmPrefSaveReply = httpRequest.put(req, ba); +} + +void MerkaartorPreferences::deleteOsmPref(const QString& k) +{ + qDebug(lc_MerkaartorPreferences) << "Deleting OSM preference online: " << k; + + QUrl osmWeb(getOsmApiUrl()+QString("/user/preferences/%1").arg(k)); + + QNetworkRequest req(osmWeb); + + httpRequest.setProxy(getProxy(osmWeb)); + OsmPrefSaveReply = httpRequest.sendCustomRequest(req,"DELETE"); +} + +void MerkaartorPreferences::initialize() +{ +// Use06Api = Sets->value("osm/use06api", "true").toBool(); + Use06Api = true; + saveOnline = true; + + // Proxy upgrade + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) { + if (Sets->contains("proxy/Use")) { + bool b = Sets->value("proxy/Use").toBool(); + QString h = Sets->value("proxy/Host").toString(); + int p = Sets->value("proxy/Port").toInt(); + + Sets->remove("proxy"); + + setProxyUse(b); + setProxyHost(h); + setProxyPort(p); + } + } + + loadProjections(); + loadFilters(); + loadWMSes(); + loadTMSes(); + loadBookmarks(); + loadOsmServers(); + + fromOsmPref(); + + QStringList sl; + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) { + sl = Sets->value("downloadosm/bookmarks").toStringList(); + if (sl.size()) { + for (int i=0; i<sl.size(); i+=5) { + Bookmark B(sl[i], CoordBox(Coord(sl[i+2].toDouble(),sl[i+1].toDouble()), + Coord(sl[i+4].toDouble(),sl[i+3].toDouble()))); + theBookmarkList.addBookmark(B); + } + save(); + Sets->remove("downloadosm/bookmarks"); + } + } + + QStringList alphaList = getAlphaList(); + if (alphaList.size() == 0) { + alpha["Low"] = 0.33; + alpha["High"] = 0.66; + alpha["Opaque"] = 1.0; + } else { + for (int i=0; i<alphaList.size(); i+=2) { + alpha[alphaList[i]] = alphaList[i+1].toDouble(); + } + } + + QStringList tl; + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) { + tl = Sets->value("Tools/list").toStringList(); + for (int i=0; i<tl.size(); i+=TOOL_FIELD_SIZE) { + Tool t(tl[i], tl[i+1]); + theToolList.insert(tl[i], t); + } + } + if (!theToolList.contains("Inkscape")) { + Tool t("Inkscape", QString()); + theToolList.insert("Inkscape", t); + } + + QStringList Servers; + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) { + Servers = Sets->value("WSM/servers").toStringList(); + // TODO: Apparently WMS/servers is a list, and every 7 consecutive + // items describe a single server. There should be some documentation + // about what do the fields mean. Same with TMS/servers. + if (Servers.size()) { + for (int i=0; i<Servers.size(); i+=7) { + WmsServer S(Servers[i], Servers[i+1], Servers[i+2], Servers[i+3], Servers[i+4], Servers[i+5], Servers[i+6], QString(), QString()); + theWmsServerList.addServer(S); + } + save(); + Sets->remove("WSM/servers"); + } + + Servers = Sets->value("TMS/servers").toStringList(); + if (Servers.size()) { + for (int i=0; i<Servers.size(); i+=6) { + TmsServer S(Servers[i], Servers[i+1], Servers[i+2], "EPSG:900913", Servers[i+3].toInt(), Servers[i+4].toInt(), Servers[i+5].toInt(), QString(), QString()); + theTmsServerList.addServer(S); + } + save(); + Sets->remove("TMS/servers"); + } + } + + parentDashes << 1 << 5; + + //Ensure we have a CacheDir value in QSettings + if (!g_Merk_Ignore_Preferences) + Sets->setValue("backgroundImage/CacheDir", Sets->value("backgroundImage/CacheDir", HOMEDIR + "/BackgroundCache")); +} + +const QVector<qreal> MerkaartorPreferences::getParentDashes() const +{ + return parentDashes; +} + +qreal MerkaartorPreferences::apiVersionNum() const +{ + if (Use06Api) + return 0.6; + else + return 0.5; +} + +const QString MerkaartorPreferences::apiVersion() const +{ + if (Use06Api) + return "0.6"; + else + return "0.5"; +} + +void MerkaartorPreferences::setUse06Api(bool b) +{ + // ATTENTION this does not update Use06API member on purpose to force a + // restart before it takes effect. Mixing 0.5 api and 0.6 api in one session + // is dangerous!!! + Sets->setValue("osm/use06api", b); +} + +M_PARAM_IMPLEMENT_BOOL(rightsidedriving, roadstructure, true); +M_PARAM_IMPLEMENT_DOUBLE(doubleroaddistance, roadstructure, 20.); +M_PARAM_IMPLEMENT_DOUBLE(RoundaboutPrecision, roadstructure, 10.); +M_PARAM_IMPLEMENT_INT(RoundaboutType, misc, 0); +M_PARAM_IMPLEMENT_STRING(workingdir, general, QString()); + +BookmarkList* MerkaartorPreferences::getBookmarks() +{ + //return Sets->value("downloadosm/bookmarks").toStringList(); + return theBookmarkList.getBookmarks(); +} + +/* WMS */ + +WmsServerList* MerkaartorPreferences::getWmsServers() +{ +// return Sets->value("WSM/servers").toStringList(); + return theWmsServerList.getServers(); +} + +OsmServerList* MerkaartorPreferences::getOsmServers() +{ + return &theOsmServers; +} + +/* TMS */ + +TmsServerList* MerkaartorPreferences::getTmsServers() +{ +// return Sets->value("WSM/servers").toStringList(); + return theTmsServerList.getServers(); +} + +/* */ + +M_PARAM_IMPLEMENT_STRING(SelectedServer, backgroundImage, QString()); + +bool MerkaartorPreferences::getBgVisible() const +{ + if (g_Merk_Ignore_Preferences || g_Merk_Reset_Preferences) + return false; + else + return Sets->value("backgroundImage/Visible", false).toBool(); +} + +void MerkaartorPreferences::setBgVisible(bool theValue) +{ + if (!g_Merk_Ignore_Preferences) + Sets->setValue("backgroundImage/Visible", theValue); +} + +/* Plugins */ + +void MerkaartorPreferences::addBackgroundPlugin(IMapAdapterFactory* aPlugin) +{ + mBackgroundPlugins.insert(aPlugin->getId(), aPlugin); +} + +IMapAdapterFactory* MerkaartorPreferences::getBackgroundPlugin(const QUuid& anAdapterUid) +{ + if (mBackgroundPlugins.contains(anAdapterUid)) + return mBackgroundPlugins[anAdapterUid]; + else + return NULL; +} + +void MerkaartorPreferences::setBackgroundPlugin(const QUuid & theValue) +{ + if (!g_Merk_Ignore_Preferences) + Sets->setValue("backgroundImage/BackgroundPlugin", theValue.toString()); +} + +QUuid MerkaartorPreferences::getBackgroundPlugin() const +{ + QString s; + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) { + s = Sets->value("backgroundImage/BackgroundPlugin", QString()).toString(); + } + return QUuid(s); +} + +QMap<QUuid, IMapAdapterFactory *> MerkaartorPreferences::getBackgroundPlugins() +{ + return mBackgroundPlugins; +} + +M_PARAM_IMPLEMENT_STRING(CacheDir, backgroundImage, HOMEDIR + "/BackgroundCache"); +M_PARAM_IMPLEMENT_INT(CacheSize, backgroundImage, 0); + +/* Search */ +M_PARAM_IMPLEMENT_INT(LastMaxSearchResults, search, 999); +M_PARAM_IMPLEMENT_STRING(LastSearchName, search, QString()); +M_PARAM_IMPLEMENT_STRING(LastSearchKey, search, QString()); +M_PARAM_IMPLEMENT_STRING(LastSearchValue, search, QString()); +M_PARAM_IMPLEMENT_STRING(LastSearchTagSelector, search, QString()); +/* Visuals */ + +void MerkaartorPreferences::saveMainWindowState(const MainWindow * mainWindow) +{ +#ifndef _MOBILE + + if (!g_Merk_Ignore_Preferences) { + // Sets->setValue("MainWindow/Position", mainWindow->pos()); + // Sets->setValue("MainWindow/Size", mainWindow->size()); + Sets->setValue("MainWindow/Geometry", mainWindow->saveGeometry()); + Sets->setValue("MainWindow/State", mainWindow->saveState()); + Sets->setValue("MainWindow/Fullscreen", mainWindow->ui->windowShowAllAction->isEnabled()); + Sets->setValue("MainWindow/FullscreenState", mainWindow->fullscreenState); + } +#endif +} + +void MerkaartorPreferences::restoreMainWindowState(MainWindow * mainWindow) const +{ +#ifndef _MOBILE + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) { + // if (Sets->contains("MainWindow/Position")) + // mainWindow->move( Sets->value("MainWindow/Position").toPoint()); + // + // if (Sets->contains("MainWindow/Size")) + // mainWindow->resize( Sets->value("MainWindow/Size").toSize()); + + if (Sets->contains("MainWindow/Geometry")) + mainWindow->restoreGeometry(Sets->value("MainWindow/Geometry").toByteArray() ); + + if (Sets->contains("MainWindow/State")) + mainWindow->restoreState( Sets->value("MainWindow/State").toByteArray() ); + + if (Sets->contains("MainWindow/FullscreenState")) + mainWindow->fullscreenState = Sets->value("MainWindow/FullscreenState").toByteArray(); + + if (Sets->value("MainWindow/Fullscreen", false).toBool()) { + mainWindow->ui->windowHideAllAction->setEnabled(false); + mainWindow->ui->windowHideAllAction->setVisible(false); + mainWindow->ui->windowShowAllAction->setEnabled(true); + mainWindow->ui->windowShowAllAction->setVisible(true); + } else { + mainWindow->ui->windowHideAllAction->setEnabled(true); + mainWindow->ui->windowHideAllAction->setVisible(true); + mainWindow->ui->windowShowAllAction->setEnabled(false); + mainWindow->ui->windowShowAllAction->setVisible(false); + } + } +#endif +} + +void MerkaartorPreferences::setInitialPosition(MapView* vw) +{ + if (!g_Merk_Ignore_Preferences) { + QStringList ip; + CoordBox cb = vw->viewport(); + ip.append(QString::number(cb.bottomLeft().y(), 'f', 8)); + ip.append(QString::number(cb.bottomLeft().x(), 'f', 8)); + ip.append(QString::number(cb.topRight().y(), 'f', 8)); + ip.append(QString::number(cb.topRight().x(), 'f', 8)); + + Sets->setValue("MainWindow/InitialPosition", ip); + // Sets->setValue("MainWindow/ViewRect", vw->rect()); + } +} + +void MerkaartorPreferences::initialPosition(MapView* vw) +{ + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) { + if (!Sets->contains("MainWindow/InitialPosition")) { + vw->setViewport(WORLD_COORDBOX, vw->rect()); + return; + } + + const QStringList & ip = Sets->value("MainWindow/InitialPosition").toStringList(); + + const Coord bottomLeft(ip[0].toDouble(), ip[1].toDouble()); + const Coord topRight(ip[2].toDouble(),ip[3].toDouble()); + + vw->setViewport(CoordBox(bottomLeft, topRight), vw->rect()); + // if (!Sets->contains("MainWindow/ViewRect")) + // vw->setViewport(CoordBox(bottomLeft, topRight), vw->rect()); + // else { + // QRect rt = Sets->value("MainWindow/ViewRect").toRect(); + // vw->setViewport(CoordBox(bottomLeft, topRight), rt); + // } + } +} + +#ifndef _MOBILE +void MerkaartorPreferences::setProjectionType(QString theValue) +{ + if (!g_Merk_Ignore_Preferences) + Sets->setValue("projection/Type", theValue); +} + +QString MerkaartorPreferences::getProjectionType() +{ + // if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) + // return Sets->value("projection/Type", "Mercator").toString(); + // else + return "EPSG:3857"; +} + +ProjectionsList* MerkaartorPreferences::getProjectionsList() +{ + return &theProjectionsList; +} + +ProjectionItem MerkaartorPreferences::getProjection(QString aProj) +{ + return theProjectionsList.getProjection(aProj); +} +#endif + +QString MerkaartorPreferences::getCurrentFilter() +{ + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) + return Sets->value("filter/Type", QString()).toString(); + else + return QString(); +} + +FiltersList* MerkaartorPreferences::getFiltersList() +{ + return &theFiltersList; +} + +FilterItem MerkaartorPreferences::getFilter(QString aFilter) +{ + if (aFilter.isEmpty()) + return FilterItem(); + return theFiltersList.getFilter(aFilter); +} + +qreal MerkaartorPreferences::getAlpha(QString lvl) +{ + return alpha[lvl]; +} + +QStringList MerkaartorPreferences::getAlphaList() const +{ + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) + return Sets->value("visual/alpha").toStringList(); + else + return QStringList(); +} + +void MerkaartorPreferences::setAlphaList() +{ + if (!g_Merk_Ignore_Preferences) { + QStringList alphaList; + QHashIterator<QString, qreal> i(alpha); + while (i.hasNext()) { + i.next(); + alphaList << i.key() << QString().setNum(i.value()); + } + Sets->setValue("visual/alpha", alphaList); + } +} + +M_PARAM_IMPLEMENT_INT(HoverWidth, visual, 1); +M_PARAM_IMPLEMENT_INT(HighlightWidth, visual, 1); +M_PARAM_IMPLEMENT_INT(DirtyWidth, visual, 2); +M_PARAM_IMPLEMENT_INT(FocusWidth, visual, 3); +M_PARAM_IMPLEMENT_INT(RelationsWidth, visual, 3); +M_PARAM_IMPLEMENT_INT(GpxTrackWidth, visual, 3); + +M_PARAM_IMPLEMENT_COLOR(BgColor, visual, Qt::white) +M_PARAM_IMPLEMENT_COLOR(WaterColor, visual, QColor(181, 208, 208)) +M_PARAM_IMPLEMENT_COLOR(FocusColor, visual, Qt::blue); +M_PARAM_IMPLEMENT_COLOR(HoverColor, visual, Qt::magenta); +M_PARAM_IMPLEMENT_COLOR(HighlightColor, visual, Qt::darkCyan); +M_PARAM_IMPLEMENT_COLOR(DirtyColor, visual, QColor(255, 85, 0)); +M_PARAM_IMPLEMENT_COLOR(RelationsColor, visual, QColor(0, 170, 0)); +M_PARAM_IMPLEMENT_COLOR(GpxTrackColor, visual, QColor(50, 220, 220)); + +QHash< QString, qreal > * MerkaartorPreferences::getAlphaPtr() +{ + return α +} + +bool MerkaartorPreferences::getDrawTileBoundary() +{ + return false; +} + +M_PARAM_IMPLEMENT_BOOL(HideToolbarLabels, interface, false) + +/* DATA */ + +QString MerkaartorPreferences::getOsmWebsite() const +{ + QString s; + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) + s = Sets->value("osm/Website", "www.openstreetmap.org").toString(); + else + s = "www.openstreetmap.org"; + +#if QT_VERSION >= 0x040600 && !defined(FORCE_46) + QUrl u = QUrl::fromUserInput(s); +#else + // convenience for creating a valid URL + // fails miserably if QString s already contains a schema + QString h = s; // intermediate host + QString p; // intermediate path + + int slashpos = s.indexOf('/'); + if (slashpos >= 1) // there's a path element in s + { + h = s.left(slashpos); + p = s.right(s.size() - 1 - slashpos); + } + + QUrl u; + u.setHost(h); + u.setScheme("http"); + u.setPath(p); +#endif + + if (!u.path().isEmpty()) + u.setPath(QString()); + + return u.toString(); +} + + +QString MerkaartorPreferences::getOsmApiUrl() const +{ + QUrl u(getOsmWebsite()); + if (u.path().isEmpty()) + u.setPath("/api/" + apiVersion()); + + return u.toString(); +} + +void MerkaartorPreferences::setOsmWebsite(const QString & theValue) +{ + if (!g_Merk_Ignore_Preferences) + Sets->setValue("osm/Website", theValue); +} + +M_PARAM_IMPLEMENT_STRING(XapiUrl, osm, "http://www.overpass-api.de/api/xapi_meta?") +M_PARAM_IMPLEMENT_STRING(NominatimUrl, osm, "http://nominatim.openstreetmap.org/search") +M_PARAM_IMPLEMENT_BOOL(AutoHistoryCleanup, data, true); + +QString MerkaartorPreferences::getOsmUser() const +{ + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) + return Sets->value("osm/User").toString(); + else + return QString(); +} + +void MerkaartorPreferences::setOsmUser(const QString & theValue) +{ + if (!g_Merk_Ignore_Preferences) + Sets->setValue("osm/User", theValue); +} + +QString MerkaartorPreferences::getOsmPassword() const +{ + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) + return Sets->value("osm/Password").toString(); + else + return QString(); +} + +void MerkaartorPreferences::setOsmPassword(const QString & theValue) +{ + if (!g_Merk_Ignore_Preferences) + Sets->setValue("osm/Password", theValue); +} + +M_PARAM_IMPLEMENT_DOUBLE(MaxDistNodes, data, 0.0); + +M_PARAM_IMPLEMENT_BOOL(AutoSaveDoc, data, false); +M_PARAM_IMPLEMENT_BOOL(AutoExtractTracks, data, false); + +M_PARAM_IMPLEMENT_INT(DirectionalArrowsVisible, visual, 1); + +RendererOptions MerkaartorPreferences::getRenderOptions() +{ + RendererOptions opt; + + if (getBackgroundVisible()) opt.options |= RendererOptions::BackgroundVisible; else opt.options &= ~RendererOptions::BackgroundVisible; + if (getForegroundVisible()) opt.options |= RendererOptions::ForegroundVisible; else opt.options &= ~RendererOptions::ForegroundVisible; + if (getTouchupVisible()) opt.options |= RendererOptions::TouchupVisible; else opt.options &= ~RendererOptions::TouchupVisible; + if (getNamesVisible()) opt.options |= RendererOptions::NamesVisible; else opt.options &= ~RendererOptions::NamesVisible; + if (getPhotosVisible()) opt.options |= RendererOptions::PhotosVisible; else opt.options &= ~RendererOptions::PhotosVisible; + if (getVirtualNodesVisible()) opt.options |= RendererOptions::VirtualNodesVisible; else opt.options &= ~RendererOptions::VirtualNodesVisible; + if (getTrackPointsVisible()) opt.options |= RendererOptions::NodesVisible; else opt.options &= ~RendererOptions::NodesVisible; + if (getTrackSegmentsVisible()) opt.options |= RendererOptions::TrackSegmentVisible; else opt.options &= ~RendererOptions::TrackSegmentVisible; + if (getRelationsVisible()) opt.options |= RendererOptions::RelationsVisible; else opt.options &= ~RendererOptions::RelationsVisible; + if (getDownloadedVisible()) opt.options |= RendererOptions::DownloadedVisible; else opt.options &= ~RendererOptions::DownloadedVisible; + if (getScaleVisible()) opt.options |= RendererOptions::ScaleVisible; else opt.options &= ~RendererOptions::ScaleVisible; + if (getLatLonGridVisible()) opt.options |= RendererOptions::LatLonGridVisible; else opt.options &= ~RendererOptions::LatLonGridVisible; + if (getZoomBoris()) opt.options |= RendererOptions::LockZoom; else opt.options &= ~RendererOptions::LockZoom; + opt.arrowOptions &= getDirectionalArrowsVisible(); + + return opt; +} + +/* Export Type */ +void MerkaartorPreferences::setExportType(ExportType theValue) +{ + if (!g_Merk_Ignore_Preferences) + Sets->setValue("export/Type", theValue); +} + +ExportType MerkaartorPreferences::getExportType() const +{ + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) + return (ExportType)Sets->value("export/Type", 0).toInt(); + else + return (ExportType)0; +} + +/* Tools */ +ToolList* MerkaartorPreferences::getTools() +{ + return &theToolList; +} + +void MerkaartorPreferences::setTools() +{ + if (!g_Merk_Ignore_Preferences) { + QStringList tl; + ToolListIterator i(theToolList); + while (i.hasNext()) { + i.next(); + Tool t = i.value(); + tl.append(t.ToolName); + tl.append(t.ToolPath); + } + Sets->setValue("Tools/list", tl); + } +} + +Tool MerkaartorPreferences::getTool(QString toolName) const +{ + Tool ret; + + ToolListIterator i(theToolList); + while (i.hasNext()) { + i.next(); + if (i.key() == toolName) { + ret = i.value(); + } + } + return ret; +} + +/* Recent */ +QStringList MerkaartorPreferences::getRecentOpen() const +{ + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) + return Sets->value("recent/open").toStringList(); + else + return QStringList(); +} + +void MerkaartorPreferences::setRecentOpen(const QStringList & theValue) +{ + if (!g_Merk_Ignore_Preferences) + Sets->setValue("recent/open", theValue); +} + +void MerkaartorPreferences::addRecentOpen(const QString & theValue) +{ + QStringList RecentOpen = getRecentOpen(); + int idx = RecentOpen.indexOf(theValue); + if (idx >= 0) { + RecentOpen.move(idx, 0); + } else { + if (RecentOpen.size() == 4) + RecentOpen.removeLast(); + + RecentOpen.insert(0, theValue); + } + setRecentOpen(RecentOpen); +} + +QStringList MerkaartorPreferences::getRecentImport() const +{ + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) + return Sets->value("recent/import").toStringList(); + else + return QStringList(); +} + +void MerkaartorPreferences::setRecentImport(const QStringList & theValue) +{ + if (!g_Merk_Ignore_Preferences) + Sets->setValue("recent/import", theValue); +} + +void MerkaartorPreferences::addRecentImport(const QString & theValue) +{ + QStringList RecentImport = getRecentImport(); + int idx = RecentImport.indexOf(theValue); + if (idx >= 0) { + RecentImport.move(idx, 0); + } else { + if (RecentImport.size() == 4) + RecentImport.removeLast(); + + RecentImport.insert(0, theValue); + } + setRecentImport(RecentImport); +} + +QStringList MerkaartorPreferences::getShortcuts() const +{ + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) + return Sets->value("Tools/shortcuts").toStringList(); + else + return QStringList(); +} + +void MerkaartorPreferences::setShortcuts(const QStringList & theValue) +{ + if (!g_Merk_Ignore_Preferences) + Sets->setValue("Tools/shortcuts", theValue); +} + +M_PARAM_IMPLEMENT_INT(PolygonSides, Tools, 3) + +/* Rendering */ +M_PARAM_IMPLEMENT_BOOL(UseAntiAlias, style, true) +M_PARAM_IMPLEMENT_BOOL(AntiAliasWhilePanning, style, false) +M_PARAM_IMPLEMENT_BOOL(UseStyledWireframe, style, false) +M_PARAM_IMPLEMENT_STRING(DefaultStyle, style, ":/Styles/Mapnik.mas") +M_PARAM_IMPLEMENT_STRING(CustomStyle, style, QString()) +M_PARAM_IMPLEMENT_BOOL(DisableStyleForTracks, style, true) +M_PARAM_IMPLEMENT_STRINGLIST(TechnicalTags, style, TECHNICAL_TAGS) +M_PARAM_IMPLEMENT_INT(EditRendering, style, 0) + +/* Zoom */ +M_PARAM_IMPLEMENT_INT(ZoomIn, zoom, 133) +M_PARAM_IMPLEMENT_INT(ZoomOut, zoom, 75) +M_PARAM_IMPLEMENT_BOOL(ZoomBoris, zoom, false) + +/* Visual */ +M_PARAM_IMPLEMENT_BOOL(BackgroundOverwriteStyle, visual, false) +M_PARAM_IMPLEMENT_INT(AreaOpacity, visual, 100) +M_PARAM_IMPLEMENT_BOOL(UseShapefileForBackground, visual, false) +M_PARAM_IMPLEMENT_BOOL(DrawingHack, visual, true) +M_PARAM_IMPLEMENT_BOOL(SimpleGpxTrack, visual, false) +M_PARAM_IMPLEMENT_BOOL(UseVirtualNodes, visual, true) +M_PARAM_IMPLEMENT_BOOL(RelationsSelectableWhenHidden, visual, true) +M_PARAM_IMPLEMENT_DOUBLE(LocalZoom, visual, 0.5) +M_PARAM_IMPLEMENT_DOUBLE(RegionalZoom, visual, 0.01) +M_PARAM_IMPLEMENT_INT(NodeSize, visual, 8) + +M_PARAM_IMPLEMENT_BOOL(DownloadedVisible, visual, true) +M_PARAM_IMPLEMENT_BOOL(ScaleVisible, visual, true) +M_PARAM_IMPLEMENT_BOOL(LatLonGridVisible, visual, false) +M_PARAM_IMPLEMENT_BOOL(BackgroundVisible, visual, true) +M_PARAM_IMPLEMENT_BOOL(ForegroundVisible, visual, true) +M_PARAM_IMPLEMENT_BOOL(TouchupVisible, visual, true) +M_PARAM_IMPLEMENT_BOOL(NamesVisible, visual, false) +M_PARAM_IMPLEMENT_BOOL(TrackPointsVisible, visual, true) +M_PARAM_IMPLEMENT_BOOL(TrackSegmentsVisible, visual, true) +M_PARAM_IMPLEMENT_BOOL(RelationsVisible, visual, false) +M_PARAM_IMPLEMENT_BOOL(PhotosVisible, visual, true) +M_PARAM_IMPLEMENT_BOOL(VirtualNodesVisible, visual, true) +M_PARAM_IMPLEMENT_BOOL(DirtyVisible, visual, true) +M_PARAM_IMPLEMENT_BOOL(WireframeView, visual, false) + +/* Templates */ +M_PARAM_IMPLEMENT_STRING(DefaultTemplate, templates, ":/Templates/default.mat") +M_PARAM_IMPLEMENT_STRING(CustomTemplate, templates, QString()) + +/* GPS */ +#ifdef Q_OS_WIN +M_PARAM_IMPLEMENT_BOOL(GpsUseGpsd, gps, false) +M_PARAM_IMPLEMENT_STRING(GpsPort, gps, "COM1") +#else +M_PARAM_IMPLEMENT_BOOL(GpsUseGpsd, gps, true) +M_PARAM_IMPLEMENT_STRING(GpsPort, gps, "/dev/rfcomm0") +#endif +M_PARAM_IMPLEMENT_STRING(GpsdHost, gps, "localhost") +M_PARAM_IMPLEMENT_INT(GpsdPort, gps, 2947) +M_PARAM_IMPLEMENT_BOOL(GpsSaveLog, gps, false) +M_PARAM_IMPLEMENT_BOOL(GpsMapCenter, gps, false) +M_PARAM_IMPLEMENT_STRING(GpsLogDir, gps, QString()) +M_PARAM_IMPLEMENT_BOOL(GpsSyncTime, gps, false) + +M_PARAM_IMPLEMENT_BOOL(ResolveRelations, downloadosm, false) +M_PARAM_IMPLEMENT_BOOL(DeleteIncompleteRelations, downloadosm, false) + +M_PARAM_IMPLEMENT_BOOL(MapTooltip, visual, false) +M_PARAM_IMPLEMENT_BOOL(InfoOnHover, visual, true) +M_PARAM_IMPLEMENT_BOOL(ShowParents, visual, true) + +M_PARAM_IMPLEMENT_INT_DELAYED(TagListFirstColumnWidth, visual, 20) +M_PARAM_IMPLEMENT_BOOL(TranslateTags, locale, true) + +/* Background */ +M_PARAM_IMPLEMENT_BOOL(AutoSourceTag, backgroundImage, true) + +/* Data */ +M_PARAM_IMPLEMENT_STRING(MapdustUrl, data, "http://www.mapdust.com/feed?lang=en&ft=wrong_turn,bad_routing,oneway_road,blocked_street,missing_street,wrong_roundabout,missing_speedlimit,other&fd=1&minR=&maxR=") +M_PARAM_IMPLEMENT_BOOL(GdalConfirmProjection, data, true) +M_PARAM_IMPLEMENT_BOOL(HasAutoLoadDocument, data, false) +M_PARAM_IMPLEMENT_STRING(AutoLoadDocumentFilename, data, QString()) + +/* Mouse bevaviour */ +#ifdef _MOBILE + M_PARAM_IMPLEMENT_BOOL(MouseSingleButton, Mouse, true) +#else + M_PARAM_IMPLEMENT_BOOL(MouseSingleButton, Mouse, false) +#endif +M_PARAM_IMPLEMENT_BOOL(SeparateMoveMode, Mouse, true) +M_PARAM_IMPLEMENT_BOOL(SelectModeCreation, Mouse, false) + +// Geotag +M_PARAM_IMPLEMENT_INT(MaxGeoPicWidth, geotag, 160) + +/* Custom Style */ +M_PARAM_IMPLEMENT_BOOL(MerkaartorStyle, visual, false) +M_PARAM_IMPLEMENT_STRING(MerkaartorStyleString, visual, "skulpture") + +/* Network */ +M_PARAM_IMPLEMENT_BOOL(OfflineMode, Network, false) +M_PARAM_IMPLEMENT_BOOL(LocalServer, Network, false) +M_PARAM_IMPLEMENT_INT(NetworkTimeout, Network, 10000) + +/* Proxy */ + +QNetworkProxy MerkaartorPreferences::getProxy(const QUrl & requestUrl) +{ + QNetworkProxy theProxy; + + if ( getProxyUse() ) + { + return QNetworkProxy(QNetworkProxy::HttpProxy, getProxyHost(), getProxyPort(), getProxyUser(), getProxyPassword()); + } + else + { +#ifdef USE_LIBPROXY + // Ask libproxy for the system proxy + if (proxyFactory) { + // get proxy URL(s) from libproxy, see http://code.google.com/p/libproxy/wiki/HowTo + char **proxies = px_proxy_factory_get_proxies(proxyFactory, requestUrl.toString().toUtf8().data()); + + // Iterate through the list until we find a proxy scheme QNetworkProxy supports + for (int i=0 ; proxies[i] ; i++) { + QUrl proxyUrl(proxies[i]); + if (proxyTypeMap.contains(proxyUrl.scheme())) { + theProxy.setType(proxyTypeMap.value(proxyUrl.scheme())); + theProxy.setHostName(proxyUrl.host()); + theProxy.setPort(proxyUrl.port()); + theProxy.setUser(proxyUrl.userName()); + theProxy.setPassword(proxyUrl.password()); + //qDebug(lc_MerkaartorPreferences) << "Using proxy " << proxyUrl << " from libproxy for " << requestUrl; + } + } + for (int i=0 ; proxies[i] ; i++) { + free(proxies[i]); + } + return theProxy; + } +#endif +#if QT_VERSION >= 0x040500 + // Ask Qt for the system proxy (Qt >= 4.5.0), libproxy is preferred if available since QNetworkProxyFactory + // doesn't yet support auto-config (PAC) on MacOS or system settings on linux while libproxy does + QList<QNetworkProxy> systemProxies = QNetworkProxyFactory::systemProxyForQuery( + QNetworkProxyQuery(requestUrl, QNetworkProxyQuery::UrlRequest) + ); + return systemProxies[0]; +#else + // Otherwise no proxy + theProxy.setType(QNetworkProxy::NoProxy); +#endif + } + + return theProxy; +} + +M_PARAM_IMPLEMENT_BOOL(ProxyUse, proxy, false) +M_PARAM_IMPLEMENT_STRING(ProxyHost, proxy, QString()) +M_PARAM_IMPLEMENT_INT(ProxyPort, proxy, 8080) +M_PARAM_IMPLEMENT_STRING(ProxyUser, proxy, QString()) +M_PARAM_IMPLEMENT_STRING(ProxyPassword, proxy, QString()) + +/* Track */ +M_PARAM_IMPLEMENT_BOOL(ReadonlyTracksDefault, data, false) + +/* FeaturesDock */ +M_PARAM_IMPLEMENT_BOOL(FeaturesWithin, FeaturesDock, true) +M_PARAM_IMPLEMENT_BOOL(FeaturesSelectionFilter, FeaturesDock, true) + +namespace { + +// Preference XMLs may be stored in several directories depending +// on the platform. This method returns the list of directories to load +// preference XMLs from. +QStringList getPreferenceDirectories() { + QStringList directories; + directories << HOMEDIR; + // TODO: Some files are loaded without this override for Q_OS_MAC. Why? +#if defined(Q_OS_MAC) + { + QDir resources = QDir(QCoreApplication::applicationDirPath()); + resources.cdUp(); + resources.cd("Resources"); + directories << resources.absolutePath(); + } +#else + directories << QString(SHAREDIR); +#endif + directories << ":"; + return directories; +} + +// Returns the list of all alternative locations of the given preference +// file. +QStringList getPreferenceFilePaths(QString fileName) { + QStringList paths; + const QStringList directories = getPreferenceDirectories(); + for (QStringList::const_iterator i = directories.begin(); i != directories.end(); ++i) { + paths << (*i) + "/" + fileName; + } + return paths; +} + +} // namespace + +/* Projections */ +void MerkaartorPreferences::loadProjectionsFromFile(QString fileName) +{ + if (QDir::isRelativePath(fileName)) + fileName = QCoreApplication::applicationDirPath() + "/" + fileName; + + qDebug(lc_MerkaartorPreferences) << "loadProjection " << fileName; + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly)) { +// QMessageBox::critical(this, tr("Invalid file"), tr("%1 could not be opened.").arg(fileName)); + qDebug() << " missing"; + return; + } + + QDomDocument theXmlDoc; + if (!theXmlDoc.setContent(&file)) { +// QMessageBox::critical(this, tr("Invalid file"), tr("%1 is not a valid XML file.").arg(fileName)); + file.close(); + qDebug() << " not proper XML"; + return; + } + file.close(); + + QDomElement docElem = theXmlDoc.documentElement(); + ProjectionsList aProjList = ProjectionsList::fromXml(docElem.firstChildElement()); + theProjectionsList.add(aProjList); +} + +void MerkaartorPreferences::loadProjections() +{ + const QStringList paths = getPreferenceFilePaths("Projections.xml"); + for (QStringList::const_iterator i = paths.begin(); i != paths.end(); ++i) { + loadProjectionsFromFile(*i); + } +} + +void MerkaartorPreferences::saveProjections() +{ + QDomDocument theXmlDoc; + + theXmlDoc.appendChild(theXmlDoc.createProcessingInstruction("xml", "version=\"1.0\"")); + + QDomElement root = theXmlDoc.createElement("MerkaartorList"); + theXmlDoc.appendChild(root); + theProjectionsList.toXml(root); + + QFile file(HOMEDIR + "/Projections.xml"); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + //QMessageBox::critical(this, tr("Unable to open save projections file"), tr("%1 could not be opened for writing.").arg(HOMEDIR + "/Projections.xml")); + return; + } + file.write(theXmlDoc.toString().toUtf8()); + file.close(); +} + +/* Filters */ +void MerkaartorPreferences::loadFiltersFromFile(QString fileName) +{ + if (QDir::isRelativePath(fileName)) + fileName = QCoreApplication::applicationDirPath() + "/" + fileName; + + qDebug(lc_MerkaartorPreferences) << "loadFiltersFromFile " << fileName; + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly)) { + qDebug() << " missing"; + return; + } + + QDomDocument theXmlDoc; + if (!theXmlDoc.setContent(&file)) { + file.close(); + qDebug() << " not proper XML"; + return; + } + file.close(); + + QDomElement docElem = theXmlDoc.documentElement(); + FiltersList aFilterList = FiltersList::fromXml(docElem.firstChildElement()); + theFiltersList.add(aFilterList); +} + +void MerkaartorPreferences::loadFilters() +{ + const QStringList paths = getPreferenceFilePaths("Filters.xml"); + for (QStringList::const_iterator i = paths.begin(); i != paths.end(); ++i) { + loadFiltersFromFile(*i); + } +} + +void MerkaartorPreferences::saveFilters() +{ + QDomDocument theXmlDoc; + + theXmlDoc.appendChild(theXmlDoc.createProcessingInstruction("xml", "version=\"1.0\"")); + + QDomElement root = theXmlDoc.createElement("MerkaartorList"); + theXmlDoc.appendChild(root); + theFiltersList.toXml(root); + + QFile file(HOMEDIR + "/Filters.xml"); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + return; + } + file.write(theXmlDoc.toString().toUtf8()); + file.close(); +} + + +/* WMS Servers */ +void MerkaartorPreferences::loadWMSesFromFile(QString fileName) +{ + if (QDir::isRelativePath(fileName)) + fileName = QCoreApplication::applicationDirPath() + "/" + fileName; + + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly)) { +// QMessageBox::critical(this, tr("Invalid file"), tr("%1 could not be opened.").arg(fileName)); + return; + } + + QDomDocument theXmlDoc; + if (!theXmlDoc.setContent(&file)) { +// QMessageBox::critical(this, tr("Invalid file"), tr("%1 is not a valid XML file.").arg(fileName)); + file.close(); + return; + } + file.close(); + + QDomElement docElem = theXmlDoc.documentElement(); + WmsServersList aWmsList = WmsServersList::fromXml(docElem.firstChildElement()); + theWmsServerList.add(aWmsList); +} + +void MerkaartorPreferences::loadWMSes() +{ + loadWMSesFromFile(HOMEDIR + "/WmsServersList.xml"); + // TODO: Why is the Q_OS_MAC override in getPreferenceDirectories() + // missing here? Is that a bug, or an intention? + loadWMSesFromFile(QString(SHAREDIR) + "/WmsServersList.xml"); + loadWMSesFromFile(":/WmsServersList.xml"); +} + +void MerkaartorPreferences::saveWMSes() +{ + QDomDocument theXmlDoc; + + theXmlDoc.appendChild(theXmlDoc.createProcessingInstruction("xml", "version=\"1.0\"")); + + QDomElement root = theXmlDoc.createElement("MerkaartorList"); + theXmlDoc.appendChild(root); + theWmsServerList.toXml(root); + + QFile file(HOMEDIR + "/WmsServersList.xml"); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + //QMessageBox::critical(this, tr("Unable to open save projections file"), tr("%1 could not be opened for writing.").arg(HOMEDIR + "/Projections.xml")); + return; + } + file.write(theXmlDoc.toString().toUtf8()); + file.close(); +} + +/* TMS Servers */ +void MerkaartorPreferences::loadTMSesFromFile(QString fileName) +{ + if (QDir::isRelativePath(fileName)) + fileName = QCoreApplication::applicationDirPath() + "/" + fileName; + + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly)) { +// QMessageBox::critical(this, tr("Invalid file"), tr("%1 could not be opened.").arg(fileName)); + return; + } + + QDomDocument theXmlDoc; + if (!theXmlDoc.setContent(&file)) { +// QMessageBox::critical(this, tr("Invalid file"), tr("%1 is not a valid XML file.").arg(fileName)); + file.close(); + return; + } + file.close(); + + QDomElement docElem = theXmlDoc.documentElement(); + TmsServersList aTmsList = TmsServersList::fromXml(docElem.firstChildElement()); + theTmsServerList.add(aTmsList); +} + +void MerkaartorPreferences::loadTMSes() +{ + loadTMSesFromFile(HOMEDIR + "/TmsServersList.xml"); + // TODO: Why is the Q_OS_MAC override in getPreferenceDirectories() + // missing here? Is that a bug, or an intention? + loadTMSesFromFile(QString(SHAREDIR) + "/TmsServersList.xml"); + loadTMSesFromFile(":/TmsServersList.xml"); +} + +void MerkaartorPreferences::saveTMSes() +{ + QDomDocument theXmlDoc; + + theXmlDoc.appendChild(theXmlDoc.createProcessingInstruction("xml", "version=\"1.0\"")); + + QDomElement root = theXmlDoc.createElement("MerkaartorList"); + theXmlDoc.appendChild(root); + theTmsServerList.toXml(root); + + QFile file(HOMEDIR + "/TmsServersList.xml"); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + //QMessageBox::critical(this, tr("Unable to open save projections file"), tr("%1 could not be opened for writing.").arg(HOMEDIR + "/Projections.xml")); + return; + } + file.write(theXmlDoc.toString().toUtf8()); + file.close(); +} + +/* Bookmarks */ +void MerkaartorPreferences::loadBookmarksFromFile(QString fileName) +{ + if (QDir::isRelativePath(fileName)) + fileName = QCoreApplication::applicationDirPath() + "/" + fileName; + + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly)) { +// QMessageBox::critical(this, tr("Invalid file"), tr("%1 could not be opened.").arg(fileName)); + return; + } + + QDomDocument theXmlDoc; + if (!theXmlDoc.setContent(&file)) { +// QMessageBox::critical(this, tr("Invalid file"), tr("%1 is not a valid XML file.").arg(fileName)); + file.close(); + return; + } + file.close(); + + QDomElement docElem = theXmlDoc.documentElement(); + BookmarksList aBkList = BookmarksList::fromXml(docElem.firstChildElement()); + theBookmarkList.add(aBkList); +} + +void MerkaartorPreferences::loadBookmarks() +{ + loadBookmarksFromFile(HOMEDIR + "/BookmarksList.xml"); + // TODO: Why is the Q_OS_MAC override in getPreferenceDirectories() + // missing here? Is that a bug, or an intention? + loadBookmarksFromFile(QString(SHAREDIR) + "/BookmarksList.xml"); + loadBookmarksFromFile(":/BookmarksList.xml"); +} + +void MerkaartorPreferences::saveBookmarks() +{ + QDomDocument theXmlDoc; + + theXmlDoc.appendChild(theXmlDoc.createProcessingInstruction("xml", "version=\"1.0\"")); + + QDomElement root = theXmlDoc.createElement("MerkaartorList"); + theXmlDoc.appendChild(root); + theBookmarkList.toXml(root); + + QFile file(HOMEDIR + "/BookmarksList.xml"); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + //QMessageBox::critical(this, tr("Unable to open save bookmarks file"), tr("%1 could not be opened for writing.").arg(HOMEDIR + "/BookmarksList.xml")); + return; + } + file.write(theXmlDoc.toString().toUtf8()); + file.close(); +} + +/* OSM Servers */ + +void MerkaartorPreferences::loadOsmServers() +{ + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) { + int size = Sets->beginReadArray("OsmServers"); + for (int i = 0; i < size; ++i) { + Sets->setArrayIndex(i); + OsmServer server; + server.Selected = Sets->value("selected").toBool(); + server.Url = Sets->value("url").toString(); + server.User = Sets->value("user").toString(); + server.Password = Sets->value("password").toString(); + theOsmServers.append(server); + } + Sets->endArray(); + } +} + +void MerkaartorPreferences::saveOsmServers() +{ + if (!g_Merk_Ignore_Preferences) { + Sets->beginWriteArray("OsmServers"); + for (int i = 0; i < theOsmServers.size(); ++i) { + Sets->setArrayIndex(i); + Sets->setValue("selected", theOsmServers.at(i).Selected); + Sets->setValue("url", theOsmServers.at(i).Url); + Sets->setValue("user", theOsmServers.at(i).User); + Sets->setValue("password", theOsmServers.at(i).Password); + } + Sets->endArray(); + } +} + + +/* */ + +QString getDefaultLanguage(bool returnDefault) +{ + if (!g_Merk_Ignore_Preferences && !g_Merk_Reset_Preferences) { + QSettings* sets = getSettings(); + QString lang = sets->value("locale/language").toString(); + delete sets; + if (lang.isEmpty()) + if (returnDefault) + lang = QLocale::system().name().split("_")[0]; + return lang; + } else { + if (returnDefault) + return QLocale::system().name().split("_")[0]; + else + return QString(); + } +} + +void setDefaultLanguage(const QString& theValue) +{ + if (!g_Merk_Ignore_Preferences) { + QSettings* sets = getSettings(); + sets->setValue("locale/language", theValue); + // TODO: 'sets' memory leak? + } +} diff --git a/src/Preferences/MerkaartorPreferences.h b/src/Preferences/MerkaartorPreferences.h new file mode 100644 index 0000000..0d2a9c4 --- /dev/null +++ b/src/Preferences/MerkaartorPreferences.h @@ -0,0 +1,502 @@ +// +// C++ Interface: MerkaartorPreferences +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, bvh, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef MERKAARTORPREFERENCES_H +#define MERKAARTORPREFERENCES_H + +#include <QtCore> +#include <QtCore/QSettings> +#include <QColor> +#include <QNetworkAccessManager> +#include <QNetworkRequest> +#include <QNetworkReply> +#include <QAuthenticator> +#include <QBuffer> +#include <QUuid> +#include <QNetworkProxy> +#include <QSslError> + +#ifdef USE_LIBPROXY +#include <proxy.h> +#endif + +#include "Coord.h" +#include "WmsServersList.h" +#include "TmsServersList.h" +#include "ProjectionsList.h" +#include "BookmarksList.h" +#include "FilterList.h" + +#include "IRenderer.h" + +class MainWindow; +class MapView; +class IMapAdapterFactory; +class IPaintStyle; + +#ifdef Q_WS_X11 +#define PLATFORM "X11" +#else +#ifdef Q_OS_WIN +#define PLATFORM "Windows" +#else +#ifdef Q_WS_MACX +#define PLATFORM "Macintosh" +#else +#define PLATFORM "Other" +#endif +#endif +#endif +#define USER_AGENT (QString("%1/%2 (%4)").arg(qApp->applicationName()).arg(STRINGIFY(REVISION))).arg(PLATFORM) + +#define WORLD_COORDBOX CoordBox(Coord(-COORD_MAX*.80, COORD_MAX*.80/2), Coord(COORD_MAX*.80, -COORD_MAX*.80/2)) +#define BUILTIN_STYLES_DIR ":/Styles" +#define BUILTIN_TEMPLATES_DIR ":/Templates" + +#define M_PREFS MerkaartorPreferences::instance() +#define M_STYLE MerkaartorPreferences::styleinstance() + +#ifdef Q_WS_MACX +// Follow conventions on Mac OS X +#define HOMEDIR (g_Merk_Portable ? qApp->applicationDirPath() : QDir::homePath() + "/Library/Merkaartor") +#else +#define HOMEDIR (g_Merk_Portable ? qApp->applicationDirPath() : QDir::homePath() + "/.merkaartor") +#endif +#define SHAREDIR (g_Merk_Portable ? qApp->applicationDirPath() : STRINGIFY(SHARE_DIR)) +#define TEMPLATE_DOCUMENT (HOMEDIR + "/Startup.mdc") + +#define M_PARAM_DECLARE_BOOL(Param) \ + private: \ + bool m_##Param; \ + public: \ + void set##Param(bool theValue); \ + bool get##Param(); +#define M_PARAM_DECLARE_STRING(Param) \ + private: \ + QString m_##Param; \ + public: \ + void set##Param(const QString& theValue); \ + QString get##Param(); +#define M_PARAM_DECLARE_STRINGList(Param) \ + private: \ + QStringList m_##Param; \ + public: \ + void set##Param(const QStringList& theValue); \ + QStringList& get##Param(); +#define M_PARAM_DECLARE_INT(Param) \ + private: \ + int m_##Param; \ + public: \ + void set##Param(int theValue); \ + int get##Param(); +#define M_PARAM_DECLARE_INT_DELAYED(Param) \ + private: \ + int m_##Param; \ + public: \ + void set##Param(int theValue); \ + void save##Param(); \ + int get##Param(); +#define M_PARAM_DECLARE_DOUBLE(Param) \ + private: \ + qreal m_##Param; \ + public: \ + void set##Param(qreal theValue); \ + qreal get##Param(); +#define M_PARAM_DECLARE_COLOR(Param) \ + private: \ + QColor m_##Param; \ + public: \ + void set##Param(const QColor& theValue); \ + QColor get##Param(); + +#define SAFE_DELETE(x) {delete (x); x = NULL;} +#define STRINGIFY(x) XSTRINGIFY(x) +#define XSTRINGIFY(x) #x + +/** + @author cbro <cbro@semperpax.com> +*/ + +typedef QString FilterType; + +enum ExportType { + Export_All, + Export_Viewport, + Export_Selected +}; + +#define TOOL_FIELD_SIZE 2 +class Tool +{ + public: + Tool(); + Tool(QString Name, QString Path); + + public: + QString ToolName; + QString ToolPath; +}; +typedef QMap<QString, Tool> ToolList; +typedef QMapIterator<QString, Tool> ToolListIterator; + +struct OsmServer +{ + bool Selected; + QString Url; + QString User; + QString Password; +}; +typedef QList<OsmServer> OsmServerList; +typedef QListIterator<OsmServer> OsmServerIterator; + +// Outside of merkaartorpreferences, because initializing it will need translations +// Classic chicken & egg problem. +QString getDefaultLanguage(bool returnDefault=true); +void setDefaultLanguage(const QString& L); + +class MerkaartorPreferences : public QObject +{ +Q_OBJECT +public: + static MerkaartorPreferences* instance(); + static IPaintStyle* styleinstance(); + + MerkaartorPreferences(); + ~MerkaartorPreferences(); + + QSettings* getQSettings() const { return Sets; } + void save(bool UserPwdChanged = false); + + const QVector<qreal> getParentDashes() const; + + //bool use06Api() const; + void setUse06Api(bool b); + const QString apiVersion() const; + qreal apiVersionNum() const; + + M_PARAM_DECLARE_BOOL(rightsidedriving); + M_PARAM_DECLARE_DOUBLE(RoundaboutPrecision); + M_PARAM_DECLARE_INT(RoundaboutType); + M_PARAM_DECLARE_DOUBLE(doubleroaddistance); + M_PARAM_DECLARE_STRING(workingdir); + + void setBgVisible(bool theValue); + bool getBgVisible() const; + + /* Tile Cache */ + M_PARAM_DECLARE_STRING(CacheDir); + M_PARAM_DECLARE_INT(CacheSize); + + /* Search */ + M_PARAM_DECLARE_INT(LastMaxSearchResults); + M_PARAM_DECLARE_STRING(LastSearchName); + M_PARAM_DECLARE_STRING(LastSearchKey); + M_PARAM_DECLARE_STRING(LastSearchValue); + M_PARAM_DECLARE_STRING(LastSearchTagSelector); + + /* Visual */ + QStringList getAlphaList() const; + qreal getAlpha(QString lvl); + QHash<QString, qreal>* getAlphaPtr(); + + M_PARAM_DECLARE_INT(HoverWidth); + M_PARAM_DECLARE_INT(HighlightWidth); + M_PARAM_DECLARE_INT(DirtyWidth); + M_PARAM_DECLARE_INT(FocusWidth); + M_PARAM_DECLARE_INT(RelationsWidth); + M_PARAM_DECLARE_INT(GpxTrackWidth); + + M_PARAM_DECLARE_COLOR(BgColor) + M_PARAM_DECLARE_COLOR(WaterColor) + M_PARAM_DECLARE_COLOR(FocusColor); + M_PARAM_DECLARE_COLOR(HoverColor); + M_PARAM_DECLARE_COLOR(HighlightColor); + M_PARAM_DECLARE_COLOR(DirtyColor); + M_PARAM_DECLARE_COLOR(RelationsColor); + M_PARAM_DECLARE_COLOR(GpxTrackColor); + + M_PARAM_DECLARE_INT(DirectionalArrowsVisible); + RendererOptions getRenderOptions(); + + M_PARAM_DECLARE_INT_DELAYED(TagListFirstColumnWidth) + + /* MainWindow state */ + void saveMainWindowState(const MainWindow * mainWindow); + void restoreMainWindowState(MainWindow * mainWindow) const; + + void setInitialPosition(MapView* vw); + void initialPosition(MapView* vw); + + bool getDrawTileBoundary(); + + M_PARAM_DECLARE_BOOL(HideToolbarLabels) + + /* Data */ + void setOsmWebsite(const QString & theValue); + QString getOsmWebsite() const; + QString getOsmApiUrl() const; + + M_PARAM_DECLARE_STRING(XapiUrl) + M_PARAM_DECLARE_STRING(NominatimUrl) + M_PARAM_DECLARE_BOOL(AutoHistoryCleanup) + + void setOsmUser(const QString & theValue); + QString getOsmUser() const; + + void setOsmPassword(const QString & theValue); + QString getOsmPassword() const; + + M_PARAM_DECLARE_DOUBLE(MaxDistNodes) + + M_PARAM_DECLARE_BOOL(AutoSaveDoc) + M_PARAM_DECLARE_BOOL(AutoExtractTracks) + + /* Export Type */ + void setExportType(ExportType theValue); + ExportType getExportType() const; + + /* Tools */ + // TODO: Returning ToolList* here is very promiscuous. + // 'getTools()' should probably return 'const ToolList&' instead. + ToolList* getTools(); + Tool getTool(QString toolName) const; + + QStringList getShortcuts() const; + void setShortcuts(const QStringList & theValue); + + M_PARAM_DECLARE_INT(PolygonSides) + + /* Recent */ +private: + void setRecentOpen(const QStringList & theValue); +public: + QStringList getRecentOpen() const; + void addRecentOpen(const QString & theValue); + +private: + void setRecentImport(const QStringList & theValue); +public: + QStringList getRecentImport() const; + void addRecentImport(const QString & theValue); + + /* Rendering */ + M_PARAM_DECLARE_BOOL(UseAntiAlias) + M_PARAM_DECLARE_BOOL(AntiAliasWhilePanning) + M_PARAM_DECLARE_BOOL(UseStyledWireframe) + M_PARAM_DECLARE_STRING(DefaultStyle) + M_PARAM_DECLARE_STRING(CustomStyle) + M_PARAM_DECLARE_BOOL(DisableStyleForTracks) + M_PARAM_DECLARE_STRINGList(TechnicalTags) + M_PARAM_DECLARE_INT(EditRendering) + + /* Visual */ + M_PARAM_DECLARE_INT(ZoomIn) + M_PARAM_DECLARE_INT(ZoomOut) + M_PARAM_DECLARE_BOOL(ZoomBoris) + M_PARAM_DECLARE_BOOL(BackgroundOverwriteStyle) + M_PARAM_DECLARE_INT(AreaOpacity) + M_PARAM_DECLARE_BOOL(UseShapefileForBackground) + M_PARAM_DECLARE_BOOL(DrawingHack) + M_PARAM_DECLARE_BOOL(SimpleGpxTrack) + M_PARAM_DECLARE_BOOL(VirtualNodesVisible) + M_PARAM_DECLARE_BOOL(UseVirtualNodes) + M_PARAM_DECLARE_BOOL(RelationsSelectableWhenHidden) + M_PARAM_DECLARE_DOUBLE(LocalZoom) + M_PARAM_DECLARE_DOUBLE(RegionalZoom) + M_PARAM_DECLARE_INT(NodeSize) + + M_PARAM_DECLARE_BOOL(DownloadedVisible) + M_PARAM_DECLARE_BOOL(ScaleVisible) + M_PARAM_DECLARE_BOOL(LatLonGridVisible) + M_PARAM_DECLARE_BOOL(BackgroundVisible) + M_PARAM_DECLARE_BOOL(ForegroundVisible) + M_PARAM_DECLARE_BOOL(TouchupVisible) + M_PARAM_DECLARE_BOOL(NamesVisible) + M_PARAM_DECLARE_BOOL(TrackPointsVisible) + M_PARAM_DECLARE_BOOL(TrackSegmentsVisible) + M_PARAM_DECLARE_BOOL(RelationsVisible) + M_PARAM_DECLARE_BOOL(PhotosVisible) + M_PARAM_DECLARE_BOOL(DirtyVisible) + M_PARAM_DECLARE_BOOL(WireframeView) + + + /* Templates */ + M_PARAM_DECLARE_STRING(DefaultTemplate) + M_PARAM_DECLARE_STRING(CustomTemplate) + + /* GPS */ + M_PARAM_DECLARE_BOOL(GpsUseGpsd) + M_PARAM_DECLARE_STRING(GpsPort) + M_PARAM_DECLARE_STRING(GpsdHost) + M_PARAM_DECLARE_INT(GpsdPort) + M_PARAM_DECLARE_BOOL(GpsSaveLog) + M_PARAM_DECLARE_BOOL(GpsMapCenter) + M_PARAM_DECLARE_STRING(GpsLogDir) + M_PARAM_DECLARE_BOOL(GpsSyncTime) + + M_PARAM_DECLARE_BOOL(ResolveRelations) + M_PARAM_DECLARE_BOOL(DeleteIncompleteRelations) + + M_PARAM_DECLARE_BOOL(TranslateTags) + + M_PARAM_DECLARE_BOOL(MapTooltip) + M_PARAM_DECLARE_BOOL(InfoOnHover) + M_PARAM_DECLARE_BOOL(ShowParents) + + /* Background */ + M_PARAM_DECLARE_BOOL(AutoSourceTag) + + /* Mouse bevaviour */ + M_PARAM_DECLARE_BOOL(MouseSingleButton) + M_PARAM_DECLARE_BOOL(SeparateMoveMode) + M_PARAM_DECLARE_BOOL(SelectModeCreation) + + // Geotag + M_PARAM_DECLARE_INT(MaxGeoPicWidth) + + /* Custom Style */ + M_PARAM_DECLARE_BOOL(MerkaartorStyle) + M_PARAM_DECLARE_STRING(MerkaartorStyleString) + + /* Network */ + M_PARAM_DECLARE_BOOL(OfflineMode) + M_PARAM_DECLARE_BOOL(LocalServer) + M_PARAM_DECLARE_INT(NetworkTimeout) + + /* Proxy */ + QNetworkProxy getProxy(const QUrl & requestUrl); + + M_PARAM_DECLARE_BOOL(ProxyUse) + M_PARAM_DECLARE_STRING(ProxyHost) + M_PARAM_DECLARE_INT(ProxyPort) + M_PARAM_DECLARE_STRING(ProxyUser) + M_PARAM_DECLARE_STRING(ProxyPassword) + + /* Track */ + M_PARAM_DECLARE_BOOL(ReadonlyTracksDefault) + + /* Data */ + M_PARAM_DECLARE_STRING(OpenStreetBugsUrl) + M_PARAM_DECLARE_STRING(MapdustUrl) + M_PARAM_DECLARE_BOOL(GdalConfirmProjection) + M_PARAM_DECLARE_BOOL(HasAutoLoadDocument) + M_PARAM_DECLARE_STRING(AutoLoadDocumentFilename) + + /* FeaturesDock */ + M_PARAM_DECLARE_BOOL(FeaturesWithin) + M_PARAM_DECLARE_BOOL(FeaturesSelectionFilter) + + /* Plugins */ + void addBackgroundPlugin(IMapAdapterFactory* aPlugin); + void setBackgroundPlugin(const QUuid& theValue); + QUuid getBackgroundPlugin() const; + IMapAdapterFactory* getBackgroundPlugin(const QUuid& anAdapterUid); + QMap<QUuid, IMapAdapterFactory *> getBackgroundPlugins(); + +#ifndef _MOBILE + void setProjectionType(QString theValue); + QString getProjectionType(); + ProjectionsList* getProjectionsList(); + ProjectionItem getProjection(QString aProj); +#endif + + FilterType getCurrentFilter(); + FiltersList* getFiltersList(); + FilterItem getFilter(QString aFilter); + + BookmarkList* getBookmarks(); + WmsServerList* getWmsServers(); + TmsServerList* getTmsServers(); + OsmServerList* getOsmServers(); + + M_PARAM_DECLARE_STRING(SelectedServer); + +private: + void fromOsmPref(); + void toOsmPref(); + void putOsmPref(const QString& k, const QString& v); + void deleteOsmPref(const QString& k); + void setAlphaList(); + + /* WMSes */ + void loadWMSesFromFile(QString fileName); + void loadWMSes(); + void saveWMSes(); + + /* TMSes */ + void loadTMSesFromFile(QString fileName); + void loadTMSes(); + void saveTMSes(); + + /* Bookmarks */ + void loadBookmarksFromFile(QString fileName); + void loadBookmarks(); + void saveBookmarks(); + + /* Servers */ + void loadOsmServers(); + void saveOsmServers(); + + /* Filters */ + void loadFiltersFromFile(QString fileName); + void loadFilters(); + void saveFilters(); + + /* Projections */ + void loadProjectionsFromFile(QString fileName); + void loadProjections(); + void saveProjections(); + + QVector<qreal> parentDashes; + + bool Use06Api; + QString version; + bool saveOnline; + + // TODO: These network objects shouldn't be shared between methods + // of MerkaartorPreferences. + QNetworkAccessManager httpRequest; + QNetworkReply *OsmPrefLoadReply; + QNetworkReply *OsmPrefSaveReply; + QNetworkReply *OsmPrefDeleteReply; + + void setTools(); + void initialize(); + + QHash<QString, qreal> alpha; + ToolList theToolList; + QSettings * Sets; + QMap<QUuid, IMapAdapterFactory *> mBackgroundPlugins; + ProjectionsList theProjectionsList; + FiltersList theFiltersList; + WmsServersList theWmsServerList; + TmsServersList theTmsServerList; + BookmarksList theBookmarkList; + OsmServerList theOsmServers; + +#ifdef USE_LIBPROXY + pxProxyFactory *proxyFactory; + QHash<QString,QNetworkProxy::ProxyType> proxyTypeMap; +#endif + + static MerkaartorPreferences* m_prefInstance; + static IPaintStyle* m_EPSInstance; + +private slots: + void on_requestFinished ( QNetworkReply *reply ); + void on_authenticationRequired( QNetworkReply *reply, QAuthenticator *auth ); + void on_sslErrors(QNetworkReply *reply, const QList<QSslError>& errors); + +signals: + void bookmarkChanged(); +}; + +#endif diff --git a/src/Preferences/OsmServerWidget.ui b/src/Preferences/OsmServerWidget.ui new file mode 100644 index 0000000..4004cd1 --- /dev/null +++ b/src/Preferences/OsmServerWidget.ui @@ -0,0 +1,112 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>OsmServerWidget</class> + <widget class="QWidget" name="OsmServerWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>552</width> + <height>69</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="margin"> + <number>0</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QRadioButton" name="rbOsmServerSelected"> + <property name="text"> + <string>URL:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edOsmServerUrl"/> + </item> + <item> + <widget class="QToolButton" name="tbOsmServerAdd"> + <property name="text"> + <string>...</string> + </property> + <property name="icon"> + <iconset resource="../../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/list-add.png</normaloff>:/Icons/actions/list-add.png</iconset> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tbOsmServerDel"> + <property name="text"> + <string>...</string> + </property> + <property name="icon"> + <iconset resource="../../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/list-remove.png</normaloff>:/Icons/actions/list-remove.png</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,5,1,3"> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>57</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_14"> + <property name="text"> + <string>User:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edOsmServerUser"/> + </item> + <item> + <widget class="QLabel" name="label_13"> + <property name="text"> + <string>Pwd:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edOsmServerPwd"> + <property name="echoMode"> + <enum>QLineEdit::Password</enum> + </property> + </widget> + </item> + </layout> + </item> + </layout> + <zorder>rbOsmServerSelected</zorder> + <zorder>edOsmServerUrl</zorder> + <zorder>label_14</zorder> + <zorder>edOsmServerUser</zorder> + <zorder>label_13</zorder> + <zorder>edOsmServerPwd</zorder> + <zorder>tbOsmServerAdd</zorder> + <zorder>tbOsmServerDel</zorder> + <zorder>label_14</zorder> + </widget> + <resources> + <include location="../../Icons/AllIcons.qrc"/> + </resources> + <connections/> +</ui> diff --git a/src/Preferences/Preferences.pri b/src/Preferences/Preferences.pri new file mode 100644 index 0000000..4ec7c5a --- /dev/null +++ b/src/Preferences/Preferences.pri @@ -0,0 +1,43 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/Preferences +DEPENDPATH += $$MERKAARTOR_SRC_DIR/Preferences + +contains(LIBPROXY, 1) { + DEFINES += USE_LIBPROXY + LIBS += -lproxy +} +HEADERS += MerkaartorPreferences.h \ + PreferencesDialog.h \ + WMSPreferencesDialog.h \ + TMSPreferencesDialog.h \ + ProjectionsList.h \ + FilterList.h \ + WmsServersList.h \ + TmsServersList.h \ + BookmarksList.h \ + FilterPreferencesDialog.h +SOURCES += MerkaartorPreferences.cpp \ + PreferencesDialog.cpp \ + WMSPreferencesDialog.cpp \ + TMSPreferencesDialog.cpp \ + ProjectionsList.cpp \ + FilterList.cpp \ + WmsServersList.cpp \ + TmsServersList.cpp \ + BookmarksList.cpp \ + FilterPreferencesDialog.cpp +FORMS += PreferencesDialog.ui \ + WMSPreferencesDialog.ui \ + TMSPreferencesDialog.ui \ + FilterPreferencesDialog.ui \ + OsmServerWidget.ui + +isEmpty(MOBILE) { + HEADERS += \ + ProjPreferencesDialog.h + + SOURCES += \ + ProjPreferencesDialog.cpp + + FORMS += \ + ProjPreferencesDialog.ui +} diff --git a/src/Preferences/PreferencesDialog.cpp b/src/Preferences/PreferencesDialog.cpp new file mode 100644 index 0000000..4e7d97c --- /dev/null +++ b/src/Preferences/PreferencesDialog.cpp @@ -0,0 +1,691 @@ +// +// C++ Implementation: PreferencesDialog +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, Bart Vanhauwaert (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "PreferencesDialog.h" +#include "MasPaintStyle.h" + +#include "MainWindow.h" +#include "Document.h" +#include "Feature.h" +#include "PropertiesDock.h" + +#include <QFileDialog> +#include <QColorDialog> +#include <QMessageBox> +#include <QPainter> +#include <QStyleFactory> +#include <QNetworkProxy> + + +static void makeBoundaryIcon(QToolButton* bt, QColor C) +{ + QPixmap pm(36, 18); + pm.fill(QColor(255, 255, 255)); + QPainter p(&pm); + p.setPen(C); + p.setBrush(C); + p.drawRect(0, 6, 36, 6); + bt->setIcon(pm); +} + +OsmServerWidget::OsmServerWidget(QWidget * parent, Qt::WindowFlags f) + : QWidget(parent, f) +{ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); +} + +void OsmServerWidget::on_tbOsmServerAdd_clicked() +{ + QLayout* lay = parentWidget()->layout(); + if (!lay) + return; + + OsmServerWidget* w = new OsmServerWidget(parentWidget()); + lay->addWidget(w); + + for (int i=0; i<lay->count(); ++i) { + OsmServerWidget* w = dynamic_cast<OsmServerWidget*>(lay->itemAt(i)->widget()); + if (w) + w->tbOsmServerDel->setEnabled(true); + } +} + +void OsmServerWidget::on_tbOsmServerDel_clicked() +{ + QLayout* lay = parentWidget()->layout(); + if (!lay) + return; + + if (rbOsmServerSelected->isChecked()) { + OsmServerWidget* w = dynamic_cast<OsmServerWidget*>(lay->itemAt(0)->widget()); + if (w) + w->rbOsmServerSelected->setChecked(true); + } + if (lay->count() > 2) + close(); + else if (lay->count() == 2 ) { + for (int i=0; i<lay->count(); ++i) { + OsmServerWidget* w = dynamic_cast<OsmServerWidget*>(lay->itemAt(i)->widget()); + if (w) + w->tbOsmServerDel->setEnabled(false); + close(); + } + } +} + +void OsmServerWidget::on_rbOsmServerSelected_clicked() +{ + QLayout* lay = parentWidget()->layout(); + if (!lay) + return; + + for (int i=0; i<lay->count(); ++i) { + OsmServerWidget* w = dynamic_cast<OsmServerWidget*>(lay->itemAt(i)->widget()); + if (w) + w->rbOsmServerSelected->setChecked(false); + } + + rbOsmServerSelected->setChecked(true); +} + +PreferencesDialog::PreferencesDialog(QWidget* parent) + : QDialog(parent) +{ +#ifdef _MOBILE + setWindowState(Qt::WindowFullScreen); +#endif + + setupUi(this); + + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + QDir intTemplates(BUILTIN_TEMPLATES_DIR); + for (int i=0; i < intTemplates.entryList().size(); ++i) { + cbTemplates->addItem(intTemplates.entryList().at(i)); + } + + resize(1,1); + QApplication::processEvents(); + + loadPrefs(); +} + +void PreferencesDialog::updateStyles() +{ + cbStyles->clear(); + QDir intStyles(BUILTIN_STYLES_DIR); + for (int i=0; i < intStyles.entryList().size(); ++i) { + cbStyles->addItem(intStyles.entryList().at(i) + " (int)", QVariant(intStyles.entryInfoList().at(i).absoluteFilePath())); + } + if (!CustomStylesDir->text().isEmpty()) { + QDir customStyles(CustomStylesDir->text(), "*.mas"); + for (int i=0; i < customStyles.entryList().size(); ++i) { + cbStyles->addItem(customStyles.entryList().at(i), QVariant(customStyles.entryInfoList().at(i).absoluteFilePath())); + } + } + + int idx = cbStyles->findData(M_PREFS->getDefaultStyle()); + if (idx == -1) + idx = 0; + + cbStyles->setCurrentIndex(idx); +} + +PreferencesDialog::~PreferencesDialog() +{ +} + +void PreferencesDialog::on_buttonBox_clicked(QAbstractButton * button) +{ + if (button == buttonBox->button(QDialogButtonBox::Apply)) { + savePrefs(); + emit(preferencesChanged(this)); + } else + if (button == buttonBox->button(QDialogButtonBox::Ok)) { + savePrefs(); + emit(preferencesChanged(this)); + this->accept(); + } +} + +void PreferencesDialog::initLanguages(QComboBox* aBox) +{ + const QString& baseName = QLatin1String("merkaartor_"); + const QStringList nameFilter = { baseName + QLatin1String("*.qm") }; + for (const auto& translationDir : ((MainWindow*)parent())->translationPaths()) { + const auto translationFiles = QDir(translationDir).entryList(nameFilter, QDir::Files); + for (const auto& filename : translationFiles) { + auto code = filename.mid(baseName.length(), filename.length() - baseName.length() - 3); + aBox->addItem(QLocale(code).nativeLanguageName(), code); + } + } +} + +void PreferencesDialog::loadPrefs() +{ + initLanguages(Language); + QString CurrentLanguage(getDefaultLanguage(false)); + int l; + for (l = 0; l < Language->count(); ++l) + if (CurrentLanguage == Language->itemData(l)) + break; + SelectLanguage->setChecked(l < Language->count()); + Language->setEnabled(l < Language->count()); + if (l < Language->count()) + Language->setCurrentIndex(l); + TranslateTags->setChecked(M_PREFS->getTranslateTags()); + + OsmServerList* theOsmServers = M_PREFS->getOsmServers(); + if (!theOsmServers->size()) { + OsmServerWidget* wOSmServer = new OsmServerWidget(grpOSM); + + wOSmServer->edOsmServerUrl->setText(M_PREFS->getOsmApiUrl()); + wOSmServer->edOsmServerUser->setText(M_PREFS->getOsmUser()); + wOSmServer->edOsmServerPwd->setText(M_PREFS->getOsmPassword()); + wOSmServer->rbOsmServerSelected->setChecked(true); + wOSmServer->tbOsmServerDel->setEnabled(false); + + OsmServersLayout->addWidget(wOSmServer); + } else { + foreach(OsmServer srv, *theOsmServers) { + OsmServerWidget* wOSmServer = new OsmServerWidget(grpOSM); + + wOSmServer->edOsmServerUrl->setText(srv.Url); + wOSmServer->edOsmServerUser->setText(srv.User); + wOSmServer->edOsmServerPwd->setText(srv.Password); + wOSmServer->rbOsmServerSelected->setChecked(srv.Selected); + + OsmServersLayout->addWidget(wOSmServer); + } + } + + edXapiUrl->setText(M_PREFS->getXapiUrl()); + edNominatimUrl->setText(M_PREFS->getNominatimUrl()); + + edGpsPort->setText(M_PREFS->getGpsPort()); + edGpsdHost->setText(M_PREFS->getGpsdHost()); + sbGpsdPort->setValue(M_PREFS->getGpsdPort()); + if (M_PREFS->getGpsUseGpsd()) { + rbGpsGpsd->setChecked(true); + frGpsSerial->setEnabled(false); + } else { + rbGpsSerial->setChecked(true); + frGpsGpsd->setEnabled(false); + } + + cbGgpsSaveLog->setChecked(M_PREFS->getGpsSaveLog()); + edGpsLogDir->setText(M_PREFS->getGpsLogDir()); + cbGpsSyncTime->setChecked(M_PREFS->getGpsSyncTime()); + + + sbMaxDistNodes->setValue(M_PREFS->getMaxDistNodes()); + + bbUseProxy->setChecked(M_PREFS->getProxyUse()); + edProxyHost->setText(M_PREFS->getProxyHost()); + edProxyPort->setText(QString().setNum(M_PREFS->getProxyPort())); + edProxyUser->setText(M_PREFS->getProxyUser()); + edProxyPassword->setText(M_PREFS->getProxyPassword()); + + cbLocalServer->setChecked(M_PREFS->getLocalServer()); + sbNetworkTimeout->setValue(int(M_PREFS->getNetworkTimeout()/1000)); + + edCacheDir->setText(M_PREFS->getCacheDir()); + sbCacheSize->setValue(M_PREFS->getCacheSize()); + + cbAntiAlias->setChecked(M_PREFS->getUseAntiAlias()); + cbDisableAntialiasInPanning->setChecked(!M_PREFS->getAntiAliasWhilePanning()); + cbDisableAntialiasInPanning->setEnabled(M_PREFS->getUseAntiAlias()); + cbStyledWireframe->setChecked(M_PREFS->getUseStyledWireframe()); + QString s = M_PREFS->getDefaultStyle(); + QString cs = M_PREFS->getCustomStyle(); + if (QFileInfo(cs).isFile()) + cs = QFileInfo(cs).absolutePath(); + CustomStylesDir->setText(cs); + updateStyles(); + + rbQuickEdit->setChecked(M_PREFS->getEditRendering() == 0); + rbWireframeEdit->setChecked(M_PREFS->getEditRendering() == 1); + rbFullEdit->setChecked(M_PREFS->getEditRendering() == 2); + + cbDisableStyleForTracks->setChecked(M_PREFS->getDisableStyleForTracks()); + + QString t = M_PREFS->getDefaultTemplate(); + QString ct = M_PREFS->getCustomTemplate(); + CustomTemplateName->setText(ct); + if (t.startsWith(BUILTIN_TEMPLATES_DIR)) { + TemplateBuiltin->setChecked(true); + cbTemplates->setEnabled(true); + cbTemplates->setCurrentIndex(cbTemplates->findText(t.remove(QString(BUILTIN_TEMPLATES_DIR) + "/"))); + } else { + TemplateCustom->setChecked(true); + CustomTemplateName->setEnabled(true); + BrowseTemplate->setEnabled(true); + } + + sbZoomInPerc->setValue(M_PREFS->getZoomIn()); + sbZoomOutPerc->setValue(M_PREFS->getZoomOut()); + + sbAlphaLow->setValue(M_PREFS->getAlpha("Low")); + sbAlphaHigh->setValue(M_PREFS->getAlpha("High")); + + BgColor = M_PREFS->getBgColor(); + cbBackgroundOverwriteStyle->setChecked(M_PREFS->getBackgroundOverwriteStyle()); + FocusColor = M_PREFS->getFocusColor(); + HoverColor = M_PREFS->getHoverColor(); + HighlightColor = M_PREFS->getHighlightColor(); + DirtyColor = M_PREFS->getDirtyColor(); + RelationsColor = M_PREFS->getRelationsColor(); + GpxTrackColor = M_PREFS->getGpxTrackColor(); + makeBoundaryIcon(btBgColor, BgColor); + makeBoundaryIcon(btHoverColor, HoverColor); + makeBoundaryIcon(btHighlightColor, HighlightColor); + makeBoundaryIcon(btDirtyColor, DirtyColor); + makeBoundaryIcon(btFocusColor, FocusColor); + makeBoundaryIcon(btRelationsColor, RelationsColor); + makeBoundaryIcon(btGpxTrackColor, GpxTrackColor); + HoverWidth->setValue(M_PREFS->getHoverWidth()); + HighlightWidth->setValue(M_PREFS->getHighlightWidth()); + DirtyWidth->setValue(M_PREFS->getDirtyWidth()); + FocusWidth->setValue(M_PREFS->getFocusWidth()); + RelationsWidth->setValue(M_PREFS->getRelationsWidth()); + GpxTrackWidth->setValue(M_PREFS->getGpxTrackWidth()); + cbSimpleGpxTrack->setChecked(M_PREFS->getSimpleGpxTrack()); + + cbAutoLoadDoc->setChecked(M_PREFS->getHasAutoLoadDocument()); + edAutoLoadDoc->setText(M_PREFS->getAutoLoadDocumentFilename()); + edAutoLoadDoc->setEnabled(cbAutoLoadDoc->isChecked()); + cbAutoSaveDoc->setChecked(M_PREFS->getAutoSaveDoc()); + cbAutoExtractTracks->setChecked(M_PREFS->getAutoExtractTracks()); + cbReadonlyTracksDefault->setChecked(M_PREFS->getReadonlyTracksDefault()); + cbGdalConfirmProjection->setChecked(M_PREFS->getGdalConfirmProjection()); + + ToolList* tl = M_PREFS->getTools(); + ToolListIterator i(*tl); + while (i.hasNext()) { + i.next(); + Tool t(i.value().ToolName, i.value().ToolPath); + theTools.push_back(t); + lvTools->addItem(t.ToolName); + } + + cbMouseSingleButton->setChecked(M_PREFS->getMouseSingleButton()); + cbSeparateMoveMode->setChecked(M_PREFS->getSeparateMoveMode()); + cbSelectModeCreation->setChecked(M_PREFS->getSelectModeCreation()); + cbVirtualNodes->setChecked(M_PREFS->getUseVirtualNodes()); + cbRelationsHiddenSelectable->setChecked(M_PREFS->getRelationsSelectableWhenHidden()); + + cbCustomStyle->setChecked(M_PREFS->getMerkaartorStyle()); + comboCustomStyle->addItems(QStyleFactory::keys()); + comboCustomStyle->setCurrentIndex(comboCustomStyle->findText(M_PREFS->getMerkaartorStyleString())); + + cbAutoSourceTag->setChecked(M_PREFS->getAutoSourceTag()); +} + +void PreferencesDialog::savePrefs() +{ + if (SelectLanguage->isChecked()) + setDefaultLanguage(Language->itemData(Language->currentIndex()).toString()); + else + setDefaultLanguage(""); + + ((MainWindow*)parent())->updateLanguage(); + retranslateUi(this); + + M_PREFS->setTranslateTags(TranslateTags->isChecked()); + //M_PREFS->setUse06Api(bbUse06Api->isChecked()); + + bool OsmDataChanged = false; + + OsmServerList* theServerList = M_PREFS->getOsmServers(); + theServerList->clear(); + for (int i=0; i< OsmServersLayout->count(); ++i) { + OsmServerWidget* wOsmServer = dynamic_cast<OsmServerWidget*>(OsmServersLayout->itemAt(i)->widget()); + if (!wOsmServer) + continue; + + OsmServer srv; + srv.Url = wOsmServer->edOsmServerUrl->text(); + srv.User = wOsmServer->edOsmServerUser->text(); + srv.Password = wOsmServer->edOsmServerPwd->text(); + srv.Selected = wOsmServer->rbOsmServerSelected->isChecked(); + + if (srv.Selected && (srv.Url != M_PREFS->getOsmApiUrl() || srv.User != M_PREFS->getOsmUser() || srv.Password != M_PREFS->getOsmPassword())) { + M_PREFS->setOsmWebsite(srv.Url); + M_PREFS->setOsmUser(srv.User); + M_PREFS->setOsmPassword(srv.Password); + OsmDataChanged = true; + } + + theServerList->append(srv); + } + + M_PREFS->setXapiUrl(edXapiUrl->text()); + M_PREFS->setNominatimUrl(edNominatimUrl->text()); + + M_PREFS->setGpsPort(edGpsPort->text()); + M_PREFS->setGpsdHost(edGpsdHost->text()); + M_PREFS->setGpsdPort(sbGpsdPort->value()); + if (rbGpsGpsd->isChecked()) + M_PREFS->setGpsUseGpsd(true); + else + M_PREFS->setGpsUseGpsd(false); + + M_PREFS->setGpsSaveLog(cbGgpsSaveLog->isChecked()); + M_PREFS->setGpsLogDir(edGpsLogDir->text()); + M_PREFS->setGpsSyncTime(cbGpsSyncTime->isChecked()); + + M_PREFS->setMaxDistNodes(sbMaxDistNodes->value()); + + M_PREFS->setProxyUse(bbUseProxy->isChecked()); + M_PREFS->setProxyHost(edProxyHost->text()); + M_PREFS->setProxyPort(edProxyPort->text().toInt()); + M_PREFS->setProxyUser(edProxyUser->text()); + M_PREFS->setProxyPassword(edProxyPassword->text()); + + M_PREFS->setLocalServer(cbLocalServer->isChecked()); + M_PREFS->setNetworkTimeout(sbNetworkTimeout->value()*1000); + + M_PREFS->setCacheDir(edCacheDir->text()); + M_PREFS->setCacheSize(sbCacheSize->value()); + + M_PREFS->setUseAntiAlias(cbAntiAlias->isChecked()); + M_PREFS->setAntiAliasWhilePanning(!cbDisableAntialiasInPanning->isChecked()); + M_PREFS->setUseStyledWireframe(cbStyledWireframe->isChecked()); + M_PREFS->setCustomStyle(CustomStylesDir->text()); + + if (rbQuickEdit->isChecked()) + M_PREFS->setEditRendering(0); + else if (rbWireframeEdit->isChecked()) + M_PREFS->setEditRendering(1); + else + M_PREFS->setEditRendering(2); + + bool PainterToInvalidate = false; + if (cbDisableStyleForTracks->isChecked() != M_PREFS->getDisableStyleForTracks()) { + M_PREFS->setDisableStyleForTracks(cbDisableStyleForTracks->isChecked()); + PainterToInvalidate = true; + } + if (cbSimpleGpxTrack->isChecked() != M_PREFS->getSimpleGpxTrack()) { + M_PREFS->setSimpleGpxTrack(cbSimpleGpxTrack->isChecked()); + PainterToInvalidate = true; + } + if (PainterToInvalidate) { + for (FeatureIterator it(((MainWindow*)parent())->document()); !it.isEnd(); ++it) + { + it.get()->invalidatePainter(); + } + } + + QString NewTemplate; + if (TemplateBuiltin->isChecked()) + NewTemplate = QString(BUILTIN_TEMPLATES_DIR) + "/" + cbTemplates->currentText(); + else + NewTemplate = CustomTemplateName->text(); + + if (NewTemplate != M_PREFS->getDefaultTemplate()) + { + M_PREFS->setDefaultTemplate(NewTemplate); + ((MainWindow*)parent())->properties()->loadTemplates(NewTemplate); + } + + M_PREFS->setCustomStyle(CustomStylesDir->text()); + M_PREFS->setCustomTemplate(CustomTemplateName->text()); + + M_PREFS->setZoomIn(sbZoomInPerc->text().toInt()); + M_PREFS->setZoomOut(sbZoomOutPerc->text().toInt()); + + M_PREFS->getAlphaPtr()->insert("Low", sbAlphaLow->value()); + M_PREFS->getAlphaPtr()->insert("High", sbAlphaHigh->value()); + + M_PREFS->setBgColor(BgColor); + M_PREFS->setBackgroundOverwriteStyle(cbBackgroundOverwriteStyle->isChecked()); + M_PREFS->setFocusColor(FocusColor); + M_PREFS->setFocusWidth(FocusWidth->value()); + M_PREFS->setHoverColor(HoverColor); + M_PREFS->setHoverWidth(HoverWidth->value()); + M_PREFS->setHighlightColor(HighlightColor); + M_PREFS->setHighlightWidth(HighlightWidth->value()); + M_PREFS->setDirtyColor(DirtyColor); + M_PREFS->setDirtyWidth(DirtyWidth->value()); + M_PREFS->setRelationsColor(RelationsColor); + M_PREFS->setRelationsWidth(RelationsWidth->value()); + M_PREFS->setGpxTrackColor(GpxTrackColor); + M_PREFS->setGpxTrackWidth(GpxTrackWidth->value()); + + M_PREFS->setHasAutoLoadDocument(cbAutoLoadDoc->isChecked()); + M_PREFS->setAutoLoadDocumentFilename((edAutoLoadDoc->text())); + M_PREFS->setAutoSaveDoc(cbAutoSaveDoc->isChecked()); + M_PREFS->setAutoExtractTracks(cbAutoExtractTracks->isChecked()); + M_PREFS->setReadonlyTracksDefault(cbReadonlyTracksDefault->isChecked()); + M_PREFS->setGdalConfirmProjection(cbGdalConfirmProjection->isChecked()); + + ToolList* tl = M_PREFS->getTools(); + tl->clear(); + for (int i = 0; i < theTools.size(); ++i) { + Tool t(theTools[i]); + tl->insert(theTools[i].ToolName, t); + } + + M_PREFS->setMouseSingleButton(cbMouseSingleButton->isChecked()); + M_PREFS->setSeparateMoveMode(cbSeparateMoveMode->isChecked()); + M_PREFS->setSelectModeCreation(cbSelectModeCreation->isChecked()); + M_PREFS->setUseVirtualNodes(cbVirtualNodes->isChecked()); + M_PREFS->setRelationsSelectableWhenHidden(cbRelationsHiddenSelectable->isChecked()); + + M_PREFS->setMerkaartorStyle(cbCustomStyle->isChecked()); + M_PREFS->setMerkaartorStyleString(comboCustomStyle->currentText()); + + M_PREFS->setAutoSourceTag(cbAutoSourceTag->isChecked()); + + M_PREFS->save(OsmDataChanged); +} + +void PreferencesDialog::on_BrowseStyle_clicked() +{ + QString s = QFileDialog::getExistingDirectory(this,tr("Custom styles directory"),""); + if (!s.isNull()) + CustomStylesDir->setText(QDir::toNativeSeparators(s)); + + updateStyles(); +} + +void PreferencesDialog::on_BrowseTemplate_clicked() +{ + QString s = QFileDialog::getOpenFileName(this,tr("Tag Template"),"",tr("Merkaartor tag template (*.mat)")); + if (!s.isNull()) + CustomTemplateName->setText(QDir::toNativeSeparators(s)); +} + +QColor PreferencesDialog::pickColor(QColor defaultColor) { + return QColorDialog::getColor(defaultColor, this +#if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) + , tr("Select Color"), QColorDialog::ShowAlphaChannel +#endif + ); +} + +void PreferencesDialog::on_btBgColor_clicked() +{ + QColor rgb = pickColor(BgColor); + if (rgb.isValid()) { + BgColor = rgb; + makeBoundaryIcon(btBgColor, BgColor); + } +} + +void PreferencesDialog::on_btFocusColor_clicked() +{ + QColor rgb = pickColor(FocusColor); + if (rgb.isValid()) { + FocusColor = rgb; + makeBoundaryIcon(btFocusColor, FocusColor); + } +} + +void PreferencesDialog::on_btHoverColor_clicked() +{ + QColor rgb = pickColor(HoverColor); + if (rgb.isValid()) { + HoverColor = rgb; + makeBoundaryIcon(btHoverColor, HoverColor); + } +} + +void PreferencesDialog::on_btHighlightColor_clicked() +{ + QColor rgb = pickColor(HighlightColor); + if (rgb.isValid()) { + HighlightColor = rgb; + makeBoundaryIcon(btHighlightColor, HighlightColor); + } +} + +void PreferencesDialog::on_btDirtyColor_clicked() +{ + QColor rgb = pickColor(DirtyColor); + if (rgb.isValid()) { + DirtyColor = rgb; + makeBoundaryIcon(btDirtyColor, DirtyColor); + } +} + +void PreferencesDialog::on_btRelationsColor_clicked() +{ + QColor rgb = pickColor(RelationsColor); + if (rgb.isValid()) { + RelationsColor = rgb; + makeBoundaryIcon(btRelationsColor, RelationsColor); + } +} +void PreferencesDialog::on_btGpxTrackColor_clicked() +{ + QColor rgb = pickColor(GpxTrackColor); + if (rgb.isValid()) { + GpxTrackColor = rgb; + makeBoundaryIcon(btGpxTrackColor, GpxTrackColor); + } +} + + +/* Tools */ +void PreferencesDialog::on_btAddTool_clicked(void) +{ + for (int i=0; i<theTools.size(); ++i) { + if (theTools[i].ToolName == edToolName->text()) { + QMessageBox::critical(this, tr("Tool already exists"), + tr("A tool of this name already exists.\nPlease select another name or click the <Apply> button if you want to modify the existing one"), QMessageBox::Ok); + return; + } + } + Tool t(edToolName->text(), edToolPath->text()); + theTools.push_back(t); + lvTools->addItem(t.ToolName); + + lvTools->setCurrentRow(theTools.size() - 1); + on_lvTools_itemSelectionChanged(); +} + +void PreferencesDialog::on_btDelTool_clicked(void) +{ + int idx = static_cast<int>(lvTools->currentRow()); + if (idx >= theTools.size()) + return; + + if (theTools[idx].ToolName == "Inkscape") { + QMessageBox::critical(this, tr("Cannot delete preset tool"), + tr("Cannot delete preset tool \"%1\"").arg(theTools[idx].ToolName), QMessageBox::Ok); + return; + } + theTools.erase(theTools.begin() + idx); + delete lvTools->takeItem(idx); + if (idx && (idx >= theTools.size())) + --idx; + lvTools->setCurrentRow(idx); + on_lvTools_itemSelectionChanged(); +} + +void PreferencesDialog::on_btApplyTool_clicked(void) +{ + int idx = static_cast<int>(lvTools->currentRow()); + if (idx >= theTools.size()) + return; + + if ((theTools[idx].ToolName == "Inkscape") && edToolName->text() != theTools[idx].ToolName) { + QMessageBox::critical(this, tr("Cannot modify preset tool name"), + tr("Cannot modify preset tool \"%1\"'s name").arg(theTools[idx].ToolName), QMessageBox::Ok); + return; + } + Tool& t(theTools[idx]); + t.ToolName = edToolName->text(); + t.ToolPath = edToolPath->text(); + + lvTools->item(lvTools->currentRow())->setText(edToolName->text()); +} + +void PreferencesDialog::on_lvTools_itemSelectionChanged() +{ + QListWidgetItem* it = lvTools->item(lvTools->currentRow()); + + int idx = static_cast<int>(lvTools->row(it)); + if (idx >= theTools.size()) + return; + + Tool& t(theTools[idx]); + edToolName->setText(t.ToolName); + edToolPath->setText(t.ToolPath); +} + +void PreferencesDialog::on_btBrowse_clicked() +{ + QString s = QFileDialog::getOpenFileName(this,tr("Select tool executable")); + if (!s.isNull()) { + edToolPath->setText(s); + } +} + +void PreferencesDialog::on_btAutoloadBrowse_clicked() +{ + QString s = QFileDialog::getOpenFileName(this,tr("Select template document"), "", tr("Merkaartor document (*.mdc)")); + if (!s.isNull()) { + edAutoLoadDoc->setText(s); + } +} + +void PreferencesDialog::on_btGpsLogDirBrowse_clicked() +{ + QString s = QFileDialog::getExistingDirectory(this,tr("Select Log directory")); + if (!s.isNull()) { + edGpsLogDir->setText(s); + } +} + +void PreferencesDialog::changeEvent(QEvent * event) +{ + if (event->type() == QEvent::LanguageChange) + { + retranslateUi(this); + Language->clear(); + initLanguages(Language); + QString CurrentLanguage(getDefaultLanguage(false)); + int l; + for (l = 0; l < Language->count(); ++l) + if (CurrentLanguage == Language->itemData(l)) + break; + SelectLanguage->setChecked(l < Language->count()); + Language->setEnabled(l < Language->count()); + if (l < Language->count()) + Language->setCurrentIndex(l); + } + + QDialog::changeEvent(event); +} + diff --git a/src/Preferences/PreferencesDialog.h b/src/Preferences/PreferencesDialog.h new file mode 100644 index 0000000..f885105 --- /dev/null +++ b/src/Preferences/PreferencesDialog.h @@ -0,0 +1,96 @@ +// +// C++ Interface: PreferencesDialog +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef PREFERENCESDIALOG_H +#define PREFERENCESDIALOG_H + +#include <QWidget> +#include <QBuffer> +#include <QListWidgetItem> + +#include "ui_PreferencesDialog.h" +#include "ui_OsmServerWidget.h" +#include "MerkaartorPreferences.h" + +/** + @author cbro <cbro@semperpax.com> +*/ + +class OsmServerWidget : public QWidget, public Ui::OsmServerWidget +{ + Q_OBJECT + +public: + OsmServerWidget(QWidget * parent = 0, Qt::WindowFlags f = 0); + +public slots: + void on_tbOsmServerAdd_clicked(); + void on_tbOsmServerDel_clicked(); + void on_rbOsmServerSelected_clicked(); +}; + +class PreferencesDialog : public QDialog, public Ui::PreferencesDialog +{ + Q_OBJECT + +public: + PreferencesDialog(QWidget* parent = 0); + ~PreferencesDialog(); + +public slots: + void on_buttonBox_clicked(QAbstractButton * button); + void on_BrowseStyle_clicked(); + void on_BrowseTemplate_clicked(); + void on_btBgColor_clicked(); + void on_btFocusColor_clicked(); + void on_btHoverColor_clicked(); + void on_btHighlightColor_clicked(); + void on_btDirtyColor_clicked(); + void on_btRelationsColor_clicked(); + void on_btGpxTrackColor_clicked(); + + /* GPS */ + void on_btGpsLogDirBrowse_clicked(); + + /* Tools */ + void on_btAddTool_clicked(void); + void on_btDelTool_clicked(void); + void on_btApplyTool_clicked(void); + void on_lvTools_itemSelectionChanged(); + void on_btBrowse_clicked(); + + /* Data */ + void on_btAutoloadBrowse_clicked(); + +private: + void updateStyles(); + void loadPrefs(); + void initLanguages(QComboBox*); + void savePrefs(); + + void changeEvent(QEvent *); + QColor pickColor(QColor defaultColor); + +private: + QList<Tool> theTools; + QColor BgColor; + QColor FocusColor; + QColor HoverColor; + QColor HighlightColor; + QColor DirtyColor; + QColor RelationsColor; + QColor GpxTrackColor; + +signals: + void preferencesChanged(PreferencesDialog* prefs); +}; + +#endif diff --git a/src/Preferences/PreferencesDialog.ui b/src/Preferences/PreferencesDialog.ui new file mode 100644 index 0000000..30977e1 --- /dev/null +++ b/src/Preferences/PreferencesDialog.ui @@ -0,0 +1,1881 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <author>Chris Browet</author> + <class>PreferencesDialog</class> + <widget class="QDialog" name="PreferencesDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>689</width> + <height>487</height> + </rect> + </property> + <property name="windowTitle"> + <string>Preferences</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_6"> + <item> + <widget class="QTabWidget" name="tabPref"> + <property name="tabPosition"> + <enum>QTabWidget::North</enum> + </property> + <property name="currentIndex"> + <number>3</number> + </property> + <widget class="QWidget" name="tab_4"> + <attribute name="title"> + <string>Visual</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <widget class="QGroupBox" name="grpGeneral"> + <property name="title"> + <string>General</string> + </property> + <layout class="QVBoxLayout"> + <item> + <layout class="QHBoxLayout"> + <item> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Zoom out/in (%)</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="sbZoomOutPerc"/> + </item> + <item> + <widget class="QSpinBox" name="sbZoomInPerc"> + <property name="minimum"> + <number>100</number> + </property> + <property name="maximum"> + <number>1000</number> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout"> + <item> + <widget class="QLabel" name="label_9"> + <property name="text"> + <string>Opacity low/high</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="sbAlphaLow"> + <property name="maximum"> + <double>1.000000000000000</double> + </property> + <property name="singleStep"> + <double>0.100000000000000</double> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="sbAlphaHigh"> + <property name="maximum"> + <double>1.000000000000000</double> + </property> + <property name="singleStep"> + <double>0.100000000000000</double> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QCheckBox" name="cbMouseSingleButton"> + <property name="text"> + <string>Single mouse button interaction</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QCheckBox" name="cbCustomStyle"> + <property name="text"> + <string>Use custom Qt style</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QCheckBox" name="cbSelectModeCreation"> + <property name="text"> + <string>Allow node/way creation in select mode</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QCheckBox" name="cbSeparateMoveMode"> + <property name="text"> + <string>Separate move mode</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QCheckBox" name="cbVirtualNodes"> + <property name="text"> + <string>Use virtual nodes (new session required)</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QCheckBox" name="cbRelationsHiddenSelectable"> + <property name="text"> + <string>Relations selectable while hidden</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QComboBox" name="comboCustomStyle"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab_3"> + <attribute name="title"> + <string>Colors</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_9"> + <item> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>Background</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QToolButton" name="btBgColor"> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>…</string> + </property> + <property name="iconSize"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="cbBackgroundOverwriteStyle"> + <property name="text"> + <string>Overwrite style</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QLabel" name="label_26"> + <property name="text"> + <string>GPX track</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_11"> + <item> + <widget class="QToolButton" name="btGpxTrackColor"> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>…</string> + </property> + <property name="iconSize"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="GpxTrackWidth"/> + </item> + <item> + <widget class="QLabel" name="label_27"> + <property name="text"> + <string>Pixels</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="cbSimpleGpxTrack"> + <property name="text"> + <string>Simple GPX track appearance</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_6"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="title"> + <string>Interface</string> + </property> + <layout class="QGridLayout" name="formLayout"> + <item row="3" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_5"> + <item> + <widget class="QToolButton" name="btFocusColor"> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>…</string> + </property> + <property name="iconSize"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="FocusWidth"/> + </item> + <item> + <widget class="QLabel" name="label_22"> + <property name="text"> + <string>Pixels</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_4"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="4" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_6"> + <item> + <widget class="QToolButton" name="btRelationsColor"> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>…</string> + </property> + <property name="iconSize"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="RelationsWidth"/> + </item> + <item> + <widget class="QLabel" name="label_23"> + <property name="text"> + <string>Pixels</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_5"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="0" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QToolButton" name="btHoverColor"> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>…</string> + </property> + <property name="iconSize"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="HoverWidth"/> + </item> + <item> + <widget class="QLabel" name="label_18"> + <property name="text"> + <string>Pixels</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_19"> + <property name="text"> + <string>Hover</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_14"> + <item> + <widget class="QToolButton" name="btHighlightColor"> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>…</string> + </property> + <property name="iconSize"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="HighlightWidth"/> + </item> + <item> + <widget class="QLabel" name="label_118"> + <property name="text"> + <string>Pixels</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_113"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="label_21"> + <property name="text"> + <string>Relations</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_20"> + <property name="text"> + <string>Focus</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_119"> + <property name="text"> + <string>Highlight</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_13"> + <item> + <widget class="QToolButton" name="btDirtyColor"> + <property name="minimumSize"> + <size> + <width>45</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string>…</string> + </property> + <property name="iconSize"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="DirtyWidth"/> + </item> + <item> + <widget class="QLabel" name="label_28"> + <property name="text"> + <string>Pixels</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_8"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_11"> + <property name="text"> + <string>Dirty</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <spacer name="verticalSpacer_5"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab_7"> + <attribute name="title"> + <string>Locale</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label_16"> + <property name="text"> + <string>A restart of the program may be needed for these changes to take effect.</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QCheckBox" name="SelectLanguage"> + <property name="text"> + <string>Use language</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="Language"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QCheckBox" name="TranslateTags"> + <property name="text"> + <string>Translate standard tags</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>174</width> + <height>189</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab_5"> + <attribute name="title"> + <string>Rendering</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <widget class="QGroupBox" name="groupBox_5"> + <property name="title"> + <string>Options</string> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="0" column="0"> + <widget class="QCheckBox" name="cbAntiAlias"> + <property name="text"> + <string>Anti-aliasing</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QCheckBox" name="cbDisableAntialiasInPanning"> + <property name="text"> + <string>No anti-aliasing while panning</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QCheckBox" name="cbStyledWireframe"> + <property name="toolTip"> + <string><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></string> + </property> + <property name="text"> + <string>Use current style for wireframe rendering</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_7"> + <property name="title"> + <string>Editing</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_15"> + <item> + <widget class="QRadioButton" name="rbQuickEdit"> + <property name="text"> + <string>Quick editing</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="rbWireframeEdit"> + <property name="text"> + <string>Wireframe editing</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="rbFullEdit"> + <property name="text"> + <string>Full render editing</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="MapStyle"> + <property name="title"> + <string>Map style</string> + </property> + <layout class="QVBoxLayout" name="_2"> + <item> + <layout class="QHBoxLayout" name="_4"> + <item> + <widget class="QLabel" name="label_17"> + <property name="text"> + <string>Custom styles folder</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="CustomStylesDir"> + <property name="enabled"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="BrowseStyle"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string>…</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="_3"> + <item> + <widget class="QLabel" name="label_24"> + <property name="text"> + <string>Current style</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="cbStyles"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QCheckBox" name="cbDisableStyleForTracks"> + <property name="text"> + <string>No styles for track layers</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tabTemplate"> + <attribute name="title"> + <string>Template</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_7"> + <item> + <widget class="QGroupBox" name="MapStyle_2"> + <property name="title"> + <string>Tag template</string> + </property> + <layout class="QVBoxLayout" name="_9"> + <item> + <layout class="QHBoxLayout" name="_10"> + <item> + <widget class="QRadioButton" name="TemplateBuiltin"> + <property name="text"> + <string>Built-in</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="cbTemplates"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="_11"> + <item> + <widget class="QRadioButton" name="TemplateCustom"> + <property name="text"> + <string>Custom</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="CustomTemplateName"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="BrowseTemplate"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string>…</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <spacer name="verticalSpacer_4"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>302</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tabData"> + <attribute name="title"> + <string>Data</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QGroupBox" name="grpOSM"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="title"> + <string>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</string> + </property> + <layout class="QVBoxLayout" name="OsmServersLayout"/> + </widget> + </item> + <item> + <widget class="QGroupBox" name="grpXAPI_2"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="title"> + <string>XAPI</string> + </property> + <layout class="QVBoxLayout" name="_8"> + <item> + <layout class="QGridLayout" name="_12"> + <item row="0" column="1"> + <widget class="QLabel" name="label_30"> + <property name="text"> + <string>URL:</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLineEdit" name="edXapiUrl"/> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="grpNomination"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="title"> + <string>Nominatim (geo search)</string> + </property> + <layout class="QVBoxLayout" name="_6"> + <item> + <layout class="QGridLayout" name="_7"> + <item row="0" column="2"> + <widget class="QLineEdit" name="edNominatimUrl"/> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="label_29"> + <property name="text"> + <string>URL:</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="gb_Documents"> + <property name="title"> + <string>Documents</string> + </property> + <layout class="QVBoxLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="spacing"> + <number>0</number> + </property> + <item> + <widget class="QCheckBox" name="cbAutoLoadDoc"> + <property name="text"> + <string>Autoload template document</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edAutoLoadDoc"/> + </item> + <item> + <widget class="QPushButton" name="btAutoloadBrowse"> + <property name="maximumSize"> + <size> + <width>30</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string>…</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QCheckBox" name="cbAutoSaveDoc"> + <property name="text"> + <string>Autosave documents after upload</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="gb_Tracks"> + <property name="title"> + <string>Tracks</string> + </property> + <layout class="QVBoxLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <item> + <widget class="QCheckBox" name="cbAutoExtractTracks"> + <property name="text"> + <string>Automatically extract opened tracks</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="cbReadonlyTracksDefault"> + <property name="text"> + <string>Track layers read-only by default</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_9"> + <item> + <widget class="QLabel" name="label_25"> + <property name="text"> + <string>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="sbMaxDistNodes"> + <property name="singleStep"> + <double>0.100000000000000</double> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_6"> + <property name="title"> + <string>GDAL</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_10"> + <item> + <widget class="QCheckBox" name="cbGdalConfirmProjection"> + <property name="text"> + <string>Confirm projection</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab_6"> + <attribute name="title"> + <string>GPS</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <item> + <widget class="QGroupBox" name="groupBox_4"> + <property name="title"> + <string>GPS input</string> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="1" column="0"> + <widget class="QRadioButton" name="rbGpsGpsd"> + <property name="text"> + <string>gpsd</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QRadioButton" name="rbGpsSerial"> + <property name="text"> + <string>Serial</string> + </property> + </widget> + </item> + <item row="0" column="1" colspan="2"> + <widget class="QFrame" name="frGpsSerial"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_8"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="lblGpsPort"> + <property name="text"> + <string>Port</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edGpsPort"/> + </item> + </layout> + </widget> + </item> + <item row="1" column="1"> + <widget class="QFrame" name="frGpsGpsd"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_10"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="lblGpsdHost"> + <property name="text"> + <string>Host</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edGpsdHost"/> + </item> + <item> + <widget class="QLabel" name="lblGpsdPort"> + <property name="text"> + <string>Port</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="sbGpsdPort"> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>65535</number> + </property> + <property name="value"> + <number>2741</number> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="_5"> + <item> + <widget class="QCheckBox" name="cbGgpsSaveLog"> + <property name="text"> + <string>Save NMEA log</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edGpsLogDir"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btGpsLogDirBrowse"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string>…</string> + </property> + <property name="iconSize"> + <size> + <width>8</width> + <height>8</height> + </size> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QCheckBox" name="cbGpsSyncTime"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Set system time to GPS</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab"> + <attribute name="title"> + <string>Network</string> + </attribute> + <layout class="QVBoxLayout"> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Proxy settings</string> + </property> + <layout class="QGridLayout"> + <item row="0" column="0" colspan="3"> + <widget class="QCheckBox" name="bbUseProxy"> + <property name="text"> + <string>Use proxy</string> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>Password:</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QLineEdit" name="edProxyPassword"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maximumSize"> + <size> + <width>250</width> + <height>16777215</height> + </size> + </property> + <property name="echoMode"> + <enum>QLineEdit::Password</enum> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>User:</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Port:</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Host:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="edProxyHost"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>16777215</height> + </size> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="edProxyPort"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maximumSize"> + <size> + <width>50</width> + <height>16777215</height> + </size> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLineEdit" name="edProxyUser"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="maximumSize"> + <size> + <width>250</width> + <height>16777215</height> + </size> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_12"> + <item> + <widget class="QLabel" name="label_12"> + <property name="text"> + <string>Network Timeout (sec):</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="sbNetworkTimeout"> + <property name="minimum"> + <number>3</number> + </property> + <property name="maximum"> + <number>999</number> + </property> + <property name="singleStep"> + <number>1</number> + </property> + <property name="value"> + <number>10</number> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_7"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QCheckBox" name="cbLocalServer"> + <property name="text"> + <string>JOSM-compatible local server on port 8111</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab_2"> + <attribute name="title"> + <string>Background image</string> + </attribute> + <layout class="QVBoxLayout"> + <item> + <widget class="QGroupBox" name="grpCaching"> + <property name="title"> + <string>Tile caching (not active for Yahoo! due to legal restrictions)</string> + </property> + <layout class="QGridLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Cache folder</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="edCacheDir"/> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_15"> + <property name="text"> + <string>Cache size (in MB; 0 to turn off)</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QSpinBox" name="sbCacheSize"> + <property name="maximum"> + <number>999</number> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QGridLayout"> + <item row="0" column="0"> + <widget class="QGroupBox" name="groupBox_3"> + <property name="title"> + <string>Map Adapter</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_8"> + <item> + <widget class="QCheckBox" name="cbAutoSourceTag"> + <property name="text"> + <string>Automatically add "source" tag when creating features over a background map</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Expanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tabTools"> + <attribute name="title"> + <string>Tools</string> + </attribute> + <layout class="QHBoxLayout"> + <item> + <widget class="QListWidget" name="lvTools"/> + </item> + <item> + <widget class="Line" name="line"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout"> + <item> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Name:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edToolName"/> + </item> + <item> + <widget class="QLabel" name="label_6"> + <property name="text"> + <string>Path:</string> + </property> + <property name="buddy"> + <cstring>edToolPath</cstring> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout"> + <item> + <widget class="QLineEdit" name="edToolPath"/> + </item> + <item> + <widget class="QPushButton" name="btBrowse"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string>…</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>201</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="btApplyTool"> + <property name="text"> + <string>Apply</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btAddTool"> + <property name="text"> + <string>Add</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btDelTool"> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="maximumSize"> + <size> + <width>900</width> + <height>700</height> + </size> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>bbUseProxy</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>PreferencesDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>340</x> + <y>466</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>bbUseProxy</sender> + <signal>toggled(bool)</signal> + <receiver>edProxyHost</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>72</x> + <y>79</y> + </hint> + <hint type="destinationlabel"> + <x>162</x> + <y>105</y> + </hint> + </hints> + </connection> + <connection> + <sender>bbUseProxy</sender> + <signal>toggled(bool)</signal> + <receiver>edProxyPort</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>72</x> + <y>79</y> + </hint> + <hint type="destinationlabel"> + <x>135</x> + <y>131</y> + </hint> + </hints> + </connection> + <connection> + <sender>cbGgpsSaveLog</sender> + <signal>toggled(bool)</signal> + <receiver>edGpsLogDir</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>55</x> + <y>149</y> + </hint> + <hint type="destinationlabel"> + <x>185</x> + <y>150</y> + </hint> + </hints> + </connection> + <connection> + <sender>cbGgpsSaveLog</sender> + <signal>toggled(bool)</signal> + <receiver>btGpsLogDirBrowse</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>55</x> + <y>149</y> + </hint> + <hint type="destinationlabel"> + <x>665</x> + <y>152</y> + </hint> + </hints> + </connection> + <connection> + <sender>SelectLanguage</sender> + <signal>toggled(bool)</signal> + <receiver>Language</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>45</x> + <y>77</y> + </hint> + <hint type="destinationlabel"> + <x>200</x> + <y>79</y> + </hint> + </hints> + </connection> + <connection> + <sender>TemplateBuiltin</sender> + <signal>toggled(bool)</signal> + <receiver>cbTemplates</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>79</x> + <y>81</y> + </hint> + <hint type="destinationlabel"> + <x>173</x> + <y>83</y> + </hint> + </hints> + </connection> + <connection> + <sender>TemplateCustom</sender> + <signal>toggled(bool)</signal> + <receiver>CustomTemplateName</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>68</x> + <y>111</y> + </hint> + <hint type="destinationlabel"> + <x>155</x> + <y>112</y> + </hint> + </hints> + </connection> + <connection> + <sender>TemplateCustom</sender> + <signal>toggled(bool)</signal> + <receiver>BrowseTemplate</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>68</x> + <y>111</y> + </hint> + <hint type="destinationlabel"> + <x>655</x> + <y>114</y> + </hint> + </hints> + </connection> + <connection> + <sender>cbCustomStyle</sender> + <signal>toggled(bool)</signal> + <receiver>comboCustomStyle</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>148</x> + <y>206</y> + </hint> + <hint type="destinationlabel"> + <x>614</x> + <y>208</y> + </hint> + </hints> + </connection> + <connection> + <sender>bbUseProxy</sender> + <signal>toggled(bool)</signal> + <receiver>edProxyUser</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>72</x> + <y>79</y> + </hint> + <hint type="destinationlabel"> + <x>162</x> + <y>157</y> + </hint> + </hints> + </connection> + <connection> + <sender>bbUseProxy</sender> + <signal>toggled(bool)</signal> + <receiver>edProxyPassword</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>72</x> + <y>79</y> + </hint> + <hint type="destinationlabel"> + <x>162</x> + <y>183</y> + </hint> + </hints> + </connection> + <connection> + <sender>rbGpsSerial</sender> + <signal>toggled(bool)</signal> + <receiver>frGpsSerial</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>75</x> + <y>81</y> + </hint> + <hint type="destinationlabel"> + <x>167</x> + <y>84</y> + </hint> + </hints> + </connection> + <connection> + <sender>rbGpsGpsd</sender> + <signal>toggled(bool)</signal> + <receiver>frGpsGpsd</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>75</x> + <y>109</y> + </hint> + <hint type="destinationlabel"> + <x>161</x> + <y>112</y> + </hint> + </hints> + </connection> + <connection> + <sender>cbAutoLoadDoc</sender> + <signal>toggled(bool)</signal> + <receiver>edAutoLoadDoc</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>137</x> + <y>244</y> + </hint> + <hint type="destinationlabel"> + <x>388</x> + <y>245</y> + </hint> + </hints> + </connection> + <connection> + <sender>cbAntiAlias</sender> + <signal>toggled(bool)</signal> + <receiver>cbDisableAntialiasInPanning</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>75</x> + <y>71</y> + </hint> + <hint type="destinationlabel"> + <x>402</x> + <y>73</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/Preferences/ProjPreferencesDialog.cpp b/src/Preferences/ProjPreferencesDialog.cpp new file mode 100644 index 0000000..5f0305c --- /dev/null +++ b/src/Preferences/ProjPreferencesDialog.cpp @@ -0,0 +1,145 @@ +// +// C++ Implementation: ProjPreferencesDialog +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, Bart Vanhauwaert (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "ProjPreferencesDialog.h" + +#include <QMessageBox> +#include <QDir> +#include <QUrl> +#include <QTextEdit> +#include <QComboBox> + +#include "ProjectionChooser.h" + +ProjPreferencesDialog::ProjPreferencesDialog(QWidget* parent) + : QDialog(parent) +{ + setupUi(this); + + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + loadPrefs(); +} + +ProjPreferencesDialog::~ProjPreferencesDialog() +{ +} + +void ProjPreferencesDialog::addProjection(const ProjectionItem & srv) +{ + theItems.push_back(srv); + if (!srv.deleted) { + QListWidgetItem* item = new QListWidgetItem(srv.name); + item->setData(Qt::UserRole, (int) theItems.size()-1); + lvProjections->addItem(item); + } +} + +void ProjPreferencesDialog::on_btSelectProj4_clicked() +{ + QString sPrj = ProjectionChooser::getProjection(tr("Please specify projection"), false, edProj4String->text(), this); + if (!sPrj.isEmpty()) + edProj4String->setText(sPrj); +} + +void ProjPreferencesDialog::on_btApply_clicked(void) +{ + int idx = static_cast<int>(lvProjections->currentItem()->data(Qt::UserRole).toInt()); + if (idx >= theItems.size()) + return; + + ProjectionItem& item(theItems[idx]); + item.name = edProjName->text(); + item.projection = edProj4String->text(); + + lvProjections->currentItem()->setText(item.name); + selectedItem = item.name; +} + +void ProjPreferencesDialog::on_btAdd_clicked(void) +{ + addProjection(ProjectionItem(edProjName->text(), edProj4String->text())); + lvProjections->setCurrentRow(lvProjections->count() - 1); + on_lvProjections_itemSelectionChanged(); +} + +void ProjPreferencesDialog::on_btDel_clicked(void) +{ + QListWidgetItem* it = lvProjections->item(lvProjections->currentRow()); + + int idx = it->data(Qt::UserRole).toInt(); + if (idx >= theItems.size()) + return; + + theItems[idx].deleted = true; + delete lvProjections->takeItem(lvProjections->currentRow()); + on_lvProjections_itemSelectionChanged(); +} + +void ProjPreferencesDialog::on_lvProjections_itemSelectionChanged() +{ + QListWidgetItem* it = lvProjections->item(lvProjections->currentRow()); + + int idx = it->data(Qt::UserRole).toInt(); + if (idx >= theItems.size()) + return; + + ProjectionItem& item(theItems[idx]); + edProjName->setText(item.name); + edProj4String->setText(item.projection); + + selectedItem = item.name; +} + +QString ProjPreferencesDialog::getSelectedItem() +{ + return selectedItem; +} + +void ProjPreferencesDialog::setSelectedItem(QString theValue) +{ + QList<QListWidgetItem *> L = lvProjections->findItems(theValue, Qt::MatchExactly); + lvProjections->setCurrentItem(L[0]); + on_lvProjections_itemSelectionChanged(); +} + +void ProjPreferencesDialog::on_buttonBox_clicked(QAbstractButton * button) +{ + if (button == buttonBox->button(QDialogButtonBox::Apply)) { + savePrefs(); + } else + if (button == buttonBox->button(QDialogButtonBox::Ok)) { + savePrefs(); + this->accept(); + } +} + +void ProjPreferencesDialog::loadPrefs() +{ + ProjectionList* L = M_PREFS->getProjectionsList()->getProjections(); + ProjectionListIterator i(*L); + while (i.hasNext()) { + i.next(); + addProjection(i.value()); + } +} + +void ProjPreferencesDialog::savePrefs() +{ + ProjectionList* L = M_PREFS->getProjectionsList()->getProjections(); + L->clear(); + for (int i = 0; i < theItems.size(); ++i) { + ProjectionItem S(theItems[i]); + L->insert(theItems[i].name, S); + } + M_PREFS->save(); +} + diff --git a/src/Preferences/ProjPreferencesDialog.h b/src/Preferences/ProjPreferencesDialog.h new file mode 100644 index 0000000..0ee0bf2 --- /dev/null +++ b/src/Preferences/ProjPreferencesDialog.h @@ -0,0 +1,62 @@ +// +// C++ Interface: ProjPreferencesDialog +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef ProjPreferencesDialog_H +#define ProjPreferencesDialog_H + +#include <QWidget> +#include <QBuffer> + + +#include <ui_ProjPreferencesDialog.h> +#include "MerkaartorPreferences.h" +#include "ProjectionsList.h" + +#include <QList> + +/** + @author cbro <cbro@semperpax.com> +*/ + +class ProjPreferencesDialog : public QDialog, public Ui::ProjPreferencesDialog +{ + Q_OBJECT + +public: + ProjPreferencesDialog(QWidget* parent = 0); + ~ProjPreferencesDialog(); + + void addProjection(const ProjectionItem & item); + +public slots: + void on_btSelectProj4_clicked(); + void on_btApply_clicked(); + void on_btAdd_clicked(); + void on_btDel_clicked(); + void on_lvProjections_itemSelectionChanged(); + void on_buttonBox_clicked(QAbstractButton * button); + +private: + void loadPrefs(); + void savePrefs(); +public: + QList<ProjectionItem> theItems; + QString getSelectedItem(); + void setSelectedItem(QString theValue); + +private: + QString selectedItem; + int httpGetId; + QBuffer* buf; + +}; + +#endif diff --git a/src/Preferences/ProjPreferencesDialog.ui b/src/Preferences/ProjPreferencesDialog.ui new file mode 100644 index 0000000..d4fae70 --- /dev/null +++ b/src/Preferences/ProjPreferencesDialog.ui @@ -0,0 +1,198 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ProjPreferencesDialog</class> + <widget class="QDialog" name="ProjPreferencesDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>640</width> + <height>285</height> + </rect> + </property> + <property name="windowTitle"> + <string>Projections setup</string> + </property> + <layout class="QVBoxLayout"> + <item> + <widget class="QGroupBox" name="grpWmsServers"> + <property name="title"> + <string>Projections</string> + </property> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>1</number> + </property> + <property name="margin"> + <number>1</number> + </property> + <item> + <widget class="QFrame" name="frame_2"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>5</number> + </property> + <property name="margin"> + <number>5</number> + </property> + <item> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Projection list:</string> + </property> + </widget> + </item> + <item> + <widget class="QListWidget" name="lvProjections"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QFrame" name="frame"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label_11"> + <property name="text"> + <string>Name:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edProjName"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>PROJ4 string</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLineEdit" name="edProj4String"/> + </item> + <item> + <widget class="QToolButton" name="btSelectProj4"> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="btApply"> + <property name="text"> + <string>Apply</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btAdd"> + <property name="text"> + <string>Add</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btDel"> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>ProjPreferencesDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>ProjPreferencesDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/Preferences/ProjectionsList.cpp b/src/Preferences/ProjectionsList.cpp new file mode 100644 index 0000000..a0de06b --- /dev/null +++ b/src/Preferences/ProjectionsList.cpp @@ -0,0 +1,156 @@ +// +// C++ Implementation: ProjectionsList +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "Global.h" + +#include "ProjectionsList.h" +#include "MerkaartorPreferences.h" + +#define STRINGIFY(x) XSTRINGIFY(x) +#define XSTRINGIFY(x) #x + +ProjectionItem::ProjectionItem () + : name(""), projection(""), deleted(false) +{ +} + +ProjectionItem::ProjectionItem (QString aName, QString aProjection, bool aDeleted) + : name(aName), projection(aProjection), deleted(aDeleted) +{ +} + +void ProjectionItem::toXml(QDomElement parent) +{ + QDomElement p = parent.ownerDocument().createElement("Projection"); + parent.appendChild(p); + p.setAttribute("name", name); + if (deleted) + p.setAttribute("deleted", "true"); + + QDomText t = parent.ownerDocument().createTextNode(projection); + p.appendChild(t); +} + +ProjectionItem ProjectionItem::fromXml(QDomElement parent) +{ + ProjectionItem theProjection; + + if (parent.tagName() == "Projection") { + theProjection.projection = parent.text().trimmed(); + theProjection.name = parent.attribute("name"); + theProjection.deleted = (parent.attribute("deleted") == "true" ? true : false); + } + + return theProjection; +} + +void ProjectionsList::add(ProjectionsList aProjectionsList) +{ + ProjectionListIterator it(*(aProjectionsList.getProjections())); + while (it.hasNext()) { + it.next(); + + ProjectionItem anItem = it.value(); + if (!theProjections.contains(anItem.name)) + theProjections.insert(anItem.name, anItem); + } +} + +void ProjectionsList::addProjection(ProjectionItem aProjection) +{ + theProjections.insert(aProjection.name, aProjection); +} + +QString searchEPSG(QString name, QString filename) +{ + QString ret; + QString espgNum = name.remove("epsg:", Qt::CaseInsensitive); + QFile f(filename); + f.open(QIODevice::ReadOnly); + if (!f.isOpen()) + return ret; + + QString theEpsgNum("<" + espgNum + ">"); + while (!f.atEnd()) { + QByteArray epsg = f.readLine(); + + int idx = epsg.indexOf(theEpsgNum); + if (idx != -1) { + idx += theEpsgNum.length(); + int idx2 = epsg.indexOf("<>", idx); + ret = epsg.mid(idx, idx2 - idx); + break; + } + } + f.close(); + + return ret; +} + +ProjectionItem ProjectionsList::getProjection(QString name) const +{ + if (name.contains("+proj")) { + return ProjectionItem(name, name); + } + if (theProjections.contains(name)) + return theProjections.value(name); + else { + QMapIterator <QString, ProjectionItem> it(theProjections); + while (it.hasNext()) { + it.next(); + + if (it.value().deleted) + continue; + + if (it.key().contains(name, Qt::CaseInsensitive)) + return it.value(); + } + } + return ProjectionItem(name, QString("+init=%1").arg(name)); +} + +QMap <QString, ProjectionItem>* ProjectionsList::getProjections() +{ + return &theProjections; +} + +void ProjectionsList::toXml(QDomElement parent) +{ + QDomElement rt = parent.ownerDocument().createElement("Projections"); + parent.appendChild(rt); + rt.setAttribute("creator", QString("%1 v%2%3").arg(STRINGIFY(PRODUCT)).arg(STRINGIFY(VERSION)).arg(STRINGIFY(REVISION))); + + QMapIterator <QString, ProjectionItem> it(theProjections); + while (it.hasNext()) { + it.next(); + + ProjectionItem i = it.value(); + i.toXml(rt); + } +} + +ProjectionsList ProjectionsList::fromXml(QDomElement parent) +{ + ProjectionsList theProjections; + + if (parent.nodeName() == "Projections") { + QDomElement c = parent.firstChildElement(); + while(!c.isNull()) { + if (c.tagName() == "Projection") { + theProjections.addProjection(ProjectionItem::fromXml(c)); + } + + c = c.nextSiblingElement(); + } + } + + return theProjections; +} diff --git a/src/Preferences/ProjectionsList.h b/src/Preferences/ProjectionsList.h new file mode 100644 index 0000000..191e8e0 --- /dev/null +++ b/src/Preferences/ProjectionsList.h @@ -0,0 +1,51 @@ +// +// C++ Interface: ProjectionsList +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef PROJECTIONS_LIST_H +#define PROJECTIONS_LIST_H + +#include <QString> +#include <QMap> +#include <QtXml> + +class ProjectionItem +{ + public: + ProjectionItem (); + ProjectionItem (QString aName, QString aProjection, bool aDeleted = false); + QString name; + QString projection; + bool deleted; + + public: + void toXml(QDomElement parent); + static ProjectionItem fromXml(QDomElement parent); +}; + +typedef QMap <QString, ProjectionItem> ProjectionList; +typedef QMapIterator<QString, ProjectionItem> ProjectionListIterator; + +class ProjectionsList +{ + public: + void add(ProjectionsList aProjectionsList); + void addProjection(ProjectionItem aProjItem); + ProjectionItem getProjection(QString name) const; + ProjectionList* getProjections(); + void toXml(QDomElement parent); + static ProjectionsList fromXml(QDomElement parent); + + private: + ProjectionList theProjections; +}; + +#endif // PROJECTIONS_LIST_H diff --git a/src/Preferences/TMSPreferencesDialog.cpp b/src/Preferences/TMSPreferencesDialog.cpp new file mode 100644 index 0000000..5856122 --- /dev/null +++ b/src/Preferences/TMSPreferencesDialog.cpp @@ -0,0 +1,397 @@ +// +// C++ Implementation: TMSPreferencesDialog +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, Bart Vanhauwaert (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "TMSPreferencesDialog.h" + +#include <QMessageBox> +#include <QDir> +#include <QUrl> +#include <QTextEdit> +#include <QComboBox> + +TMSPreferencesDialog::TMSPreferencesDialog(QWidget* parent) + : QDialog(parent) +{ + setupUi(this); + frOSGeo->setVisible(false); + + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + connect (&http, SIGNAL(finished(QNetworkReply*)), this, SLOT(httpRequestFinished(QNetworkReply*))); + + loadPrefs(); +} + +TMSPreferencesDialog::~TMSPreferencesDialog() +{ +} + +void TMSPreferencesDialog::addServer(const TmsServer & srv) +{ + theTmsServers.push_back(srv); + if (!srv.deleted) { + QListWidgetItem* item = new QListWidgetItem(srv.TmsName); + item->setData(Qt::UserRole, (int) theTmsServers.size()-1); + lvTmsServers->addItem(item); + } +} + +void TMSPreferencesDialog::on_btApplyTmsServer_clicked(void) +{ + int idx = static_cast<int>(lvTmsServers->currentItem()->data(Qt::UserRole).toInt()); + if (idx >= theTmsServers.size()) + return; + + QUrl theUrl(edTmsUrl->text()); + QString theAdress = theUrl.toString(QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment); + + TmsServer& WS(theTmsServers[idx]); + + if (frOSGeo->isVisible()) { + if (!lvTmsServices->currentItem()) + return; + TileService ts = services[lvTmsServices->currentItem()->text()]; + theUrl = ts.Url; + theUrl.setPath(theUrl.path() + "/%1/%2/%3." + ts.Format); + WS.TmsBaseUrl = edTmsUrl->text(); + } + + WS.TmsName = edTmsName->text(); + WS.TmsAdress = theAdress; + WS.TmsPath = theUrl.toString(QUrl::RemoveScheme | QUrl::RemoveAuthority).replace(QRegExp("%25([123])"), "%\\1"); + WS.TmsTileSize = sbTileSize->value(); + WS.TmsMinZoom = sbMinZoom->value(); + WS.TmsMaxZoom = sbMaxZoom->value(); + WS.TmsBlOrigin = cbBotLeftOrigin->isChecked(); + WS.TmsSourceTag = edSourceTag->text(); + WS.TmsLicenseUrl = edLicenseUrl->text(); + if (cbSRS->currentIndex() == 1) + WS.TmsProjection = "EPSG:4326"; + else + WS.TmsProjection = "EPSG:900913"; + + + lvTmsServers->currentItem()->setText(WS.TmsName); + selectedServer = WS.TmsName; +} + +void TMSPreferencesDialog::on_btAddTmsServer_clicked(void) +{ + QUrl theUrl(edTmsUrl->text()); + QString theAdress = theUrl.toString(QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment); + + QString theBaseUrl; + if (frOSGeo->isVisible()) { + if (!lvTmsServices->currentItem()) + return; + TileService ts = services[lvTmsServices->currentItem()->text()]; + theUrl = ts.Url; + theUrl.setPath(theUrl.path() + "/%1/%2/%3." + ts.Format); + theBaseUrl = edTmsUrl->text(); + } + QString proj; + if (cbSRS->currentIndex() == 1) + proj = "EPSG:4326"; + else + proj = "EPSG:900913"; + + addServer( + TmsServer(edTmsName->text(), + theAdress, + theUrl.toString(QUrl::RemoveScheme | QUrl::RemoveAuthority).replace(QRegExp("%25([123])"), "%\\1"), + proj, + sbTileSize->value(), + sbMinZoom->value(), + sbMaxZoom->value(), + edSourceTag->text(), + edLicenseUrl->text(), + theBaseUrl, + cbBotLeftOrigin->isChecked()) + ); + lvTmsServers->setCurrentRow(lvTmsServers->count() - 1); + on_lvTmsServers_itemSelectionChanged(); +} + +void TMSPreferencesDialog::on_btDelTmsServer_clicked(void) +{ + int idx = static_cast<int>(lvTmsServers->currentItem()->data(Qt::UserRole).toInt()); + if (idx >= theTmsServers.size()) + return; + + theTmsServers[idx].deleted = true; + delete lvTmsServers->takeItem(lvTmsServers->currentRow()); + on_lvTmsServers_itemSelectionChanged(); +} + +void TMSPreferencesDialog::on_lvTmsServers_itemSelectionChanged() +{ + QListWidgetItem* it = lvTmsServers->item(lvTmsServers->currentRow()); + + int idx = it->data(Qt::UserRole).toInt(); + if (idx >= theTmsServers.size()) + return; + + TmsServer& WS(theTmsServers[idx]); + edTmsName->setText(WS.TmsName); + + if (WS.TmsAdress.contains("://")) { + edTmsUrl->setText(WS.TmsAdress + WS.TmsPath); + } else { + edTmsUrl->setText("http://" + WS.TmsAdress + WS.TmsPath); + } + sbTileSize->setValue(WS.TmsTileSize); + sbMinZoom->setValue(WS.TmsMinZoom); + sbMaxZoom->setValue(WS.TmsMaxZoom); + edSourceTag->setText(WS.TmsSourceTag); + edLicenseUrl->setText(WS.TmsLicenseUrl); + cbBotLeftOrigin->setChecked(WS.TmsBlOrigin); + int ix = cbSRS->findText(WS.TmsProjection, Qt::MatchContains | Qt::MatchCaseSensitive); + cbSRS->setCurrentIndex(ix); + + if (WS.TmsBaseUrl.isEmpty()) { + frOSGeo->setVisible(false); + cbSRS->setEnabled(true); + cbBotLeftOrigin->setEnabled(true); + sbTileSize->setEnabled(true); + sbMaxZoom->setEnabled(true); + sbMinZoom->setEnabled(true); + } else { + edTmsUrl->setText(WS.TmsBaseUrl); + + frOSGeo->setVisible(true); + cbSRS->setEnabled(false); + cbBotLeftOrigin->setEnabled(false); + sbTileSize->setEnabled(false); + sbMaxZoom->setEnabled(false); + sbMinZoom->setEnabled(false); + + on_btGetServices_clicked(); + } + + selectedServer = WS.TmsName; +} + +QString TMSPreferencesDialog::getSelectedServer() +{ + return selectedServer; +} + +void TMSPreferencesDialog::setSelectedServer(QString theValue) +{ + QList<QListWidgetItem *> L = lvTmsServers->findItems(theValue, Qt::MatchExactly); + lvTmsServers->setCurrentItem(L[0]); + on_lvTmsServers_itemSelectionChanged(); +} + +void TMSPreferencesDialog::on_buttonBox_clicked(QAbstractButton * button) +{ + if (button == buttonBox->button(QDialogButtonBox::Apply)) { + savePrefs(); + } else + if (button == buttonBox->button(QDialogButtonBox::Ok)) { + savePrefs(); + this->accept(); + } +} + +void TMSPreferencesDialog::loadPrefs() +{ + TmsServerList* L = M_PREFS->getTmsServers(); + TmsServerListIterator i(*L); + while (i.hasNext()) { + i.next(); + addServer(i.value()); + } +} + +void TMSPreferencesDialog::savePrefs() +{ + TmsServerList* L = M_PREFS->getTmsServers(); + L->clear(); + for (int i = 0; i < theTmsServers.size(); ++i) { + TmsServer S(theTmsServers[i]); + L->insert(theTmsServers[i].TmsName, S); + } + //M_PREFS->setSelectedTmsServer(getSelectedServer()); + M_PREFS->save(); +} + +void TMSPreferencesDialog::on_btGetServices_clicked() +{ + QUrl theUrl(edTmsUrl->text()); + if (theUrl.host().isEmpty() || theUrl.path().isEmpty()) { + QMessageBox::critical(this, tr("Merkaartor: GetServices"), tr("Address and Path cannot be blank."), QMessageBox::Ok); + } + + lvTmsServices->clear(); + services.clear(); + + http.setProxy(M_PREFS->getProxy(theUrl)); + + sendRequest(theUrl); +} + +QNetworkReply* TMSPreferencesDialog::sendRequest(QUrl url) +{ + qDebug() << "TMS: Sending request to" << url; + QNetworkRequest req(url); + req.setRawHeader(QByteArray("User-Agent"), USER_AGENT.toLatin1()); + + http.setProxy(M_PREFS->getProxy(url)); + + return http.get(req); +} + +/* +void TMSPreferencesDialog::readResponseHeader(const QHttpResponseHeader &responseHeader) +{ + qDebug() << responseHeader.toString(); + switch (responseHeader.statusCode()) + { + case 200: + break; + + case 301: + case 302: + case 307: + http->abort(); + sendRequest(QUrl(responseHeader.value("Location"))); + break; + + default: + http->abort(); + QMessageBox::information(this, tr("Merkaartor: GetServices"), + tr("Download failed: %1.") + .arg(responseHeader.reasonPhrase())); + } +} +*/ + +void TMSPreferencesDialog::httpRequestFinished( QNetworkReply *reply) +{ + qDebug() << "TMS: request finished."; + reply->deleteLater(); + if (reply->error()) { + if (reply->error() != QNetworkReply::OperationCanceledError) { + QMessageBox::critical(this, tr("Merkaartor: GetServices"), tr("Error reading services. The server probably does not support this feature.\n"), QMessageBox::Ok); + qDebug() << "TMS GetServices error:" << reply->errorString(); + } + return; + } + + /* Check for redirects */ + QVariant redir = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); + if (redir.isValid()) { + sendRequest(QUrl(redir.toString())); + } + + QDomDocument doc; + QString content = reply->readAll(); + qDebug() << content; + doc.setContent(content); + if (doc.isNull()) + return; + + QDomElement e = doc.firstChildElement(); + if (e.nodeName() == "Services") { + QDomNodeList l = e.elementsByTagName("TileMapService"); + for (int i=0; i<l.size(); ++i) { + QString href = l.at(i).toElement().attribute("href"); + if (!href.isNull()) { + sendRequest(QUrl(href)); + } + } + } else if (e.nodeName() == "TileMapService") { + QDomNodeList l = e.elementsByTagName("TileMap"); + for (int i=0; i<l.size(); ++i) { + QString href = l.at(i).toElement().attribute("href"); + if (!href.isNull()) { + sendRequest(QUrl(href)); + } + } + } else if (e.nodeName() == "TileMap") { + QString url; + QString title; + QString srs; + CoordBox bbox; + Coord origin; + QSize tilesize; + QString tileformat; + int minzoom = 9999, maxzoom = 0; + + url = e.attribute("tilemapservice"); + QDomElement c = e.firstChildElement(); + while (!c.isNull()) { + if (c.nodeName() == "Title") { + title = c.firstChild().toText().nodeValue(); + url = url + title + "/"; + } else if (c.nodeName() == "SRS") { + srs = c.firstChild().toText().nodeValue(); + } else if (c.nodeName() == "BoundingBox") { + Coord bl(c.attribute("minx").toDouble(), c.attribute("miny").toDouble()); + Coord tr(c.attribute("maxx").toDouble(), c.attribute("maxy").toDouble()); + bbox = CoordBox(bl, tr); + } else if (c.nodeName() == "Origin") { + Coord pt(c.attribute("x").toDouble(), c.attribute("y").toDouble()); + origin = pt; + } else if (c.nodeName() == "TileFormat") { + tilesize.setWidth(c.attribute("width").toInt()); + tilesize.setHeight(c.attribute("height").toInt()); + tileformat = c.attribute("extension"); + } else if (c.nodeName() == "TileSets") { + QDomElement t = c.firstChildElement(); + while (!t.isNull()) { + int o = t.attribute("order").toInt(); + minzoom = o < minzoom ? o : minzoom; + maxzoom = o > maxzoom ? o : maxzoom; + t = t.nextSiblingElement(); + } + } + c = c.nextSiblingElement(); + } + TileService ts; + ts.Title = title; + ts.Url = url; + ts.SRS = srs; + ts.TileSize = tilesize.width(); + ts.MinZoom = minzoom; + ts.MaxZoom = maxzoom; + ts.BBox = bbox; + ts.Format = tileformat; + Coord center = bbox.center(); + if (origin.y() < center.y()) + ts.Origin = true; + else + ts.Origin = false; + + services.insert(title, ts); + + lvTmsServices->addItem(title); + frOSGeo->setVisible(true); + cbSRS->setEnabled(false); + cbBotLeftOrigin->setEnabled(false); + sbTileSize->setEnabled(false); + sbMaxZoom->setEnabled(false); + sbMinZoom->setEnabled(false); + } +} + +void TMSPreferencesDialog::on_lvTmsServices_itemSelectionChanged() +{ + TileService ts = services[lvTmsServices->currentItem()->text()]; + int ix = cbSRS->findText(ts.SRS, Qt::MatchContains); + cbSRS->setCurrentIndex(ix); + cbBotLeftOrigin->setChecked(ts.Origin); + sbTileSize->setValue(ts.TileSize); + sbMinZoom->setValue(ts.MinZoom); + sbMaxZoom->setValue(ts.MaxZoom); +} + diff --git a/src/Preferences/TMSPreferencesDialog.h b/src/Preferences/TMSPreferencesDialog.h new file mode 100644 index 0000000..a50c3ed --- /dev/null +++ b/src/Preferences/TMSPreferencesDialog.h @@ -0,0 +1,86 @@ +// +// C++ Interface: TMSPreferencesDialog +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef TMSPREFERENCESDIALOG_H +#define TMSPREFERENCESDIALOG_H + +#include <QWidget> +#include <QBuffer> +#include <QNetworkAccessManager> + + +#include <ui_TMSPreferencesDialog.h> +#include "MerkaartorPreferences.h" + +#include <QList> + +class TileService +{ +public: + QString Title; + QUrl Url; + QString SRS; + QString Format; + bool Origin; + CoordBox BBox; + int TileSize; + int MinZoom; + int MaxZoom; +}; +typedef QHash<QString, TileService> TileServiceList; + +/** + @author cbro <cbro@semperpax.com> +*/ + +class TMSPreferencesDialog : public QDialog, public Ui::TMSPreferencesDialog +{ + Q_OBJECT + +public: + TMSPreferencesDialog(QWidget* parent = 0); + ~TMSPreferencesDialog(); + + void addServer(const TmsServer & srv); + +public slots: + void on_btApplyTmsServer_clicked(); + void on_btAddTmsServer_clicked(); + void on_btDelTmsServer_clicked(); + void on_lvTmsServers_itemSelectionChanged(); + void on_lvTmsServices_itemSelectionChanged(); + void on_buttonBox_clicked(QAbstractButton * button); + + void on_btGetServices_clicked(); + +private: + void loadPrefs(); + void savePrefs(); + + QNetworkReply* sendRequest(QUrl url); + +private slots: + void httpRequestFinished( QNetworkReply *reply); + +public: + QList<TmsServer> theTmsServers; + QString getSelectedServer(); + void setSelectedServer(QString theValue); + +private: + QString selectedServer; + QNetworkAccessManager http; + QBuffer* buf; + TileServiceList services; + +}; + +#endif diff --git a/src/Preferences/TMSPreferencesDialog.ui b/src/Preferences/TMSPreferencesDialog.ui new file mode 100644 index 0000000..18cb9d9 --- /dev/null +++ b/src/Preferences/TMSPreferencesDialog.ui @@ -0,0 +1,361 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>TMSPreferencesDialog</class> + <widget class="QDialog" name="TMSPreferencesDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>594</width> + <height>551</height> + </rect> + </property> + <property name="windowTitle"> + <string>TMS servers setup</string> + </property> + <layout class="QVBoxLayout"> + <item> + <widget class="QGroupBox" name="grpWmsServers"> + <property name="title"> + <string>TMS Servers</string> + </property> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>1</number> + </property> + <property name="margin"> + <number>1</number> + </property> + <item> + <widget class="QFrame" name="frame_2"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>5</number> + </property> + <property name="margin"> + <number>5</number> + </property> + <item> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Server list:</string> + </property> + </widget> + </item> + <item> + <widget class="QListWidget" name="lvTmsServers"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QFrame" name="frame"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label_11"> + <property name="text"> + <string>Name:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edTmsName"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Server Url:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edTmsUrl"/> + </item> + </layout> + </item> + <item> + <widget class="QPushButton" name="btGetServices"> + <property name="text"> + <string>Get Services</string> + </property> + </widget> + </item> + <item> + <widget class="QFrame" name="frOSGeo"> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Services :</string> + </property> + </widget> + </item> + <item> + <widget class="QListWidget" name="lvTmsServices"/> + </item> + <item> + <widget class="QLabel" name="label_6"> + <property name="styleSheet"> + <string notr="true">QLabel { font-weight: bold; }</string> + </property> + <property name="text"> + <string>This is a standard TMS server.</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QFrame" name="frOSM"> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_6"> + <item> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>Projection:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="cbSRS"> + <item> + <property name="text"> + <string>Mercator (EPSG:900913)</string> + </property> + </item> + <item> + <property name="text"> + <string>Lat/Lon (EPSG:4326)</string> + </property> + </item> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QCheckBox" name="cbBotLeftOrigin"> + <property name="text"> + <string>Origin is bottom-left</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <item> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Tile size:</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="sbTileSize"> + <property name="maximum"> + <number>9999</number> + </property> + <property name="singleStep"> + <number>64</number> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_8"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Min zoom:</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="sbMinZoom"/> + </item> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Max zoom:</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="sbMaxZoom"/> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>"source" tag value:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edSourceTag"/> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QLabel" name="label_9"> + <property name="text"> + <string>License URL:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edLicenseUrl"/> + </item> + </layout> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_5"> + <item> + <widget class="QPushButton" name="btApplyTmsServer"> + <property name="text"> + <string>Apply</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btAddTmsServer"> + <property name="text"> + <string>Add</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btDelTmsServer"> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>TMSPreferencesDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>TMSPreferencesDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/Preferences/TmsServersList.cpp b/src/Preferences/TmsServersList.cpp new file mode 100644 index 0000000..95f59b5 --- /dev/null +++ b/src/Preferences/TmsServersList.cpp @@ -0,0 +1,178 @@ +// +// C++ Implementation: TmsServersList +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include <QApplication> + +#include "TmsServersList.h" +#include "MerkaartorPreferences.h" + +TmsServer::TmsServer() +{ + TmsServer(QApplication::translate("MerkaartorPreferences","New Server"), QString(), QString(), "EPSG:3857", 256, 0, 17, QString(), QString()); +} + +TmsServer::TmsServer(QString Name, QString Adress, QString Path, QString Projection, int tileSize, int minZoom, int maxZoom, QString SourceTag, QString LicenseUrl, QString baseUrl, bool Origin, bool Deleted) + : TmsName(Name) + , TmsAdress(Adress) + , TmsPath(Path) + , TmsProjection(Projection) + , TmsTileSize(tileSize) + , TmsMinZoom(minZoom) + , TmsMaxZoom(maxZoom) + , TmsSourceTag(SourceTag) + , TmsLicenseUrl(LicenseUrl) + , TmsBaseUrl(baseUrl) + , TmsBlOrigin(Origin) + , deleted(Deleted) +{ + if (Name.isEmpty()) { + TmsName = QApplication::translate("MerkaartorPreferences","New Server"); + } +} + +void TmsServer::toXml(QDomElement parent) +{ + QDomElement p = parent.ownerDocument().createElement("TmsServer"); + parent.appendChild(p); + p.setAttribute("name", TmsName); + p.setAttribute("address", TmsAdress); + p.setAttribute("path", TmsPath); + p.setAttribute("tilesize", QString::number(TmsTileSize)); + p.setAttribute("minzoom", QString::number(TmsMinZoom)); + p.setAttribute("maxzoom", QString::number(TmsMaxZoom)); + if (!TmsSourceTag.isEmpty()) + p.setAttribute("sourcetag", TmsSourceTag); + if (!TmsLicenseUrl.isEmpty()) + p.setAttribute("licenseurl", TmsLicenseUrl); + if (!TmsProjection.isEmpty()) + p.setAttribute("projection", TmsProjection); + if (!TmsBaseUrl.isEmpty()) + p.setAttribute("tmsBaseUrl", TmsBaseUrl); + if (TmsBlOrigin) + p.setAttribute("tmsorigin", "true"); + if (deleted) + p.setAttribute("deleted", "true"); +} + +TmsServer TmsServer::fromXml(QDomElement parent) +{ + TmsServer theServer; + + if (parent.tagName() == "TmsServer") { + theServer.TmsName = parent.attribute("name"); + theServer.TmsAdress = parent.attribute("address"); + theServer.TmsPath = parent.attribute("path"); + if (parent.hasAttribute("projection")) + theServer.TmsProjection = parent.attribute("projection"); + else + theServer.TmsProjection = "EPSG:900913"; + theServer.TmsTileSize = parent.attribute("tilesize").toInt(); + theServer.TmsMinZoom = parent.attribute("minzoom").toInt(); + theServer.TmsMaxZoom = parent.attribute("maxzoom").toInt(); + theServer.TmsSourceTag = parent.attribute("sourcetag"); + theServer.TmsLicenseUrl = parent.attribute("licenseurl"); + theServer.TmsBaseUrl = parent.attribute("tmsBaseUrl"); + theServer.TmsBlOrigin = (parent.attribute("tmsorigin") == "true" ? true : false); + theServer.deleted = (parent.attribute("deleted") == "true" ? true : false); + } + + return theServer; +} + +/** **/ + +void TmsServersList::add(TmsServersList aTmsServersList) +{ + QMapIterator <QString, TmsServer> it(*(aTmsServersList.getServers())); + while (it.hasNext()) { + it.next(); + + TmsServer anItem = it.value(); + if (!theServers.contains(anItem.TmsName)) + theServers.insert(anItem.TmsName, anItem); + } +} + +TmsServerList* TmsServersList::getServers() +{ + return &theServers; +} + +void TmsServersList::addServer(TmsServer aServer) +{ + theServers.insert(aServer.TmsName, aServer); +} + +bool TmsServersList::contains(QString name) const +{ + if (theServers.contains(name)) + return true; + else { + TmsServerListIterator it(theServers); + while (it.hasNext()) { + it.next(); + + if (it.key().contains(name, Qt::CaseInsensitive)) + return true; + } + } + return false; +} + +TmsServer TmsServersList::getServer(QString name) const +{ + if (theServers.contains(name)) + return theServers.value(name); + else { + TmsServerListIterator it(theServers); + while (it.hasNext()) { + it.next(); + + if (it.key().contains(name, Qt::CaseInsensitive)) + return it.value(); + } + } + return TmsServer(); +} + +void TmsServersList::toXml(QDomElement parent) +{ + QDomElement rt = parent.ownerDocument().createElement("TmsServers"); + parent.appendChild(rt); + rt.setAttribute("creator", QString("%1 v%2").arg(STRINGIFY(PRODUCT)).arg(STRINGIFY(VERSION))); + + TmsServerListIterator it(theServers); + while (it.hasNext()) { + it.next(); + + TmsServer i = it.value(); + i.toXml(rt); + } +} + +TmsServersList TmsServersList::fromXml(QDomElement parent) +{ + TmsServersList theServersList; + + if (parent.nodeName() == "TmsServers") { + QDomElement c = parent.firstChildElement(); + while(!c.isNull()) { + if (c.tagName() == "TmsServer") { + theServersList.addServer(TmsServer::fromXml(c)); + } + + c = c.nextSiblingElement(); + } + } + + return theServersList; +} diff --git a/src/Preferences/TmsServersList.h b/src/Preferences/TmsServersList.h new file mode 100644 index 0000000..256e008 --- /dev/null +++ b/src/Preferences/TmsServersList.h @@ -0,0 +1,61 @@ +// +// C++ Interface: TMSServersList +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef TMSSERVERS_LIST_H +#define TMSSERVERS_LIST_H + +#include <QString> +#include <QMap> +#include <QtXml> + +class TmsServer +{ + public: + TmsServer(); + TmsServer(QString Name, QString Adress, QString Path, QString Projection, int tileSize, int minZoom, int maxZoom, QString SourceTag, QString LicenseUrl, QString TmsBaseUrl = QString(), bool Origin=false, bool Deleted=false); + + void toXml(QDomElement parent); + static TmsServer fromXml(QDomElement parent); + + public: + QString TmsName; + QString TmsAdress; + QString TmsPath; + QString TmsProjection; + int TmsTileSize; + int TmsMinZoom; + int TmsMaxZoom; + QString TmsSourceTag; + QString TmsLicenseUrl; + QString TmsBaseUrl; + bool TmsBlOrigin; + bool deleted; +}; +typedef QMap<QString, TmsServer> TmsServerList; +typedef QMapIterator<QString, TmsServer> TmsServerListIterator; + +class TmsServersList +{ + public: + void add(TmsServersList aTmsServersList); + void addServer(TmsServer aServer); + bool contains(QString name) const; + TmsServerList* getServers(); + TmsServer getServer(QString name) const; + void toXml(QDomElement parent); + static TmsServersList fromXml(QDomElement parent); + + private: + TmsServerList theServers; +}; + +#endif // TMSSERVERS_LIST_H diff --git a/src/Preferences/WMSPreferencesDialog.cpp b/src/Preferences/WMSPreferencesDialog.cpp new file mode 100644 index 0000000..ec3e6c7 --- /dev/null +++ b/src/Preferences/WMSPreferencesDialog.cpp @@ -0,0 +1,747 @@ +// +// C++ Implementation: WMSPreferencesDialog +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, Bart Vanhauwaert (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "WMSPreferencesDialog.h" + +#include <QMessageBox> +#include <QDir> +#include <QUrl> +#include <QTextEdit> +#include <QComboBox> +#include <QNetworkReply> + +// from wikipedia +#define EQUATORIALRADIUS 6378137.0 +#define POLARRADIUS 6356752.0 +#define EQUATORIALMETERCIRCUMFERENCE 40075016.68 +#define EQUATORIALMETERHALFCIRCUMFERENCE 20037508.34 +#define EQUATORIALMETERPERDEGREE 222638.981555556 + +WMSPreferencesDialog::WMSPreferencesDialog(QWidget* parent) + : QDialog(parent), curReply(0) +{ + setupUi(this); + + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + loadPrefs(); + + edWmsLayers->setVisible(false); + frWmsSettings->setVisible(true); + isTiled = 0; + frTileIt->setEnabled(false); + edWmsUrl->setValidator(&wmsValid); + + connect(tvWmsLayers, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(on_tvWmsLayers_itemChanged(QTreeWidgetItem *, int))); + connect(&m_networkManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(httpRequestFinished(QNetworkReply *))); +} + +WMSPreferencesDialog::~WMSPreferencesDialog() +{ +} + +void WMSPreferencesDialog::updateUrl() +{ + QUrl theUrl(edWmsUrl->text()); +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + // FIXME: I'm not sure this is correct. Needs testing. + QUrlQuery theQuery(theUrl); +#else +#define theQuery theUrl +#endif + if (!theQuery.hasQueryItem("VERSION")) + theQuery.addQueryItem("VERSION", "1.1.1"); + if (!theQuery.hasQueryItem("SERVICE")) + theQuery.addQueryItem("SERVICE", "WMS"); + + theQuery.removeQueryItem("TRANSPARENT"); theQuery.addQueryItem("TRANSPARENT", "TRUE"); + theQuery.removeQueryItem("LAYERS"); theQuery.addQueryItem("LAYERS", edWmsLayers->text()); + theQuery.removeQueryItem("SRS"); theQuery.addQueryItem("SRS", cbWmsProj->currentText()); + theQuery.removeQueryItem("STYLES"); theQuery.addQueryItem("STYLES", cbWmsStyle->currentText()); + theQuery.removeQueryItem("FORMAT"); theQuery.addQueryItem("FORMAT", cbWmsImgFormat->currentText()); +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + theUrl.setQuery(theQuery); +#else +#undef theQuery +#endif + edWmsUrl->setText(theUrl.toString()); +} + +void WMSPreferencesDialog::addServer(const WmsServer & srv) +{ + theWmsServers.push_back(srv); + if (!srv.deleted) { + QListWidgetItem* item = new QListWidgetItem(srv.WmsName); + item->setData(Qt::UserRole, (int)(theWmsServers.size()-1)); + lvWmsServers->addItem(item); + } +} + +void WMSPreferencesDialog::generateWmscLayer() +{ + selWmscLayer.LayerName = edWmsLayers->text(); + selWmscLayer.Projection = cbWmsProj->currentText(); + selWmscLayer.Styles = cbWmsStyle->currentText(); + selWmscLayer.ImgFormat = cbWmsImgFormat->currentText(); + selWmscLayer.TileHeight = 256; + selWmscLayer.TileWidth = 256; + qreal startRes; + if (selWmscLayer.Projection.contains("4326")) { + selWmscLayer.BoundingBox = QRectF(QPointF(-180, -90.), QPointF(180., 90.)); + startRes = 0.703125; + } else { + selWmscLayer.BoundingBox = QRectF(QPointF(-EQUATORIALMETERHALFCIRCUMFERENCE, -EQUATORIALMETERHALFCIRCUMFERENCE), QPointF(EQUATORIALMETERHALFCIRCUMFERENCE, EQUATORIALMETERHALFCIRCUMFERENCE)); + startRes = 156543.03; + } + selWmscLayer.Resolutions.clear(); + selWmscLayer.Resolutions << startRes; + for (int i=1; i<sbZoomLevels->value(); ++i) { + startRes /= 2.; + selWmscLayer.Resolutions << startRes; + } +} + +void WMSPreferencesDialog::on_edWmsUrl_textEdited(const QString &newText) +{ + QUrl theUrl(newText); +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + QUrlQuery theQuery(theUrl); +#define theQuery theQuery +#else +#define theQuery theUrl +#endif + + if (theQuery.hasQueryItem("LAYERS")) + edWmsLayers->setText(QUrl::fromPercentEncoding(theQuery.queryItemValue("LAYERS").toLatin1())); + if (theQuery.hasQueryItem("SRS")) + cbWmsProj->setEditText(QUrl::fromPercentEncoding(theQuery.queryItemValue("SRS").toLatin1())); + if (theQuery.hasQueryItem("STYLES")) + cbWmsStyle->setEditText(QUrl::fromPercentEncoding(theQuery.queryItemValue("STYLES").toLatin1())); + if (theQuery.hasQueryItem("FORMAT")) + cbWmsImgFormat->setEditText(QUrl::fromPercentEncoding(theQuery.queryItemValue("FORMAT").toLatin1())); +#undef theQuery +} + +void WMSPreferencesDialog::on_edWmsUrl_editingFinished() +{ + QUrl u(edWmsUrl->text()); + if (u.isValid() && !u.host().isEmpty() && !u.path().isEmpty()) { + showCapabilities(); + } +} + +void WMSPreferencesDialog::on_btApplyWmsServer_clicked(void) +{ + int idx = lvWmsServers->currentItem()->data(Qt::UserRole).toInt(); + if (idx >= theWmsServers.size()) + return; + + QUrl theUrl(edWmsUrl->text()); + + WmsServer& WS(theWmsServers[idx]); + WS.WmsName = edWmsName->text(); + WS.WmsAdress = theUrl.host(); + if (theUrl.port() != -1) + WS.WmsAdress += ":" + QString::number(theUrl.port()); + WS.WmsPath = theUrl.toString(QUrl::RemoveScheme | QUrl::RemoveAuthority); + WS.WmsLayers = edWmsLayers->text(); + WS.WmsProjections = cbWmsProj->currentText(); + WS.WmsStyles = cbWmsStyle->currentText(); + WS.WmsImgFormat = cbWmsImgFormat->currentText(); + if (cbTileIt->isChecked()) { + isTiled = 2; + generateWmscLayer(); + } + if (isTiled) { + WS.WmsCLayer = selWmscLayer; + WS.WmsProjections = selWmscLayer.Projection; + WS.WmsImgFormat = selWmscLayer.ImgFormat; + WS.WmsStyles = selWmscLayer.Styles; + } + WS.WmsIsTiled = isTiled; + WS.WmsSourceTag = edSourceTag->text(); + WS.WmsLicenseUrl = edLicenseUrl->text(); + + lvWmsServers->currentItem()->setText(WS.WmsName); + selectedServer = WS.WmsName; +} + +void WMSPreferencesDialog::on_btAddWmsServer_clicked(void) +{ + QUrl theUrl(edWmsUrl->text()); + QString theAdress = theUrl.host(); + if (theUrl.port() != -1) + theAdress += ":" + QString::number(theUrl.port()); + if (cbTileIt->isChecked()) { + isTiled = 2; + generateWmscLayer(); + } + if (isTiled) + addServer(WmsServer(edWmsName->text(), theAdress, theUrl.toString(QUrl::RemoveScheme | QUrl::RemoveAuthority), + edWmsLayers->text() + , edSourceTag->text() + , edLicenseUrl->text() + , selWmscLayer.Projection, selWmscLayer.Styles, selWmscLayer.ImgFormat + , isTiled, selWmscLayer)); + else + addServer(WmsServer(edWmsName->text(), theAdress, theUrl.toString(QUrl::RemoveScheme | QUrl::RemoveAuthority), + edWmsLayers->text() + , edSourceTag->text() + , edLicenseUrl->text() + , cbWmsProj->currentText(), cbWmsStyle->currentText(), cbWmsImgFormat->currentText())); + lvWmsServers->setCurrentRow(lvWmsServers->count() - 1); +// on_lvWmsServers_itemSelectionChanged(); +} + +void WMSPreferencesDialog::on_btDelWmsServer_clicked(void) +{ + int idx = lvWmsServers->currentItem()->data(Qt::UserRole).toInt(); + if (idx >= theWmsServers.size()) + return; + + theWmsServers[idx].deleted = true; + delete lvWmsServers->currentItem(); + on_lvWmsServers_itemSelectionChanged(); +} + +void WMSPreferencesDialog::on_lvWmsServers_itemSelectionChanged() +{ + frTileIt->setEnabled(false); + cbTileIt->setChecked(false); + sbZoomLevels->setValue(0); + setStatus( Empty ); + frWmsSettings->setVisible(true); + isTiled = 0; + selWmscLayer = WmscLayer(); + + QListWidgetItem* it = lvWmsServers->item(lvWmsServers->currentRow()); + + int idx = it->data(Qt::UserRole).toInt(); + if (idx >= theWmsServers.size()) + return; + + WmsServer& WS(theWmsServers[idx]); + edWmsName->setText(WS.WmsName); + edWmsUrl->setText("http://" + WS.WmsAdress + WS.WmsPath); + edWmsLayers->setText(WS.WmsLayers); + cbWmsProj->setEditText(WS.WmsProjections); + cbWmsStyle->setEditText(WS.WmsStyles); + cbWmsImgFormat->setEditText(WS.WmsImgFormat); + edSourceTag->setText(WS.WmsSourceTag); + edLicenseUrl->setText(WS.WmsLicenseUrl); + isTiled = WS.WmsIsTiled; + if (isTiled > 0) + selWmscLayer = WS.WmsCLayer; + if (isTiled == 2) { + frTileIt->setEnabled(true); + cbTileIt->setChecked(true); + sbZoomLevels->setValue(selWmscLayer.Resolutions.size()); + } + on_cbWmsProj_activated(WS.WmsProjections); + + selectedServer = WS.WmsName; + + if (curReply) { + curReply->abort(); + } + QUrl u(edWmsUrl->text()); + if (u.isValid() && !u.host().isEmpty() && !u.path().isEmpty()) { + showCapabilities(); + } +} + +void WMSPreferencesDialog::on_cbWmsProj_activated(const QString &text) +{ + frTileIt->setEnabled(false); + if ( + text.toUpper().contains("OSGEO:41001") || + text.toUpper().contains("EPSG:3785") || + text.toUpper().contains("EPSG:900913") || + text.toUpper().contains("EPSG:3857") || + text.toUpper().contains("EPSG:4326") + ) + { + frTileIt->setEnabled(true); + } + updateUrl(); +} + +void WMSPreferencesDialog::refreshStyles() +{ + QStringList layers = edWmsLayers->text().split(','); + QStringList theStyles; + foreach(QString l, layers) { + theStyles << styles[l]; + } + cbWmsStyle->setEditText(theStyles.join(",")); + + updateUrl(); +} + +void WMSPreferencesDialog::on_cbWmsStyle_activated(int index) +{ + QString style = cbWmsStyle->itemData(index).toString(); + styles[curLayer] = style; + + refreshStyles(); +} + +void WMSPreferencesDialog::on_cbWmsStyle_editTextChanged(const QString &/*newText*/) +{ + updateUrl(); +} + +void WMSPreferencesDialog::on_cbWmsImgFormat_activated(const QString &/*text*/) +{ + updateUrl(); +} + +QString WMSPreferencesDialog::getSelectedServer() +{ + return selectedServer; +} + +void WMSPreferencesDialog::setSelectedServer(QString theValue) +{ + QList<QListWidgetItem *> L = lvWmsServers->findItems(theValue, Qt::MatchExactly); + if (L.size()) { + lvWmsServers->setCurrentItem(L[0]); + on_lvWmsServers_itemSelectionChanged(); + } +} + +void WMSPreferencesDialog::on_buttonBox_clicked(QAbstractButton * button) +{ + if (button == buttonBox->button(QDialogButtonBox::Apply)) { + savePrefs(); + } else + if (button == buttonBox->button(QDialogButtonBox::Ok)) { + savePrefs(); + this->accept(); + } +} + +void WMSPreferencesDialog::loadPrefs() +{ + WmsServerList* L = M_PREFS->getWmsServers(); + WmsServerListIterator i(*L); + while (i.hasNext()) { + i.next(); + addServer(i.value()); + } +} + +void WMSPreferencesDialog::savePrefs() +{ + WmsServerList* L = M_PREFS->getWmsServers(); + L->clear(); + for (int i = 0; i < theWmsServers.size(); ++i) { + WmsServer S(theWmsServers[i]); + L->insert(theWmsServers[i].WmsName, S); + } + //M_PREFS->setSelectedWmsServer(getSelectedServer()); + M_PREFS->save(); +} + +void WMSPreferencesDialog::showCapabilities(void) +{ + if (curReply) + return; + + QUrl theUrl(edWmsUrl->text()); +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + QUrlQuery theQuery(theUrl); +#define theQuery theQuery +#else +#define theQuery theUrl +#endif + if (theUrl.host().isEmpty() || theUrl.path().isEmpty()) { + QMessageBox::critical(this, tr("Merkaartor: GetCapabilities"), tr("Address and Path cannot be blank."), QMessageBox::Ok); + } + + if (!theQuery.hasQueryItem("VERSION")) + theQuery.addQueryItem("VERSION", "1.1.1"); + if (!theQuery.hasQueryItem("SERVICE")) + theQuery.addQueryItem("SERVICE", "WMS"); + theQuery.removeAllQueryItems("LAYERS"); + theQuery.removeAllQueryItems("SRS"); + theQuery.removeAllQueryItems("FORMAT"); + theQuery.removeAllQueryItems("STYLES"); + theQuery.addQueryItem("REQUEST", "GetCapabilities"); + +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + theUrl.setQuery(theQuery); +#endif +#undef theQuery +// QUrl url(edWmsUrl->text() + "VERSION=1.1.1&SERVICE=WMS&request=GetCapabilities"); + + requestCapabilities(theUrl); +} + +void WMSPreferencesDialog::requestCapabilities(QUrl url) +{ + if (curReply) + return; + + tvWmsLayers->clear(); + + QString oldSrs = cbWmsProj->currentText(); + cbWmsProj->clear(); + cbWmsProj->setEditText(oldSrs); + + QString oldFormat = cbWmsImgFormat->currentText(); + cbWmsImgFormat->clear(); + cbWmsImgFormat->setEditText(oldFormat); + + m_networkManager.setProxy(M_PREFS->getProxy(url)); + QNetworkRequest req(url); + req.setRawHeader("Host", url.host().toLatin1()); + req.setRawHeader("User-Agent", USER_AGENT.toLatin1()); + + curReply = m_networkManager.get(req); +} + +void WMSPreferencesDialog::httpRequestFinished(QNetworkReply * reply) +{ + if (reply != curReply) + return; + + setStatus( Empty ); + + int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + if (reply->error() != QNetworkReply::NoError) { + if (reply->error() != QNetworkReply::OperationCanceledError) + setStatus( ErrorGetCapabilities, reply->errorString() ); + //QMessageBox::critical(this, tr("Merkaartor: GetCapabilities"), tr("Error reading capabilities.\n") + reply->errorString(), QMessageBox::Ok); + } else { + switch (statusCode) { + case 200: + break; + case 301: + case 302: + case 307: + // Redirected + requestCapabilities(reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl()); + curReply->deleteLater(); + curReply = NULL; + return; + default: + QString reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); + setStatus( ErrorGetCapabilities, reason); + /* + QMessageBox::information(this, tr("Merkaartor: GetCapabilities"), + tr("Download failed: %1.") + .arg(statusCode)); */ + curReply->deleteLater(); + curReply = NULL; + return; + } + } + + frWmsSettings->setVisible(true); + isTiled = 0; + + QDomDocument theXmlDoc; + QByteArray buf; + buf = reply->readAll(); +// QString src(buf); +// qDebug() << src; + theXmlDoc.setContent(buf); + curReply->deleteLater(); + curReply = NULL; + + + QDomElement docElem = theXmlDoc.documentElement(); + + if (edWmsName->text().isEmpty()) { + QDomElement svcElem = docElem.firstChildElement("Service"); + if (!svcElem.isNull()) { + QDomNodeList aNodeList = svcElem.elementsByTagName("Title"); + if (aNodeList.size()) + edWmsName->setText(aNodeList.item(0).firstChild().nodeValue()); + } + } + + QDomElement capElem = docElem.firstChildElement("Capability"); + if (capElem.isNull()) { + // No "Capability" + return; + } + + srsList.clear(); + styleList.clear(); + QDomElement layElem = capElem.firstChildElement("Layer"); + while(!layElem.isNull()) { + QTreeWidgetItem* it = parseLayer(layElem, NULL); + tvWmsLayers->addTopLevelItem(it); + tvWmsLayers->expandItem(it); + + layElem = layElem.nextSiblingElement("Layer"); + } + + QString oldStyle = cbWmsStyle->currentText(); +// cbWmsProj->clear(); +// srsList.sort(); +// cbWmsProj->addItems(srsList); + cbWmsStyle->setEditText(oldStyle); +// on_cbWmsProj_currentIndexChanged(oldSrs); + + QDomElement reqElem = capElem.firstChildElement("Request"); + QDomElement GetMapElem = reqElem.firstChildElement("GetMap"); + QDomNodeList formatNodeList = GetMapElem.elementsByTagName("Format"); + + QStringList formatList; + QString oldFormat = cbWmsImgFormat->currentText(); + cbWmsImgFormat->clear(); + for (int i=0; i<formatNodeList.size(); ++i) { + if (!formatList.contains(formatNodeList.item(i).firstChild().nodeValue())) + formatList.append(formatNodeList.item(i).firstChild().nodeValue()); + } + formatList.sort(); + cbWmsImgFormat->addItems(formatList); + cbWmsImgFormat->setEditText(oldFormat); + on_cbWmsImgFormat_activated(oldFormat); + + QDomElement vendorElem = capElem.firstChildElement("VendorSpecificCapabilities"); + if (!vendorElem.isNull()) { + parseVendorSpecific(vendorElem); + } + + tvWmsLayers->setCurrentItem(tvWmsLayers->topLevelItem(0)); +} + +void WMSPreferencesDialog::parseVendorSpecific(QDomElement &vendorElem) +{ + QDomElement elem = vendorElem.firstChildElement(); + while(!elem.isNull()) { + if (elem.tagName() == "TileSet") { + WmscLayer aLayer; + parseTileSet(elem, aLayer); + if (!aLayer.LayerName.isNull()) + wmscLayers << aLayer; + } + elem = elem.nextSiblingElement(); + } +} + +void WMSPreferencesDialog::parseTileSet(QDomElement &tilesetElem, WmscLayer &aLayer) +{ + setStatus( Caching ); + frWmsSettings->setVisible(false); + isTiled = 1; + + QDomElement elem = tilesetElem.firstChildElement(); + while(!elem.isNull()) { + if (elem.tagName() == "Layers") { + aLayer.LayerName = elem.firstChild().nodeValue(); + } else if (elem.tagName() == "SRS") { + aLayer.Projection = elem.firstChild().nodeValue(); + } else if (elem.tagName() == "Format") { + aLayer.ImgFormat = elem.firstChild().nodeValue(); + } else if (elem.tagName() == "Styles") { + aLayer.Styles = elem.firstChild().nodeValue(); + } else if (elem.tagName() == "BoundingBox") { + QPointF tl, br; + tl.setX(elem.attribute("minx").toDouble()); + tl.setY(elem.attribute("miny").toDouble()); + br.setX(elem.attribute("maxx").toDouble()); + br.setY(elem.attribute("maxy").toDouble()); + aLayer.BoundingBox = QRectF(tl, br); + } else if (elem.tagName() == "Resolutions") { + QStringList resL; + resL = elem.firstChild().nodeValue().split(" ", QString::SkipEmptyParts); + foreach(QString res, resL) + aLayer.Resolutions << res.toDouble(); + } else if (elem.tagName() == "Width") { + aLayer.TileWidth = elem.firstChild().nodeValue().toInt(); + } else if (elem.tagName() == "Height") { + aLayer.TileHeight = elem.firstChild().nodeValue().toInt(); + } + + elem = elem.nextSiblingElement(); + } +} + +QTreeWidgetItem * WMSPreferencesDialog::parseLayer(const QDomElement& aLayerElem, + QTreeWidgetItem* aLayerItem) +{ + if (aLayerElem.tagName() != "Layer") + return NULL; + + QDomElement title = aLayerElem.firstChildElement("Title"); + QDomElement name = aLayerElem.firstChildElement("Name"); + + QString theTitle, theName; + if (!name.isNull()) + theName = name.firstChild().nodeValue(); + if (!title.isNull()) { + theTitle = title.firstChild().nodeValue(); + } else theTitle = tr("Unnamed layer"); + + + QTreeWidgetItem *newItem = new QTreeWidgetItem; + newItem->setFlags(Qt::NoItemFlags |Qt::ItemIsEnabled); + + + newItem->setText(0,theTitle); + newItem->setText(1,theName); + + if (!title.isNull()) { + newItem->setToolTip(0, title.firstChild().nodeValue()); + } else { + newItem->setToolTip(0, tr("Untitled")); + } + + if (!name.isNull()) { + newItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsSelectable | Qt::ItemIsEnabled); + newItem->setData(0, Qt::UserRole, theName); + newItem->setCheckState(0, Qt::Unchecked); + foreach (QString s, edWmsLayers->text().split(',')) { + if (theName == s) { + newItem->setCheckState(0, Qt::Checked); + break; + } + } + } else { +// newItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsSelectable | Qt::ItemIsEnabled); + } + + if (aLayerItem) + aLayerItem->addChild(newItem); + + QStringList upSrsList; + if (aLayerItem) + upSrsList = srsList.value(aLayerItem->text(0)); + QDomElement srsNode = aLayerElem.firstChildElement("SRS"); + while (!srsNode.isNull()) { + if (!upSrsList.contains(srsNode.firstChild().nodeValue())) + upSrsList.append(srsNode.firstChild().nodeValue()); + srsNode = srsNode.nextSiblingElement("SRS"); + } + srsList[newItem->text(0)] = upSrsList; + + QList <QPair<QString, QString> > upStyleList; + if (aLayerItem) + upStyleList = styleList.value(aLayerItem->text(0)); + QDomElement styleNode = aLayerElem.firstChildElement("Style"); + while (!styleNode.isNull()) { + QDomElement title = styleNode.firstChildElement("Title"); + QDomElement name = styleNode.firstChildElement("Name"); + + if (!name.isNull() && !upStyleList.contains(qMakePair(name.firstChild().nodeValue(), title.firstChild().nodeValue()))) + upStyleList.append(qMakePair(name.firstChild().nodeValue(), title.firstChild().nodeValue())); + + styleNode = styleNode.nextSiblingElement("Style"); + } + styleList[newItem->text(0)] = upStyleList; + + QDomElement layElem = aLayerElem.firstChildElement("Layer"); + while(!layElem.isNull()) { + parseLayer(layElem, newItem); + layElem = layElem.nextSiblingElement("Layer"); + } + + tvWmsLayers->expandItem(newItem); + tvWmsLayers->header()->setStretchLastSection(false); +#ifdef QT5 + tvWmsLayers->header()->setSectionResizeMode(QHeaderView::ResizeToContents); +#else + tvWmsLayers->header()->setResizeMode(QHeaderView::ResizeToContents); +#endif + return newItem; +} + +void WMSPreferencesDialog::setStatus( WMSStatus status, QString message ) { + switch (status) { + case Caching: + lblStatus->setText(tr("This is a caching WMS server.")); + break; + case ErrorNetwork: + lblStatus->setText(tr("Could not contact WMS server: %1").arg(message)); + break; + case ErrorGetCapabilities: + lblStatus->setText(tr("Could not get capabilities: %1").arg(message)); + break; + default: + lblStatus->setText(QString()); + } + + if (status > Error) { + lblStatus->setStyleSheet("QLabel { color : red; }"); + } else { + lblStatus->setStyleSheet(QString()); + } +} + +void WMSPreferencesDialog::setTreeCheckState(Qt::CheckState state, QTreeWidgetItem *twi) { + twi->setCheckState(0, state); + for (int i = 0; i < twi->childCount(); i++) + setTreeCheckState(state, twi->child(i)); +} + +void WMSPreferencesDialog::on_tvWmsLayers_itemChanged(QTreeWidgetItem *twi, int) +{ + QStringList theLayers; + bool hasSelection = false; + + /* Set the checkbox status recursively for the whole subtree */ + setTreeCheckState(twi->checkState(0), twi); + + if (isTiled == 1 && twi->checkState(0) == Qt::Checked) { + theLayers.append(twi->data(0, Qt::UserRole).toString()); + hasSelection = true; + foreach(WmscLayer layer, wmscLayers) + if (layer.LayerName == twi->data(0, Qt::UserRole).toString()) { + selWmscLayer = layer; + } + } + + QTreeWidgetItemIterator it(tvWmsLayers); + while (*it) { + if ((*it)->checkState(0) == Qt::Checked) { + if (isTiled == 1) { + if (hasSelection && *it != twi) + (*it)->setCheckState(0, Qt::Unchecked); + } else { + theLayers.append((*it)->data(0, Qt::UserRole).toString()); + } + } + ++it; + } + edWmsLayers->setText(theLayers.join(",")); + refreshStyles(); +} + +void WMSPreferencesDialog::on_tvWmsLayers_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem */*previous*/) +{ + if (current) + curLayer = current->text(0); + else + return; + + QStringList theSRS = srsList[curLayer]; + QString oldSrs = cbWmsProj->currentText(); + cbWmsProj->clear(); + theSRS.sort(); + cbWmsProj->addItems(theSRS); + cbWmsProj->setEditText(oldSrs); + on_cbWmsProj_activated(oldSrs); + + QList <QPair<QString, QString> > theStyles = styleList[curLayer]; + QString oldStyle = cbWmsStyle->currentText(); + cbWmsStyle->clear(); + QPair<QString, QString> aStyle; + foreach(aStyle, theStyles) { + cbWmsStyle->addItem(aStyle.second, QVariant(aStyle.first)); + } + cbWmsStyle->setEditText(oldStyle); + on_cbWmsProj_activated(oldSrs); +} diff --git a/src/Preferences/WMSPreferencesDialog.h b/src/Preferences/WMSPreferencesDialog.h new file mode 100644 index 0000000..9b949e5 --- /dev/null +++ b/src/Preferences/WMSPreferencesDialog.h @@ -0,0 +1,157 @@ +// +// C++ Interface: WMSPreferencesDialog +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef WMSPREFERENCESDIALOG_H +#define WMSPREFERENCESDIALOG_H + +#include <QWidget> +#include <QNetworkAccessManager> +#include <QBuffer> + + +#include <ui_WMSPreferencesDialog.h> +#include "MerkaartorPreferences.h" +#include "Global.h" + +#include <QList> +#include <QtXml> + +/** + @author cbro <cbro@semperpax.com> +*/ + +class WmsUrlValidator: public QValidator +{ +public: + explicit WmsUrlValidator(QObject * parent=0) + : QValidator(parent) + {} + + State validate ( QString & input, int & /*pos*/ ) const + { + QUrl theUrl(input); + + if (!theUrl.isValid()) + return QValidator::Intermediate; + +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + QUrlQuery theQuery(theUrl); +#define theQuery theQuery +#else +#define theQuery theUrl +#endif + + if (theQuery.hasQueryItem("BBOX")) + theQuery.removeQueryItem("BBOX"); + if (theQuery.hasQueryItem("REQUEST")) + theQuery.removeQueryItem("REQUEST"); + if (theQuery.hasQueryItem("WIDTH")) + theQuery.removeQueryItem("WIDTH"); + if (theQuery.hasQueryItem("HEIGHT")) + theQuery.removeQueryItem("HEIGHT"); + if (theQuery.hasQueryItem("TRANSPARENT")) + theQuery.removeQueryItem("TRANSPARENT"); + if (theQuery.hasQueryItem("tiled")) + theQuery.removeQueryItem("tiled"); + +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + theUrl.setQuery(theQuery); +#endif + input = theUrl.toString(); + return QValidator::Acceptable; + } + +// virtual void fixup ( QString & input ) const +// { +// QUrl u(input); +// if (!u.isValid()) +// return; +// if (u.hasEncodedQueryItem("BBOX")) { +// u.removeEncodedQueryItem("BBOX"); +// } +// input = u.toString(); +// } + +}; + +class WMSPreferencesDialog : public QDialog, public Ui::WMSPreferencesDialog +{ + Q_OBJECT + +public: + WMSPreferencesDialog(QWidget* parent = 0); + ~WMSPreferencesDialog(); + + void addServer(const WmsServer & srv); + +public slots: + void on_edWmsUrl_textEdited(const QString & newText); + void on_edWmsUrl_editingFinished(); + void on_btApplyWmsServer_clicked(); + void on_btAddWmsServer_clicked(); + void on_btDelWmsServer_clicked(); + void showCapabilities(); + void on_lvWmsServers_itemSelectionChanged(); + void on_cbWmsProj_activated(const QString & text); + void on_cbWmsStyle_activated ( int index ); + void on_cbWmsStyle_editTextChanged(const QString & newText); + void on_cbWmsImgFormat_activated(const QString &/*text*/); + void httpRequestFinished(QNetworkReply * reply); + void on_buttonBox_clicked(QAbstractButton * button); + void on_tvWmsLayers_itemChanged(QTreeWidgetItem *, int); + void on_tvWmsLayers_currentItemChanged ( QTreeWidgetItem * current, QTreeWidgetItem * previous ); + +private: + enum WMSStatus { + Empty, + Caching, + Error, + ErrorNetwork, + ErrorGetCapabilities, + }; + + void updateUrl(); + void loadPrefs(); + void savePrefs(); + void requestCapabilities(QUrl url); + QTreeWidgetItem * parseLayer(const QDomElement& aLayerElem, + QTreeWidgetItem* aLayerItem); + void parseVendorSpecific(QDomElement& vendorElem); + void parseTileSet(QDomElement& tilesetElem, WmscLayer& aLayer); + + void setTreeCheckState(Qt::CheckState state, QTreeWidgetItem *twi); + void setStatus( WMSStatus status, QString message = QString() ); + + void refreshStyles(); + + +public: + QList<WmsServer> theWmsServers; + QString getSelectedServer(); + void setSelectedServer(QString theValue); + +private: + void generateWmscLayer(); + + QString selectedServer; + QNetworkAccessManager m_networkManager; + QNetworkReply* curReply; + int isTiled; + QList<WmscLayer> wmscLayers; + WmscLayer selWmscLayer; + WmsUrlValidator wmsValid; + QMap <QString, QStringList> srsList; + QMap <QString, QList <QPair<QString, QString> > > styleList; + QMap <QString, QString> styles; + QString curLayer; +}; + +#endif diff --git a/src/Preferences/WMSPreferencesDialog.ui b/src/Preferences/WMSPreferencesDialog.ui new file mode 100644 index 0000000..e2765e0 --- /dev/null +++ b/src/Preferences/WMSPreferencesDialog.ui @@ -0,0 +1,395 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>WMSPreferencesDialog</class> + <widget class="QDialog" name="WMSPreferencesDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>797</width> + <height>718</height> + </rect> + </property> + <property name="windowTitle"> + <string>WMS servers setup</string> + </property> + <layout class="QVBoxLayout"> + <item> + <widget class="QGroupBox" name="grpWmsServers"> + <property name="title"> + <string>WMS Servers</string> + </property> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>1</number> + </property> + <property name="margin"> + <number>1</number> + </property> + <item> + <widget class="QFrame" name="frame_2"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>5</number> + </property> + <property name="margin"> + <number>5</number> + </property> + <item> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Server list:</string> + </property> + </widget> + </item> + <item> + <widget class="QListWidget" name="lvWmsServers"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QFrame" name="frame"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QLabel" name="label_11"> + <property name="text"> + <string>Name:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edWmsName"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Server Url:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edWmsUrl"/> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_5"> + <item> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>Layers:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edWmsLayers"/> + </item> + </layout> + </item> + <item> + <widget class="Line" name="line"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QTreeWidget" name="tvWmsLayers"> + <property name="headerHidden"> + <bool>false</bool> + </property> + <property name="columnCount"> + <number>2</number> + </property> + <column> + <property name="text"> + <string>Title</string> + </property> + </column> + <column> + <property name="text"> + <string notr="true">Name</string> + </property> + </column> + </widget> + </item> + <item> + <widget class="QLabel" name="lblStatus"> + <property name="text"> + <string notr="true"/> + </property> + <property name="openExternalLinks"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QFrame" name="frWmsSettings"> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_6"> + <item> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>Projection:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="cbWmsProj"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="editable"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QWidget" name="frTileIt" native="true"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <widget class="QCheckBox" name="cbTileIt"> + <property name="text"> + <string>Tile it</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Zoom levels</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="sbZoomLevels"> + <property name="maximum"> + <number>99</number> + </property> + <property name="value"> + <number>17</number> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Image format:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="cbWmsImgFormat"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="editable"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_8"> + <item> + <widget class="QLabel" name="label_9"> + <property name="text"> + <string>Styles:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="cbWmsStyle"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="editable"> + <bool>true</bool> + </property> + <property name="insertPolicy"> + <enum>QComboBox::NoInsert</enum> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_9"> + <item> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>"source" tag value:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edSourceTag"/> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_10"> + <item> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>License URL:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edLicenseUrl"/> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QPushButton" name="btApplyWmsServer"> + <property name="text"> + <string>Apply</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btAddWmsServer"> + <property name="text"> + <string>Add</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btDelWmsServer"> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>WMSPreferencesDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>WMSPreferencesDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/Preferences/WmsServersList.cpp b/src/Preferences/WmsServersList.cpp new file mode 100644 index 0000000..1a892c3 --- /dev/null +++ b/src/Preferences/WmsServersList.cpp @@ -0,0 +1,238 @@ +// +// C++ Implementation: WMSServersList +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include <QApplication> + +#include "WmsServersList.h" +#include "MerkaartorPreferences.h" + +WmsServer::WmsServer() +{ + WmsServer(QApplication::translate("MerkaartorPreferences","New Server"), QString(), QString(), QString(), QString(), QString(), QString(), QString(), QString()); +} + +WmsServer::WmsServer(QString Name, QString Adress, QString Path, QString Layers + , QString SourceTag + , QString LicenseUrl + , QString Projections, QString Styles, QString ImgFormat + , int IsTiled + , WmscLayer CLayer + , bool Deleted + ) + : WmsName(Name), WmsAdress(Adress), WmsPath(Path), WmsLayers(Layers) + , WmsLicenseUrl(LicenseUrl) + , WmsSourceTag(SourceTag) + , WmsProjections(Projections), WmsStyles(Styles), WmsImgFormat(ImgFormat) + , WmsIsTiled(IsTiled) + , WmsCLayer(CLayer) + , deleted(Deleted) +{ + if (Name.isEmpty()) { + WmsName = QApplication::translate("MerkaartorPreferences","New Server"); + } +} + +void WmsServer::toXml(QDomElement parent) +{ + QDomElement p = parent.ownerDocument().createElement("WmsServer"); + parent.appendChild(p); + p.setAttribute("name", WmsName); + p.setAttribute("address", WmsAdress); + p.setAttribute("path", WmsPath); + p.setAttribute("projections", WmsProjections); + if (!WmsLayers.isEmpty()) + p.setAttribute("layers", WmsLayers); + if (!WmsStyles.isEmpty()) + p.setAttribute("styles", WmsStyles); + if (!WmsImgFormat.isEmpty()) + p.setAttribute("format", WmsImgFormat); + if (!WmsSourceTag.isEmpty()) + p.setAttribute("sourcetag", WmsSourceTag); + if (!WmsLicenseUrl.isEmpty()) + p.setAttribute("licenseurl", WmsLicenseUrl); + if (deleted) + p.setAttribute("deleted", "true"); + if (WmsIsTiled > 0) { + QDomElement c; + switch (WmsIsTiled) { + case 1: + c = parent.ownerDocument().createElement("WMS-C"); + break; + case 2: + c = parent.ownerDocument().createElement("Tiling"); + break; + } + p.appendChild(c); + + c.setAttribute("TileWidth", WmsCLayer.TileWidth); + c.setAttribute("TileHeight", WmsCLayer.TileHeight); + + QDomElement bb = parent.ownerDocument().createElement("BoundingBox"); + c.appendChild(bb); + bb.setAttribute("minx", WmsCLayer.BoundingBox.left()); + bb.setAttribute("miny", WmsCLayer.BoundingBox.top()); + bb.setAttribute("maxx", WmsCLayer.BoundingBox.right()); + bb.setAttribute("maxy", WmsCLayer.BoundingBox.bottom()); + + QDomElement r = parent.ownerDocument().createElement("Resolutions"); + c.appendChild(r); + QStringList slr; + foreach(qreal z, WmsCLayer.Resolutions) { + slr << QString::number(z); + } + r.appendChild(parent.ownerDocument().createTextNode(slr.join(" "))); + } +} + +WmsServer WmsServer::fromXml(QDomElement parent) +{ + WmsServer theServer; + + if (parent.tagName() == "WmsServer") { + theServer.WmsName = parent.attribute("name"); + theServer.WmsAdress = parent.attribute("address"); + theServer.WmsPath = parent.attribute("path"); + theServer.WmsLayers = parent.attribute("layers"); + theServer.WmsProjections = parent.attribute("projections"); + theServer.WmsStyles = parent.attribute("styles"); + theServer.WmsImgFormat = parent.attribute("format"); + theServer.WmsSourceTag = parent.attribute("sourcetag"); + theServer.WmsLicenseUrl = parent.attribute("licenseurl"); + theServer.deleted = (parent.attribute("deleted") == "true" ? true : false); + + theServer.WmsIsTiled = 0; + QDomElement wmscElem = parent.firstChildElement("WMS-C"); + if (wmscElem.isNull()) { + wmscElem = parent.firstChildElement("Tiling"); + if (!wmscElem.isNull()) + theServer.WmsIsTiled = 2; + } else + theServer.WmsIsTiled = 1; + + if (!wmscElem.isNull()) { + theServer.WmsCLayer.LayerName = theServer.WmsLayers; + theServer.WmsCLayer.Projection = theServer.WmsProjections; + theServer.WmsCLayer.Styles = theServer.WmsStyles; + + theServer.WmsCLayer.TileHeight = wmscElem.attribute("TileHeight").toInt(); + theServer.WmsCLayer.TileWidth = wmscElem.attribute("TileWidth").toInt(); + + QDomElement bb = wmscElem.firstChildElement("BoundingBox"); + if (!bb.isNull()) { + qreal minx = bb.attribute("minx").toDouble(); + qreal miny = bb.attribute("miny").toDouble(); + qreal maxx = bb.attribute("maxx").toDouble(); + qreal maxy = bb.attribute("maxy").toDouble(); + theServer.WmsCLayer.BoundingBox = QRectF(QPointF(minx, miny), QPointF(maxx, maxy)); + } + + QDomElement r = wmscElem.firstChildElement("Resolutions"); + if (!r.isNull()) { + QStringList resL; + resL = r.firstChild().toText().nodeValue().split(" ", QString::SkipEmptyParts); + foreach(QString res, resL) + theServer.WmsCLayer.Resolutions << res.toDouble(); + } + } + } + + return theServer; +} + +/** **/ + +void WmsServersList::add(WmsServersList aWmsServersList) +{ + QMapIterator <QString, WmsServer> it(*(aWmsServersList.getServers())); + while (it.hasNext()) { + it.next(); + + WmsServer anItem = it.value(); + if (!theServers.contains(anItem.WmsName)) + theServers.insert(anItem.WmsName, anItem); + } +} + +WmsServerList* WmsServersList::getServers() +{ + return &theServers; +} + +void WmsServersList::addServer(WmsServer aServer) +{ + theServers.insert(aServer.WmsName, aServer); +} + +bool WmsServersList::contains(QString name) const +{ + if (theServers.contains(name)) + return true; + else { + WmsServerListIterator it(theServers); + while (it.hasNext()) { + it.next(); + + if (it.key().contains(name, Qt::CaseInsensitive)) + return true; + } + } + return false; +} + +WmsServer WmsServersList::getServer(QString name) const +{ + if (theServers.contains(name)) + return theServers.value(name); + else { + WmsServerListIterator it(theServers); + while (it.hasNext()) { + it.next(); + + if (it.key().contains(name, Qt::CaseInsensitive)) + return it.value(); + } + } + return WmsServer(); +} + +void WmsServersList::toXml(QDomElement parent) +{ + QDomElement rt = parent.ownerDocument().createElement("WmsServers"); + parent.appendChild(rt); + rt.setAttribute("creator", QString("%1 v%2").arg(STRINGIFY(PRODUCT)).arg(STRINGIFY(VERSION))); + + WmsServerListIterator it(theServers); + while (it.hasNext()) { + it.next(); + + WmsServer i = it.value(); + i.toXml(rt); + } +} + +WmsServersList WmsServersList::fromXml(QDomElement parent) +{ + WmsServersList theServersList; + + if (parent.nodeName() == "WmsServers") { + QDomElement c = parent.firstChildElement(); + while(!c.isNull()) { + if (c.tagName() == "WmsServer") { + theServersList.addServer(WmsServer::fromXml(c)); + } + + c = c.nextSiblingElement(); + } + } + + return theServersList; +} diff --git a/src/Preferences/WmsServersList.h b/src/Preferences/WmsServersList.h new file mode 100644 index 0000000..cd70ffb --- /dev/null +++ b/src/Preferences/WmsServersList.h @@ -0,0 +1,84 @@ +// +// C++ Interface: WMSServersList +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef WMSSERVERS_LIST_H +#define WMSSERVERS_LIST_H + +#include <QString> +#include <QMap> +#include <QtXml> + +#include "Coord.h" + +class WmscLayer +{ +public: + QString LayerName; + QString Projection; + QString Styles; + QString ImgFormat; + QRectF BoundingBox; + QList<qreal> Resolutions; + int TileWidth; + int TileHeight; +}; + +class WmsServer +{ + public: + WmsServer(); + WmsServer(QString Name, QString Adress, QString Path, QString Layers + , QString SourceTag + , QString LicenseUrl + , QString Projections, QString Styles, QString ImgFormat + , int IsTiled = 0 + , WmscLayer CLayer = WmscLayer() + , bool Deleted=false + ); + + void toXml(QDomElement parent); + static WmsServer fromXml(QDomElement parent); + + public: + QString WmsName; + QString WmsAdress; + QString WmsPath; + QString WmsLayers; + QString WmsSourceTag; + QString WmsLicenseUrl; + QString WmsProjections; + QString WmsStyles; + QString WmsImgFormat; + int WmsIsTiled; + WmscLayer WmsCLayer; + + bool deleted; +}; +typedef QMap<QString, WmsServer> WmsServerList; +typedef QMapIterator<QString, WmsServer> WmsServerListIterator; + +class WmsServersList +{ + public: + void add(WmsServersList aWmsServersList); + void addServer(WmsServer aServer); + bool contains(QString name) const; + WmsServerList* getServers(); + WmsServer getServer(QString name) const; + void toXml(QDomElement parent); + static WmsServersList fromXml(QDomElement parent); + + private: + WmsServerList theServers; +}; + +#endif // WMSSERVERS_LIST_H diff --git a/src/QMapControl.pri b/src/QMapControl.pri new file mode 100644 index 0000000..3491c8b --- /dev/null +++ b/src/QMapControl.pri @@ -0,0 +1,31 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/QMapControl +DEPENDPATH += $$MERKAARTOR_SRC_DIR/QMapControl + +# Input +HEADERS += \ + imagemanager.h \ + mapadapter.h \ + mapnetwork.h \ + wmsmapadapter.h \ + WmscMapAdapter.h \ + tilemapadapter.h + +SOURCES += \ + IImageManager.cpp \ + imagemanager.cpp \ + mapadapter.cpp \ + mapnetwork.cpp \ + wmsmapadapter.cpp \ + WmscMapAdapter.cpp \ + tilemapadapter.cpp + +QT += network + +contains(USEWEBENGINE,1) { + DEFINES += USE_WEBKIT + SOURCES += browserimagemanager.cpp + HEADERS += browserimagemanager.h + QT += webenginewidgets + contains(THREADED_BROWSERIMAGEMANAGER,1): DEFINES += BROWSERIMAGEMANAGER_IS_THREADED +} + diff --git a/src/QMapControl/WmscMapAdapter.cpp b/src/QMapControl/WmscMapAdapter.cpp new file mode 100644 index 0000000..56dc3fc --- /dev/null +++ b/src/QMapControl/WmscMapAdapter.cpp @@ -0,0 +1,166 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "WmscMapAdapter.h" +#include "Global.h" + +WmscMapAdapter::WmscMapAdapter(WmsServer aServer) + : MapAdapter("", "", 0, 0), theServer(aServer) +{ + // :MapAdapter(host, serverPath, tilesize, minZoom, maxZoom) + name = theServer.WmsName; + host = theServer.WmsAdress; + serverPath = theServer.WmsPath; + tilesize = theServer.WmsCLayer.TileWidth; + max_zoom = theServer.WmsCLayer.Resolutions.size() - 1; + loc.setNumberOptions(QLocale::OmitGroupSeparator); +} + +WmscMapAdapter::~WmscMapAdapter() +{ +} + +QUuid WmscMapAdapter::getId() const +{ + return QUuid("{E238750A-AC27-429e-995C-A60C17B9A1E0}"); +} + +IMapAdapter::Type WmscMapAdapter::getType() const +{ + return IMapAdapter::NetworkBackground; +} + +QString WmscMapAdapter::projection() const +{ + return theServer.WmsProjections; +} + +QRectF WmscMapAdapter::getBoundingbox() const +{ + return theServer.WmsCLayer.BoundingBox; +} + +int WmscMapAdapter::getTileSizeW() const +{ + return tilesize; +} + +int WmscMapAdapter::getTileSizeH() const +{ + return tilesize; +} + +void WmscMapAdapter::zoom_in() +{ + current_zoom = current_zoom < max_zoom ? current_zoom+1 : max_zoom; + +} +void WmscMapAdapter::zoom_out() +{ + current_zoom = current_zoom > min_zoom ? current_zoom-1 : min_zoom; +} + +QString WmscMapAdapter::getQuery(int i, int j, int /* z */) const +{ + // WMS-C Y origin is lower left +// j = getTilesNS(current_zoom)-1 - j; + + qreal tileWidth = getBoundingbox().width() / getTilesWE(current_zoom); + qreal tileHeight = getBoundingbox().height() / getTilesNS(current_zoom); + + QPointF ul = QPointF(i*tileWidth+getBoundingbox().topLeft().x(), getBoundingbox().bottomLeft().y()-j*tileHeight); + QPointF br = QPointF((i+1)*tileWidth+getBoundingbox().topLeft().x(), getBoundingbox().bottomLeft().y()- (j+1)*tileHeight); + + QUrl theUrl(theServer.WmsPath); +#ifdef QT5 + QUrlQuery theQuery; +#define theQuery theQuery +#else +#define theQuery theUrl +#endif + if (!theQuery.hasQueryItem("VERSION")) + theQuery.addQueryItem("VERSION", "1.1.1"); + if (!theQuery.hasQueryItem("SERVICE")) + theQuery.addQueryItem("SERVICE", "WMS"); + theQuery.addQueryItem("REQUEST", "GetMap"); + + if (!theQuery.hasQueryItem("TRANSPARENT")) + theQuery.addQueryItem("TRANSPARENT", "TRUE"); + if (!theQuery.hasQueryItem("LAYERS")) + theQuery.addQueryItem("LAYERS", theServer.WmsLayers); + if (!theQuery.hasQueryItem("SRS")) + theQuery.addQueryItem("SRS", theServer.WmsProjections); + if (!theQuery.hasQueryItem("STYLES")) + theQuery.addQueryItem("STYLES", theServer.WmsStyles); + if (!theQuery.hasQueryItem("FORMAT")) + theQuery.addQueryItem("FORMAT", theServer.WmsImgFormat); + theQuery.addQueryItem("WIDTH", QString::number(getTileSizeW())); + theQuery.addQueryItem("HEIGHT", QString::number(getTileSizeH())); + theQuery.addQueryItem("BBOX", QString() + .append(loc.toString(ul.x(),'f',6)).append(",") + .append(loc.toString(br.y(),'f',6)).append(",") + .append(loc.toString(br.x(),'f',6)).append(",") + .append(loc.toString(ul.y(),'f',6)) + ); + if (theServer.WmsIsTiled == 1) + theQuery.addQueryItem("tiled", "true"); +#ifdef QT5 + theUrl.setQuery(theQuery); +#endif +#undef theQuery + + + return theUrl.toString(QUrl::RemoveScheme | QUrl::RemoveAuthority); +} + +bool WmscMapAdapter::isValid(int x, int y, int z) const +{ + // Origin is bottom-left + y = getTilesNS(current_zoom)-1 - y; + + if ((x<0) || (x>=getTilesWE(z)) || + (y<0) || (y>=getTilesNS(z))) + { + return false; + } + return true; + +} + +int WmscMapAdapter::getTilesWE(int zoomlevel) const +{ + qreal unitPerTile = theServer.WmsCLayer.Resolutions[zoomlevel] * getTileSizeW(); // Size of 1 tile in projected units + return qRound(getBoundingbox().width() / unitPerTile); +} + +int WmscMapAdapter::getTilesNS(int zoomlevel) const +{ + qreal unitPerTile = theServer.WmsCLayer.Resolutions[zoomlevel] * getTileSizeH(); // Size of 1 tile in projected units + return qRound(getBoundingbox().height() / unitPerTile); +} + +QString WmscMapAdapter::getSourceTag() const +{ + return theServer.WmsSourceTag; +} + +QString WmscMapAdapter::getLicenseUrl() const +{ + return theServer.WmsLicenseUrl; +} diff --git a/src/QMapControl/WmscMapAdapter.h b/src/QMapControl/WmscMapAdapter.h new file mode 100644 index 0000000..ef9d53a --- /dev/null +++ b/src/QMapControl/WmscMapAdapter.h @@ -0,0 +1,113 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 WMSCMAPADAPTER_H +#define WMSCMAPADAPTER_H + +#include "mapadapter.h" +#include "WmsServersList.h" + +//! MapAdapter for servers with image tiles +/*! + * Use this derived MapAdapter to display maps from OpenStreetMap + * @author Kai Winter <kaiwinter@gmx.de> +*/ +class WmscMapAdapter : public MapAdapter +{ +public: + //! constructor + /*! + * Sample of a correct initialization of a MapAdapter:<br/> + * TileMapAdapter* ta = new TileMapAdapter("192.168.8.1", "/img/img_cache.php/%1/%2/%3.png", 256, 0,17);<br/> + * The placeholders %1, %2, %3 stands for x, y, z<br/> + * The minZoom is 0 (means the whole world is visible). The maxZoom is 17 (means it is zoomed in to the max) + * @param host The servers URL + * @param serverPath The path to the tiles with placeholders + * @param tilesize the size of the tiles + * @param minZoom the minimum zoom level + * @param maxZoom the maximum zoom level + */ + WmscMapAdapter(WmsServer aServer); + + virtual ~WmscMapAdapter(); + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const; + + //! returns the type of this MapAdapter + /*! + * @return the type of this MapAdapter + */ + virtual IMapAdapter::Type getType () const; + + //! returns the size of the tiles + /*! + * @return the size of the tiles + */ + virtual int getTileSizeW () const; + virtual int getTileSizeH () const; + + //! returns the source tag to be applied when drawing over this map + /*! + * @return the source tag + */ + virtual QString getSourceTag() const; + virtual void setSourceTag (const QString& ) {} + + //! returns the Url of the usage license + /*! + * @return the Url of the usage license + */ + virtual QString getLicenseUrl() const; + + qreal PI; + + virtual void zoom_in(); + virtual void zoom_out(); + + virtual bool isValid(int x, int y, int z) const; + virtual QString getQuery(int x, int y, int z) const; + virtual QString getQuery(const QRectF& , const QRectF& , const QRect& ) const { return QString(); } + virtual QPixmap getPixmap(const QRectF& /* wgs84Bbox */, const QRectF& /* projBbox */, const QRect& /* size */) const { return QPixmap(); } + + virtual QString projection() const; + virtual QRectF getBoundingbox() const; + + virtual bool isTiled() const { return true; } + virtual int getTilesWE(int zoomlevel) const; + virtual int getTilesNS(int zoomlevel) const; + + virtual void cleanup() {} + + virtual bool toXML(QXmlStreamWriter& /*stream*/) { return true; } + virtual void fromXML(QXmlStreamReader& /*xParent*/) {} + virtual QString toPropertiesHtml() {return QString();} + + virtual void setSettings(QSettings* /*aSet*/) {} + +protected: + WmsServer theServer; + + int tilesize; +}; + +#endif //WMSCMAPADAPTER_H diff --git a/src/QMapControl/browserimagemanager.cpp b/src/QMapControl/browserimagemanager.cpp new file mode 100644 index 0000000..75cb0b2 --- /dev/null +++ b/src/QMapControl/browserimagemanager.cpp @@ -0,0 +1,393 @@ +/*************************************************************************** + * Copyright (C) 2008 by Chris Browet * + * cbro@semperpax.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. * + ***************************************************************************/ +#include "browserimagemanager.h" +#include "MerkaartorPreferences.h" + +#include <QApplication> +#include <QDateTime> +#include <QPixmapCache> +#include <QPainter> +#include <QMessageBox> +#include <QCryptographicHash> +#include <QTimer> +#include <QMutex> +#include <QNetworkProxy> +#include <QNetworkAccessManager> + +#include "IMapAdapter.h" + +#define MAX_REQ 1 +#define BROWSER_TILE_SIZE 512 +#define str(x) # x + +void BrowserWebPage::javaScriptConsoleMessage ( const QString & message, int lineNumber, const QString & sourceID ) +{ + Q_UNUSED(message) + Q_UNUSED(lineNumber) + Q_UNUSED(sourceID) + // FIXME Seems to crash at times (see http://trac.openstreetmap.org/ticket/1194) + //QString s = QString("%1 at %2, %3").arg(message).arg(QString::number(lineNumber)).arg(sourceID); + //printf("%s\n", s); +} + +void BrowserWebPage::javaScriptAlert ( const QString & msg ) +{ + //QMessageBox::information(NULL, tr("Javascript alert"), msg); + + if (msg.startsWith("Coord")) { + + tllat = 90.0; + tllon = -180.0; + brlat = -90.0; + brlon = 180.0; + + QStringList tokens = msg.split(" "); + Q_ASSERT(tokens.size() == 5); + + tllat = tokens[1].toDouble(); + tllon = tokens[2].toDouble(); + brlat = tokens[3].toDouble(); + brlon = tokens[4].toDouble(); + + qDebug() << "Coord:" << tllat << "," << tllon << "," << brlat << "," << brlon; + } else + if (msg.startsWith("Size")) { + + sw = BROWSER_TILE_SIZE; + sh = BROWSER_TILE_SIZE; + + QStringList tokens = msg.split(" "); + Q_ASSERT(tokens.size() == 5); + + int ox, oy, x1, y1; + ox = int(tokens[1].toDouble()); + oy = int(tokens[2].toDouble()); + x1 = int(tokens[3].toDouble()); + y1 = int(tokens[4].toDouble()); + + qDebug() << "Size:" << ox << "," << oy << "," << x1 << "," << y1; + + sw = x1 - ox; + sh = y1 - oy; + + qDebug() << "----" << sw << "," << sh; + + } + if (msg.startsWith("ReqSize")) { + QStringList tokens = msg.split(" "); + Q_ASSERT(tokens.size() == 3); + + int w, h; + w = int(tokens[1].toDouble()); + h = int(tokens[2].toDouble()); + + qDebug() << "ReqSize:" << w << "," << h ; + } +} + +void BrowserWebPage::launchRequest ( const QUrl & url ) +{ + qDebug() << "Warning: you are using BrowserWebPage to render background imagery. " + "This code is not tested and may not work as expected. If you experience issues, please let us know."; + sw = sh = 0; + load(url); +} + +BrowserImageManager* BrowserImageManager::m_BrowserImageManagerInstance = 0; +QMutex mutex; + +#ifdef BROWSERIMAGEMANAGER_IS_THREADED +BrowserImageManager::BrowserImageManager(QObject* parent) + :QThread(parent), emptyPixmap(QPixmap(1,1)), requestActive(false), page(0) +{ + emptyPixmap.fill(Qt::transparent); + + if (QPixmapCache::cacheLimit() <= 20000) + { + QPixmapCache::setCacheLimit(20000); // in kb + } +} +#else +BrowserImageManager::BrowserImageManager(QObject* parent) + :QObject(parent), emptyPixmap(QPixmap(1,1)), errorPixmap(QPixmap(512,512)), page(0), timeoutTimer(new QTimer(this)) +{ + errorPixmap.fill(Qt::gray); + QPainter P(&errorPixmap); + P.fillRect(0, 0, 511, 511, QBrush(Qt::red, Qt::DiagCrossPattern)); + emptyPixmap.fill(Qt::transparent); + + if (QPixmapCache::cacheLimit() <= 20000) + { + QPixmapCache::setCacheLimit(20000); // in kb + } + + page = new BrowserWebPage(); + + connect(page, SIGNAL(loadFinished(bool)), this, SLOT(pageLoadFinished(bool))); + + connect(timeoutTimer, SIGNAL(timeout()), this, SLOT(timeout())); + timeoutTimer->setInterval(M_PREFS->getNetworkTimeout()); + +// QWebView* theVw = new QWebView((QWidget*)parent); +// theVw->setPage(page); +// theVw->show(); +} +#endif // BROWSERIMAGEMANAGER_IS_THREADED + + +BrowserImageManager::~BrowserImageManager() +{ +} + +QByteArray BrowserImageManager::getData(IMapAdapter* anAdapter, const QString &url) +{ + QImage pm = getImage(anAdapter, url); + QBuffer buf; + pm.save(&buf); + return buf.buffer(); +} + +QImage BrowserImageManager::getImage(IMapAdapter* anAdapter, const QString &url) +{ +// QPixmap pm(emptyPixmap); + QPixmap pm; + + QString host = anAdapter->getHost(); + QString strHash = anAdapter->getName() + url; + QString hash = QString(strHash.toLatin1().toBase64()); + if (hash.size() > 255) { + QCryptographicHash crypt(QCryptographicHash::Md5); + crypt.addData(hash.toLatin1()); + hash = QString(crypt.result().toHex()); + } + + // is image in picture cache + if (QPixmapCache::find(hash, pm)) { + qDebug() << "BrowserImageManager::QPixmapCache hit!"; + return pm.toImage(); + } + + // disk cache? + if (anAdapter->isTiled() && useDiskCache(hash + ".png")) { + if (pm.load(cacheDir.absolutePath() + "/" + hash + ".png")) { + QPixmapCache::insert(hash, pm); + return pm.toImage(); + } + } + if (M_PREFS->getOfflineMode()) + return pm.toImage(); + + LoadingRequest LR(hash, host, url); + if (loadingRequests.contains(LR)) + return pm.toImage(); + + loadingRequests.enqueue(LR); + emit(dataRequested()); + +#ifndef BROWSERIMAGEMANAGER_IS_THREADED + if (loadingRequests.size() <= MAX_REQ) + launchRequest(); +#endif + + return pm.toImage(); +} + +void BrowserImageManager::launchRequest() +{ + if (loadingRequests.isEmpty()) + return; +// LoadingRequest* R = loadingRequests.dequeue(); + LoadingRequest R = loadingRequests.head(); + qDebug() << "BrowserImageManager::launchRequest:" << QString(R.host).append(R.url) << "Hash:" << R.hash; + + QUrl u = QUrl( R.url); + + page->launchRequest(u); + requestActive = true; +#ifndef BROWSERIMAGEMANAGER_IS_THREADED + timeoutTimer->start(); +#endif +} + +void BrowserImageManager::pageLoadFinished(bool ok) +{ + mutex.lock(); + + timeoutTimer->stop(); + + if (loadingRequests.isEmpty()) { + mutex.unlock(); + return; + } + + LoadingRequest R = loadingRequests.dequeue(); + requestActive = false; + + if (ok && page->sw && page->sh) { + qDebug() << "BrowserImageManager::pageLoadFinished:" << " Hash:" << R.hash; + QPixmap pt(page->sw, page->sh); + QPainter P(&pt); + page->view()->render(&P, QPoint(), QRegion(0,0,page->sw,page->sh)); + P.end(); + +// if (page->sw != BROWSER_TILE_SIZE || page->sh != BROWSER_TILE_SIZE) { +// QPixmap tmpPx = pt.scaled(QSize(BROWSER_TILE_SIZE, BROWSER_TILE_SIZE)); +// pt = tmpPx; +// } + + if (!(pt.isNull())) { + QPixmapCache::insert(R.hash, pt); + QString strHash = QByteArray::fromBase64(R.hash.toLatin1()); + + if (cacheMaxSize && !strHash.startsWith("Yahoo")) { + pt.save(cacheDir.absolutePath() + "/" + R.hash + ".png"); + QFileInfo info(cacheDir.absolutePath() + "/" + R.hash + ".png"); + cacheInfo.append(info); + cacheSize += info.size(); + + adaptCache(); + } + } + + QByteArray ba; + QHash<QString, QString> headers; + + receivedData(ba, headers, R.hash); + } else { + loadingRequests.enqueue(R); + qDebug() << "BrowserImageManager::pageLoadFinished - Error:" << "Hash:" << R.hash; + } + + mutex.unlock(); + + if (loadingRequests.isEmpty()) + loadingQueueEmpty(); +#ifndef BROWSERIMAGEMANAGER_IS_THREADED + else + launchRequest(); +#endif +} + +void BrowserImageManager::slotLoadProgress(int p) +{ + if (!(p < 100)) { + } +} + +//QPixmap BrowserImageManager::prefetchImage(const QString& host, const QString& url) +QImage BrowserImageManager::prefetchImage(IMapAdapter* anAdapter, int x, int y, int z) +{ + QString host = anAdapter->getHost(); + QString url = anAdapter->getQuery(x, y, z); + QString strHash = QString("%1;%2;%3;%4;%5").arg(anAdapter->getName()).arg(QString::number(x)).arg(QString::number(y)).arg(QString::number(z)).arg(anAdapter->getTileSizeW()); + QString hash = QString(strHash.toLatin1().toBase64()); + + prefetch.append(hash); + return getImage(anAdapter, anAdapter->getQuery(x, y, z)); +} + +void BrowserImageManager::receivedData(const QByteArray& /* ba */, const QHash<QString, QString>& /* headers */, const QString& hash) +{ + prefetch.removeOne(hash); + emit(dataReceived()); +} + +void BrowserImageManager::loadingQueueEmpty() +{ + emit(loadingFinished()); +} + +void BrowserImageManager::abortLoading() +{ + //qDebug() << "BrowserImageManager::abortLoading"; + page->triggerAction(QWebEnginePage::Stop); + if (!loadingRequests.isEmpty()) { + LoadingRequest R = loadingRequests.dequeue(); + loadingRequests.clear(); + loadingRequests.enqueue(R); + } + loadingQueueEmpty(); +} + +#ifdef BROWSERIMAGEMANAGER_IS_THREADED +void BrowserImageManager::run() +{ + page = new BrowserWebEnginePage(); + page->setViewportSize(QSize(1024, 1024)); + + QTimer theTimer; + theTimer.start(100); + connect(page, SIGNAL(loadFinished(bool)), this, SLOT(pageLoadFinished(bool))); + connect (&theTimer, SIGNAL(timeout()), this, SLOT(checkRequests()), Qt::DirectConnection); + + exec(); + + delete page; +} + +void BrowserImageManager::checkRequests() +{ + mutex.lock(); + + if (!requestActive) { + requestDuration = 0; + launchRequest(); + } else { + if ((requestDuration++) > 100) { + requestDuration = 0; + page->triggerAction(QWebEnginePage::Stop); + qDebug() << "BrowserImageManager Timeout"; + } + } + + mutex.unlock(); +} +#else +void BrowserImageManager::timeout() +{ + qDebug() << "BrowserImageManager::timeout"; + page->triggerAction(QWebEnginePage::Stop); + pageLoadFinished(false); +} +#endif // BROWSERIMAGEMANAGER_IS_THREADED + +void BrowserImageManager::setCacheDir(const QDir& path) +{ + cacheDir = path; + cacheSize = 0; + if (!cacheDir.exists()) { + cacheDir.mkpath(cacheDir.absolutePath()); + } else { + cacheInfo = cacheDir.entryInfoList(QDir::Files, QDir::Time | QDir::Reversed); + for (int i=0; i<cacheInfo.size(); i++) { + cacheSize += cacheInfo[i].size(); + } + } +} + +QDir BrowserImageManager::getCacheDir() +{ + return cacheDir; +} + +void BrowserImageManager::setCacheMaxSize(int max) +{ + cacheMaxSize = max*1024*1024; +} diff --git a/src/QMapControl/browserimagemanager.h b/src/QMapControl/browserimagemanager.h new file mode 100644 index 0000000..ca846e3 --- /dev/null +++ b/src/QMapControl/browserimagemanager.h @@ -0,0 +1,142 @@ +/*************************************************************************** + * Copyright (C) 2008 by Chris Browet * + * cbro@semperpax.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. * + ***************************************************************************/ +#ifndef BROWSERIMAGEMANAGER_H +#define BROWSERIMAGEMANAGER_H + +#include <QObject> +#include <QPixmap> + +#include <QtNetwork/QtNetwork> +#include <QWebEnginePage> +#include <QWebEngineHistory> +#include <QWebEngineSettings> +#include <QWebEngineView> + +#include <QThread> + +#include "IImageManager.h" + +/** + @author Chris Browet <cbro@semperpax.com> +*/ + +class BrowserWebPage : public QWebEnginePage +{ + friend class BrowserImageManager; + + protected: + virtual void javaScriptConsoleMessage ( const QString & message, int lineNumber, const QString & sourceID ); + virtual void javaScriptAlert ( const QString & msg ) ; + void launchRequest ( const QUrl & url ); + + private: + qreal tllat, tllon; + qreal brlat, brlon; + + int ox, oy, sw, sh; +}; + +#ifdef BROWSERIMAGEMANAGER_IS_THREADED +class BrowserImageManager : public QThread, public IImageManager +#else +class BrowserImageManager : public QObject, public IImageManager +#endif +{ + Q_OBJECT; + public: + BrowserImageManager(QObject* parent = 0); + BrowserImageManager(const BrowserImageManager&); + BrowserImageManager& operator=(const BrowserImageManager&); + ~BrowserImageManager(); + + //! returns a QPixmap of the asked image + /*! + * If this component doesn´t have the image a network query gets started to load it. + * @param host the host of the image + * @param path the path to the image + * @return the pixmap of the asked image + */ + QImage getImage(IMapAdapter* anAdapter, const QString &url); + QByteArray getData(IMapAdapter* anAdapter, const QString &url); + + //QPixmap prefetchImage(const QString& host, const QString& path); + QImage prefetchImage(IMapAdapter* anAdapter, int x, int y, int z); + + void receivedData(const QByteArray& ba, const QHash<QString, QString>& headers, const QString& url); + + /*! + * This method is called by MapNetwork, after all images in its queue were loaded. + * The BrowserImageManager emits a signal, which is used in MapControl to remove the zoom image. + * The zoom image should be removed on Tile Images with transparency. + * Else the zoom image stay visible behind the newly loaded tiles. + */ + void loadingQueueEmpty(); + + /*! + * Aborts all current loading threads. + * This is useful when changing the zoom-factor, though newly needed images loads faster + */ + void abortLoading(); + + void setCacheDir(const QDir& path); + QDir getCacheDir(); + void setCacheMaxSize(int max); + + private: + QPixmap emptyPixmap; + QPixmap errorPixmap; + QStringList prefetch; + + QQueue<LoadingRequest> loadingRequests; + bool requestActive; + int requestDuration; + void launchRequest(); + + static BrowserImageManager* m_BrowserImageManagerInstance; + + BrowserWebPage* page; + QNetworkAccessManager* qnam; + + signals: + void dataRequested(); + void dataReceived(); + void loadingFinished(); + + private slots: + void pageLoadFinished(bool); + void slotLoadProgress(int p); + +#ifdef BROWSERIMAGEMANAGER_IS_THREADED + private slots: + void checkRequests(); + + protected: + virtual void run(); +#else + private: + QTimer* timeoutTimer; + + private slots: + void timeout(); + +#endif // BROWSERIMAGEMANAGER_IS_THREADED +}; + +#endif diff --git a/src/QMapControl/imagemanager.cpp b/src/QMapControl/imagemanager.cpp new file mode 100644 index 0000000..4516404 --- /dev/null +++ b/src/QMapControl/imagemanager.cpp @@ -0,0 +1,197 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "imagemanager.h" +#include "MerkaartorPreferences.h" +#include "IMapAdapter.h" + +#include <QDateTime> +#include <QCryptographicHash> + +ImageManager* ImageManager::m_ImageManagerInstance = 0; + +ImageManager::ImageManager(QObject* parent) + :QObject(parent), emptyPixmap(QPixmap(1,1)), net(new MapNetwork(this)) +{ + emptyPixmap.fill(Qt::transparent); + +#ifndef _MOBILE + m_dataCache.setMaxCost(20000000); // 20mb +#else + m_dataCache.setMaxCost(5000000); // 5mb +#endif +} + +ImageManager::~ImageManager() +{ + net->abortLoading(); + delete net; +} + +QByteArray ImageManager::getData(IMapAdapter* anAdapter, const QString &url) +{ + QString host = anAdapter->getHost(); + QString strHash = anAdapter->getName() + url; + QString hash = QString(strHash.toLatin1().toBase64()); + if (hash.size() > 255) { + QCryptographicHash crypt(QCryptographicHash::Md5); + crypt.addData(hash.toLatin1()); + hash = QString(crypt.result().toHex()); + } + + QByteArray ba; + if (m_dataCache.contains(hash)) { + QBuffer* buf = m_dataCache.object(hash); + return buf->data(); + } + + // currently loading? + if (!net->isLoading(hash)) + { + // load from net, add empty image + net->load(hash, host, url); + emit(dataRequested()); + return ba; + } + return ba; +} + +QImage ImageManager::getImage(IMapAdapter* anAdapter, const QString &url) +{ +// qDebug() << "ImageManager::getImage"; + + QString host = anAdapter->getHost(); + QString strHash = anAdapter->getName() + url; + QString hash = QString(strHash.toLatin1().toBase64()); + if (hash.size() > 255) { + QCryptographicHash crypt(QCryptographicHash::Md5); + crypt.addData(hash.toLatin1()); + hash = QString(crypt.result().toHex()); + } + + /* QPixmap pm(anAdapter->getTileSize(), anAdapter->getTileSize()); + pm.fill(Qt::black);*/ + // QPixmap pm(emptyPixmap); + QImage pm; + + // is image in picture cache + if (m_dataCache.contains(hash)) { + pm.loadFromData(m_dataCache.object(hash)->data()); + return pm; + } + + // disk cache? + if (anAdapter->isTiled() && useDiskCache(hash + ".png")) { + if (pm.load(cacheDir.absolutePath() + "/" + hash + ".png")) { + return pm; + } + } + + if (M_PREFS->getOfflineMode()) + return pm; + + // currently loading? + if (!net->isLoading(hash)) + { + // load from net, add empty image + net->load(hash, host, url); + emit(dataRequested()); + return pm; + } + return pm; +} + +//QPixmap ImageManager::prefetchImage(const QString& host, const QString& url) +QImage ImageManager::prefetchImage(IMapAdapter* anAdapter, int x, int y, int z) +{ + QString host = anAdapter->getHost(); + QString url = anAdapter->getQuery(x, y, z); + QString strHash = QString("%1%2").arg(anAdapter->getName()).arg(url); + QString hash = QString(strHash.toLatin1().toBase64()); + + prefetch.append(hash); + return getImage(anAdapter, anAdapter->getQuery(x, y, z)); +} + +void ImageManager::receivedData(const QByteArray& ba, const QHash<QString, QString>& headers, const QString& hash) +{ +// qDebug() << "ImageManager::receivedImage"; + + QImage img = QImage::fromData(ba); + foreach (QString k, headers.keys()) { + img.setText(k, headers[k]); + } + QBuffer* buf = new QBuffer(); + buf->open(QIODevice::WriteOnly); + img.save(buf, "PNG"); + buf->close(); + m_dataCache.insert(hash, buf, buf->data().size()); + if (cacheMaxSize || cachePermanent) { + + if (!img.isNull()) { + img.save(cacheDir.absolutePath() + "/" + hash + ".png"); + QFileInfo info(cacheDir.absolutePath() + "/" + hash + ".png"); + cacheInfo.append(info); + cacheSize += info.size(); + + adaptCache(); + } + } + + prefetch.removeOne(hash); + emit(dataReceived()); +} + +void ImageManager::loadingQueueEmpty() +{ + emit(loadingFinished()); +// ((Layer*)this->parent())->removeZoomImage(); +// qDebug() << "size of image-map:" << images.size(); +// qDebug() << "size:" << QPixmapCache::cacheLimit(); +} + +void ImageManager::abortLoading() +{ + net->abortLoading(); + loadingQueueEmpty(); +} + +void ImageManager::setCacheDir(const QDir& path) +{ + cacheDir = path; + cacheSize = 0; + if (!cacheDir.exists()) { + cacheDir.mkpath(cacheDir.absolutePath()); + } else { + cacheInfo = cacheDir.entryInfoList(QDir::Files, QDir::Time | QDir::Reversed); + for (int i=0; i<cacheInfo.size(); i++) { + cacheSize += cacheInfo[i].size(); + } + } +} + +QDir ImageManager::getCacheDir() +{ + return cacheDir; +} + +void ImageManager::setCacheMaxSize(int max) +{ + cacheMaxSize = max*1024*1024; +} diff --git a/src/QMapControl/imagemanager.h b/src/QMapControl/imagemanager.h new file mode 100644 index 0000000..fca6f64 --- /dev/null +++ b/src/QMapControl/imagemanager.h @@ -0,0 +1,96 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 IMAGEMANAGER_H +#define IMAGEMANAGER_H + +#include <QObject> +#include <QBuffer> +#include <QDebug> +#include <QMutex> +#include <QFileInfo> +#include <QCache> +#include "mapnetwork.h" + +#include "IImageManager.h" + +class MapNetwork; +class IMapAdapter; + +/** + @author Kai Winter <kaiwinter@gmx.de> +*/ +class ImageManager : public QObject, public IImageManager +{ + Q_OBJECT; + public: + ImageManager(QObject* parent = 0); + ImageManager(const ImageManager&); + ImageManager& operator=(const ImageManager&); + ~ImageManager(); + + //! returns a QPixmap of the asked image + /*! + * If this component doesn´t have the image a network query gets started to load it. + * @param host the host of the image + * @param path the path to the image + * @return the pixmap of the asked image + */ + QImage getImage(IMapAdapter* anAdapter, const QString &url); + QByteArray getData(IMapAdapter* anAdapter, const QString &url); + + //QPixmap prefetchImage(const QString& host, const QString& path); + QImage prefetchImage(IMapAdapter* anAdapter, int x, int y, int z); + + void receivedData(const QByteArray& ba, const QHash<QString, QString>& headers, const QString& url); + + /*! + * This method is called by MapNetwork, after all images in its queue were loaded. + * The ImageManager emits a signal, which is used in MapControl to remove the zoom image. + * The zoom image should be removed on Tile Images with transparency. + * Else the zoom image stay visible behind the newly loaded tiles. + */ + void loadingQueueEmpty(); + + /*! + * Aborts all current loading threads. + * This is useful when changing the zoom-factor, though newly needed images loads faster + */ + void abortLoading(); + + void setCacheDir(const QDir& path); + QDir getCacheDir(); + void setCacheMaxSize(int max); + + private: + QPixmap emptyPixmap; + MapNetwork* net; + QStringList prefetch; + + static ImageManager* m_ImageManagerInstance; + + QCache<QString, QBuffer> m_dataCache; + + signals: + void dataRequested(); + void dataReceived(); + void loadingFinished(); +}; + +#endif diff --git a/src/QMapControl/imagepoint.cpp b/src/QMapControl/imagepoint.cpp new file mode 100644 index 0000000..cd0b3f1 --- /dev/null +++ b/src/QMapControl/imagepoint.cpp @@ -0,0 +1,43 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "imagepoint.h" + +ImagePoint::ImagePoint(double x, double y, QString filename, QString name, Alignment alignment) + : Point(x, y, name, alignment) +{ +// qDebug() << "loading image:" << filename; + mypixmap = new QPixmap(filename); + size = mypixmap->size(); +// qDebug() << "image size:" << size; +} + +ImagePoint::ImagePoint(double x, double y, QPixmap* pixmap, QString name, Alignment alignment) + : Point(x, y, name, alignment) +{ + mypixmap = pixmap; + size = mypixmap->size(); +} + + +ImagePoint::~ImagePoint() +{ +} + + diff --git a/src/QMapControl/imagepoint.h b/src/QMapControl/imagepoint.h new file mode 100644 index 0000000..6a43c2b --- /dev/null +++ b/src/QMapControl/imagepoint.h @@ -0,0 +1,62 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 IMAGEPOINT_H +#define IMAGEPOINT_H + +#include "point.h" + +//! Draws an image into the map +/*! This is a convenience class for Point. + * It configures the pixmap of a Point to draw the given image. + * The image will be loaded from the given path and written in the points pixmap. + * + * @author Kai Winter <kaiwinter@gmx.de> +*/ +class ImagePoint : public Point +{ + public: + //! Creates a point which loads and displays the given image file + /*! + * Use this contructor to load the given image file and let the point display it. + * When you want multiple points to display the same image, use the other contructor and pass a pointer to that image. + * @param x longitude + * @param y latitude + * @param filename the file which should be loaded and displayed + * @param name the name of the image point + * @param alignment alignment (Middle or TopLeft) + */ + ImagePoint(double x, double y, QString filename, QString name = QString(), Alignment alignment = Middle); + + //! Creates a point which displays the given image + /*! + * Use this contructor to display the given image. + * You have to load that image yourself, but can use it for multiple points. + * @param x longitude + * @param y latitude + * @param pixmap pointer to the image pixmap + * @param name the name of the image point + * @param alignment alignment (Middle or TopLeft) + */ + ImagePoint(double x, double y, QPixmap* pixmap, QString name = QString(), Alignment alignment = Middle); + virtual ~ImagePoint(); + +}; + +#endif diff --git a/src/QMapControl/mapadapter.cpp b/src/QMapControl/mapadapter.cpp new file mode 100644 index 0000000..7fd6d16 --- /dev/null +++ b/src/QMapControl/mapadapter.cpp @@ -0,0 +1,87 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "mapadapter.h" + +MapAdapter::MapAdapter(const QString& host, const QString& serverPath, const QString& theProjection, int minZoom, int maxZoom) + :host(host), serverPath(serverPath), Projection(theProjection), min_zoom(minZoom), max_zoom(maxZoom), theImageManager(0) +{ + current_zoom = min_zoom; + loc = QLocale(QLocale::English); +} + +MapAdapter::~MapAdapter() +{ +} + +QString MapAdapter::getName() const +{ + return name; +} + +QString MapAdapter::getHost() const +{ + return host; +} + +QString MapAdapter::projection() const +{ + return Projection; +} + +int MapAdapter::getMinZoom(const QRectF &) const +{ + return min_zoom; +} + +int MapAdapter::getMaxZoom(const QRectF &) const +{ + return max_zoom; +} + +int MapAdapter::getAdaptedMinZoom(const QRectF &) const +{ + return 0; +} + +int MapAdapter::getAdaptedMaxZoom(const QRectF &) const +{ + return max_zoom > min_zoom ? max_zoom - min_zoom : min_zoom - max_zoom; +} + +int MapAdapter::getZoom() const +{ + return current_zoom; +} + +int MapAdapter::getAdaptedZoom() const +{ + return max_zoom < min_zoom ? min_zoom - current_zoom : current_zoom - min_zoom; +} + +IImageManager* MapAdapter::getImageManager() +{ + return theImageManager; +} + +void MapAdapter::setImageManager(IImageManager* anImageManager) +{ + theImageManager = anImageManager; +} + diff --git a/src/QMapControl/mapadapter.h b/src/QMapControl/mapadapter.h new file mode 100644 index 0000000..cea3c1b --- /dev/null +++ b/src/QMapControl/mapadapter.h @@ -0,0 +1,128 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 MAPADAPTER_H +#define MAPADAPTER_H + +#include <QObject> +#include <QSize> +#include <QPoint> +#include <QPointF> +#include <QLocale> +#include <QDebug> +#include <cmath> + +#include "IImageManager.h" +#include "imagemanager.h" +#include "IMapAdapter.h" + +//! Used to fit map servers into QMapControl +/*! + * MapAdapters are needed to convert between world- and display coordinates. + * This calculations depend on the used map projection. + * There are two ready-made MapAdapters: + * - TileMapAdapter, which is ready to use for OpenStreetMap or Google (Mercator projection) + * - WMSMapAdapter, which could be used for the most WMS-Server (some servers show errors, because of image ratio) + * + * MapAdapters are also needed to form the HTTP-Queries to load the map tiles. + * The maps from WMS Servers are also divided into tiles, because those can be better cached. + * + * @see TileMapAdapter, @see WMSMapAdapter + * + * @author Kai Winter <kaiwinter@gmx.de> +*/ +class MapAdapter : public IMapAdapter +{ + //friend class ImageManager; + //friend class BrowserImageManager; + //friend class Layer; + + Q_OBJECT + Q_INTERFACES(IMapAdapter) + +public: + virtual ~MapAdapter(); + + //! returns the host of this MapAdapter + /*! + * @return the host of this MapAdapter + */ + virtual QString getName () const; + + //! returns the host of this MapAdapter + /*! + * @return the host of this MapAdapter + */ + virtual QString getHost () const; + + //! returns the projection of this MapAdapter + /*! + * @return the projection of this MapAdapter + */ + virtual QString projection() const; + + //! returns the min zoom value + /*! + * @return the min zoom value + */ + virtual int getMinZoom (const QRectF &) const; + + //! returns the max zoom value + /*! + * @return the max zoom value + */ + virtual int getMaxZoom (const QRectF &) const; + + //! returns the current zoom + /*! + * @return the current zoom + */ + virtual int getZoom () const; + + virtual int getAdaptedZoom()const; + virtual int getAdaptedMinZoom (const QRectF &) const; + virtual int getAdaptedMaxZoom (const QRectF &) const; + + virtual QMenu* getMenu() const { return NULL; } + + virtual IImageManager* getImageManager(); + virtual void setImageManager(IImageManager* anImageManager); + +protected: + QString name; + MapAdapter(const QString& host, const QString& serverPath, const QString& projection, int minZoom = 0, int maxZoom = 0); + virtual void zoom_in() = 0; + virtual void zoom_out() = 0; + virtual bool isValid(int x, int y, int z) const = 0; + virtual QString getQuery(int x, int y, int z) const = 0; + + QSize size; + QString host; + QString serverPath; + QString Projection; + int min_zoom; + int max_zoom; + int current_zoom; + + QLocale loc; + + IImageManager* theImageManager; +}; + +#endif diff --git a/src/QMapControl/mapcontrol.cpp b/src/QMapControl/mapcontrol.cpp new file mode 100644 index 0000000..83e4d1f --- /dev/null +++ b/src/QMapControl/mapcontrol.cpp @@ -0,0 +1,344 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "mapcontrol.h" + +MapControl::MapControl(QSize size, MouseMode mousemode) + : size(size), mousemode(mousemode) +{ + layermanager = new LayerManager(this, size); + screen_middle = QPoint(size.width()/2, size.height()/2); + + mousepressed = false; + + connect(ImageManager::instance(), SIGNAL(imageReceived()), + this, SLOT(updateRequestNew())); + + connect(ImageManager::instance(), SIGNAL(loadingFinished()), + this, SLOT(loadingFinished())); + + this->setMaximumSize(size.width()+1, size.height()+1); +} + +MapControl::~MapControl() +{ + delete layermanager; +} + +QPointF MapControl::getCurrentCoordinate() const +{ + return layermanager->getCurrentCoordinate(); +} + +Layer* MapControl::getLayer(const QString& layername) const +{ + return layermanager->getLayer(layername); +} + +QStringList MapControl::getLayers() const +{ + return layermanager->getLayers(); +} + +int MapControl::getNumberOfLayers() const +{ + return layermanager->getLayers().size(); +} + +void MapControl::followGeometry(const Geometry* geom) const +{ + connect(geom, SIGNAL(positionChanged(Geometry*)), + this, SLOT(positionChanged(Geometry*))); +} + +void MapControl::positionChanged(Geometry* geom) +{ + QPoint start = layermanager->getLayer()->getMapAdapter()->coordinateToDisplay(getCurrentCoordinate()); + QPoint dest = layermanager->getLayer()->getMapAdapter()->coordinateToDisplay(((Point*)geom)->getCoordinate()); + + QPoint step = (dest-start); + + layermanager->scrollView(step); + +// setView(geom); + update(); +} + +void MapControl::moveTo(QPointF coordinate) +{ + target = coordinate; + steps = 25; + if (moveMutex.tryLock()) + { + QTimer::singleShot(40, this, SLOT(tick())); + } + else + { +// stopMove(coordinate); + } +} +void MapControl::tick() +{ + QPoint start = layermanager->getLayer()->getMapAdapter()->coordinateToDisplay(getCurrentCoordinate()); + QPoint dest = layermanager->getLayer()->getMapAdapter()->coordinateToDisplay(target); + + QPoint step = (dest-start)/steps; + QPointF next = getCurrentCoordinate()- step; + +// setView(Coordinate(next.x(), next.y())); + layermanager->scrollView(step); + + update(); + steps--; + if (steps>0) + { + QTimer::singleShot(40, this, SLOT(tick())); + } + else + { + moveMutex.unlock(); + } +} + +void MapControl::paintEvent(QPaintEvent* evnt) +{ + QWidget::paintEvent(evnt); + QPainter painter(this); + +// painter.translate(150,190); +// painter.scale(0.5,0.5); + +// painter.setClipRect(0,0, size.width(), size.height()); + +// painter.setViewport(10000000000,0,size.width(),size.height()); + + /* + // rotating + rotation = 45; + painter.translate(256,256); + painter.rotate(rotation); + painter.translate(-256,-256); + */ + + layermanager->drawImage(&painter); + layermanager->drawGeoms(&painter); + + painter.drawLine(screen_middle.x(), screen_middle.y()-10, + screen_middle.x(), screen_middle.y()+10); // | + painter.drawLine(screen_middle.x()-10, screen_middle.y(), + screen_middle.x()+10, screen_middle.y()); // - + +// int cross_x = int(layermanager->getMapmiddle_px().x())%256; +// int cross_y = int(layermanager->getMapmiddle_px().y())%256; +// painter.drawLine(screen_middle.x()-cross_x+cross_x, screen_middle.y()-cross_y+0, +// screen_middle.x()-cross_x+cross_x, screen_middle.y()-cross_y+256); // | +// painter.drawLine(screen_middle.x()-cross_x+0, screen_middle.y()-cross_y+cross_y, +// screen_middle.x()-cross_x+256, screen_middle.y()-cross_y+cross_y); // - + + painter.drawRect(0,0, size.width(), size.height()); + /* + // rotating + painter.setMatrix(painter.matrix().inverted()); + //qt = painter.transform(); + qm = painter.combinedMatrix(); + */ + + if (mousepressed && mousemode == Dragging) + { + QRect rect = QRect(pre_click_px, current_mouse_pos); + painter.drawRect(rect); + } +} + +// mouse events +void MapControl::mousePressEvent(QMouseEvent* evnt) +{ + //rotating + +// QMouseEvent* me = new QMouseEvent(evnt->type(), qm.map(QPoint(evnt->x(),evnt->y())), evnt->button(), evnt->buttons(), evnt->modifiers()); +// evnt = me; +// qDebug() << "evnt:" << evnt->x() << "," << evnt->y() << "," << evnt->pos(); + + + layermanager->mouseEvent(evnt); + + if (layermanager->getLayers().size()>0) + { + if (evnt->button() == 1) + { + mousepressed = true; + pre_click_px = QPoint(evnt->x(), evnt->y()); + } + else if (evnt->button() == 2 && mousemode != None) // zoom in + { + zoomIn(); + } else if (evnt->button() == 4 && mousemode != None) // zoom out + { + zoomOut(); + } + } + +// emit(mouseEvent(evnt)); + emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos()))); +} + +void MapControl::mouseReleaseEvent(QMouseEvent* evnt) +{ + mousepressed = false; + if (mousemode == Dragging) + { + QPointF ulCoord = clickToWorldCoordinate(pre_click_px); + QPointF lrCoord = clickToWorldCoordinate(current_mouse_pos); + + QRectF coordinateBB = QRectF(ulCoord, QSizeF( (lrCoord-ulCoord).x(), (lrCoord-ulCoord).y())); + + emit(draggedRect(coordinateBB)); + } + + emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos()))); +} + +void MapControl::mouseMoveEvent(QMouseEvent* evnt) +{ +// emit(mouseEvent(evnt)); + + /* + // rotating + QMouseEvent* me = new QMouseEvent(evnt->type(), qm.map(QPoint(evnt->x(),evnt->y())), evnt->button(), evnt->buttons(), evnt->modifiers()); + evnt = me; + */ + if (mousepressed && mousemode == Panning) + { + QPoint offset = pre_click_px - QPoint(evnt->x(), evnt->y()); + layermanager->scrollView(offset); + pre_click_px = QPoint(evnt->x(), evnt->y()); + } + else if (mousepressed && mousemode == Dragging) + { + current_mouse_pos = QPoint(evnt->x(), evnt->y()); + } +// emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos()))); + + update(); +// emit(mouseEventCoordinate(evnt, clickToWorldCoordinate(evnt->pos()))); +} + +QPointF MapControl::clickToWorldCoordinate(QPoint click) +{ + // click coordinate to image coordinate + QPoint displayToImage= QPoint(click.x()-screen_middle.x()+layermanager->getMapmiddle_px().x(), + click.y()-screen_middle.y()+layermanager->getMapmiddle_px().y()); + // image coordinate to world coordinate + return layermanager->getLayer()->getMapAdapter()->displayToCoordinate(displayToImage); +} + +void MapControl::updateRequest(QRect rect) +{ + update(rect); +} +void MapControl::updateRequestNew() +{ +// qDebug() << "MapControl::updateRequestNew()"; + layermanager->forceRedraw(); + update(); +} +// slots +void MapControl::zoomIn() +{ + layermanager->zoomIn(); + update(); +} +void MapControl::zoomOut() +{ + layermanager->zoomOut(); + update(); +} +void MapControl::setZoom(int zoomlevel) +{ + layermanager->setZoom(zoomlevel); + update(); +} +int MapControl::getCurrentZoom() const +{ + return layermanager->getCurrentZoom(); +} +void MapControl::scrollLeft(int pixel) +{ + layermanager->scrollView(QPoint(-pixel,0)); + update(); +} +void MapControl::scrollRight(int pixel) +{ + layermanager->scrollView(QPoint(pixel,0)); + update(); +} +void MapControl::scrollUp(int pixel) +{ + layermanager->scrollView(QPoint(0,-pixel)); + update(); +} +void MapControl::scrollDown(int pixel) +{ + layermanager->scrollView(QPoint(0,pixel)); + update(); +} +void MapControl::scroll(const QPoint scroll) +{ + layermanager->scrollView(scroll); + update(); +} + +void MapControl::setView(const QPointF& coordinate) const +{ + layermanager->setView(coordinate); +} + +void MapControl::setView(const QList<QPointF> coordinates) const +{ + layermanager->setView(coordinates); +} + +void MapControl::setView(const Point* point) const +{ + layermanager->setView(point->getCoordinate()); +} + +void MapControl::loadingFinished() +{ +// qDebug() << "MapControl::loadingFinished()"; + layermanager->removeZoomImage(); +} +void MapControl::addLayer(Layer* layer) +{ + layermanager->addLayer(layer); +} + +void MapControl::setMouseMode(MouseMode mousemode) +{ + this->mousemode = mousemode; +} +MapControl::MouseMode MapControl::getMouseMode() +{ + return mousemode; +} + +void MapControl::stopFollowing(Geometry* geom) +{ + geom->disconnect(SIGNAL(positionChanged(Geometry*))); +} diff --git a/src/QMapControl/mapcontrol.h b/src/QMapControl/mapcontrol.h new file mode 100644 index 0000000..1a092a9 --- /dev/null +++ b/src/QMapControl/mapcontrol.h @@ -0,0 +1,276 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 MAPCONTROL_H +#define MAPCONTROL_H + +#include <QtWidgets> + +#include "layermanager.h" +#include "layer.h" +#include "mapadapter.h" +#include "geometry.h" +#include "imagemanager.h" +class LayerManager; +class MapAdapter; +class Layer; + + +//! The control element of the widget and also the widget itself +/*! + * This is the main widget. + * To this control layers can be added. + * A MapControl have to be instantiated with a QSize which sets the size the widget takes in a layout. + * The given size is also the size, which is asured to be filled with map images. + * + * @author Kai Winter <kaiwinter@gmx.de> +*/ +class MapControl : public QWidget +{ + Q_OBJECT + + public: + //! Declares what actions the mouse move has on the map + enum MouseMode + { + Panning, /*!< The map is moved */ + Dragging, /*!< A rectangular can be drawn */ + None, /*!< Mouse move events have no efect to the map */ + }; + + //! The constructor of MapControl + /*! + * The MapControl is the widget which displays the maps. + * The size describes the area, which gets filled with map data + * When you give no MouseMode, the mouse is moving the map. + * You can change the MouseMode on runtime, to e.g. Dragging, which lets the user drag a rectangular box. + * After the dragging a signal with the size of the box is emitted. + * The mousemode ´None´ can be used, to completely define the control of the map yourself. + * @param size the size which the widget should fill with map data + * @param mousemode the way mouseevents are handled + */ + MapControl(QSize size, MouseMode mousemode = Panning); + + ~MapControl(); + + //! adds a layer + /*! + * If multiple layers are added, they are painted in the added order. + * @param layer the layer which should be added + */ + void addLayer(Layer* layer); + + //! returns the layer with the given name + /*! + * @param layername name of the wanted layer + * @return the layer with the given name + */ + Layer* getLayer(const QString& layername) const; + + //! returns the names of all layers + /*! + * @return returns a QStringList with the names of all layers + */ + QStringList getLayers() const; + + //! returns the number of existing layers + /*! + * @return returns the number of existing layers + */ + int getNumberOfLayers() const; + + //! returns the coordinate of the center of the map + /*! + * @return returns the coordinate of the middle of the screen + */ + QPointF getCurrentCoordinate() const; + + //! returns the current zoom level + /*! + * @return returns the current zoom level + */ + int getCurrentZoom() const; + + //! sets the middle of the map to the given coordinate + /*! + * @param coordinate the coordinate which the view´s middle should be set to + */ + void setView(const QPointF& coordinate) const; + + //! sets the view, so all coordinates are visible + /*! + * The code of setting the view to multiple coordinates is "brute force" and pretty slow. + * Have to be reworked. + * @param coordinates the Coorinates which should be visible + */ + void setView(const QList<QPointF> coordinates) const; + + //! sets the view to the given Point + /*! + * + * @param point the geometric point the view should be set to + */ + void setView(const Point* point) const; + + //! Keeps the center of the map on the Geometry, even when it moves + /*! + * To stop the following the method stopFollowing() have to be called + * @param geometry the Geometry which should stay centered. + */ + void followGeometry(const Geometry* geometry) const; + //TODO: +// void followGeometry(const QList<Geometry*>) const; + + //! Stops the following of a Geometry + /*! + * if the view is set to follow a Geometry this method stops the trace. + * See followGeometry(). + * @param geometry the Geometry which should not followed anymore + */ + void stopFollowing(Geometry* geometry); + + //! Smoothly moves the center of the view to the given Coordinate + /*! + * @param coordinate the Coordinate which the center of the view should moved to + */ + void moveTo (QPointF coordinate); + + //! sets the Mouse Mode of the MapControl + /*! + * There are three MouseModes declard by an enum. + * The MouesMode Dragging draws an rectangular in the map while the MouseButton is pressed. + * When the Button is released a draggedRect() signal is emitted. + * + * The second MouseMode (the default) is Panning, which allows dragging the map around. + * @param mousemode the MouseMode + */ + void setMouseMode(MouseMode mousemode); + + //! returns the current MouseMode + /*! + * For a explanation for the MouseModes see setMouseMode() + * @return the current MouseMode + */ + MapControl::MouseMode getMouseMode(); + + int rotation; + + private: + LayerManager* layermanager; + QPoint screen_middle; // middle of the widget (half size) + + QPoint pre_click_px; // used for scrolling (MouseMode Panning) + QPoint current_mouse_pos; // used for scrolling and dragging (MouseMode Panning/Dragging) + + QSize size; // size of the widget + + bool mousepressed; + + MouseMode mousemode; + + QMutex moveMutex; // used for method moveTo() + QPointF target; // used for method moveTo() + int steps; // used for method moveTo() + + QPointF clickToWorldCoordinate(QPoint click); + MapControl& operator=(const MapControl& rhs); + MapControl(const MapControl& old); + + protected: + void paintEvent(QPaintEvent* evnt); + void mousePressEvent(QMouseEvent* evnt); + void mouseReleaseEvent(QMouseEvent* evnt); + void mouseMoveEvent(QMouseEvent* evnt); + + + signals: +// void mouseEvent(const QMouseEvent* evnt); + + //! Emitted AFTER a MouseEvent occured + /*! + * This signals allows receiving click events within the MapWidget together with the world coordinate. + * It is emitted on MousePressEvents and MouseReleaseEvents. + * The kind of the event can be obtained by checking the events type. + * @param evnt the QMouseEvent that occured + * @param coordinate the corresponding world coordinate + */ + void mouseEventCoordinate(const QMouseEvent* evnt, const QPointF coordinate); + + //! Emitted, after a Rectangular is dragged. + /*! + * It is possible to select a rectangular area in the map, if the MouseMode is set to Dragging. + * The coordinates are in world coordinates + * @param QRectF the dragged Rect + */ + void draggedRect(const QRectF); + + //! This signal is emmited, when a Geometry is clicked + /*! + * @param geometry + * @param coord_px asd + */ + void geometryClickEvent(Geometry* geometry, QPoint coord_px); + + public slots: + //! zooms in one step + void zoomIn(); + + //! zooms out one step + void zoomOut(); + + //! sets the given zoomlevel + /*! + * @param zoomlevel the zoomlevel + */ + void setZoom(int zoomlevel); + + //! scrolls the view to the left + void scrollLeft(int pixel=10); + + //! scrolls the view to the right + void scrollRight(int pixel=10); + + //! scrolls the view up + void scrollUp(int pixel=10); + + //! scrolls the view down + void scrollDown(int pixel=10); + + //! scrolls the view by the given point + void scroll(const QPoint scroll); + + //! updates the map for the given rect + /*! + * @param rect the area which should be repainted + */ + void updateRequest(QRect rect); + + //! updates the hole map by creating a new offscreen image + /*! + * + */ + void updateRequestNew(); + + private slots: + void tick(); + void loadingFinished(); + void positionChanged(Geometry* geom); +}; + +#endif diff --git a/src/QMapControl/mapnetwork.cpp b/src/QMapControl/mapnetwork.cpp new file mode 100644 index 0000000..d55d102 --- /dev/null +++ b/src/QMapControl/mapnetwork.cpp @@ -0,0 +1,204 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "mapnetwork.h" + +#include "MerkaartorPreferences.h" + +#include <QNetworkRequest> +#include <QNetworkReply> + +#define MAX_REQ 8 + +QLoggingCategory lc_MapNetwork("merk.MapNetwork"); + +MapNetwork::MapNetwork(IImageManager* parent) + : parent(parent) +{ + m_networkManager = parent->getNetworkManager(); + m_networkManager->setProxy(M_PREFS->getProxy(QUrl("http://merkaartor.be"))); + connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), + this, SLOT(requestFinished(QNetworkReply*))); +} + +MapNetwork::~MapNetwork() +{ +} + + +void MapNetwork::load(const QString& hash, const QString& host, const QString& url) +{ + qDebug(lc_MapNetwork) << "requesting: " << QString(host).append(url); +// http->setHost(host); +// int getId = http->get(url); + + loadingRequests.enqueue(new LoadingRequest(hash, host, url)); + + if (loadingMap.size() < MAX_REQ) + launchRequest(); + else + qDebug(lc_MapNetwork) << "queue full, will fetch later"; +} + +void MapNetwork::launchRequest() +{ + if (loadingRequests.isEmpty()) + return; + LoadingRequest* R = loadingRequests.dequeue(); + + QUrl theUrl; + if (R->host.contains("://")) { + theUrl.setUrl(QString(R->host).append(R->url)); + } else { + theUrl.setUrl("http://" + QString(R->host).append(R->url)); + } + + qDebug(lc_MapNetwork) << "getting: " << theUrl.toString(); + + launchRequest(theUrl, R); +} + +void MapNetwork::launchRequest(QUrl url, LoadingRequest* R) +{ + QNetworkRequest req(url); + + req.setRawHeader("Host", url.host().toLatin1()); + req.setRawHeader("Accept", "image/*"); + req.setRawHeader("User-Agent", USER_AGENT.toLatin1()); + + QNetworkReply* reply = m_networkManager->get(req); + loadingMap[reply] = R; + + QTimer* timeoutTimer = new QTimer(); + connect(timeoutTimer, SIGNAL(timeout()), this, SLOT(timeout())); + timeoutTimer->setInterval(M_PREFS->getNetworkTimeout()); + timeoutTimer->setSingleShot(true); + + timeoutMap[timeoutTimer] = reply; + timeoutTimer->start(); +} + +void MapNetwork::requestFinished(QNetworkReply* reply) +{ + if (!loadingMap.contains(reply)){ + // Don't react on setProxy and setHost requestFinished... + return; + } + QTimer* t = timeoutMap.key(reply); + Q_ASSERT(t); + t->stop(); + timeoutMap.remove(t); + delete t; + + LoadingRequest* R = loadingMap[reply]; + loadingMap.remove(reply); + + int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + + if (reply->error() != QNetworkReply::NoError) { + if (reply->error() != QNetworkReply::OperationCanceledError) + qWarning(lc_MapNetwork) << "network error: " << statusCode << " " << reply->errorString(); + } else + switch (statusCode) { + case 301: + case 302: + case 307: + qDebug(lc_MapNetwork) << "redirected: " << R->host << R->url; + launchRequest(reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(), new LoadingRequest(R->hash, R->host, R->url)); + return; + case 404: + qDebug(lc_MapNetwork) << "404 error: " << R->host << R->url; + break; + case 500: + qDebug(lc_MapNetwork) << "500 error: " << R->host << R->url; + break; + // Redirected + default: + if (statusCode != 200) + qDebug(lc_MapNetwork) << "Other http code (" << statusCode << "): " << R->host << R->url; + QString hash = R->hash; + // qDebug(lc_MapNetwork) << "request finished for id: " << id; + QByteArray ax; + QHash<QString, QString> headers; + + if (reply->bytesAvailable() > 0) { + ax = reply->readAll(); + foreach (QByteArray k, reply->rawHeaderList()) { + headers[QString(k)] = QString(reply->rawHeader(k)); + } + + parent->receivedData(ax, headers, hash); + } + break; + } + delete R; + + launchRequest(); + if (loadingMap.isEmpty() && loadingRequests.isEmpty()) { + qDebug(lc_MapNetwork) << "all loaded"; + parent->loadingQueueEmpty(); + } +} + +void MapNetwork::abortLoading() +{ + foreach (QNetworkReply* rply, loadingMap.keys()) + rply->abort(); + loadingMap.clear(); + while (!loadingRequests.isEmpty()) + delete loadingRequests.dequeue(); + //loadingRequests.clear(); +} + +bool MapNetwork::isLoading(QString hash) +{ + QListIterator<LoadingRequest*> i(loadingRequests); + while (i.hasNext()) + if (i.next()->hash == hash) + return true; + + QMapIterator<QNetworkReply*, LoadingRequest*> j(loadingMap); + while (j.hasNext()) + if (j.next().value()->hash == hash) + return true; + + return false; +} + +void MapNetwork::timeout() +{ + QTimer* t = qobject_cast<QTimer*>(sender()); + Q_ASSERT(t); + + QNetworkReply* rply = timeoutMap[t]; + if (!loadingMap.contains(rply)) + return; + + LoadingRequest* R = loadingMap[rply]; + qWarning(lc_MapNetwork) << "MapNetwork::timeout: " << R->host << R->url; + loadingMap.remove(rply); + loadingRequests.enqueue(R); + + rply->abort(); + timeoutMap.remove(t); + delete t; + + if (loadingMap.size() < MAX_REQ) + launchRequest(); +} diff --git a/src/QMapControl/mapnetwork.h b/src/QMapControl/mapnetwork.h new file mode 100644 index 0000000..c51dcfe --- /dev/null +++ b/src/QMapControl/mapnetwork.h @@ -0,0 +1,76 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 MAPNETWORK_H +#define MAPNETWORK_H + +#include <QObject> +#include <QDebug> +#include <QList> +#include <QQueue> +#include <QPixmap> +#include <QMutex> +#include <QUrl> + +#include "IImageManager.h" +/** + @author Kai Winter <kaiwinter@gmx.de> +*/ +class ImageManager; +class MapNetwork : QObject +{ + Q_OBJECT + public: + MapNetwork(IImageManager* parent); + ~MapNetwork(); + + void load(const QString& hash, const QString& host, const QString& url); + + /*! + * checks if the given url is already loading + * @param url the url of the image + * @return boolean, if the image is already loading + */ + bool isLoading(QString hash); + + /*! + * Aborts all current loading threads. + * This is useful when changing the zoom-factor, though newly needed images loads faster + */ + void abortLoading(); + + private: + IImageManager* parent; + QNetworkAccessManager* m_networkManager; + QMap<QNetworkReply*, LoadingRequest*> loadingMap; + QMap<QTimer*, QNetworkReply*> timeoutMap; + QQueue<LoadingRequest*> loadingRequests; + + MapNetwork& operator=(const MapNetwork& rhs); + MapNetwork(const MapNetwork& old); + void launchRequest(); + void launchRequest(QUrl url, LoadingRequest* R); + + + private slots: + void requestFinished(QNetworkReply* reply); + void timeout(); +}; + +#endif diff --git a/src/QMapControl/tilemapadapter.cpp b/src/QMapControl/tilemapadapter.cpp new file mode 100644 index 0000000..1f62b15 --- /dev/null +++ b/src/QMapControl/tilemapadapter.cpp @@ -0,0 +1,154 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "tilemapadapter.h" + +// from wikipedia +#define EQUATORIALRADIUS 6378137.0 +#define POLARRADIUS 6356752.0 +#define EQUATORIALMETERCIRCUMFERENCE 40075016.68 +#define EQUATORIALMETERHALFCIRCUMFERENCE 20037508.34 +#define EQUATORIALMETERPERDEGREE 222638.981555556 + +TileMapAdapter::TileMapAdapter(const TmsServer& ts) + :MapAdapter(ts.TmsAdress, ts.TmsPath, ts.TmsProjection, ts.TmsMinZoom, ts.TmsMaxZoom) + , theServer(ts) + , tilesize(ts.TmsTileSize) + , BlOrigin(ts.TmsBlOrigin) +{ + name = ts.TmsName; + + serverPath.replace("%1", "%z"); + serverPath.replace("%2", "%x"); + serverPath.replace("%3", "%y"); + + int paramz = serverPath.indexOf("%z"); + int paramx = serverPath.indexOf("%x"); + int paramy = serverPath.indexOf("%y"); + + if (paramx == -1 && paramy == -1 && paramz == -1) { + // Check for potlach-style url + paramz = serverPath.indexOf('!'); + if (paramz) + serverPath.replace(paramz, 1, "%z"); + paramx = serverPath.indexOf('!'); + if (paramx) + serverPath.replace(paramx, 1, "%x"); + paramy = serverPath.indexOf('!'); + if (paramy) + serverPath.replace(paramy, 1, "%y"); + + } + + isProj4326 = (Projection.contains(":4326")); + loc.setNumberOptions(QLocale::OmitGroupSeparator); +} + +TileMapAdapter::~TileMapAdapter() +{ +} + +QUuid TileMapAdapter::getId() const +{ + return QUuid("{CA8A07EC-A466-462b-929F-3805BC9DEC95}"); +} + +IMapAdapter::Type TileMapAdapter::getType() const +{ + return IMapAdapter::NetworkBackground; +} + +QRectF TileMapAdapter::getBoundingbox() const +{ + if (isProj4326) + return QRectF(QPointF(-180.00, -90.00), QPointF(180.00, 90.00)); + else + return QRectF(QPointF(-EQUATORIALMETERHALFCIRCUMFERENCE, -EQUATORIALMETERHALFCIRCUMFERENCE), QPointF(EQUATORIALMETERHALFCIRCUMFERENCE, EQUATORIALMETERHALFCIRCUMFERENCE)); +} + +int TileMapAdapter::getTileSizeW() const +{ + return tilesize; +} + +int TileMapAdapter::getTileSizeH() const +{ + return tilesize; +} + +//TODO: rausziehen? ->MapAdapter? +void TileMapAdapter::zoom_in() +{ + if (min_zoom > max_zoom) + current_zoom = current_zoom > max_zoom ? current_zoom-1 : max_zoom; + else if (min_zoom < max_zoom) + current_zoom = current_zoom < max_zoom ? current_zoom+1 : max_zoom; +} +void TileMapAdapter::zoom_out() +{ + if (min_zoom > max_zoom) + current_zoom = current_zoom < min_zoom ? current_zoom+1 : min_zoom; + else if (min_zoom < max_zoom) + current_zoom = current_zoom > min_zoom ? current_zoom-1 : min_zoom; +} + +QString TileMapAdapter::getQuery (int x, int y, int z) const +{ + if (BlOrigin) + y = getTilesNS(current_zoom)-1 - y; + QString str = serverPath; + str.replace("%z", QString::number(z)); + str.replace("%y", QString::number(y)); + str.replace("%x", QString::number(x)); + return str; +} + +bool TileMapAdapter::isValid(int x, int y, int z) const +{ + if ((x<0) || (x>getTilesWE(z)) || + (y<0) || (y>getTilesNS(z))) + { + return false; + } + return true; +} + +int TileMapAdapter::getTilesWE(int zoomlevel) const +{ + int t = int(pow(2, zoomlevel+0.0)); + if (isProj4326) + t *= 2; + + return t; +} + +int TileMapAdapter::getTilesNS(int zoomlevel) const +{ + return int(pow(2, zoomlevel+0.0)); +} + +QString TileMapAdapter::getSourceTag() const +{ + return theServer.TmsSourceTag; +} + +QString TileMapAdapter::getLicenseUrl() const +{ + return theServer.TmsLicenseUrl; +} diff --git a/src/QMapControl/tilemapadapter.h b/src/QMapControl/tilemapadapter.h new file mode 100644 index 0000000..ae49138 --- /dev/null +++ b/src/QMapControl/tilemapadapter.h @@ -0,0 +1,112 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 TILEMAPADAPTER_H +#define TILEMAPADAPTER_H + +#include "mapadapter.h" +#include "TmsServersList.h" + +//! MapAdapter for servers with image tiles +/*! + * Use this derived MapAdapter to display maps from OpenStreetMap + * @author Kai Winter <kaiwinter@gmx.de> +*/ +class TileMapAdapter : public MapAdapter +{ +public: + //! constructor + /*! + * Sample of a correct initialization of a MapAdapter:<br/> + * TileMapAdapter* ta = new TileMapAdapter("192.168.8.1", "/img/img_cache.php/%1/%2/%3.png", 256, 0,17);<br/> + * The placeholders %1, %2, %3 stands for x, y, z<br/> + * The minZoom is 0 (means the whole world is visible). The maxZoom is 17 (means it is zoomed in to the max) + * @param host The servers URL + * @param serverPath The path to the tiles with placeholders + * @param tilesize the size of the tiles + * @param minZoom the minimum zoom level + * @param maxZoom the maximum zoom level + */ + TileMapAdapter(const TmsServer& ts); + + virtual ~TileMapAdapter(); + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const; + + //! returns the type of this MapAdapter + /*! + * @return the type of this MapAdapter + */ + virtual IMapAdapter::Type getType () const; + + //! returns the size of the tiles + /*! + * @return the size of the tiles + */ + virtual int getTileSizeW () const; + virtual int getTileSizeH () const; + + //! returns the source tag to be applied when drawing over this map + /*! + * @return the source tag + */ + virtual QString getSourceTag() const; + virtual void setSourceTag (const QString& ) {}; + + //! returns the Url of the usage license + /*! + * @return the Url of the usage license + */ + virtual QString getLicenseUrl() const; + + virtual void zoom_in(); + virtual void zoom_out(); + + virtual bool isValid(int x, int y, int z) const; + virtual QString getQuery(int x, int y, int z) const; + virtual QString getQuery(const QRectF& , const QRectF& , const QRect& ) const { return QString(); } + virtual QPixmap getPixmap(const QRectF& /* wgs84Bbox */, const QRectF& /* projBbox */, const QRect& /* size */) const { return QPixmap(); } + + virtual QRectF getBoundingbox() const; + + virtual bool isTiled() const { return true; } + virtual int getTilesWE(int zoomlevel) const; + virtual int getTilesNS(int zoomlevel) const; + + virtual void cleanup() {} + + virtual bool toXML(QXmlStreamWriter& /*stream*/) { return true; } + virtual void fromXML(QXmlStreamReader& /*xParent*/) {} + virtual QString toPropertiesHtml() {return QString();} + + virtual void setSettings(QSettings* /*aSet*/) {} + +protected: + TmsServer theServer; + int tilesize; + bool BlOrigin; + bool isProj4326; + +}; + +#endif diff --git a/src/QMapControl/wmsmapadapter.cpp b/src/QMapControl/wmsmapadapter.cpp new file mode 100644 index 0000000..91b2ab3 --- /dev/null +++ b/src/QMapControl/wmsmapadapter.cpp @@ -0,0 +1,122 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 "wmsmapadapter.h" +#include "Global.h" + +WMSMapAdapter::WMSMapAdapter(WmsServer aServer) + : theServer(aServer) +{ + loc = QLocale(QLocale::English); + loc.setNumberOptions(QLocale::OmitGroupSeparator); +} + +QString WMSMapAdapter::getName() const +{ + return theServer.WmsName; +} + +QString WMSMapAdapter::getHost() const +{ + return theServer.WmsAdress; +} + +IImageManager* WMSMapAdapter::getImageManager() +{ + return theImageManager; +} + +void WMSMapAdapter::setImageManager(IImageManager* anImageManager) +{ + theImageManager = anImageManager; +} + +QString WMSMapAdapter::projection() const +{ + if (theServer.WmsProjections == "OSGEO:41001") + return "EPSG:3857"; + return theServer.WmsProjections; +} + +WMSMapAdapter::~WMSMapAdapter() +{ +} + +QUuid WMSMapAdapter::getId() const +{ + return QUuid("{E238750A-AC27-429e-995C-A60C17B9A1E0}"); +} + +IMapAdapter::Type WMSMapAdapter::getType() const +{ + if (theServer.WmsImgFormat.startsWith("image")) + return IMapAdapter::NetworkBackground; + else + return IMapAdapter::NetworkDataBackground; +} + +QString WMSMapAdapter::getQuery(const QRectF& /*wgs84Bbox*/, const QRectF& projBbox, const QRect& size) const +{ + QUrl theUrl(theServer.WmsPath); +#ifdef QT5 + QUrlQuery theQuery(theUrl); +#define theQuery theQuery +#else +#define theQuery theUrl +#endif + if (!theQuery.hasQueryItem("VERSION")) + theQuery.addQueryItem("VERSION", "1.1.1"); + if (!theQuery.hasQueryItem("SERVICE")) + theQuery.addQueryItem("SERVICE", "WMS"); + theQuery.addQueryItem("REQUEST", "GetMap"); + + if (!theQuery.hasQueryItem("TRANSPARENT")) + theQuery.addQueryItem("TRANSPARENT", "TRUE"); + if (!theQuery.hasQueryItem("LAYERS")) + theQuery.addQueryItem("LAYERS", theServer.WmsLayers); + if (!theQuery.hasQueryItem("SRS")) + theQuery.addQueryItem("SRS", theServer.WmsProjections); + if (!theQuery.hasQueryItem("STYLES")) + theQuery.addQueryItem("STYLES", theServer.WmsStyles); + if (!theQuery.hasQueryItem("FORMAT")) + theQuery.addQueryItem("FORMAT", theServer.WmsImgFormat); + theQuery.addQueryItem("WIDTH", QString::number(size.width())); + theQuery.addQueryItem("HEIGHT", QString::number(size.height())); + theQuery.addQueryItem("BBOX", loc.toString(projBbox.bottomLeft().x(),'f',6).append(",") + .append(loc.toString(projBbox.bottomLeft().y(),'f',6)).append(",") + .append(loc.toString(projBbox.topRight().x(),'f',6)).append(",") + .append(loc.toString(projBbox.topRight().y(),'f',6)) + ); +#ifdef QT5 + theUrl.setQuery(theQuery); +#endif +#undef theQuery + + return theUrl.toString(QUrl::RemoveScheme | QUrl::RemoveAuthority); +} + +QString WMSMapAdapter::getSourceTag() const +{ + return theServer.WmsSourceTag; +} + +QString WMSMapAdapter::getLicenseUrl() const +{ + return theServer.WmsLicenseUrl; +} diff --git a/src/QMapControl/wmsmapadapter.h b/src/QMapControl/wmsmapadapter.h new file mode 100644 index 0000000..2a91fe3 --- /dev/null +++ b/src/QMapControl/wmsmapadapter.h @@ -0,0 +1,141 @@ +/*************************************************************************** + * Copyright (C) 2007 by Kai Winter * + * kaiwinter@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the 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 WMSMAPADAPTER_H +#define WMSMAPADAPTER_H + +#include "IMapAdapter.h" +#include "WmsServersList.h" + +#include <QLocale> + +//! MapAdapter for WMS servers +/*! + * Use this derived MapAdapter to display maps from WMS servers + * @author Kai Winter <kaiwinter@gmx.de> +*/ +class WMSMapAdapter : public IMapAdapter +{ +public: + + WMSMapAdapter(WmsServer aServer); + virtual ~WMSMapAdapter(); + + //! returns the unique identifier (Uuid) of this MapAdapter + /*! + * @return the unique identifier (Uuid) of this MapAdapter + */ + virtual QUuid getId () const; + + //! returns the type of this MapAdapter + /*! + * @return the type of this MapAdapter + */ + virtual IMapAdapter::Type getType () const; + + //! returns the name of this MapAdapter + /*! + * @return the name of this MapAdapter + */ + virtual QString getName () const; + + //! returns the host of this MapAdapter + /*! + * @return the host of this MapAdapter + */ + virtual QString getHost () const; + + //! returns the size of the tiles + /*! + * @return the size of the tiles + */ + virtual int getTileSizeW () const { return -1; } + virtual int getTileSizeH () const { return -1; } + + //! returns the min zoom value + /*! + * @return the min zoom value + */ + virtual int getMinZoom (const QRectF &) const { return -1; } + + //! returns the max zoom value + /*! + * @return the max zoom value + */ + virtual int getMaxZoom (const QRectF &) const { return -1; } + + //! returns the current zoom + /*! + * @return the current zoom + */ + virtual int getZoom () const { return -1; } + + //! returns the source tag to be applied when drawing over this map + /*! + * @return the source tag + */ + virtual QString getSourceTag() const; + virtual void setSourceTag (const QString& ) {}; + + //! returns the Url of the usage license + /*! + * @return the Url of the usage license + */ + virtual QString getLicenseUrl() const; + + virtual int getAdaptedZoom() const { return -1; } + virtual int getAdaptedMinZoom(const QRectF &) const { return -1; } + virtual int getAdaptedMaxZoom(const QRectF &) const { return -1; } + + virtual void zoom_in() {} + virtual void zoom_out() {} + + virtual bool isValid(int, int, int) const { return true; } + virtual QString getQuery(int, int, int) const { return QString(); } + virtual QString getQuery(const QRectF& wgs84Bbox, const QRectF& projBbox, const QRect& size) const ; + virtual QPixmap getPixmap(const QRectF& /* wgs84Bbox */, const QRectF& /* projBbox */, const QRect& /* size */) const { return QPixmap(); } + + virtual QString projection() const; + virtual QRectF getBoundingbox() const { return QRectF(); } + + virtual bool isTiled() const { return false; } + virtual int getTilesWE(int) const { return -1; } + virtual int getTilesNS(int) const { return -1; } + + virtual QMenu* getMenu() const { return NULL; } + + virtual IImageManager* getImageManager(); + virtual void setImageManager(IImageManager* anImageManager); + + virtual void cleanup() {} + + virtual bool toXML(QXmlStreamWriter& /*stream*/) { return true; } + virtual void fromXML(QXmlStreamReader& /*xParent*/) {} + virtual QString toPropertiesHtml() {return QString();} + + virtual void setSettings(QSettings* /*aSet*/) {} + +private: + + QLocale loc; + WmsServer theServer; + IImageManager* theImageManager; +}; + +#endif diff --git a/src/QToolBarDialog/QToolBarDialog.pri b/src/QToolBarDialog/QToolBarDialog.pri new file mode 100644 index 0000000..6ab4648 --- /dev/null +++ b/src/QToolBarDialog/QToolBarDialog.pri @@ -0,0 +1,7 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/QToolBarDialog +DEPENDPATH += $$MERKAARTOR_SRC_DIR/QToolBarDialog + +HEADERS += qttoolbardialog.h +SOURCES += qttoolbardialog.cpp +RESOURCES += ../../Icons/QToolBarDialog/qttoolbardialog.qrc +FORMS += qttoolbardialog.ui diff --git a/src/QToolBarDialog/qttoolbardialog.cpp b/src/QToolBarDialog/qttoolbardialog.cpp new file mode 100644 index 0000000..7eedfd1 --- /dev/null +++ b/src/QToolBarDialog/qttoolbardialog.cpp @@ -0,0 +1,1892 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + +#include "qttoolbardialog.h" +#include "ui_qttoolbardialog.h" +#include <QtCore/QSet> +#include <QAction> +#include <QToolBar> +#include <QMainWindow> +#include <QShowEvent> +#include <QHideEvent> +#include <QHeaderView> + +class QtFullToolBarManagerPrivate +{ + class QtFullToolBarManager *q_ptr; + Q_DECLARE_PUBLIC(QtFullToolBarManager) + +public: + + QToolBar *toolBarWidgetAction(QAction *action) const; + void removeWidgetActions(const QMap<QToolBar *, QList<QAction *> > &actions); + + enum { + VersionMarker = 0xff, + ToolBarMarker = 0xfe, + CustomToolBarMarker = 0xfd, + }; + + void saveState(QDataStream &stream) const; + bool restoreState(QDataStream &stream) const; + QToolBar *findDefaultToolBar(const QString &objectName) const; + QAction *findAction(const QString &actionName) const; + + QToolBar *toolBarByName(const QString &toolBarName) const; + + QtFullToolBarManagerPrivate(); + + QMap<QString, QList<QAction *> > categoryToActions; + QMap<QAction *, QString> actionToCategory; + + QSet<QAction *> allActions; + QMap<QAction *, QToolBar *> widgetActions; + QSet<QAction *> regularActions; + QMap<QAction *, QList<QToolBar *> > actionToToolBars; + + QMap<QToolBar *, QList<QAction *> > toolBars; + QMap<QToolBar *, QList<QAction *> > toolBarsWithSeparators; + QMap<QToolBar *, QList<QAction *> > defaultToolBars; + QList<QToolBar *> customToolBars; + + QMainWindow *theMainWindow; +}; + + +class QtFullToolBarManager : public QObject +{ + Q_OBJECT +public: + QtFullToolBarManager(QObject *parent); + ~QtFullToolBarManager(); + + void setMainWindow(QMainWindow *mainWindow); + QMainWindow *mainWindow() const; + + void addCategory(const QString &category); + bool hasCategory(const QString &category) const; + QStringList categories() const; + QList<QAction *> categoryActions(const QString &category) const; + QString actionCategory(QAction *action) const; + + // only non-separator + void addAction(QAction *action, const QString &category); + + void removeAction(QAction *action); + + QSet<QAction *> actions() const; + bool isWidgetAction(QAction *action) const; + + /* + Adds (registers) toolBar. Adds (registers) actions that already exists in toolBar. + Remembers toolbar and its actions as a default. + */ + void addDefaultToolBar(QToolBar *toolBar, const QString &category); + + void removeDefaultToolBar(QToolBar *toolBar); + // NULL on action list means separator. + QMap<QToolBar *, QList<QAction *> > defaultToolBars() const; + bool isDefaultToolBar(QToolBar *toolBar) const; + + QToolBar *createToolBar(const QString &toolBarName); + void deleteToolBar(QToolBar *toolBar); // only those which were created, not added + + QList<QAction *> actions(QToolBar *toolBar) const; + + void setToolBars(const QMap<QToolBar *, QList<QAction *> > &actions); + void setToolBar(QToolBar *toolBar, const QList<QAction *> &actions); + + QMap<QToolBar *, QList<QAction *> > toolBarsActions() const; + QByteArray saveState(int version = 0) const; + bool restoreState(const QByteArray &state, int version = 0); + +public slots: + + void resetToolBar(QToolBar *toolBar); + void resetAllToolBars(); + +signals: + void toolBarCreated(QToolBar *toolBar); + void toolBarRemoved(QToolBar *toolBar); + + /* + If QToolBarWidgetAction was in another tool bar and is inserted into + this toolBar, toolBarChanged is first emited for other toolbar - without + that action. (Another approach may be that user first must call setToolBar + without that action for old tool bar) + */ + void toolBarChanged(QToolBar *toolBar, const QList<QAction *> &actions); + +private: + QtFullToolBarManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtFullToolBarManager) + Q_DISABLE_COPY(QtFullToolBarManager) +}; + + +QtFullToolBarManagerPrivate::QtFullToolBarManagerPrivate() + : theMainWindow(0) +{ +} + +QToolBar *QtFullToolBarManagerPrivate::toolBarWidgetAction(QAction *action) const +{ + if (widgetActions.contains(action)) + return widgetActions.value(action); + return 0; +} + +void QtFullToolBarManagerPrivate::removeWidgetActions(const QMap<QToolBar *, QList<QAction *> > + &actions) +{ + QMap<QToolBar *, QList<QAction *> >::ConstIterator itToolBar = actions.constBegin(); + while (itToolBar != actions.constEnd()) { + QToolBar *toolBar = itToolBar.key(); + QList<QAction *> newActions = toolBars.value(toolBar); + QList<QAction *> newActionsWithSeparators = toolBarsWithSeparators.value(toolBar); + + QList<QAction *> removedActions; + QList<QAction *> actionList = itToolBar.value(); + QListIterator<QAction *> itAction(actionList); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + if (newActions.contains(action) && toolBarWidgetAction(action) == toolBar) { + newActions.removeAll(action); + newActionsWithSeparators.removeAll(action); + removedActions.append(action); + } + } + + //emit q_ptr->toolBarChanged(toolBar, newActions); + + toolBars.insert(toolBar, newActions); + toolBarsWithSeparators.insert(toolBar, newActionsWithSeparators); + QListIterator<QAction *> itRemovedAction(removedActions); + while (itRemovedAction.hasNext()) { + QAction *oldAction = itRemovedAction.next(); + widgetActions.insert(oldAction, 0); + actionToToolBars[oldAction].removeAll(toolBar); + } + + itToolBar++; + } +} + +void QtFullToolBarManagerPrivate::saveState(QDataStream &stream) const +{ + stream << (uchar) ToolBarMarker; + stream << defaultToolBars.size(); + QMap<QToolBar *, QList<QAction *> >::ConstIterator itToolBar = + defaultToolBars.constBegin(); + while (itToolBar != defaultToolBars.constEnd()) { + QToolBar *tb = itToolBar.key(); + if (tb->objectName().isEmpty()) { + qWarning("QtToolBarManager::saveState(): 'objectName' not set for QToolBar " + "%p '%s', using 'windowTitle' instead", + tb, tb->windowTitle().toLocal8Bit().constData()); + stream << tb->windowTitle(); + } else { + stream << tb->objectName(); + } + + stream << toolBars[tb].size(); + QListIterator<QAction *> itAction(toolBars[tb]); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + + if (action) { + if (action->objectName().isEmpty()) { + qWarning("QtToolBarManager::saveState(): 'objectName' not set for QAction " + "%p '%s', using 'text' instead", + action, action->text().toLocal8Bit().constData()); + stream << action->text(); + } else { + stream << action->objectName(); + } + } else { + stream << QString(); + } + } + itToolBar++; + } + + + stream << (uchar) CustomToolBarMarker; + stream << toolBars.size() - defaultToolBars.size(); + itToolBar = toolBars.constBegin(); + while (itToolBar != toolBars.constEnd()) { + QToolBar *tb = itToolBar.key(); + if (!defaultToolBars.contains(tb)) { + stream << tb->objectName(); + stream << tb->windowTitle(); + + stream << toolBars[tb].size(); + QListIterator<QAction *> itAction(toolBars[tb]); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + + if (action) { + if (action->objectName().isEmpty()) { + qWarning("QtToolBarManager::saveState(): 'objectName' not set for QAction " + "%p '%s', using 'text' instead", + action, action->text().toLocal8Bit().constData()); + stream << action->text(); + } else { + stream << action->objectName(); + } + } else { + stream << QString(); + } + } + } + itToolBar++; + } +} + +bool QtFullToolBarManagerPrivate::restoreState(QDataStream &stream) const +{ + uchar tmarker; + stream >> tmarker; + if (tmarker != ToolBarMarker) + return false; + + int toolBars; + stream >> toolBars; + for (int i = 0; i < toolBars; i++) { + QString objectName; + stream >> objectName; + int actionCount; + stream >> actionCount; + QList<QAction *> actions; + for (int j = 0; j < actionCount; j++) { + QString actionName; + stream >> actionName; + + if (actionName.isEmpty()) + actions.append(0); + else { + QAction *action = findAction(actionName); + if (action) + actions.append(action); + } + } + + QToolBar *toolBar = findDefaultToolBar(objectName); + if (toolBar) + q_ptr->setToolBar(toolBar, actions); + } + + + + uchar ctmarker; + stream >> ctmarker; + if (ctmarker != CustomToolBarMarker) + return false; + + QList<QToolBar *> oldCustomToolBars = customToolBars; + + stream >> toolBars; + for (int i = 0; i < toolBars; i++) { + QString objectName; + QString toolBarName; + int actionCount; + stream >> objectName; + stream >> toolBarName; + stream >> actionCount; + QList<QAction *> actions; + for (int j = 0; j < actionCount; j++) { + QString actionName; + stream >> actionName; + + if (actionName.isEmpty()) + actions.append(0); + else { + QAction *action = findAction(actionName); + if (action) + actions.append(action); + } + } + + QToolBar *toolBar = toolBarByName(objectName); + if (toolBar) { + toolBar->setWindowTitle(toolBarName); + oldCustomToolBars.removeAll(toolBar); + } + else + toolBar = q_ptr->createToolBar(toolBarName); + if (toolBar) { + toolBar->setObjectName(objectName); + q_ptr->setToolBar(toolBar, actions); + } + } + QListIterator<QToolBar *> itToolBar(oldCustomToolBars); + while (itToolBar.hasNext()) + q_ptr->deleteToolBar(itToolBar.next()); + return true; +} + +QToolBar *QtFullToolBarManagerPrivate::findDefaultToolBar(const QString &objectName) const +{ + QMap<QToolBar *, QList<QAction *> >::ConstIterator itToolBar = + defaultToolBars.constBegin(); + while (itToolBar != defaultToolBars.constEnd()) { + QToolBar *tb = itToolBar.key(); + if (tb->objectName() == objectName) + return tb; + + itToolBar++; + } + + qWarning("QtToolBarManager::restoreState(): cannot find a QToolBar named " + "'%s', trying to match using 'windowTitle' instead.", + objectName.toLocal8Bit().constData()); + + itToolBar = defaultToolBars.constBegin(); + while (itToolBar != defaultToolBars.constEnd()) { + QToolBar *tb = itToolBar.key(); + if (tb->windowTitle() == objectName) + return tb; + + itToolBar++; + } + qWarning("QtToolBarManager::restoreState(): cannot find a QToolBar with " + "matching 'windowTitle' (looking for '%s').", + objectName.toLocal8Bit().constData()); + + return 0; +} + +QAction *QtFullToolBarManagerPrivate::findAction(const QString &actionName) const +{ + QSetIterator<QAction *> itAction(allActions); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + + if (action->objectName() == actionName) + return action; + } + qWarning("QtToolBarManager::restoreState(): cannot find a QAction named " + "'%s', trying to match using 'text' instead.", + actionName.toLocal8Bit().constData()); + + itAction.toFront(); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + + if (action->text() == actionName) + return action; + } + qWarning("QtToolBarManager::restoreState(): cannot find a QAction with " + "matching 'text' (looking for '%s').", + actionName.toLocal8Bit().constData()); + + return 0; +} + +QToolBar *QtFullToolBarManagerPrivate::toolBarByName(const QString &toolBarName) const +{ + QMap<QToolBar *, QList<QAction *> >::ConstIterator itToolBar = toolBars.constBegin(); + while (itToolBar != toolBars.constEnd()) { + QToolBar *toolBar = itToolBar.key(); + if (toolBar->objectName() == toolBarName) + return toolBar; + + itToolBar++; + } + return 0; +} + +////////////////////////////// + +QtFullToolBarManager::QtFullToolBarManager(QObject *parent) + : QObject(parent) +{ + d_ptr = new QtFullToolBarManagerPrivate; + d_ptr->q_ptr = this; +} + +QtFullToolBarManager::~QtFullToolBarManager() +{ + delete d_ptr; +} + +void QtFullToolBarManager::setMainWindow(QMainWindow *mainWindow) +{ + d_ptr->theMainWindow = mainWindow; +} + +QMainWindow *QtFullToolBarManager::mainWindow() const +{ + return d_ptr->theMainWindow; +} + +void QtFullToolBarManager::addCategory(const QString &category) +{ + d_ptr->categoryToActions[category] = QList<QAction *>(); +} + +bool QtFullToolBarManager::hasCategory(const QString &category) const +{ + return d_ptr->categoryToActions.contains(category); +} + +QStringList QtFullToolBarManager::categories() const +{ + return d_ptr->categoryToActions.keys(); +} + +QList<QAction *> QtFullToolBarManager::categoryActions(const QString &category) const +{ + QMap<QString, QList<QAction *> >::ConstIterator it = + d_ptr->categoryToActions.find(category); + if (it != d_ptr->categoryToActions.constEnd()) + return it.value(); + return QList<QAction *>(); +} + +QString QtFullToolBarManager::actionCategory(QAction *action) const +{ + QMap<QAction *, QString>::ConstIterator it = d_ptr->actionToCategory.find(action); + if (it != d_ptr->actionToCategory.constEnd()) + return it.value(); + return QString(); +} + +void QtFullToolBarManager::addAction(QAction *action, const QString &category) +{ + if (!action) + return; +// if (!d_ptr->categoryToActions.contains(category)) +// return; + if (action->isSeparator()) + return; + if (d_ptr->allActions.contains(action)) + return; + if (QLatin1String(action->metaObject()->className()) == + QLatin1String("QToolBarWidgetAction")) + d_ptr->widgetActions.insert(action, 0); + else + d_ptr->regularActions.insert(action); + d_ptr->allActions.insert(action); + d_ptr->categoryToActions[category].append(action); + d_ptr->actionToCategory[action] = category; +} + +void QtFullToolBarManager::removeAction(QAction *action) +{ + if (!d_ptr->allActions.contains(action)) + return; + + QList<QToolBar *> toolBars = d_ptr->actionToToolBars[action]; + QListIterator<QToolBar *> itToolBar(toolBars); + while (itToolBar.hasNext()) { + QToolBar *toolBar = itToolBar.next(); + + d_ptr->toolBars[toolBar].removeAll(action); + d_ptr->toolBarsWithSeparators[toolBar].removeAll(action); + + toolBar->removeAction(action); + } + + QMap<QToolBar *, QList<QAction *> >::ConstIterator itDefault = + d_ptr->defaultToolBars.constBegin(); + while (itDefault != d_ptr->defaultToolBars.constEnd()) { + if (itDefault.value().contains(action)) + d_ptr->defaultToolBars[itDefault.key()].removeAll(action); + + itDefault++; + } + + d_ptr->allActions.remove(action); + d_ptr->widgetActions.remove(action); + d_ptr->regularActions.remove(action); + d_ptr->actionToToolBars.remove(action); + + QString category = d_ptr->actionToCategory.value(action); + d_ptr->actionToCategory.remove(action); + d_ptr->categoryToActions[category].removeAll(action); + + if (d_ptr->categoryToActions[category].isEmpty()) + d_ptr->categoryToActions.remove(category); +} + +QSet<QAction *> QtFullToolBarManager::actions() const +{ + return d_ptr->allActions; +} + +bool QtFullToolBarManager::isWidgetAction(QAction *action) const +{ + if (d_ptr->widgetActions.contains(action)) + return true; + return false; +} + +void QtFullToolBarManager::addDefaultToolBar(QToolBar *toolBar, const QString &category) +{ + if (!toolBar) + return; + if (d_ptr->toolBars.contains(toolBar)) + return; +// if (!d_ptr->categoryToActions.contains(category)) +// return; + // could be also checked if toolBar belongs to mainwindow + + QList<QAction *> newActionsWithSeparators; + QList<QAction *> newActions; + QList<QAction *> actions = toolBar->actions(); + QListIterator<QAction *> itAction(actions); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + addAction(action, category); + if (d_ptr->widgetActions.contains(action)) + d_ptr->widgetActions.insert(action, toolBar); + newActionsWithSeparators.append(action); + if (action->isSeparator()) + action = 0; + else + d_ptr->actionToToolBars[action].append(toolBar); + newActions.append(action); + } + d_ptr->defaultToolBars.insert(toolBar, newActions); + //Below could be done by call setToolBar() if we want signal emission here. + d_ptr->toolBars.insert(toolBar, newActions); + d_ptr->toolBarsWithSeparators.insert(toolBar, newActionsWithSeparators); +} + +void QtFullToolBarManager::removeDefaultToolBar(QToolBar *toolBar) +{ + if (!d_ptr->defaultToolBars.contains(toolBar)) + return; + + QList<QAction *> defaultActions = d_ptr->defaultToolBars[toolBar]; + setToolBar(toolBar, QList<QAction *>()); + QListIterator<QAction *> itAction(defaultActions); + while (itAction.hasNext()) + removeAction(itAction.next()); + + d_ptr->toolBars.remove(toolBar); + d_ptr->toolBarsWithSeparators.remove(toolBar); + d_ptr->defaultToolBars.remove(toolBar); + + itAction.toFront(); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + if (action) + toolBar->insertAction(0, action); + else + toolBar->insertSeparator(0); + } +} + +QMap<QToolBar *, QList<QAction *> > QtFullToolBarManager::defaultToolBars() const +{ + return d_ptr->defaultToolBars; +} + +bool QtFullToolBarManager::isDefaultToolBar(QToolBar *toolBar) const +{ + if (d_ptr->defaultToolBars.contains(toolBar)) + return true; + return false; +} + +QToolBar *QtFullToolBarManager::createToolBar(const QString &toolBarName) +{ + if (!mainWindow()) + return 0; + QToolBar *toolBar = new QToolBar(toolBarName, mainWindow()); + int i = 1; + QLatin1String prefix("_Custom_Toolbar_"); + QString name = QString("%1%2").arg(prefix).arg(i); + while (d_ptr->toolBarByName(name)) + name = QString("%1%2").arg(prefix).arg(++i); + toolBar->setObjectName(name); + mainWindow()->addToolBar(toolBar); + d_ptr->customToolBars.append(toolBar); + d_ptr->toolBars.insert(toolBar, QList<QAction *>()); + d_ptr->toolBarsWithSeparators.insert(toolBar, QList<QAction *>()); + //emit toolBarCreated(toolBar); + return toolBar; +} + +void QtFullToolBarManager::deleteToolBar(QToolBar *toolBar) +{ + if (!d_ptr->toolBars.contains(toolBar)) + return; + if (d_ptr->defaultToolBars.contains(toolBar)) + return; + setToolBar(toolBar, QList<QAction *>()); + //emit toolBarRemoved(toolBar); + d_ptr->customToolBars.removeAll(toolBar); + d_ptr->toolBars.remove(toolBar); + d_ptr->toolBarsWithSeparators.remove(toolBar); + delete toolBar; +} + +QList<QAction *> QtFullToolBarManager::actions(QToolBar *toolBar) const +{ + if (d_ptr->toolBars.contains(toolBar)) + return d_ptr->toolBars.value(toolBar); + return QList<QAction *>(); +} + +void QtFullToolBarManager::setToolBars(const QMap<QToolBar *, QList<QAction *> > &actions) +{ + QMap<QToolBar *, QList<QAction *> >::ConstIterator it = actions.constBegin(); + while (it != actions.constEnd()) { + setToolBar(it.key(), it.value()); + it++; + } +} + +void QtFullToolBarManager::setToolBar(QToolBar *toolBar, const QList<QAction *> &actions) +{ + if (!toolBar) + return; + if (!d_ptr->toolBars.contains(toolBar)) + return; + + if (actions == d_ptr->toolBars[toolBar]) + return; + + QMap<QToolBar *, QList<QAction *> > toRemove; + + QList<QAction *> newActions; + QListIterator<QAction *> itAction(actions); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + if (!action || (!newActions.contains(action) && d_ptr->allActions.contains(action))) + newActions.append(action); + + QToolBar *oldToolBar = d_ptr->toolBarWidgetAction(action); + if (oldToolBar && oldToolBar != toolBar) + toRemove[oldToolBar].append(action); + } + + d_ptr->removeWidgetActions(toRemove); + //emit toolBarChanged(toolBar, newActions); + + QList<QAction *> oldActions = d_ptr->toolBarsWithSeparators.value(toolBar); + QListIterator<QAction *> itOldAction(oldActions); + while (itOldAction.hasNext()) { + QAction *action = itOldAction.next(); + /* + When addDefaultToolBar() separator actions could be checked if they are + inserted in other toolbars - if yes then create new one. + */ + if (d_ptr->toolBarWidgetAction(action) == toolBar) + d_ptr->widgetActions.insert(action, 0); + toolBar->removeAction(action); + if (action->isSeparator()) + delete action; + else + d_ptr->actionToToolBars[action].removeAll(toolBar); + } + + QList<QAction *> newActionsWithSeparators; + QListIterator<QAction *> itNewActions(newActions); + while (itNewActions.hasNext()) { + QAction *action = itNewActions.next(); + QAction *newAction = 0; + if (!action) + newAction = toolBar->insertSeparator(0); + if (d_ptr->allActions.contains(action)) { + toolBar->insertAction(0, action); + newAction = action; + d_ptr->actionToToolBars[action].append(toolBar); + } + newActionsWithSeparators.append(newAction); + } + d_ptr->toolBars.insert(toolBar, newActions); + d_ptr->toolBarsWithSeparators.insert(toolBar, newActionsWithSeparators); +} + +QMap<QToolBar *, QList<QAction *> > QtFullToolBarManager::toolBarsActions() const +{ + return d_ptr->toolBars; +} + +void QtFullToolBarManager::resetToolBar(QToolBar *toolBar) +{ + if (!isDefaultToolBar(toolBar)) + return; + setToolBar(toolBar, defaultToolBars().value(toolBar)); +} + +void QtFullToolBarManager::resetAllToolBars() +{ + setToolBars(defaultToolBars()); + QList<QToolBar *> oldCustomToolBars = d_ptr->customToolBars; + QListIterator<QToolBar *> itToolBar(oldCustomToolBars); + while (itToolBar.hasNext()) { + deleteToolBar(itToolBar.next()); + } +} + +QByteArray QtFullToolBarManager::saveState(int version) const +{ + QByteArray data; + QDataStream stream(&data, QIODevice::WriteOnly); + stream << QtFullToolBarManagerPrivate::VersionMarker; + stream << version; + d_ptr->saveState(stream); + return data; +} + +bool QtFullToolBarManager::restoreState(const QByteArray &state, int version) +{ + QByteArray sd = state; + QDataStream stream(&sd, QIODevice::ReadOnly); + int marker, v; + stream >> marker; + stream >> v; + if (marker != QtFullToolBarManagerPrivate::VersionMarker || v != version) + return false; + return d_ptr->restoreState(stream); +} + + +class QtToolBarManagerPrivate +{ + class QtToolBarManager *q_ptr; + Q_DECLARE_PUBLIC(QtToolBarManager) +public: + QtFullToolBarManager *manager; +}; + +////////////////////////////////////// + +/*! \class QtToolBarManager + + \brief The QtToolBarManager class provides toolbar management for + main windows. + + The QtToolBarManager is typically used with a QtToolBarDialog + which allows the user to customize the toolbars for a given main + window. The QtToolBarDialog class's functionality is controlled by + an instance of the QtToolBarManager class, and the main window is + specified using the QtToolBarManager class's setMainWindow() + function. + + The currently specified main window can be retrieved using the + mainWindow() function. + + The toolbar manager holds lists of the given main window's actions + and toolbars, and can add actions and toolbars to these + lists using the addAction() and addToolBar() functions + respectively. The actions can in addition be categorized + acccording to the user's preferences. The toolbar manager can also + remove custom actions and toolbars using the removeAction() and + removeToolBar() functions. + + Finally, the QtToolBarManager is able to save the customized state + of its toolbars using the saveState() function as well as restore + the toolbars' saved state using restoreState() function. + + \sa QtToolBarDialog +*/ + +/*! + Creates a toolbar manager with the given \a parent. +*/ +QtToolBarManager::QtToolBarManager(QObject *parent) + : QObject(parent) +{ + d_ptr = new QtToolBarManagerPrivate; + d_ptr->q_ptr = this; + + d_ptr->manager = new QtFullToolBarManager(this); +} + +/*! + Destroys the toolbar manager. +*/ +QtToolBarManager::~QtToolBarManager() +{ + delete d_ptr; +} + +/*! + Sets the main window upon which the toolbar manager operates, to + be the given \a mainWindow. +*/ +void QtToolBarManager::setMainWindow(QMainWindow *mainWindow) +{ + d_ptr->manager->setMainWindow(mainWindow); +} + +/*! + Returns the main window associated this toolbar manager. +*/ +QMainWindow *QtToolBarManager::mainWindow() const +{ + return d_ptr->manager->mainWindow(); +} + +/*! + Adds the given \a action to the given \a category in the manager's + list of actions. If the \a category doesn't exist it is created. + Only non separator actions can be added. If the action is already + added to the list, the function doesn't do anything. + + \sa removeAction() +*/ +void QtToolBarManager::addAction(QAction *action, const QString &category) +{ + d_ptr->manager->addAction(action, category); +} + +/*! + Removes the specified \a action from the manager's list of + actions. The action is also removed from all the registered + toolbars. If the specified \a action is the only action in its + category, that category is removed as well. + + \sa addAction() +*/ +void QtToolBarManager::removeAction(QAction *action) +{ + d_ptr->manager->removeAction(action); +} + +/*! + Adds the given \a toolBar to the manager's toolbar list. + + All the \a toolBar's actions are automatically added to the given + \a category in the manager's list of actions if they're not + already there. The manager remembers which toolbar the actions + belonged to, so, when the \a toolBar is removed, its actions will + be removed as well. + + Custom toolbars are created with the main window returned by + the mainWindow() function, as its parent. + + \sa removeToolBar() +*/ +void QtToolBarManager::addToolBar(QToolBar *toolBar, const QString &category) +{ + d_ptr->manager->addDefaultToolBar(toolBar, category); +} + +/*! + Removes the specified \a toolBar from the manager's list. All the + actions that existed in the specified \a toolBar when it was + added are removed as well. + + \sa addToolBar() +*/ +void QtToolBarManager::removeToolBar(QToolBar *toolBar) +{ + d_ptr->manager->removeDefaultToolBar(toolBar); +} + +/*! + Returns the manager's toolbar list. +*/ +QList<QToolBar *> QtToolBarManager::toolBars() const +{ + return d_ptr->manager->toolBarsActions().keys(); +} + +/* +void QtToolBarManager::resetToolBar(QToolBar *toolBar) +{ + d_ptr->manager->resetToolBar(toolBar); +} + +void QtToolBarManager::resetAllToolBars() +{ + d_ptr->manager->resetAllToolBars(); +} +*/ + +/*! + Saves the state of the toolbar manager's toolbars. The \a version + number is stored as part of the data. + + Identifies all the QToolBar and QAction objects by their object + name property. Ensure that this property is unique for each + QToolBar and QAction that you add using the QtToolBarManager. + + Returns an identifier for the state which can be passed along with + the version number to the restoreState() function to restore the + saved state. + + \sa restoreState() +*/ +QByteArray QtToolBarManager::saveState(int version) const +{ + return d_ptr->manager->saveState(version); +} + +/*! + Restores the saved state of the toolbar manager's toolbars. The + \a version number is compared with the version number of the + stored \a state. + + Returns true if the version numbers are matching and the toolbar + manager's state is restored; otherwise the toolbar manager's state + is left unchanged and the function returns false. + + Note that the state of the toolbar manager's toolbars should be + restored before restoring the state of the main window's toolbars + and dockwidgets using the QMainWindow::restoreState() function. In + that way the restoreState() function can create the custom + toolbars before the QMainWindow::restoreState() function restores + the custom toolbars' positions. + + \sa saveState() +*/ +bool QtToolBarManager::restoreState(const QByteArray &state, int version) +{ + return d_ptr->manager->restoreState(state, version); +} + +////////////////////// + +class ToolBarItem { +public: + ToolBarItem() : tb(0) {} + ToolBarItem(QToolBar *toolBar) : tb(toolBar) {} + ToolBarItem(QToolBar *toolBar, const QString &toolBarName) + : tb(toolBar), tbName(toolBarName) {} + ToolBarItem(const QString &toolBarName) : tb(0), tbName(toolBarName) {} + QToolBar *toolBar() const + { return tb; } + void setToolBar(QToolBar *toolBar) + { tb = toolBar; } + QString toolBarName() const + { return tbName; } + void setToolBarName(const QString &toolBarName) + { tbName = toolBarName; } +private: + QToolBar *tb; + QString tbName; +}; + +class QtToolBarDialogPrivate { + QtToolBarDialog *q_ptr; + Q_DECLARE_PUBLIC(QtToolBarDialog) +public: + QtToolBarDialogPrivate() + : toolBarManager(0), + currentAction(0), + currentToolBar(0) + { } + + ToolBarItem *createItem(QToolBar *toolBar); + ToolBarItem *createItem(const QString &toolBarName); + void deleteItem(ToolBarItem *item); + + void newClicked(); + void removeClicked(); + void defaultClicked(); + void okClicked(); + void applyClicked(); + void cancelClicked(); + void upClicked(); + void downClicked(); + void leftClicked(); + void rightClicked(); + void renameClicked(); + void toolBarRenamed(QListWidgetItem *item); + void currentActionChanged(QTreeWidgetItem *current); + void currentToolBarChanged(QListWidgetItem *current); + void currentToolBarActionChanged(QListWidgetItem *current); + + void removeToolBar(ToolBarItem *item); + bool isDefaultToolBar(ToolBarItem *item) const; + void setButtons(); + void clearOld(); + void fillNew(); + QtFullToolBarManager *toolBarManager; + QMap<ToolBarItem *, QList<QAction *> > currentState; + QMap<QToolBar *, ToolBarItem *> toolBarItems; + QSet<ToolBarItem *> createdItems; + QSet<ToolBarItem *> removedItems; + + QSet<ToolBarItem *> allToolBarItems; + + // static + QTreeWidgetItem *currentAction; + QMap<QAction *, QTreeWidgetItem *> actionToItem; + QMap<QTreeWidgetItem *, QAction *> itemToAction; + + // dynamic + ToolBarItem *currentToolBar; + QMap<ToolBarItem *, QListWidgetItem *> toolBarToItem; + QMap<QListWidgetItem *, ToolBarItem *> itemToToolBar; + + // dynamic + QMap<QAction *, QListWidgetItem *> actionToCurrentItem; + QMap<QListWidgetItem *, QAction *> currentItemToAction; + + QMap<QAction *, ToolBarItem *> widgetActionToToolBar; + QMap<ToolBarItem *, QSet<QAction *> > toolBarToWidgetActions; + + QString separatorText; + Ui::QtToolBarDialog ui; +}; + +ToolBarItem *QtToolBarDialogPrivate::createItem(QToolBar *toolBar) +{ + if (!toolBar) + return 0; + ToolBarItem *item = new ToolBarItem(toolBar, toolBar->windowTitle()); + allToolBarItems.insert(item); + return item; +} + +ToolBarItem *QtToolBarDialogPrivate::createItem(const QString &toolBarName) +{ + ToolBarItem *item = new ToolBarItem(toolBarName); + allToolBarItems.insert(item); + return item; +} + +void QtToolBarDialogPrivate::deleteItem(ToolBarItem *item) +{ + if (!allToolBarItems.contains(item)) + return; + allToolBarItems.remove(item); + delete item; +} + +void QtToolBarDialogPrivate::clearOld() +{ + ui.actionTree->clear(); + ui.toolBarList->clear(); + ui.currentToolBarList->clear(); + ui.removeButton->setEnabled(false); + ui.newButton->setEnabled(false); + ui.upButton->setEnabled(false); + ui.downButton->setEnabled(false); + ui.leftButton->setEnabled(false); + ui.rightButton->setEnabled(false); + + actionToItem.clear(); + itemToAction.clear(); + toolBarToItem.clear(); + itemToToolBar.clear(); + actionToCurrentItem.clear(); + currentItemToAction.clear(); + widgetActionToToolBar.clear(); + toolBarToWidgetActions.clear(); + + toolBarItems.clear(); + currentState.clear(); + createdItems.clear(); + removedItems.clear(); + QSetIterator<ToolBarItem *> itItem(allToolBarItems); + while (itItem.hasNext()) + delete itItem.next(); + allToolBarItems.clear(); + + currentToolBar = 0; + currentAction = 0; +} + +void QtToolBarDialogPrivate::fillNew() +{ + if (!toolBarManager) + return; + + QTreeWidgetItem *item = new QTreeWidgetItem(ui.actionTree); + item->setText(0, separatorText); + ui.actionTree->setCurrentItem(item); + currentAction = item; + actionToItem.insert(0, item); + itemToAction.insert(item, 0); + QStringList categories = toolBarManager->categories(); + QStringListIterator itCategory(categories); + while (itCategory.hasNext()) { + QString category = itCategory.next(); + QTreeWidgetItem *categoryItem = new QTreeWidgetItem(ui.actionTree); + categoryItem->setText(0, category); + QList<QAction *> actions = toolBarManager->categoryActions(category); + QListIterator<QAction *> itAction(actions); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + item = new QTreeWidgetItem(categoryItem); + item->setText(0, action->text()); + item->setIcon(0, action->icon()); + item->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic); + actionToItem.insert(action, item); + itemToAction.insert(item, action); + if (toolBarManager->isWidgetAction(action)) { + item->setData(0, Qt::TextColorRole, QColor(Qt::blue)); + widgetActionToToolBar.insert(action, 0); + } + item->setFlags(item->flags() | Qt::ItemIsDragEnabled); + } + ui.actionTree->setItemExpanded(categoryItem, true); + } + //ui.actionTree->sortItems(0, Qt::AscendingOrder); + + QMap<QToolBar *, QList<QAction *> > toolBars = toolBarManager->toolBarsActions(); + QMap<QToolBar *, QList<QAction *> >::ConstIterator it = toolBars.constBegin(); + while (it != toolBars.constEnd()) { + QToolBar *toolBar = it.key(); + ToolBarItem *tbItem = createItem(toolBar); + toolBarItems.insert(toolBar, tbItem); + QListWidgetItem *item = new QListWidgetItem(toolBar->windowTitle(), + ui.toolBarList); + toolBarToItem.insert(tbItem, item); + itemToToolBar.insert(item, tbItem); + QList<QAction *> actions = it.value(); + QListIterator<QAction *> itAction(actions); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + if (toolBarManager->isWidgetAction(action)) { + widgetActionToToolBar.insert(action, tbItem); + toolBarToWidgetActions[tbItem].insert(action); + } + } + currentState.insert(tbItem, actions); + if (it == toolBars.constBegin()) + ui.toolBarList->setCurrentItem(item); + if (isDefaultToolBar(tbItem)) + item->setData(Qt::TextColorRole, QColor(Qt::darkGreen)); + else + item->setFlags(item->flags() | Qt::ItemIsEditable); + + it++; + } + ui.toolBarList->sortItems(); + setButtons(); +} + +bool QtToolBarDialogPrivate::isDefaultToolBar(ToolBarItem *item) const +{ + if (!item) + return false; + if (!item->toolBar()) + return false; + return toolBarManager->isDefaultToolBar(item->toolBar()); +} + +void QtToolBarDialogPrivate::setButtons() +{ + bool newEnabled = false; + bool removeEnabled = false; + bool renameEnabled = false; + bool upEnabled = false; + bool downEnabled = false; + bool leftEnabled = false; + bool rightEnabled = false; + + if (toolBarManager) { + newEnabled = true; + removeEnabled = !isDefaultToolBar(currentToolBar); + renameEnabled = removeEnabled; + QListWidgetItem *currentToolBarAction = ui.currentToolBarList->currentItem(); + if (currentToolBarAction) { + int row = ui.currentToolBarList->row(currentToolBarAction); + upEnabled = row > 0; + downEnabled = row < ui.currentToolBarList->count() - 1; + leftEnabled = true; + } + if (currentAction && currentToolBar) + rightEnabled = true; + } + ui.newButton->setEnabled(newEnabled); + ui.removeButton->setEnabled(removeEnabled); + ui.renameButton->setEnabled(renameEnabled); + ui.upButton->setEnabled(upEnabled); + ui.downButton->setEnabled(downEnabled); + ui.leftButton->setEnabled(leftEnabled); + ui.rightButton->setEnabled(rightEnabled); +} + +void QtToolBarDialogPrivate::newClicked() +{ + QString toolBarName = q_ptr->tr("Custom Toolbar"); // = QInputDialog::getString(); + // produce unique name + ToolBarItem *item = createItem(toolBarName); + currentState.insert(item, QList<QAction *>()); + createdItems.insert(item); + QListWidgetItem *i = new QListWidgetItem(toolBarName, ui.toolBarList); + i->setFlags(i->flags() | Qt::ItemIsEditable); + ui.toolBarList->setCurrentItem(i); + itemToToolBar.insert(i, item); + toolBarToItem.insert(item, i); + ui.toolBarList->sortItems(); + ui.toolBarList->setCurrentItem(i); + currentToolBarChanged(i); + renameClicked(); +} + +void QtToolBarDialogPrivate::removeToolBar(ToolBarItem *item) +{ + if (!item) + return; + if (item->toolBar() && toolBarManager->isDefaultToolBar(item->toolBar())) + return; + if (!toolBarToItem.contains(item)) + return; + QListWidgetItem *i = toolBarToItem.value(item); + bool wasCurrent = false; + if (i == ui.toolBarList->currentItem()) + wasCurrent = true; + int row = ui.toolBarList->row(i); + QMap<ToolBarItem *, QSet<QAction *> >::ConstIterator itToolBar = + toolBarToWidgetActions.find(item); + if (itToolBar != toolBarToWidgetActions.constEnd()) { + QSet<QAction *> actions = itToolBar.value(); + QSetIterator<QAction *> itAction(actions); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + widgetActionToToolBar.insert(action, 0); + } + toolBarToWidgetActions.remove(item); + } + + currentState.remove(item); + createdItems.remove(item); + toolBarToItem.remove(item); + itemToToolBar.remove(i); + delete i; + if (item->toolBar()) + removedItems.insert(item); + else + deleteItem(item); + if (wasCurrent) { + if (row == ui.toolBarList->count()) + row--; + if (row < 0) + ; + else + ui.toolBarList->setCurrentRow(row); + } + setButtons(); +} + +void QtToolBarDialogPrivate::removeClicked() +{ + QListWidgetItem *i = ui.toolBarList->currentItem(); + if (!i) + return; + ToolBarItem *item = itemToToolBar.value(i); + removeToolBar(item); +} + +void QtToolBarDialogPrivate::defaultClicked() +{ + QMap<QToolBar *, QList<QAction *> > defaultToolBars = toolBarManager->defaultToolBars(); + QMap<QToolBar *, QList<QAction *> >::ConstIterator itToolBar = defaultToolBars.constBegin(); + while (itToolBar != defaultToolBars.constEnd()) { + QToolBar *toolBar = itToolBar.key(); + ToolBarItem *toolBarItem = toolBarItems.value(toolBar); + + if (toolBarToWidgetActions.contains(toolBarItem)) { + QSetIterator<QAction *> itAction(toolBarToWidgetActions.value(toolBarItem)); + while (itAction.hasNext()) + widgetActionToToolBar.insert(itAction.next(), 0); + toolBarToWidgetActions.remove(toolBarItem); + } + + currentState.remove(toolBarItem); + + QListIterator<QAction *> itAction(itToolBar.value()); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + if (toolBarManager->isWidgetAction(action)) { + ToolBarItem *otherToolBar = widgetActionToToolBar.value(action); + if (otherToolBar) { + toolBarToWidgetActions[otherToolBar].remove(action); + currentState[otherToolBar].removeAll(action); + } + widgetActionToToolBar.insert(action, toolBarItem); + toolBarToWidgetActions[toolBarItem].insert(action); + } + } + currentState.insert(toolBarItem, itToolBar.value()); + + itToolBar++; + } + currentToolBarChanged(toolBarToItem.value(currentToolBar)); + + QList<ToolBarItem *> toolBars = currentState.keys(); + QListIterator<ToolBarItem *> itTb(toolBars); + while (itTb.hasNext()) + removeToolBar(itTb.next()); +} + +void QtToolBarDialogPrivate::okClicked() +{ + applyClicked(); + q_ptr->accept(); +} + +void QtToolBarDialogPrivate::applyClicked() +{ + QMap<ToolBarItem *, QList<QAction *> > toolBars = currentState; + QMap<ToolBarItem *, QList<QAction *> >::ConstIterator itToolBar = toolBars.constBegin(); + while (itToolBar != toolBars.constEnd()) { + ToolBarItem *item = itToolBar.key(); + QToolBar *toolBar = item->toolBar(); + if (toolBar) { + toolBarManager->setToolBar(toolBar, itToolBar.value()); + toolBar->setWindowTitle(item->toolBarName()); + } + + itToolBar++; + } + + QSet<ToolBarItem *> toRemove = removedItems; + QSetIterator<ToolBarItem *> itRemove(toRemove); + while (itRemove.hasNext()) { + ToolBarItem *item = itRemove.next(); + QToolBar *toolBar = item->toolBar(); + removedItems.remove(item); + currentState.remove(item); + deleteItem(item); + if (toolBar) + toolBarManager->deleteToolBar(toolBar); + } + + QSet<ToolBarItem *> toCreate = createdItems; + QSetIterator<ToolBarItem *> itCreate(toCreate); + while (itCreate.hasNext()) { + ToolBarItem *item = itCreate.next(); + QString toolBarName = item->toolBarName(); + createdItems.remove(item); + QList<QAction *> actions = currentState.value(item); + QToolBar *toolBar = toolBarManager->createToolBar(toolBarName); + item->setToolBar(toolBar); + toolBarManager->setToolBar(toolBar, actions); + } +} + +void QtToolBarDialogPrivate::upClicked() +{ + QListWidgetItem *currentToolBarAction = ui.currentToolBarList->currentItem(); + if (!currentToolBarAction) + return; + int row = ui.currentToolBarList->row(currentToolBarAction); + if (row == 0) + return; + ui.currentToolBarList->takeItem(row); + int newRow = row - 1; + ui.currentToolBarList->insertItem(newRow, currentToolBarAction); + QList<QAction *> actions = currentState.value(currentToolBar); + QAction *action = actions.at(row); + actions.removeAt(row); + actions.insert(newRow, action); + currentState.insert(currentToolBar, actions); + ui.currentToolBarList->setCurrentItem(currentToolBarAction); + setButtons(); +} + +void QtToolBarDialogPrivate::downClicked() +{ + QListWidgetItem *currentToolBarAction = ui.currentToolBarList->currentItem(); + if (!currentToolBarAction) + return; + int row = ui.currentToolBarList->row(currentToolBarAction); + if (row == ui.currentToolBarList->count() - 1) + return; + ui.currentToolBarList->takeItem(row); + int newRow = row + 1; + ui.currentToolBarList->insertItem(newRow, currentToolBarAction); + QList<QAction *> actions = currentState.value(currentToolBar); + QAction *action = actions.at(row); + actions.removeAt(row); + actions.insert(newRow, action); + currentState.insert(currentToolBar, actions); + ui.currentToolBarList->setCurrentItem(currentToolBarAction); + setButtons(); +} + +void QtToolBarDialogPrivate::leftClicked() +{ + QListWidgetItem *currentToolBarAction = ui.currentToolBarList->currentItem(); + if (!currentToolBarAction) + return; + int row = ui.currentToolBarList->row(currentToolBarAction); + currentState[currentToolBar].removeAt(row); + QAction *action = currentItemToAction.value(currentToolBarAction); + if (widgetActionToToolBar.contains(action)) { + ToolBarItem *item = widgetActionToToolBar.value(action); + if (item == currentToolBar) { // have to be + toolBarToWidgetActions[item].remove(action); + if (toolBarToWidgetActions[item].empty()) + toolBarToWidgetActions.remove(item); + } + widgetActionToToolBar.insert(action, 0); + } + if (action) + actionToCurrentItem.remove(action); + currentItemToAction.remove(currentToolBarAction); + delete currentToolBarAction; + if (row == ui.currentToolBarList->count()) + row--; + if (row >= 0) { + QListWidgetItem *item = ui.currentToolBarList->item(row); + ui.currentToolBarList->setCurrentItem(item); + } + setButtons(); +} + +void QtToolBarDialogPrivate::rightClicked() +{ + if (!currentAction) + return; + if (!currentToolBar) + return; + QListWidgetItem *currentToolBarAction = ui.currentToolBarList->currentItem(); + + QAction *action = itemToAction.value(currentAction); + QListWidgetItem *item = 0; + if (action) { + if (currentState[currentToolBar].contains(action)) { + item = actionToCurrentItem.value(action); + if (item == currentToolBarAction) + return; + int row = ui.currentToolBarList->row(item); + ui.currentToolBarList->takeItem(row); + currentState[currentToolBar].removeAt(row); + // only reorder here + } else { + item = new QListWidgetItem(action->text()); + item->setIcon(action->icon()); + item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic); + currentItemToAction.insert(item, action); + actionToCurrentItem.insert(action, item); + if (widgetActionToToolBar.contains(action)) { + item->setData(Qt::TextColorRole, QColor(Qt::blue)); + ToolBarItem *toolBar = widgetActionToToolBar.value(action); + if (toolBar) { + currentState[toolBar].removeAll(action); + toolBarToWidgetActions[toolBar].remove(action); + if (toolBarToWidgetActions[toolBar].empty()) + toolBarToWidgetActions.remove(toolBar); + } + widgetActionToToolBar.insert(action, currentToolBar); + toolBarToWidgetActions[currentToolBar].insert(action); + } + } + } else { + item = new QListWidgetItem(separatorText); + currentItemToAction.insert(item, 0); + } + + int row = ui.currentToolBarList->count(); + if (currentToolBarAction) { + row = ui.currentToolBarList->row(currentToolBarAction) + 1; + } + ui.currentToolBarList->insertItem(row, item); + currentState[currentToolBar].insert(row, action); + ui.currentToolBarList->setCurrentItem(item); + + setButtons(); +} + +void QtToolBarDialogPrivate::renameClicked() +{ + if (!currentToolBar) + return; + + QListWidgetItem *item = toolBarToItem.value(currentToolBar); + ui.toolBarList->editItem(item); +} + +void QtToolBarDialogPrivate::toolBarRenamed(QListWidgetItem *item) +{ + if (!currentToolBar) + return; + + ToolBarItem *tbItem = itemToToolBar.value(item); + if (!tbItem) + return; + tbItem->setToolBarName(item->text()); + //ui.toolBarList->sortItems(); +} + +void QtToolBarDialogPrivate::currentActionChanged(QTreeWidgetItem *current) +{ + if (itemToAction.contains(current)) + currentAction = current; + else + currentAction = NULL; + setButtons(); +} + +void QtToolBarDialogPrivate::currentToolBarChanged(QListWidgetItem *current) +{ + currentToolBar = itemToToolBar.value(current); + ui.currentToolBarList->clear(); + actionToCurrentItem.clear(); + currentItemToAction.clear(); + setButtons(); + if (!currentToolBar) { + return; + } + QList<QAction *> actions = currentState.value(currentToolBar); + QListIterator<QAction *> itAction(actions); + QListWidgetItem *first = 0; + while (itAction.hasNext()) { + QAction *action = itAction.next(); + QString actionName = separatorText; + if (action) + actionName = action->text(); + QListWidgetItem *item = new QListWidgetItem(actionName, ui.currentToolBarList); + if (action) { + item->setIcon(action->icon()); + item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic); + actionToCurrentItem.insert(action, item); + if (widgetActionToToolBar.contains(action)) + item->setData(Qt::TextColorRole, QColor(Qt::blue)); + } + currentItemToAction.insert(item, action); + if (!first) + first = item; + } + if (first) + ui.currentToolBarList->setCurrentItem(first); +} + +void QtToolBarDialogPrivate::currentToolBarActionChanged(QListWidgetItem *) +{ + setButtons(); +} + +void QtToolBarDialogPrivate::cancelClicked() +{ + // just nothing + q_ptr->reject(); +} + +////////////////////// +/* +class FeedbackItemDelegate : public QItemDelegate +{ + Q_OBJECT +public: + FeedbackItemDelegate(QObject *parent = 0) : QItemDelegate(parent) { } + + virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex & index) const; + virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; +}; + +void FeedbackItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + if () + painter->save(); + QRect r = option.rect; + float yCentral = r.height() / 2.0; + float margin = 2.0; + float arrowWidth = 5.0; + float width = 20; + qDebug("rect: x %d, y %d, w %d, h %d", r.x(), r.y(), r.width(), r.height()); + QLineF lineBase(0.0 + margin, r.y() + yCentral, width - margin, r.y() + yCentral); + QLineF lineArrowLeft(width - margin - arrowWidth, r.y() + yCentral - arrowWidth, + width - margin, r.y() + yCentral); + QLineF lineArrowRight(width - margin - arrowWidth, r.y() + yCentral + arrowWidth, + width - margin, r.y() + yCentral); + painter->drawLine(lineBase); + painter->drawLine(lineArrowLeft); + painter->drawLine(lineArrowRight); + painter->translate(QPoint(width, 0)); + QItemDelegate::paint(painter, option, index); + painter->restore(); +} + +QSize FeedbackItemDelegate::sizeHint(const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + //return QItemDelegate::sizeHint(option, index); + QSize s = QItemDelegate::sizeHint(option, index); + s.setWidth(s.width() - 20); + return s; +} + +class QtToolBarListWidget : public QListWidget +{ + Q_OBJECT +public: + QtToolBarListWidget(QWidget *parent) : QListWidget(parent), actionDrag(false) {} + +protected: + void startDrag(Qt::DropActions supportedActions); + + void dragEnterEvent(QDragEnterEvent *event); + void dragMoveEvent(QDragMoveEvent *event); + void dragLeaveEvent(QDragLeaveEvent *); + void dropEvent(QDropEvent *event); + + void setDragAction(const QString *action) { actionName = action; } +private: + QPersistentModelIndex lastDropIndicator; + QString actionName; + bool actionDrag; +}; + +void QtToolBarListWidget::startDrag(Qt::DropActions supportedActions) +{ + QListWidgetItem *item = currentItem(); + if (item) { + actionName = QString(); + emit aboutToDrag(item); + if (!actionName.isEmpty()) { + QDrag *drag = new QDrag(this); + QMimeData *data = new QMimeData; + data->setData("action", actionName.toLocal8Bit().constData()); + drag->setMimeData(data); + drag->start(supportedActions); + } + } +} + +void QtToolBarListWidget::dragEnterEvent(QDragEnterEvent *event) +{ + const QMimeData *mime = event->mimeData(); + actionDrag = mime->hasFormat("action"); + if (actionDrag) + event->accept(); + else + event->ignore(); +} + +void QtToolBarListWidget::dragMoveEvent(QDragMoveEvent *event) +{ + event->ignore(); + if (actionDrag) { + QPoint p = event->pos(); + QListWidgetItem *item = itemAt(p); + Indicator indic = QtToolBarListWidget::None; + if (item) { + QRect rect = visualItemRect(item); + if (p.y() - rect.top() < rect.height() / 2) + indic = QtToolBarListWidget::Above; + else + indic = QtToolBarListWidget::Below; + } + setIndicator(item, indic); + event->accept(); + } +} + +void QtToolBarListWidget::dragLeaveEvent(QDragLeaveEvent *) +{ + if (actionDrag) { + actionDrag = false; + setIndicator(item, QtToolBarListWidget::None); + } +} + +void QtToolBarListWidget::dropEvent(QDropEvent *event) +{ + if (actionDrag) { + QListWidgetItem *item = indicatorItem(); + Indicator indic = indicator(); + QByteArray array = event->mimeData()->data("action"); + QDataStream stream(&array, QIODevice::ReadOnly); + QString action; + stream >> action; + emit actionDropped(action, item, ); + + actionDrag = false; + setIndicator(item, QtToolBarListWidget::None); + } +} +*/ + +/*! \class QtToolBarDialog + + \brief The QtToolBarDialog class provides a dialog for customizing + toolbars. + + QtToolBarDialog allows the user to customize the toolbars for a + given main window. + + \image qttoolbardialog.png + + The dialog lets the users add, rename and remove custom toolbars. + Note that built-in toolbars are marked with a green color, and + cannot be removed or renamed. + + The users can also add and remove actions from the toolbars. An + action can be added to many toolbars, but a toolbar can only + contain one instance of each action. Actions that contains a + widget are marked with a blue color in the list of actions, and + can only be added to one single toolbar. + + Finally, the users can add separators to the toolbars. + + The original toolbars can be restored by clicking the \gui + {Restore all} button. All custom toolbars will then be removed, + and all built-in toolbars will be restored to their original state. + + The QtToolBarDialog class's functionality is controlled by an + instance of the QtToolBarManager class, and the main window is + specified using the QtToolBarManager::setMainWindow() function. + + All you need to do to use QtToolBarDialog is to specify an + QtToolBarManager instance and call the QDialog::exec() slot: + + \code + QtToolBarManager *toolBarManager; + + void MyMainWindow::customize() + { + QtToolBarDialog dialog(this); + dialog.setToolBarManager(toolBarManager); + dialog.exec(); + } + \endcode + + \sa QtToolBarManager +*/ + +/*! + Creates a toolbar dialog with the given \a parent and the specifed + window \a flags. +*/ +QtToolBarDialog::QtToolBarDialog(QWidget *parent, Qt::WindowFlags flags) + : QDialog(parent, flags) +{ + d_ptr = new QtToolBarDialogPrivate; + d_ptr->q_ptr = this; + d_ptr->ui.setupUi(this); + d_ptr->separatorText = tr("< S E P A R A T O R >"); + + d_ptr->ui.actionTree->setColumnCount(1); + d_ptr->ui.actionTree->setRootIsDecorated(false); + d_ptr->ui.actionTree->header()->hide(); +/* + ui.toolBarList->setEditTriggers(QAbstractItemView::DoubleClicked | + QAbstractItemView::EditKeyPressed); +*/ + +// ui.actionList->setDragEnabled(true); +// FeedbackItemDelegate *del = new FeedbackItemDelegate(this); +// ui.currentToolBarList->setItemDelegate(del); +// ui.currentToolBarList->setAcceptDrops(true); + + d_ptr->ui.upButton->setIcon(QIcon(":/qttoolbardialog/up.png")); + d_ptr->ui.downButton->setIcon(QIcon(":/qttoolbardialog/down.png")); + d_ptr->ui.leftButton->setIcon(QIcon(":/qttoolbardialog/back.png")); + d_ptr->ui.rightButton->setIcon(QIcon(":/qttoolbardialog/forward.png")); + d_ptr->ui.newButton->setIcon(QIcon(":/qttoolbardialog/plus.png")); + d_ptr->ui.removeButton->setIcon(QIcon(":/qttoolbardialog/minus.png")); + + connect(d_ptr->ui.newButton, SIGNAL(clicked()), this, SLOT(newClicked())); + connect(d_ptr->ui.removeButton, SIGNAL(clicked()), this, SLOT(removeClicked())); + connect(d_ptr->ui.renameButton, SIGNAL(clicked()), this, SLOT(renameClicked())); + connect(d_ptr->ui.defaultButton, SIGNAL(clicked()), this, SLOT(defaultClicked())); + connect(d_ptr->ui.okButton, SIGNAL(clicked()), this, SLOT(okClicked())); + connect(d_ptr->ui.applyButton, SIGNAL(clicked()), this, SLOT(applyClicked())); + connect(d_ptr->ui.cancelButton, SIGNAL(clicked()), this, SLOT(cancelClicked())); + connect(d_ptr->ui.upButton, SIGNAL(clicked()), this, SLOT(upClicked())); + connect(d_ptr->ui.downButton, SIGNAL(clicked()), this, SLOT(downClicked())); + connect(d_ptr->ui.leftButton, SIGNAL(clicked()), this, SLOT(leftClicked())); + connect(d_ptr->ui.rightButton, SIGNAL(clicked()), this, SLOT(rightClicked())); + + connect(d_ptr->ui.actionTree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), + this, SLOT(currentActionChanged(QTreeWidgetItem *))); + connect(d_ptr->ui.toolBarList, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), + this, SLOT(currentToolBarChanged(QListWidgetItem *))); + connect(d_ptr->ui.currentToolBarList, + SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), + this, SLOT(currentToolBarActionChanged(QListWidgetItem *))); + + connect(d_ptr->ui.actionTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), + this, SLOT(rightClicked())); + connect(d_ptr->ui.currentToolBarList, SIGNAL(itemDoubleClicked(QListWidgetItem *)), + this, SLOT(leftClicked())); + connect(d_ptr->ui.toolBarList, SIGNAL(itemChanged(QListWidgetItem *)), + this, SLOT(toolBarRenamed(QListWidgetItem *))); +} + +/*! + Destroys the toolbar dialog. +*/ +QtToolBarDialog::~QtToolBarDialog() +{ + d_ptr->clearOld(); + delete d_ptr; +} + +/*! + Connects the toolbar dialog to the given \a toolBarManager. Then, + when exec() is called, the toolbar dialog will operate using the + given \a toolBarManager. +*/ +void QtToolBarDialog::setToolBarManager(QtToolBarManager *toolBarManager) +{ + if (d_ptr->toolBarManager == toolBarManager->d_ptr->manager) + return; + if (isVisible()) + d_ptr->clearOld(); + d_ptr->toolBarManager = toolBarManager->d_ptr->manager; + if (isVisible()) + d_ptr->fillNew(); +} + +/*! + \reimp +*/ +void QtToolBarDialog::showEvent(QShowEvent *event) +{ + if (!event->spontaneous()) + d_ptr->fillNew(); +} + +/*! + \reimp +*/ +void QtToolBarDialog::hideEvent(QHideEvent *event) +{ + if (!event->spontaneous()) + d_ptr->clearOld(); +} + +#include "moc_qttoolbardialog.cpp" +#include "qttoolbardialog.moc" diff --git a/src/QToolBarDialog/qttoolbardialog.h b/src/QToolBarDialog/qttoolbardialog.h new file mode 100644 index 0000000..264e701 --- /dev/null +++ b/src/QToolBarDialog/qttoolbardialog.h @@ -0,0 +1,144 @@ +/**************************************************************************** +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of a Qt Solutions component. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact Nokia at qt-info@nokia.com. +** +****************************************************************************/ + +#ifndef QTTOOLBARDIALOG_H +#define QTTOOLBARDIALOG_H + +#include <QDialog> + +#if defined(Q_WS_WIN) +# if !defined(QT_QTTOOLBARDIALOG_EXPORT) && !defined(QT_QTTOOLBARDIALOG_IMPORT) +# define QT_QTTOOLBARDIALOG_EXPORT +# elif defined(QT_QTTOOLBARDIALOG_IMPORT) +# if defined(QT_QTTOOLBARDIALOG_EXPORT) +# undef QT_QTTOOLBARDIALOG_EXPORT +# endif +# define QT_QTTOOLBARDIALOG_EXPORT __declspec(dllimport) +# elif defined(QT_QTTOOLBARDIALOG_EXPORT) +# undef QT_QTTOOLBARDIALOG_EXPORT +# define QT_QTTOOLBARDIALOG_EXPORT __declspec(dllexport) +# endif +#else +# define QT_QTTOOLBARDIALOG_EXPORT +#endif + +class QMainWindow; +class QAction; +class QToolBar; + +class QtToolBarManagerPrivate; + +class QT_QTTOOLBARDIALOG_EXPORT QtToolBarManager : public QObject +{ + Q_OBJECT +public: + + QtToolBarManager(QObject *parent = 0); + ~QtToolBarManager(); + + void setMainWindow(QMainWindow *mainWindow); + QMainWindow *mainWindow() const; + + void addAction(QAction *action, const QString &category); + void removeAction(QAction *action); + + void addToolBar(QToolBar *toolBar, const QString &category); + void removeToolBar(QToolBar *toolBar); + + QList<QToolBar *> toolBars() const; + + QByteArray saveState(int version = 0) const; + bool restoreState(const QByteArray &state, int version = 0); + +private: + + friend class QtToolBarDialog; + QtToolBarManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtToolBarManager) + Q_DISABLE_COPY(QtToolBarManager) +}; + +class QtToolBarDialogPrivate; + +class QT_QTTOOLBARDIALOG_EXPORT QtToolBarDialog : public QDialog +{ + Q_OBJECT +public: + + QtToolBarDialog(QWidget *parent = 0, Qt::WindowFlags flags = 0); + ~QtToolBarDialog(); + + void setToolBarManager(QtToolBarManager *toolBarManager); + +protected: + + void showEvent(QShowEvent *event); + void hideEvent(QHideEvent *event); + +private: + + QtToolBarDialogPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtToolBarDialog) + Q_DISABLE_COPY(QtToolBarDialog) + + Q_PRIVATE_SLOT(d_func(), void newClicked()) + Q_PRIVATE_SLOT(d_func(), void removeClicked()) + Q_PRIVATE_SLOT(d_func(), void defaultClicked()) + Q_PRIVATE_SLOT(d_func(), void okClicked()) + Q_PRIVATE_SLOT(d_func(), void applyClicked()) + Q_PRIVATE_SLOT(d_func(), void cancelClicked()) + Q_PRIVATE_SLOT(d_func(), void upClicked()) + Q_PRIVATE_SLOT(d_func(), void downClicked()) + Q_PRIVATE_SLOT(d_func(), void leftClicked()) + Q_PRIVATE_SLOT(d_func(), void rightClicked()) + Q_PRIVATE_SLOT(d_func(), void renameClicked()) + Q_PRIVATE_SLOT(d_func(), void toolBarRenamed(QListWidgetItem *)) + Q_PRIVATE_SLOT(d_func(), void currentActionChanged(QTreeWidgetItem *)) + Q_PRIVATE_SLOT(d_func(), void currentToolBarChanged(QListWidgetItem *)) + Q_PRIVATE_SLOT(d_func(), void currentToolBarActionChanged(QListWidgetItem *)) +}; + +#endif diff --git a/src/QToolBarDialog/qttoolbardialog.ui b/src/QToolBarDialog/qttoolbardialog.ui new file mode 100644 index 0000000..7c2dc10 --- /dev/null +++ b/src/QToolBarDialog/qttoolbardialog.ui @@ -0,0 +1,240 @@ +<ui version="4.0" > + <author></author> + <comment></comment> + <exportmacro></exportmacro> + <class>QtToolBarDialog</class> + <widget class="QDialog" name="QtToolBarDialog" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>487</width> + <height>464</height> + </rect> + </property> + <property name="windowTitle" > + <string>Customize Toolbars</string> + </property> + <layout class="QGridLayout" > + <property name="margin" > + <number>8</number> + </property> + <property name="spacing" > + <number>6</number> + </property> + <item rowspan="3" row="1" column="0" > + <widget class="QTreeWidget" name="actionTree" /> + </item> + <item row="0" column="0" > + <widget class="QLabel" name="label" > + <property name="text" > + <string>Actions</string> + </property> + </widget> + </item> + <item row="0" column="1" colspan="2" > + <layout class="QHBoxLayout" > + <property name="margin" > + <number>0</number> + </property> + <property name="spacing" > + <number>6</number> + </property> + <item> + <widget class="QLabel" name="label_2" > + <property name="text" > + <string>Toolbars</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="newButton" > + <property name="text" > + <string>New</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="removeButton" > + <property name="text" > + <string>Remove</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="renameButton" > + <property name="text" > + <string>Rename</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="4" column="0" colspan="3" > + <layout class="QHBoxLayout" > + <property name="margin" > + <number>0</number> + </property> + <property name="spacing" > + <number>6</number> + </property> + <item> + <widget class="QPushButton" name="defaultButton" > + <property name="text" > + <string>Restore All</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation" > + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" > + <size> + <width>61</width> + <height>31</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="okButton" > + <property name="text" > + <string>OK</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="applyButton" > + <property name="text" > + <string>Apply</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="cancelButton" > + <property name="text" > + <string>Cancel</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="3" column="1" > + <layout class="QVBoxLayout" > + <property name="margin" > + <number>0</number> + </property> + <property name="spacing" > + <number>6</number> + </property> + <item> + <widget class="QToolButton" name="upButton" > + <property name="sizePolicy" > + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text" > + <string>Up</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="leftButton" > + <property name="sizePolicy" > + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text" > + <string><-</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="rightButton" > + <property name="sizePolicy" > + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text" > + <string>-></string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="downButton" > + <property name="sizePolicy" > + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text" > + <string>Down</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation" > + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" > + <size> + <width>29</width> + <height>16</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="3" column="2" > + <widget class="QListWidget" name="currentToolBarList" /> + </item> + <item row="2" column="1" colspan="2" > + <widget class="QLabel" name="label_3" > + <property name="text" > + <string>Current Toolbar Actions</string> + </property> + </widget> + </item> + <item row="1" column="1" colspan="2" > + <widget class="QListWidget" name="toolBarList" /> + </item> + </layout> + </widget> + <pixmapfunction></pixmapfunction> + <tabstops> + <tabstop>newButton</tabstop> + <tabstop>removeButton</tabstop> + <tabstop>renameButton</tabstop> + <tabstop>toolBarList</tabstop> + <tabstop>upButton</tabstop> + <tabstop>leftButton</tabstop> + <tabstop>rightButton</tabstop> + <tabstop>downButton</tabstop> + <tabstop>currentToolBarList</tabstop> + <tabstop>defaultButton</tabstop> + <tabstop>okButton</tabstop> + <tabstop>applyButton</tabstop> + <tabstop>cancelButton</tabstop> + </tabstops> + <resources/> + <connections/> +</ui> diff --git a/src/Render/MapRenderer.cpp b/src/Render/MapRenderer.cpp new file mode 100644 index 0000000..bdf079e --- /dev/null +++ b/src/Render/MapRenderer.cpp @@ -0,0 +1,397 @@ +// +// C++ Implementation: MapRenderer +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com>, (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "MapRenderer.h" + +#include "Document.h" +#include "Features.h" +#include "MapView.h" +#include "MasPaintStyle.h" +#include "ImageMapLayer.h" +#include "LineF.h" + +#define TEST_RFLAGS(x) theOptions.options.testFlag(x) +#define TEST_RENDERER_RFLAGS(x) r->theOptions.options.testFlag(x) + +void BackgroundStyleLayer::draw(Way* R) +{ + const FeaturePainter* paintsel = R->getPainter(r->thePixelPerM); + if (paintsel) { + paintsel->drawBackground(R, r->thePainter, r); + } else if (!TEST_RENDERER_RFLAGS(RendererOptions::UnstyledHidden)) +// if (/*!globalZoom(r->theProjection) && */!R->hasPainter()) //FIXME Untagged roads level of zoom? + { + QPen thePen(QColor(0,0,0),1); + + r->thePainter->setBrush(Qt::NoBrush); + if (R->layer()->classType() == Layer::ImageLayerType && M_PREFS->getUseShapefileForBackground()) { + thePen = QPen(QColor(0xc0,0xc0,0xc0),1); + if (M_PREFS->getBackgroundOverwriteStyle() || !M_STYLE->getGlobalPainter().getDrawBackground()) + r->thePainter->setBrush(M_PREFS->getBgColor()); + else + r->thePainter->setBrush(QBrush(M_STYLE->getGlobalPainter().getBackgroundColor())); + } else { + if (r->thePixelPerM < M_PREFS->getRegionalZoom()) + thePen = QPen(QColor(0x77,0x77,0x77),1); + } + + r->thePainter->setPen(thePen); + R->getLock(); + r->thePainter->drawPath(r->theTransform.map(R->getPath())); + R->releaseLock(); + } +} + +void BackgroundStyleLayer::draw(Relation* R) +{ + const FeaturePainter* paintsel = R->getPainter(r->thePixelPerM); + if (paintsel) + paintsel->drawBackground(R,r->thePainter,r); +} + + +void BackgroundStyleLayer::draw(Node* N) +{ + if ((N->isReadonly() || !N->isSelectable(r->thePixelPerM, r->theOptions)) && (!N->isPOI() && !N->isWaypoint())) + return; + + const FeaturePainter* paintsel = N->getPainter(r->thePixelPerM); + if (paintsel) + paintsel->drawBackground(N,r->thePainter,r); +} + +void ForegroundStyleLayer::draw(Way* R) +{ + const FeaturePainter* paintsel = R->getPainter(r->thePixelPerM); + if (paintsel) + paintsel->drawForeground(R,r->thePainter,r); +} + +void ForegroundStyleLayer::draw(Relation* R) +{ + const FeaturePainter* paintsel = R->getPainter(r->thePixelPerM); + if (paintsel) + paintsel->drawForeground(R,r->thePainter,r); +} + +void ForegroundStyleLayer::draw(Node* N) +{ + if ((N->isReadonly() || !N->isSelectable(r->thePixelPerM, r->theOptions)) && (!N->isPOI() && !N->isWaypoint())) + return; + + const FeaturePainter* paintsel = N->getPainter(r->thePixelPerM); + if (paintsel) + paintsel->drawForeground(N,r->thePainter,r); +} + +void TouchupStyleLayer::draw(Way* R) +{ + const FeaturePainter* paintsel = R->getPainter(r->thePixelPerM); + if (paintsel) + paintsel->drawTouchup(R,r->thePainter,r); + else if (!R->hasPainter() && !TEST_RENDERER_RFLAGS(RendererOptions::UnstyledHidden)) { + if ( r->theOptions.arrowOptions != RendererOptions::ArrowsNever ) + { + Feature::TrafficDirectionType TT = trafficDirection(R); + if ( (TT != Feature::UnknownDirection) || (r->theOptions.arrowOptions == RendererOptions::ArrowsAlways) ) + { + qreal theWidth = r->thePixelPerM*R->widthOf()-4; + if (theWidth > 8) + theWidth = 8; + qreal DistFromCenter = 2*(theWidth+4); + if (theWidth > 0) + { + for (int i=1; i<R->size(); ++i) + { + QPointF FromF(r->toView(R->getNode(i-1))); + QPointF ToF(r->toView(R->getNode(i))); + if (distance(FromF,ToF) > (DistFromCenter*2+4)) + { + QPointF H(FromF+ToF); + H *= 0.5; + qreal A = angle(FromF-ToF); + QPointF T(DistFromCenter*cos(A),DistFromCenter*sin(A)); + QPointF V1(theWidth*cos(A+M_PI/6),theWidth*sin(A+M_PI/6)); + QPointF V2(theWidth*cos(A-M_PI/6),theWidth*sin(A-M_PI/6)); + if ( (TT == Feature::OtherWay) || (TT == Feature::BothWays) ) + { + r->thePainter->setPen(QPen(QColor(0,0,255), 2)); + r->thePainter->drawLine(H+T,H+T-V1); + r->thePainter->drawLine(H+T,H+T-V2); + } + if ( (TT == Feature::OneWay) || (TT == Feature::BothWays) ) + { + r->thePainter->setPen(QPen(QColor(0,0,255), 2)); + r->thePainter->drawLine(H-T,H-T+V1); + r->thePainter->drawLine(H-T,H-T+V2); + } + else + { + if ( r->theOptions.arrowOptions == RendererOptions::ArrowsAlways ) + { + r->thePainter->setPen(QPen(QColor(255,0,0), 2)); + r->thePainter->drawLine(H-T,H-T+V1); + r->thePainter->drawLine(H-T,H-T+V2); + } + } + } + } + } + } + } + } +} + +void TouchupStyleLayer::draw(Relation* /* R */) +{ +} + +void TouchupStyleLayer::draw(Node* Pt) +{ + const FeaturePainter* paintsel = Pt->getPainter(r->thePixelPerM); + if (paintsel) + paintsel->drawTouchup(Pt,r->thePainter,r); + else if (!TEST_RENDERER_RFLAGS(RendererOptions::UnstyledHidden)) { + if (! ((Pt->isReadonly() || !Pt->isSelectable(r->thePixelPerM, r->theOptions)) && (!Pt->isPOI() && !Pt->isWaypoint()))) +// if (!Pt->isReadonly() && Pt->isSelectable(r)) + { + qreal WW = r->NodeWidth; + if (WW >= 1) { + QColor theColor = QColor(0,0,0,128); + if (r->theGlobalPainter.DrawNodes) { + theColor = r->theGlobalPainter.NodesColor; + } + QPointF P(r->toView(Pt)); + if (Pt->layer() && (Pt->layer()->classGroups() & Layer::Special)) { + QRect R2(P.x()-(WW+4)/2, P.y()-(WW+4)/2, WW+4, WW+4); + r->thePainter->fillRect(R2,QColor(255,0,255,192)); + } else if (Pt->isWaypoint()) { + QRect R2(P.x()-(WW+4)/2, P.y()-(WW+4)/2, WW+4, WW+4); + r->thePainter->fillRect(R2,QColor(255,0,0,192)); + } + + QRect R(P.x()-WW/2, P.y()-WW/2, WW, WW); + r->thePainter->fillRect(R,theColor); + } + } + } +} + +void LabelStyleLayer::draw(Way* R) +{ + const FeaturePainter* paintsel = R->getPainter(r->thePixelPerM); + if (paintsel) + paintsel->drawLabel(R,r->thePainter,r); +} + +void LabelStyleLayer::draw(Relation* /* R */) +{ +} + +void LabelStyleLayer::draw(Node* Pt) +{ + const FeaturePainter* paintsel = Pt->getPainter(r->thePixelPerM); + if (paintsel) + paintsel->drawLabel(Pt,r->thePainter,r); +} + +/*** MapRenderer ***/ + +MapRenderer::MapRenderer() +{ + bglayer = BackgroundStyleLayer(this); + fglayer = ForegroundStyleLayer(this); + tchuplayer = TouchupStyleLayer(this); + lbllayer = LabelStyleLayer(this); +} + +QPoint MapRenderer::toView(Node* aPt) const +{ + return theTransform.map(aPt->projected()).toPoint(); +} + + +void MapRenderer::render( + QPainter* P, + const QMap<RenderPriority, QSet <Feature*> >& theFeatures, + const QRectF& pViewport, + const QRect& screen, + const qreal pixelPerM, + const RendererOptions& options +) +{ + theViewport = pViewport; + theScreen = screen; + thePixelPerM = pixelPerM; + + qreal Aspect = (double)screen.width() / screen.height(); + qreal pAspect = fabs(pViewport.width() / pViewport.height()); + + qreal wv, hv; + if (pAspect > Aspect) { + wv = fabs(pViewport.width()); + hv = fabs(pViewport.height() * pAspect / Aspect); + } else { + wv = fabs(pViewport.width() * Aspect / pAspect); + hv = fabs(pViewport.height()); + } + + qreal ScaleLon = screen.width() / wv; + qreal ScaleLat = screen.height() / hv; + theTransform.reset(); + theTransform.scale(ScaleLon, -ScaleLat); + theTransform.translate(-pViewport.topLeft().x(), -pViewport.topLeft().y()); + + theOptions = options; + theGlobalPainter = M_STYLE->getGlobalPainter(); + if (theGlobalPainter.DrawNodes) { + NodeWidth = thePixelPerM*theGlobalPainter.NodesProportional+theGlobalPainter.NodesFixed; + } else { + NodeWidth = thePixelPerM * M_PREFS->getNodeSize(); + if (NodeWidth > M_PREFS->getNodeSize()) + NodeWidth = M_PREFS->getNodeSize(); + } + + bool bgLayerVisible = TEST_RFLAGS(RendererOptions::BackgroundVisible); + bool fgLayerVisible = TEST_RFLAGS(RendererOptions::ForegroundVisible); + bool tchpLayerVisible = TEST_RFLAGS(RendererOptions::TouchupVisible); + bool lblLayerVisible = TEST_RFLAGS(RendererOptions::NamesVisible); + + QMap<RenderPriority, QSet<Feature*> >::const_iterator itm; + QMap<RenderPriority, QSet<Feature*> >::const_iterator itmCur; + QSet<Feature*>::const_iterator it; + + thePainter = P; + thePainter->save(); + thePainter->translate(screen.left(), screen.top()); + + itm = theFeatures.constBegin(); + while (itm != theFeatures.constEnd()) + { + int curLayer = (itm.key()).layer(); + itmCur = itm; + while (itm != theFeatures.constEnd() && (itm.key()).layer() == curLayer) + { + if (bgLayerVisible) + { + for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { + qreal alpha = (*it)->getAlpha(); + if ((*it)->isReadonly() && !TEST_RFLAGS(RendererOptions::ForPrinting)) + alpha /= 2.0; + if (alpha != 1.) { + P->save(); + P->setOpacity(alpha); + } + + if (CHECK_WAY(*it)) { + Way * R = STATIC_CAST_WAY(*it); + for (int i=0; i<R->sizeParents(); ++i) + if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(thePixelPerM)) + continue; + bglayer.draw(R); + } else if (CHECK_NODE(*it)) + bglayer.draw(STATIC_CAST_NODE(*it)); + else if (CHECK_RELATION(*it)) + bglayer.draw(STATIC_CAST_RELATION(*it)); + if (alpha != 1.) { + P->restore(); + } + } + } + ++itm; + } + itm = itmCur; + while (itm != theFeatures.constEnd() && (itm.key()).layer() == curLayer) + { + if (fgLayerVisible) + { + for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { + qreal alpha = (*it)->getAlpha(); + if ((*it)->isReadonly() && !TEST_RFLAGS(RendererOptions::ForPrinting)) + alpha /= 2.0; + if (alpha != 1.) { + P->save(); + P->setOpacity(alpha); + } + + if (CHECK_WAY(*it)) { + Way * R = STATIC_CAST_WAY(*it); + for (int i=0; i<R->sizeParents(); ++i) + if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(thePixelPerM)) + continue; + fglayer.draw(R); + } else if (CHECK_NODE(*it)) + fglayer.draw(STATIC_CAST_NODE(*it)); + else if (CHECK_RELATION(*it)) + fglayer.draw(STATIC_CAST_RELATION(*it)); + if (alpha != 1.) { + P->restore(); + } + } + } + ++itm; + } + } + if (tchpLayerVisible) + { + for (itm = theFeatures.constBegin() ;itm != theFeatures.constEnd(); ++itm) { + for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { + qreal alpha = (*it)->getAlpha(); + if ((*it)->isReadonly() && !TEST_RFLAGS(RendererOptions::ForPrinting)) + alpha /= 2.0; + if (alpha != 1.) { + P->save(); + P->setOpacity(alpha); + } + + if (CHECK_WAY(*it)) { + Way * R = STATIC_CAST_WAY(*it); + for (int i=0; i<R->sizeParents(); ++i) + if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(thePixelPerM)) + continue; + tchuplayer.draw(R); + } else if (CHECK_NODE(*it)) + tchuplayer.draw(STATIC_CAST_NODE(*it)); + else if (CHECK_RELATION(*it)) + tchuplayer.draw(STATIC_CAST_RELATION(*it)); + if (alpha != 1.) { + P->restore(); + } + } + } + } + + if (lblLayerVisible) + { + for (itm = theFeatures.constBegin() ;itm != theFeatures.constEnd(); ++itm) { + for (it = itm.value().constBegin(); it != itm.value().constEnd(); ++it) { + P->save(); + qreal alpha = (*it)->getAlpha(); + if ((*it)->isReadonly() && !TEST_RFLAGS(RendererOptions::ForPrinting)) + alpha /= 2.0; + P->setOpacity(alpha); + + if (CHECK_WAY(*it)) { + Way * R = STATIC_CAST_WAY(*it); + for (int i=0; i<R->sizeParents(); ++i) + if (!R->getParent(i)->isDeleted() && R->getParent(i)->hasPainter(thePixelPerM)) + continue; + lbllayer.draw(R); + } else if (CHECK_NODE(*it)) + lbllayer.draw(STATIC_CAST_NODE(*it)); + else if (CHECK_RELATION(*it)) + lbllayer.draw(STATIC_CAST_RELATION(*it)); + P->restore(); + } + } + } + thePainter->restore(); +} diff --git a/src/Render/MapRenderer.h b/src/Render/MapRenderer.h new file mode 100644 index 0000000..cd59653 --- /dev/null +++ b/src/Render/MapRenderer.h @@ -0,0 +1,125 @@ +// +// C++ Interface: MapRenderer +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com>, (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef MAPRENDERER_H +#define MAPRENDERER_H + +#include "FeaturePainter.h" + +#include <QPainter> +#include <QTransform> +#include <QList> + +#include "Feature.h" +#include "IRenderer.h" + +class Document; +class PaintStylePrivate; +class MapRenderer; + +class PaintStyleLayer +{ +public: + PaintStyleLayer() {} + PaintStyleLayer(MapRenderer* ar) { r = ar; } + virtual void draw(Way* R) = 0; + virtual void draw(Node* Pt) = 0; + virtual void draw(Relation* R) = 0; + +protected: + MapRenderer* r; +}; + +class BackgroundStyleLayer : public PaintStyleLayer +{ +public: + BackgroundStyleLayer() {} + BackgroundStyleLayer(MapRenderer* ar) + : PaintStyleLayer(ar) {} + virtual void draw(Way* R); + virtual void draw(Node* Pt); + virtual void draw(Relation* R); +}; + +class ForegroundStyleLayer : public PaintStyleLayer +{ +public: + ForegroundStyleLayer() {} + ForegroundStyleLayer(MapRenderer* ar) + : PaintStyleLayer(ar) {} + virtual void draw(Way* R); + virtual void draw(Node* Pt); + virtual void draw(Relation* R); +}; + +class TouchupStyleLayer : public PaintStyleLayer +{ +public: + TouchupStyleLayer() {} + TouchupStyleLayer(MapRenderer* ar) + : PaintStyleLayer(ar) {} + virtual void draw(Way* R); + virtual void draw(Node* Pt); + virtual void draw(Relation* R); +}; + +class LabelStyleLayer : public PaintStyleLayer +{ +public: + LabelStyleLayer() {} + LabelStyleLayer(MapRenderer* ar) + : PaintStyleLayer(ar) {} + virtual void draw(Way* R); + virtual void draw(Node* Pt); + virtual void draw(Relation* R); +}; + +class MapRenderer +{ +public: + MapRenderer(); + + void render( + QPainter* P, + const QMap<RenderPriority, QSet <Feature*> >& theFeatures, + const QRectF& pViewport, + const QRect& screen, + const qreal pixelPerM, + const RendererOptions& options + ); +// void print( +// QPainter* P, +// QMap<RenderPriority, QSet <Feature*> > theFeatures, +// const RendererOptions& options, +// MapView* aView +// ); + + CoordBox theViewport; + QRect theScreen; + QTransform theTransform; + qreal thePixelPerM; + qreal NodeWidth; + + QPainter* thePainter; + RendererOptions theOptions; + GlobalPainter theGlobalPainter; + + QPoint toView(Node *aPt) const; + +protected: + BackgroundStyleLayer bglayer; + ForegroundStyleLayer fglayer; + TouchupStyleLayer tchuplayer; + LabelStyleLayer lbllayer; + +}; + +#endif // MAPRENDERER_H diff --git a/src/Render/NativeRenderDialog.cpp b/src/Render/NativeRenderDialog.cpp new file mode 100644 index 0000000..8e2334f --- /dev/null +++ b/src/Render/NativeRenderDialog.cpp @@ -0,0 +1,275 @@ +// +// C++ Implementation: NativeRenderDialog +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "NativeRenderDialog.h" + +#include "MainWindow.h" +#include "Document.h" +#include "MapView.h" +#include "Projection.h" +#include "Layer.h" +#include "Features.h" +#include "MerkaartorPreferences.h" +#include "MasPaintStyle.h" +#include "PictureViewerDialog.h" + +#include <QPrinter> +#include <QPrintPreviewDialog> +#include <QPrintPreviewWidget> + +#include <QMainWindow> +#include <QProgressDialog> +#include <QPainter> +#include <QSvgGenerator> +#include <QFileDialog> + +NativeRenderDialog::NativeRenderDialog(Document *aDoc, const CoordBox& aCoordBox, QWidget *parent) + :QObject(parent), theDoc(aDoc), theOrigBox(aCoordBox) +{ + thePrinter = new QPrinter(); + thePrinter->setDocName(aDoc->title()); + + mapview = new MapView(NULL); + mapview->setDocument(theDoc); + + preview = new QPrintPreviewDialog( thePrinter, parent ); + QMainWindow* mw = preview->findChild<QMainWindow*>(); + prtW = dynamic_cast<QPrintPreviewWidget*>(mw->centralWidget()); + + QWidget* myWidget = new QWidget(preview); + ui.setupUi(myWidget); + ui.verticalLayout->addWidget(prtW); + mw->setCentralWidget(myWidget); + + /* Set the DPI validator to accept positive values only. */ + dpiValidator = new QIntValidator( ui.fieldDpi ); + dpiValidator->setBottom( 0 ); + ui.fieldDpi->setValidator( dpiValidator ); + + /* Set the UI parameters first, before we tie in the updatePreview signal/slot. */ + setBoundingBox(aCoordBox); + setOptions(M_PREFS->getRenderOptions()); + + /* Tie in the updatePreview slot to the UI. */ + connect(ui.cbShowNodes, SIGNAL(toggled(bool)), prtW, SLOT(updatePreview())); + connect(ui.cbShowRelations, SIGNAL(toggled(bool)), prtW, SLOT(updatePreview())); + connect(ui.cbShowGrid, SIGNAL(toggled(bool)), prtW, SLOT(updatePreview())); + connect(ui.cbShowScale, SIGNAL(toggled(bool)), prtW, SLOT(updatePreview())); + connect(ui.cbShowUnstyled, SIGNAL(toggled(bool)), prtW, SLOT(updatePreview())); + connect(ui.sbMinLat, SIGNAL(valueChanged(double)), prtW, SLOT(updatePreview())); + connect(ui.sbMaxLat, SIGNAL(valueChanged(double)), prtW, SLOT(updatePreview())); + connect(ui.sbMinLon, SIGNAL(valueChanged(double)), prtW, SLOT(updatePreview())); + connect(ui.sbMaxLon, SIGNAL(valueChanged(double)), prtW, SLOT(updatePreview())); + + connect(ui.btExportPDF, SIGNAL(clicked()), SLOT(exportPDF())); + connect(ui.btExportSVG, SIGNAL(clicked()), SLOT(exportSVG())); + connect(ui.btExportRaster, SIGNAL(clicked()), SLOT(exportRaster())); + + connect( preview, &QPrintPreviewDialog::paintRequested, + this, &NativeRenderDialog::renderPreview ); +} + +RendererOptions NativeRenderDialog::options() +{ + RendererOptions opt; + opt.options |= RendererOptions::ForPrinting; + opt.options |= RendererOptions::BackgroundVisible; + opt.options |= RendererOptions::ForegroundVisible; + opt.options |= RendererOptions::TouchupVisible; + opt.options |= RendererOptions::NamesVisible; + + if (ui.cbShowNodes->isChecked()) + opt.options |= RendererOptions::NodesVisible; + if (ui.cbShowRelations->isChecked()) + opt.options |= RendererOptions::RelationsVisible; + if (ui.cbShowScale->isChecked()) + opt.options |= RendererOptions::ScaleVisible; + if (ui.cbShowGrid->isChecked()) + opt.options |= RendererOptions::LatLonGridVisible; + if (!ui.cbShowUnstyled->isChecked()) + opt.options |= RendererOptions::UnstyledHidden; + + return opt; +} + +void NativeRenderDialog::setOptions(RendererOptions aOpt) +{ + ui.cbShowNodes->setChecked(aOpt.options & RendererOptions::NodesVisible); + ui.cbShowRelations->setChecked(aOpt.options & RendererOptions::RelationsVisible); + ui.cbShowScale->setChecked(aOpt.options & RendererOptions::ScaleVisible); + ui.cbShowGrid->setChecked(aOpt.options & RendererOptions::LatLonGridVisible); + ui.cbShowUnstyled->setChecked(!(aOpt.options & RendererOptions::UnstyledHidden)); + + prtW->updatePreview(); +} + +CoordBox NativeRenderDialog::boundingBox() +{ + CoordBox VP(Coord( + ui.sbMinLon->value(), + ui.sbMinLat->value() + ), Coord( + ui.sbMaxLon->value(), + ui.sbMaxLat->value() + )); + return VP; +} + +void NativeRenderDialog::setBoundingBox(CoordBox aBBox) +{ + ui.sbMinLat->setValue(aBBox.bottomLeft().y()); + ui.sbMaxLat->setValue(aBBox.topLeft().y()); + ui.sbMinLon->setValue(aBBox.topLeft().x()); + ui.sbMaxLon->setValue(aBBox.topRight().x()); + + prtW->updatePreview(); +} + +int NativeRenderDialog::exec() +{ + return preview->exec(); +} + +void NativeRenderDialog::renderPreview(QPrinter* printer) +{ + /* Set the preview resolution. Having full resolution just for preview + * could result in huge delay when opening the dialog the first time. */ + printer->setResolution(96); + QPainter P(printer); + P.setRenderHint(QPainter::Antialiasing); + QRect theR = printer->pageRect(); + qDebug() << "Rendering preview to:" << theR; + theR.moveTo(0, 0); + render(P, theR, options()); +} + +void NativeRenderDialog::render(QPainter& P, QRect theR, RendererOptions opt) +{ + P.setClipRect(theR); + P.setClipping(true); + P.setRenderHint(QPainter::Antialiasing); + + mapview->setGeometry(theR); + mapview->setViewport(boundingBox(), theR); + mapview->setRenderOptions(opt); + mapview->invalidate(true, true, false); + mapview->drawFeaturesSync(P); + if (opt.options & RendererOptions::ScaleVisible) + mapview->drawScale(P); + if (opt.options & RendererOptions::LatLonGridVisible) + mapview->drawLatLonGrid(P); +} + +void NativeRenderDialog::setPrinterOptions() { + int userDpi = ui.fieldDpi->currentText().toInt(); + thePrinter->setResolution(userDpi); +} + +void NativeRenderDialog::exportPDF() +{ + QString s; + QFileDialog dlg(NULL, tr("Output filename"), QString("%1/%2.pdf").arg(M_PREFS->getworkingdir()).arg(tr("untitled")), tr("PDF files (*.pdf)") + "\n" + tr("All Files (*)")); + dlg.setFileMode(QFileDialog::AnyFile); + dlg.setDefaultSuffix("pdf"); + dlg.setAcceptMode(QFileDialog::AcceptSave); + + if (dlg.exec()) { + if (dlg.selectedFiles().size()) + s = dlg.selectedFiles()[0]; + } +// QString s = QFileDialog::getSaveFileName(NULL,tr("Output filename"),"",tr("PDF files (*.pdf)")); + if (s.isNull()) + return; + + thePrinter->setOutputFormat(QPrinter::PdfFormat); + thePrinter->setOutputFileName(s); + setPrinterOptions(); + + QPainter P(thePrinter); + P.setRenderHint(QPainter::Antialiasing); + QRect theR = thePrinter->pageRect(); + theR.moveTo(0, 0); + RendererOptions opt = options(); + opt.options |= RendererOptions::PrintAllLabels; + render(P, theR, opt); +} + +void NativeRenderDialog::exportRaster() +{ + QString s; + QFileDialog dlg(NULL, tr("Output filename"), QString("%1/%2.png").arg(M_PREFS->getworkingdir()).arg(tr("untitled")), tr("Image files (*.png *.jpg)") + "\n" + tr("All Files (*)")); + dlg.setFileMode(QFileDialog::AnyFile); + dlg.setDefaultSuffix("png"); + dlg.setAcceptMode(QFileDialog::AcceptSave); + + if (dlg.exec()) { + if (dlg.selectedFiles().size()) + s = dlg.selectedFiles()[0]; + } +// QString s = QFileDialog::getSaveFileName(NULL,tr("Output filename"),"",tr("Image files (*.png *.jpg)")); + if (s.isNull()) + return; + + setPrinterOptions(); + + QRect theR = thePrinter->pageRect(); + theR.moveTo(0, 0); + + QPixmap pix(theR.size()); + if (M_PREFS->getUseShapefileForBackground()) + pix.fill(M_PREFS->getWaterColor()); + else if (M_PREFS->getBackgroundOverwriteStyle() || !M_STYLE->getGlobalPainter().getDrawBackground()) + pix.fill(M_PREFS->getBgColor()); + else + pix.fill(M_STYLE->getGlobalPainter().getBackgroundColor()); + + QPainter P(&pix); + P.setRenderHint(QPainter::Antialiasing); + render(P, theR, options()); + + pix.save(s); +} + +void NativeRenderDialog::exportSVG() +{ + QString s; + QFileDialog dlg(NULL, tr("Output filename"), QString("%1/%2.svg").arg(M_PREFS->getworkingdir()).arg(tr("untitled")), tr("SVG files (*.svg)") + "\n" + tr("All Files (*)")); + dlg.setFileMode(QFileDialog::AnyFile); + dlg.setDefaultSuffix("svg"); + dlg.setAcceptMode(QFileDialog::AcceptSave); + + if (dlg.exec()) { + if (dlg.selectedFiles().size()) + s = dlg.selectedFiles()[0]; + } +// QString s = QFileDialog::getSaveFileName(NULL,tr("Output filename"),"",tr("SVG files (*.svg)")); + if (s.isNull()) + return; + + setPrinterOptions(); + + QSvgGenerator svgg; + QRect theR = thePrinter->pageRect(); + theR.moveTo(0, 0); + svgg.setSize(theR.size()); + svgg.setFileName(s); +#if QT_VERSION >= 0x040500 + svgg.setViewBox(theR); +#endif + + QPainter P(&svgg); + P.setRenderHint(QPainter::Antialiasing); + RendererOptions opt = options(); + opt.options |= RendererOptions::PrintAllLabels; + + render(P, theR, opt); +} + diff --git a/src/Render/NativeRenderDialog.h b/src/Render/NativeRenderDialog.h new file mode 100644 index 0000000..91aa9f9 --- /dev/null +++ b/src/Render/NativeRenderDialog.h @@ -0,0 +1,71 @@ +// +// C++ Interface: NativeRenderDialog +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef NATIVERENDERDIALOG_H +#define NATIVERENDERDIALOG_H + +#include <QWidget> +#include <QSettings> + +#include "Coord.h" +#include "IRenderer.h" + +#include <ui_NativeRenderDialog.h> + +class Document; +class MapView; +class CoordBox; +class QPrinter; +class QPrintPreviewDialog; +class QPrintPreviewWidget; + +class NativeRenderDialog: public QObject +{ + Q_OBJECT + +public: + NativeRenderDialog(Document *aDoc, const CoordBox& aCoordBox, QWidget *parent = 0); + void render(QPainter& P, QRect theR, RendererOptions opt); + + RendererOptions options(); + void setOptions(RendererOptions aOpt); + CoordBox boundingBox(); + void setBoundingBox(CoordBox aBBox); + +public slots: + void exportPDF(); + void exportSVG(); + void exportRaster(); + +public slots: + int exec(); + +private slots: + void renderPreview(QPrinter* prt); + +private: + void setPrinterOptions(); + + Ui::NativeRenderWidget ui; + Document* theDoc; + MapView* mapview; + CoordBox theOrigBox; + QSettings* Sets; + double ratio; + QPrinter* thePrinter; + QPrintPreviewDialog* preview; + QPrintPreviewWidget* prtW; + QIntValidator* dpiValidator; + int dpiMinimumValue; + +}; + +#endif diff --git a/src/Render/NativeRenderDialog.ui b/src/Render/NativeRenderDialog.ui new file mode 100644 index 0000000..e6fe05d --- /dev/null +++ b/src/Render/NativeRenderDialog.ui @@ -0,0 +1,331 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>NativeRenderWidget</class> + <widget class="QWidget" name="NativeRenderWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>714</width> + <height>629</height> + </rect> + </property> + <property name="windowTitle"> + <string>Raster/SVG export</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="leftMargin"> + <number>4</number> + </property> + <property name="topMargin"> + <number>4</number> + </property> + <property name="rightMargin"> + <number>4</number> + </property> + <property name="bottomMargin"> + <number>4</number> + </property> + <item> + <widget class="QGroupBox" name="grpOptions"> + <property name="title"> + <string>Options</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <layout class="QGridLayout" name="gridLayout"> + <property name="spacing"> + <number>4</number> + </property> + <item row="0" column="0"> + <widget class="QLabel" name="label_3"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>60</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>min lat/Lon</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QDoubleSpinBox" name="sbMinLat"> + <property name="minimumSize"> + <size> + <width>60</width> + <height>0</height> + </size> + </property> + <property name="decimals"> + <number>6</number> + </property> + <property name="minimum"> + <double>-90.000000000000000</double> + </property> + <property name="maximum"> + <double>90.000000000000000</double> + </property> + <property name="singleStep"> + <double>0.010000000000000</double> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_4"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>60</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>max lat/Lon</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QDoubleSpinBox" name="sbMaxLat"> + <property name="minimumSize"> + <size> + <width>60</width> + <height>0</height> + </size> + </property> + <property name="decimals"> + <number>6</number> + </property> + <property name="minimum"> + <double>-90.000000000000000</double> + </property> + <property name="maximum"> + <double>90.000000000000000</double> + </property> + <property name="singleStep"> + <double>0.010000000000000</double> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QDoubleSpinBox" name="sbMinLon"> + <property name="minimumSize"> + <size> + <width>60</width> + <height>0</height> + </size> + </property> + <property name="decimals"> + <number>6</number> + </property> + <property name="minimum"> + <double>-180.000000000000000</double> + </property> + <property name="maximum"> + <double>180.000000000000000</double> + </property> + <property name="singleStep"> + <double>0.010000000000000</double> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QDoubleSpinBox" name="sbMaxLon"> + <property name="minimumSize"> + <size> + <width>60</width> + <height>0</height> + </size> + </property> + <property name="decimals"> + <number>6</number> + </property> + <property name="minimum"> + <double>-180.000000000000000</double> + </property> + <property name="maximum"> + <double>180.000000000000000</double> + </property> + <property name="singleStep"> + <double>0.010000000000000</double> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="Line" name="line"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0"> + <widget class="QCheckBox" name="cbShowNodes"> + <property name="text"> + <string>Show Nodes</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QCheckBox" name="cbShowRelations"> + <property name="text"> + <string>Show Relations</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QCheckBox" name="cbShowScale"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Show Scale</string> + </property> + <property name="tristate"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="0" column="3"> + <widget class="QCheckBox" name="cbShowGrid"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Show Lat/Lon Grid</string> + </property> + <property name="tristate"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QCheckBox" name="cbShowUnstyled"> + <property name="text"> + <string>Show unstyled features</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="Line" name="line_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLabel" name="labelPrintResolution"> + <property name="text"> + <string>Print resolution</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="fieldDpi"> + <property name="editable"> + <bool>true</bool> + </property> + <property name="currentText"> + <string notr="true">300</string> + </property> + <item> + <property name="text"> + <string>300</string> + </property> + </item> + <item> + <property name="text"> + <string>600</string> + </property> + </item> + <item> + <property name="text"> + <string>1200</string> + </property> + </item> + </widget> + </item> + <item> + <widget class="QLabel" name="labelDpi"> + <property name="text"> + <string>dpi</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="Line" name="line_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QPushButton" name="btExportPDF"> + <property name="text"> + <string>Export to PDF...</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btExportSVG"> + <property name="text"> + <string>Export to SVG...</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btExportRaster"> + <property name="text"> + <string>Export to Raster...</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/Render/RENDERING.md b/src/Render/RENDERING.md new file mode 100644 index 0000000..abe7122 --- /dev/null +++ b/src/Render/RENDERING.md @@ -0,0 +1,26 @@ +# Rendering in Merkaartor + +Note: This document is work in progress and might contain mistakes and/or +old/partial information. Feel free to improve it. + +## Rendering OSM + +The OSM data is represented by a Document object. A view to this document is +represented by a MapView object. A single Document can be viewed through +multiple MapView objects, for example the main canvas and a printed map +(NativeRenderDialog). + +MapView creates and OsmLayerRender object, which handles parallelization of +rendering. It splits the viewport into tiles and manages the rendering and +rendered pieces. For the rendering itself, QtConcurrent module is used and +executes MapRenderer to do the actual painting. + +Note that during painting, the map data must not be modified. This includes +various auxilary structures in the Document, like cached Painters (defined by +the current style). + +We currently handle this by a few locks around some random places, which is +pretty fragile. Locking the document object would probably be the best way to +do it. + + diff --git a/src/Render/Render.pri b/src/Render/Render.pri new file mode 100644 index 0000000..ef15140 --- /dev/null +++ b/src/Render/Render.pri @@ -0,0 +1,25 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/Render +DEPENDPATH += $$MERKAARTOR_SRC_DIR/Render + +# Header files +HEADERS += \ + FeaturePainter.h \ + MapRenderer.h + +# Source files +SOURCES += \ + FeaturePainter.cpp \ + MapRenderer.cpp + +isEmpty(MOBILE) { + QT += svg + + HEADERS += \ + NativeRenderDialog.h + + SOURCES += \ + NativeRenderDialog.cpp + + # Forms + FORMS += NativeRenderDialog.ui +} diff --git a/src/Sync/DirtyList.cpp b/src/Sync/DirtyList.cpp new file mode 100644 index 0000000..4ffaeac --- /dev/null +++ b/src/Sync/DirtyList.cpp @@ -0,0 +1,833 @@ +#include "Global.h" + +#include "DirtyList.h" +#include "Command.h" +#include "Coord.h" +#include "DownloadOSM.h" +#include "ExportOSM.h" +#include "Document.h" +#include "Layer.h" +#include "Features.h" +#include "Utils.h" + +#include <QEventLoop> +#include <QDialog> +#include <QListWidget> +#include <QMessageBox> +#include <QProgressDialog> +#include <QTcpSocket> +#include <QInputDialog> + +#include <algorithm> + +int glbAdded, glbUpdated, glbDeleted; +int glbNodesAdded, glbNodesUpdated, glbNodesDeleted; +int glbWaysAdded, glbWaysUpdated, glbWaysDeleted; +int glbRelationsAdded, glbRelationsUpdated, glbRelationsDeleted; + +QString glbChangeSetComment; + +QString stripToOSMId(const IFeature::FId& id) +{ + return QString::number(id.numId); +} + +QString userName(const Feature* F) +{ + QString s(F->tagValue("name", QString())); + if (!s.isEmpty()) + return " ("+s+")"; + return QString(); +} + +DirtyList::~DirtyList() +{ +} + +bool DirtyListBuild::add(Feature* F) +{ + if (!F->isDirty()) return false; + //if (F->hasOSMId()) return false; + + Added.push_back(F); + return false; +} + +bool DirtyListBuild::update(Feature* F) +{ + if (!F->isDirty()) return false; + + for (int i=0; i<Updated.size(); ++i) + if (Updated[i] == F) + { + UpdateCounter[i].first++; + return false; + } + Updated.push_back(F); + UpdateCounter.push_back(qMakePair((int) 1, (int)0)); + return false; +} + +bool DirtyListBuild::erase(Feature* F) +{ + if (!F->isDirty()) return false; + + Deleted.push_back(F); + return false; +} + +bool DirtyListBuild::willBeAdded(Feature* F) const +{ + return std::find(Added.begin(),Added.end(),F) != Added.end(); +} + +bool DirtyListBuild::willBeErased(Feature* F) const +{ + return std::find(Deleted.begin(),Deleted.end(),F) != Deleted.end(); +} + +bool DirtyListBuild::updateNow(Feature* F) const +{ + for (int i=0; i<Updated.size(); ++i) + if (Updated[i] == F) + { + UpdateCounter[i].second++; + return UpdateCounter[i].first == UpdateCounter[i].second; + } + return false; +} + +void DirtyListBuild::resetUpdates() +{ + for (int i=0; i<UpdateCounter.size(); ++i) + UpdateCounter[i].second = 0; +} + +/* DIRTYLISTVISIT */ + +DirtyListVisit::DirtyListVisit(Document* aDoc, const DirtyListBuild &aBuilder, bool b) +: theDocument(aDoc), Future(aBuilder), EraseFromHistory(b) +{ +} + +bool DirtyListVisit::runVisit() +{ + DeletePass = false; + document()->history().buildDirtyList(*this); + DeletePass = true; + for (int i=0; i<RelationsToDelete.uniqueKeys().size(); i++) { + if (!RelationsToDelete.uniqueKeys()[i]->hasOSMId()) + continue; + RelationsToDelete[RelationsToDelete.uniqueKeys()[i]] = eraseRelation(RelationsToDelete.uniqueKeys()[i]); + } + for (int i=0; i<RoadsToDelete.uniqueKeys().size(); i++) { + if (!RoadsToDelete.uniqueKeys()[i]->hasOSMId()) + continue; + RoadsToDelete[RoadsToDelete.uniqueKeys()[i]] = eraseRoad(RoadsToDelete.uniqueKeys()[i]); + } + for (int i=0; i<TrackPointsToDelete.uniqueKeys().size(); i++) { + if (!TrackPointsToDelete.uniqueKeys()[i]->hasOSMId()) + continue; + TrackPointsToDelete[TrackPointsToDelete.uniqueKeys()[i]] = erasePoint(TrackPointsToDelete.uniqueKeys()[i]); + } + return document()->history().buildDirtyList(*this); +} + +Document* DirtyListVisit::document() +{ + return theDocument; +} + +bool DirtyListVisit::notYetAdded(Feature* F) +{ + return std::find(AlreadyAdded.begin(),AlreadyAdded.end(),F) == AlreadyAdded.end(); +} + +bool DirtyListVisit::add(Feature* F) +{ + if (DeletePass) return false; + if (F->isDeleted()) return false; + // TODO Needed to add children of updated imported features. Sure there is no advert cases? + //if (!F->isDirty()) return false; + + // Allow "Force Upload" of OSM objects + //if (F->hasOSMId()) return false; + + if (Future.willBeErased(F)) + return EraseFromHistory; + for (int i=0; i<AlreadyAdded.size(); ++i) + if (AlreadyAdded[i] == F) + return EraseResponse[i]; + + bool x; + if (Node* Pt = CAST_NODE(F)) + { + if (Pt->isInteresting()) + { + if (F->hasOSMId()) + x = updatePoint(Pt); + else + x = addPoint(Pt); + AlreadyAdded.push_back(F); + EraseResponse.push_back(x); + return x; + } + else + return EraseFromHistory; + } + else if (Way* R = dynamic_cast<Way*>(F)) + { + for (int i=0; i<R->size(); ++i) + if (!R->getNode(i)->isVirtual()) + if (!(R->get(i)->hasOSMId()) && notYetAdded(R->get(i))) + add(R->get(i)); + if (F->hasOSMId()) + x = updateRoad(R); + else + x = addRoad(R); + AlreadyAdded.push_back(F); + EraseResponse.push_back(x); + return x; + } + else if (Relation* Rel = dynamic_cast<Relation*>(F)) + { + for (int i=0; i<Rel->size(); ++i) + if (!(Rel->get(i)->hasOSMId()) && notYetAdded(Rel->get(i))) + add(Rel->get(i)); + if (F->hasOSMId()) + x = updateRelation(Rel); + else + x = addRelation(Rel); + AlreadyAdded.push_back(F); + EraseResponse.push_back(x); + return x; + } + return EraseFromHistory; +} + +bool DirtyListVisit::update(Feature* F) +{ + if (DeletePass) return false; + if (!F->isDirty()) return false; + if (F->isDeleted()) return false; + + if (Future.willBeErased(F) || Future.willBeAdded(F)) + return EraseFromHistory; + if (!Future.updateNow(F)) + return EraseFromHistory; + if (Node* Pt = dynamic_cast<Node*>(F)) + { + if (Pt->isInteresting()) { + if (!(Pt->hasOSMId()) && notYetAdded(Pt)) + return addPoint(Pt); + else + return updatePoint(Pt); + } else + return EraseFromHistory; + } + else if (Way* R = dynamic_cast<Way*>(F)) { + for (int i=0; i<R->size(); ++i) + if (!(R->get(i)->hasOSMId()) && notYetAdded(R->get(i))) + add(R->get(i)); + return updateRoad(R); + } else if (Relation* Rel = dynamic_cast<Relation*>(F)) { + for (int i=0; i<Rel->size(); ++i) + if (!(Rel->get(i)->hasOSMId()) && notYetAdded(Rel->get(i))) + add(Rel->get(i)); + return updateRelation(Rel); + } + return EraseFromHistory; +} + +bool DirtyListVisit::erase(Feature* F) +{ + if (!F->isDirty()) return false; + + if (DeletePass) { + if (Node* Pt = dynamic_cast<Node*>(F)) + return TrackPointsToDelete[Pt]; + else if (Way* R = dynamic_cast<Way*>(F)) + return RoadsToDelete[R]; + else if (Relation* S = dynamic_cast<Relation*>(F)) + return RelationsToDelete[S]; + } + if (Future.willBeAdded(F)) + return EraseFromHistory; + if (Node* Pt = dynamic_cast<Node*>(F)) + { + if (Pt->isInteresting()) + TrackPointsToDelete[Pt] = false; + } + else if (Way* R = dynamic_cast<Way*>(F)) + RoadsToDelete[R] = false; + else if (Relation* S = dynamic_cast<Relation*>(F)) + RelationsToDelete[S] = false; + + return false; +} + +bool DirtyListVisit::noop(Feature* F) +{ + if (!F->isDirty()) return false; + + if (!F->isDeleted() && !F->isUploadable()) + return false; + + return EraseFromHistory; +} + +/* DIRTYLISTDESCRIBER */ + + +DirtyListDescriber::DirtyListDescriber(Document* aDoc, const DirtyListBuild& aFuture) +: DirtyListVisit(aDoc, aFuture, false), Task(0) +{ + glbAdded = glbUpdated = glbDeleted = 0; + glbNodesAdded = glbNodesUpdated = glbNodesDeleted = 0; + glbWaysAdded = glbWaysUpdated = glbWaysDeleted = 0; + glbRelationsAdded = glbRelationsUpdated = glbRelationsDeleted = 0; +} + +int DirtyListDescriber::tasks() const +{ + return Task; +} + +bool DirtyListDescriber::showChanges(QWidget* aParent) +{ + QDialog* dlg = new QDialog(aParent); + Ui.setupUi(dlg); + dlg->setWindowFlags(dlg->windowFlags() & ~Qt::WindowContextHelpButtonHint); + theListWidget = Ui.ChangesList; + + runVisit(); + + Ui.lblNodesAdded->setText(QString::number(glbNodesAdded)); + Ui.lblNodesUpdated->setText(QString::number(glbNodesUpdated)); + Ui.lblNodesDeleted->setText(QString::number(glbNodesDeleted)); + Ui.lblWaysAdded->setText(QString::number(glbWaysAdded)); + Ui.lblWaysUpdated->setText(QString::number(glbWaysUpdated)); + Ui.lblWaysDeleted->setText(QString::number(glbWaysDeleted)); + Ui.lblRelationsAdded->setText(QString::number(glbRelationsAdded)); + Ui.lblRelationsUpdated->setText(QString::number(glbRelationsUpdated)); + Ui.lblRelationsDeleted->setText(QString::number(glbRelationsDeleted)); + Ui.lblAdded->setText(QString::number(glbAdded)); + Ui.lblUpdated->setText(QString::number(glbUpdated)); + Ui.lblDeleted->setText(QString::number(glbDeleted)); + + //Ui.edChangesetComment->setText(glbChangeSetComment); + //Ui.edChangesetComment->selectAll(); + + bool ok = false; + while (!ok) { + if (dlg->exec() == QDialog::Accepted) { + /* Dialog was accepted, check for non-empty comment */ + if (!Ui.edChangesetComment->text().isEmpty()) { + glbChangeSetComment = Ui.edChangesetComment->text(); + ok = true; + } else if (QMessageBox::question(NULL, + QApplication::tr("Use empty changeset comment?"), + QApplication::tr("The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention.\n" + "Do you still wish to commit empty changeset comment?"), QMessageBox::Yes, QMessageBox::No ) + == QMessageBox::Yes + ) ok = true; + } else break; /* Dialog was cancelled */ + } + + Task = Ui.ChangesList->count(); + SAFE_DELETE(dlg) + return ok; +} + + +bool DirtyListDescriber::addRoad(Way* R) +{ + QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","ADD road %1").arg(R->id().numId) + userName(R), theListWidget); + it->setData(Qt::UserRole, QVariant::fromValue(R->id())); + ++glbAdded; + ++glbWaysAdded; + return false; +} + +bool DirtyListDescriber::addPoint(Node* Pt) +{ + QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","ADD trackpoint %1").arg(Pt->id().numId) + userName(Pt), theListWidget); + it->setData(Qt::UserRole, QVariant::fromValue(Pt->id())); + ++glbAdded; + ++glbNodesAdded; + return false; +} + +bool DirtyListDescriber::addRelation(Relation* R) +{ + QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","ADD relation %1").arg(R->id().numId) + userName(R), theListWidget); + it->setData(Qt::UserRole, QVariant::fromValue(R->id())); + ++glbAdded; + ++glbRelationsAdded; + return false; +} + +bool DirtyListDescriber::updatePoint(Node* Pt) +{ + QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","UPDATE trackpoint %1").arg(Pt->id().numId) + userName(Pt), theListWidget); + it->setData(Qt::UserRole, QVariant::fromValue(Pt->id())); + ++glbUpdated; + ++glbNodesUpdated; + return false; +} + +bool DirtyListDescriber::updateRelation(Relation* R) +{ + QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","UPDATE relation %1").arg(R->id().numId) + userName(R), theListWidget); + it->setData(Qt::UserRole, QVariant::fromValue(R->id())); + ++glbUpdated; + ++glbRelationsUpdated; + return false; +} + +bool DirtyListDescriber::updateRoad(Way* R) +{ + QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","UPDATE road %1").arg(R->id().numId) + userName(R), theListWidget); + it->setData(Qt::UserRole, QVariant::fromValue(R->id())); + ++glbUpdated; + ++glbWaysUpdated; + return false; +} + +bool DirtyListDescriber::erasePoint(Node* Pt) +{ + QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","REMOVE trackpoint %1").arg(Pt->id().numId) + userName(Pt), theListWidget); + it->setData(Qt::UserRole, QVariant::fromValue(Pt->id())); + ++glbDeleted; + ++glbNodesDeleted; + return false; +} + +bool DirtyListDescriber::eraseRoad(Way* R) +{ + QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","REMOVE road %1").arg(R->id().numId) + userName(R), theListWidget); + it->setData(Qt::UserRole, QVariant::fromValue(R->id())); + ++glbDeleted; + ++glbWaysDeleted; + return false; +} + +bool DirtyListDescriber::eraseRelation(Relation* R) +{ + QListWidgetItem* it = new QListWidgetItem(QApplication::translate("DirtyListExecutor","REMOVE relation %1").arg(R->id().numId) + userName(R), theListWidget); + it->setData(Qt::UserRole, QVariant::fromValue(R->id())); + ++glbDeleted; + ++glbRelationsDeleted; + return false; +} + +/* DIRTYLIST */ + + +DirtyListExecutor::DirtyListExecutor(Document* aDoc, const DirtyListBuild& aFuture, const QString& aWeb, const QString& aUser, const QString& aPwd, int aTasks) +: DirtyListVisit(aDoc, aFuture, false), Tasks(aTasks), Done(0), Web(aWeb), User(aUser), Pwd(aPwd), theDownloader(0) +{ + theDownloader = new Downloader(User, Pwd); +} + +DirtyListExecutor::~DirtyListExecutor() +{ + delete theDownloader; +} + + +bool DirtyListExecutor::sendRequest(const QString& Method, const QString& URL, const QString& Data, QString& Rcv) +{ + if (inError()) + return false; + + QMessageBox::StandardButton theChoice = QMessageBox::Retry; + while (theChoice == QMessageBox::Retry) { + QUrl theUrl(Web+URL); + if (!theDownloader->request(Method,theUrl,Data)) + { + qDebug() << QString("Upload error: request (%1); Server message is '%2'").arg(theDownloader->resultCode()).arg(theDownloader->resultText()); + if (theDownloader->resultCode() == 401) { + QMessageBox::warning(Progress,tr("Error uploading request"), + tr("Please check your username and password in the Preferences menu")); + theChoice = QMessageBox::Abort; + } else { + QString msg = tr("There was an error uploading this request (%1)\nServer message is '%2'").arg(theDownloader->resultCode()).arg(theDownloader->resultText()); + if (!theDownloader->errorText().isEmpty()) + msg += tr("\nAPI message is '%1'").arg(theDownloader->errorText()); + theChoice = QMessageBox::warning(Progress,tr("Error uploading request"), msg, QMessageBox::Abort | QMessageBox::Retry | QMessageBox::Ignore); + continue; + } + } + + QByteArray Content = theDownloader->content(); + int x = theDownloader->resultCode(); + + if (x==200) + { + Rcv = QString::fromUtf8(Content.data()); + break; + } + else + { + qDebug() << QString("Upload error: request (%1); Server message is '%2'").arg(theDownloader->resultCode()).arg(theDownloader->resultText()); + theChoice = QMessageBox::warning(Progress,tr("Error uploading request"), + tr("There was an error uploading this request (%1)\nServer message is '%2'").arg(x).arg(theDownloader->resultText()), + QMessageBox::Abort | QMessageBox::Retry | QMessageBox::Ignore); + continue; + } + } + if (theChoice == QMessageBox::Abort) { + errorAbort = true; + return false; + } + return true; +} + +bool DirtyListExecutor::executeChanges(QWidget* aParent) +{ + bool ok; + + Progress = new QProgressDialog(aParent); + Progress->setWindowTitle(tr("Uploading changes...")); + Progress->setWindowFlags(Progress->windowFlags() & ~Qt::WindowContextHelpButtonHint); + Progress->setWindowFlags(Progress->windowFlags() | Qt::MSWindowsFixedSizeDialogHint); + Progress->setWindowModality(Qt::WindowModal); + Progress->setMinimumDuration(0); + Progress->setMaximum(Tasks+2); + Progress->show(); + + if ((ok = start())) + { + if ((ok = runVisit())) { + ok = stop(); + } + } + SAFE_DELETE(Progress) + + return ok; +} + +bool DirtyListExecutor::start() +{ + ChangeSetId.clear(); + Progress->setValue(++Done); + + qDebug() << QString("OPEN changeset"); + + Progress->setLabelText(tr("OPEN changeset")); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + QString DataIn( + "<osm>" + "<changeset>" + "<tag k=\"created_by\" v=\"Merkaartor %1 (%2)\"/>" + "<tag k=\"comment\" v=\"%3\"/>" + "</changeset>" + "</osm>"); + DataIn = DataIn.arg(STRINGIFY(VERSION)).arg(QLocale::system().name().split("_")[0]).arg(Utils::encodeAttributes(glbChangeSetComment)); + QString DataOut; + QString URL = theDownloader->getURLToOpenChangeSet(); + if (sendRequest("PUT",URL,DataIn, DataOut)) + { + ChangeSetId = DataOut; + return true; + } + return false; +} + +bool DirtyListExecutor::stop() +{ + Progress->setValue(++Done); + + qDebug() << QString("CLOSE changeset"); + + Progress->setLabelText(tr("CLOSE changeset")); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + QString URL = theDownloader->getURLToCloseChangeSet(ChangeSetId); + QString DataIn, DataOut; + if (sendRequest("PUT",URL,DataIn,DataOut)) + { + ChangeSetId.clear(); + return true; + } + + return true; +} + +bool DirtyListExecutor::addRelation(Relation *R) +{ + Progress->setValue(++Done); + + qDebug() << QString("ADD relation %1").arg(R->id().numId); + + Progress->setLabelText(tr("ADD relation %1").arg(R->id().numId) + userName(R)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + QString DataIn, DataOut; + IFeature::FId OldId; + OldId = R->id(); + R->setId(IFeature::FId(IFeature::OsmRelation, 0)); + DataIn = wrapOSM(exportOSM(*R, ChangeSetId), ChangeSetId); + R->setId(OldId); + QString URL=theDownloader->getURLToCreate("relation"); + if (sendRequest("PUT",URL,DataIn,DataOut)) + { + // chop off extra spaces, newlines etc + R->setId(IFeature::FId(IFeature::OsmRelation, DataOut.toInt())); + R->setLastUpdated(Feature::OSMServer); + R->setVersionNumber(1); + if (!g_Merk_Frisius) { + R->layer()->remove(R); + document()->getUploadedLayer()->add(R); + } + R->setUploaded(true); + R->setDirtyLevel(0); + return EraseFromHistory; + } + return false; +} + +bool DirtyListExecutor::addRoad(Way *R) +{ + Progress->setValue(++Done); + + qDebug() << QString("ADD road %1").arg(R->id().numId); + + Progress->setLabelText(tr("ADD road %1").arg(R->id().numId) + userName(R)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + QString DataIn, DataOut; + IFeature::FId OldId; + OldId = R->id(); + R->setId(IFeature::FId(IFeature::LineString, 0)); + DataIn = wrapOSM(exportOSM(*R, ChangeSetId), ChangeSetId); + R->setId(OldId); + QString URL=theDownloader->getURLToCreate("way"); + if (sendRequest("PUT",URL,DataIn,DataOut)) + { + // chop off extra spaces, newlines etc + R->setId(IFeature::FId(IFeature::LineString, DataOut.toInt())); + R->setLastUpdated(Feature::OSMServer); + R->setVersionNumber(1); + if (!g_Merk_Frisius) { + R->layer()->remove(R); + document()->getUploadedLayer()->add(R); + } + R->setUploaded(true); + R->setDirtyLevel(0); + return EraseFromHistory; + } + return false; +} + + +bool DirtyListExecutor::addPoint(Node* Pt) +{ + Progress->setValue(++Done); + + qDebug() << QString("ADD trackpoint %1").arg(Pt->id().numId); + + Progress->setLabelText(tr("ADD trackpoint %1").arg(Pt->id().numId) + userName(Pt)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + QString DataIn, DataOut; + IFeature::FId OldId; + OldId = Pt->id(); + Pt->setId(IFeature::FId(IFeature::Point, 0)); + DataIn = wrapOSM(exportOSM(*Pt, ChangeSetId), ChangeSetId); + Pt->setId(OldId); + QString URL=theDownloader->getURLToCreate("node"); + if (sendRequest("PUT",URL,DataIn,DataOut)) + { + // chop off extra spaces, newlines etc + Pt->setId(IFeature::FId(IFeature::Point, DataOut.toInt())); + Pt->setLastUpdated(Feature::OSMServer); + Pt->setVersionNumber(1); + if (!g_Merk_Frisius) { + Pt->layer()->remove(Pt); + document()->getUploadedLayer()->add(Pt); + } + Pt->setUploaded(true); + Pt->setDirtyLevel(0); + return EraseFromHistory; + } + return false; +} + + + +bool DirtyListExecutor::updateRelation(Relation* R) +{ + Progress->setValue(++Done); + + qDebug() << QString("UPDATE relation %1").arg(R->id().numId); + + Progress->setLabelText(tr("UPDATE relation %1").arg(R->id().numId) + userName(R)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + QString URL = theDownloader->getURLToUpdate("relation",stripToOSMId(R->id())); + QString DataIn, DataOut; + DataIn = wrapOSM(exportOSM(*R, ChangeSetId), ChangeSetId); + if (sendRequest("PUT",URL,DataIn,DataOut)) + { + R->setLastUpdated(Feature::OSMServer); + int NewVersion = DataOut.toInt(); + if (NewVersion <= R->versionNumber()) + NewVersion = R->versionNumber()+1; + R->setVersionNumber(NewVersion); + + if (!g_Merk_Frisius) { + R->layer()->remove(R); + document()->getUploadedLayer()->add(R); + } + R->setUploaded(true); + R->setDirtyLevel(0); + return EraseFromHistory; + } + return true; +} + + +bool DirtyListExecutor::updateRoad(Way* R) +{ + Progress->setValue(++Done); + + qDebug() << QString("UPDATE road %1").arg(R->id().numId); + + Progress->setLabelText(tr("UPDATE road %1").arg(R->id().numId) + userName(R)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + QString URL = theDownloader->getURLToUpdate("way",stripToOSMId(R->id())); + QString DataIn, DataOut; + DataIn = wrapOSM(exportOSM(*R, ChangeSetId), ChangeSetId); + if (sendRequest("PUT",URL,DataIn,DataOut)) + { + R->setLastUpdated(Feature::OSMServer); + + int NewVersion = DataOut.toInt(); + if (NewVersion <= R->versionNumber()) + NewVersion = R->versionNumber()+1; + R->setVersionNumber(NewVersion); + + if (!g_Merk_Frisius) { + R->layer()->remove(R); + document()->getUploadedLayer()->add(R); + } + R->setUploaded(true); + R->setDirtyLevel(0); + return EraseFromHistory; + } + return true; +} + +bool DirtyListExecutor::updatePoint(Node* Pt) +{ + Progress->setValue(++Done); + + qDebug() << QString("UPDATE trackpoint %1").arg(Pt->id().numId); + + Progress->setLabelText(tr("UPDATE trackpoint %1").arg(Pt->id().numId) + userName(Pt)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); +// QString URL("/api/0.3/node/%1"); +// URL = URL.arg(stripToOSMId(Pt->id())); + QString URL = theDownloader->getURLToUpdate("node",stripToOSMId(Pt->id())); + QString DataIn, DataOut; + DataIn = wrapOSM(exportOSM(*Pt, ChangeSetId), ChangeSetId); + if (sendRequest("PUT",URL,DataIn,DataOut)) + { + Pt->setLastUpdated(Feature::OSMServer); + + int NewVersion = DataOut.toInt(); + if (NewVersion <= Pt->versionNumber()) + NewVersion = Pt->versionNumber()+1; + Pt->setVersionNumber(NewVersion); + + if (!g_Merk_Frisius) { + Pt->layer()->remove(Pt); + document()->getUploadedLayer()->add(Pt); + } + Pt->setUploaded(true); + Pt->setDirtyLevel(0); + return EraseFromHistory; + } + return false; +} + +bool DirtyListExecutor::erasePoint(Node *Pt) +{ + Progress->setValue(++Done); + + qDebug() << QString("REMOVE trackpoint %1").arg(Pt->id().numId); + + Progress->setLabelText(tr("REMOVE trackpoint %1").arg(Pt->id().numId) + userName(Pt)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); +// QString URL("/api/0.3/node/%1"); +// URL = URL.arg(stripToOSMId(Pt->id())); + QString URL = theDownloader->getURLToDelete("node",stripToOSMId(Pt->id())); + QString DataIn, DataOut; + DataIn = wrapOSM(exportOSM(*Pt, ChangeSetId), ChangeSetId); + if (sendRequest("DELETE",URL,DataIn,DataOut)) + { + Pt->setLastUpdated(Feature::OSMServer); + if (!g_Merk_Frisius) { + Pt->layer()->remove(Pt); + document()->getUploadedLayer()->add(Pt); + } + Pt->setUploaded(true); + Pt->setDirtyLevel(0); + return EraseFromHistory; + } + return false; +} + +bool DirtyListExecutor::eraseRoad(Way *R) +{ + Progress->setValue(++Done); + + qDebug() << QString("REMOVE road %1").arg(R->id().numId); + + Progress->setLabelText(tr("REMOVE road %1").arg(R->id().numId) + userName(R)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); +// QString URL("/api/0.3/way/%1"); +// URL = URL.arg(stripToOSMId(R->id())); + QString URL = theDownloader->getURLToDelete("way",stripToOSMId(R->id())); + QString DataIn, DataOut; + DataIn = wrapOSM(exportOSM(*R, ChangeSetId), ChangeSetId); + if (sendRequest("DELETE",URL,DataIn,DataOut)) + { + R->setLastUpdated(Feature::OSMServer); + if (!g_Merk_Frisius) { + R->layer()->remove(R); + document()->getUploadedLayer()->add(R); + } + R->setUploaded(true); + R->setDirtyLevel(0); + return EraseFromHistory; + } + return false; +} + +bool DirtyListExecutor::eraseRelation(Relation *R) +{ + Progress->setValue(++Done); + + qDebug() << QString("REMOVE relation %1").arg(R->id().numId); + + Progress->setLabelText(tr("REMOVE relation %1").arg(R->id().numId) + userName(R)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + QString URL = theDownloader->getURLToDelete("relation",stripToOSMId(R->id())); + QString DataIn, DataOut; + DataIn = wrapOSM(exportOSM(*R, ChangeSetId), ChangeSetId); + if (sendRequest("DELETE",URL,DataIn,DataOut)) + { + R->setLastUpdated(Feature::OSMServer); + if (!g_Merk_Frisius) { + R->layer()->remove(R); + document()->getUploadedLayer()->add(R); + } + R->setUploaded(true); + R->setDirtyLevel(0); + return EraseFromHistory; + } + return false; +} diff --git a/src/Sync/DirtyList.h b/src/Sync/DirtyList.h new file mode 100644 index 0000000..c9a52ed --- /dev/null +++ b/src/Sync/DirtyList.h @@ -0,0 +1,159 @@ +#ifndef MERKATOR_DIRTYLIST_H_ +#define MERKATOR_DIRTYLIST_H_ + +class Downloader; +class Document; +class Feature; +class Relation; +class Way; +class Node; +class Way; + +class QProgressDialog; +class QWidget; + +#include <ui_SyncListDialog.h> + +#include <QtCore/QObject> +#include <QtCore/QString> + +#include <utility> +#include <QList> + +class DirtyList +{ + public: + DirtyList() : errorAbort(false) {} + virtual ~DirtyList(); + virtual bool add(Feature* F) = 0; + virtual bool update(Feature* F) = 0; + virtual bool erase(Feature* F) = 0; + virtual bool noop(Feature* F) = 0; + + virtual bool inError() {return errorAbort; } + + protected: + bool errorAbort; +}; + +class DirtyListBuild : public DirtyList +{ + public: + virtual bool add(Feature* F); + virtual bool update(Feature* F); + virtual bool erase(Feature* F); + virtual bool noop(Feature*) {return false;} + + virtual bool willBeAdded(Feature* F) const; + virtual bool willBeErased(Feature* F) const; + virtual bool updateNow(Feature* F) const; + virtual void resetUpdates(); + + protected: + QList<Feature*> Added, Deleted; + QList<Feature*> Updated; + mutable QList<QPair<int, int> > UpdateCounter; +}; + +class DirtyListVisit : public DirtyList +{ + public: + DirtyListVisit(Document* aDoc, const DirtyListBuild& aFuture, bool aEraseFromHistory); + + Document* document(); + bool runVisit(); + + virtual bool add(Feature* F); + virtual bool update(Feature* F); + virtual bool erase(Feature* F); + virtual bool noop(Feature* F); + + virtual bool addPoint(Node* Pt) = 0; + virtual bool addRoad(Way* R) = 0; + virtual bool addRelation(Relation* R) = 0; + virtual bool updatePoint(Node* Pt) = 0; + virtual bool updateRoad(Way* R) = 0; + virtual bool updateRelation(Relation* R) = 0; + virtual bool erasePoint(Node* Pt) = 0; + virtual bool eraseRoad(Way* R) = 0; + virtual bool eraseRelation(Relation* R) = 0; + + protected: + bool notYetAdded(Feature* F); + Document* theDocument; + const DirtyListBuild& Future; + bool EraseFromHistory; + QList<Feature*> Updated; + QList<Feature*> AlreadyAdded; + QList<bool> EraseResponse; + bool DeletePass; + QMap<Node*, bool> TrackPointsToDelete; + QMap<Way*, bool> RoadsToDelete; + QMap<Relation*, bool> RelationsToDelete; +}; + +class DirtyListDescriber : public DirtyListVisit +{ + public: + DirtyListDescriber(Document* aDoc, const DirtyListBuild& aFuture); + + virtual bool addPoint(Node* Pt); + virtual bool addRoad(Way* R); + virtual bool addRelation(Relation* R); + virtual bool updatePoint(Node* Pt); + virtual bool updateRoad(Way* R); + virtual bool updateRelation(Relation *R); + virtual bool erasePoint(Node* Pt); + virtual bool eraseRoad(Way* R); + virtual bool eraseRelation(Relation* R); + + bool showChanges(QWidget* Parent); + int tasks() const; + + private: + Ui::SyncListDialog Ui; + + protected: + QListWidget* theListWidget; + int Task; +}; + +class DirtyListExecutor : public QObject, public DirtyListVisit +{ + Q_OBJECT + + public: + DirtyListExecutor(Document* aDoc, const DirtyListBuild& aFuture, const QString& aWeb, const QString& aUser, const QString& aPwd, int aTasks); + virtual ~DirtyListExecutor(); + + virtual bool start(); + virtual bool stop(); + virtual bool addPoint(Node* Pt); + virtual bool addRoad(Way* R); + virtual bool addRelation(Relation* R); + virtual bool updatePoint(Node* Pt); + virtual bool updateRoad(Way* R); + virtual bool updateRelation(Relation* R); + virtual bool erasePoint(Node* Pt); + virtual bool eraseRoad(Way* R); + virtual bool eraseRelation(Relation* R); + + bool executeChanges(QWidget* Parent); + + private: + bool sendRequest(const QString& Method, const QString& URL, const QString& Out, QString& Rcv); + + Ui::SyncListDialog Ui; + int Tasks, Done; + QProgressDialog* Progress; + QString Web,User,Pwd; + Downloader* theDownloader; + QString ChangeSetId; +}; + +QString stripToOSMId(const QString& id); +QString userName(const Feature* F); + +#endif + + diff --git a/src/Sync/DirtyListExecutorOSC.cpp b/src/Sync/DirtyListExecutorOSC.cpp new file mode 100644 index 0000000..5598d6c --- /dev/null +++ b/src/Sync/DirtyListExecutorOSC.cpp @@ -0,0 +1,481 @@ +//*************************************************************** +// CLass: DirtyListExecutorOSCOSC +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com> (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +//****************************************************************** + +#include "Global.h" +#include "DirtyListExecutorOSC.h" + +#include "MainWindow.h" +#include "Features.h" +#include "DownloadOSM.h" +#include "MerkaartorPreferences.h" +#include "Command.h" +#include "Utils.h" + +#include <QMessageBox> +#include <QDebug> +#include <QProgressDialog> +#include <QRegExp> + +extern int glbAdded, glbUpdated, glbDeleted; +extern QString glbChangeSetComment; + +DirtyListExecutorOSC::DirtyListExecutorOSC(Document* aDoc, const DirtyListBuild& aFuture) + : DirtyListVisit(aDoc, aFuture, false) + , Done(0) + , theDownloader(0) +{ +} + +DirtyListExecutorOSC::DirtyListExecutorOSC(Document* aDoc, const DirtyListBuild& aFuture, const QString& aWeb, const QString& aUser, const QString& aPwd, int aTasks) +: DirtyListVisit(aDoc, aFuture, false), Tasks(aTasks), Done(0), Web(aWeb), User(aUser), Pwd(aPwd), theDownloader(0) +{ + theDownloader = new Downloader(User, Pwd); +} + +DirtyListExecutorOSC::~DirtyListExecutorOSC() +{ + delete theDownloader; +} + + +int DirtyListExecutorOSC::sendRequest(const QString& Method, const QString& URL, const QString& Data, QString& Rcv) +{ + if (inError()) + return false; + + int rCode = -1; + + QMessageBox::StandardButton theChoice = QMessageBox::Retry; + while (theChoice == QMessageBox::Retry) { + QUrl theUrl(Web+URL); + if (!theDownloader->request(Method,theUrl,Data)) + { + qDebug() << QString("Upload error: request (%1); Server message is '%2'").arg(theDownloader->resultCode()).arg(theDownloader->resultText()); + if (theDownloader->resultCode() == 401) { + QMessageBox::warning(Progress,tr("Error uploading request"), + tr("Please check your username and password in the Preferences menu")); + theChoice = QMessageBox::Abort; + } else { + QString msg = tr("There was an error uploading this request (%1)\nServer message is '%2'").arg(theDownloader->resultCode()).arg(theDownloader->resultText()); + if (!theDownloader->errorText().isEmpty()) + msg += tr("\nAPI message is '%1'").arg(theDownloader->errorText()); + theChoice = QMessageBox::warning(Progress,tr("Error uploading request"), msg, QMessageBox::Abort | QMessageBox::Retry); + continue; + } + } + + QByteArray Content = theDownloader->content(); + Rcv = QString::fromUtf8(Content.data()); + rCode = theDownloader->resultCode(); + + qDebug() << QString("Upload: rCode (%1); Msg (%2)").arg(rCode).arg(Rcv); + + if (rCode == 200) + break; + + theChoice = QMessageBox::warning(Progress,tr("Error uploading request"), + tr( + "There was an error uploading this request (%1)\n\"%2\"\n" + "Please redownload the problematic feature to handle the conflict." + ).arg(rCode).arg(Rcv), + QMessageBox::Abort | QMessageBox::Retry); + } + if (theChoice == QMessageBox::Abort) { + errorAbort = true; + return rCode; + } + return rCode; +} + +QByteArray DirtyListExecutorOSC::getChanges() +{ + Progress = new QProgressDialog(0); + Progress->setWindowTitle(tr("Checking changes...")); + Progress->setWindowFlags(Progress->windowFlags() & ~Qt::WindowContextHelpButtonHint); + Progress->setWindowFlags(Progress->windowFlags() | Qt::MSWindowsFixedSizeDialogHint); + Progress->setWindowModality(Qt::WindowModal); + Progress->setMinimumDuration(0); + Progress->setMaximum(Tasks+2); + Progress->show(); + + OscBuffer.buffer().clear(); + OscBuffer.open(QIODevice::WriteOnly); + + OscStream.setDevice(&OscBuffer); + OscStream.writeStartDocument(); + + OscStream.writeStartElement("osmChange "); + OscStream.writeAttribute("version", "0.6"); + OscStream.writeAttribute("generator", QString("Merkaartor %1").arg(STRINGIFY(VERSION))); + + runVisit(); + + SAFE_DELETE(Progress) + + OscStream.writeEndDocument(); + OscBuffer.close(); + + return OscBuffer.buffer(); +} + +bool DirtyListExecutorOSC::executeChanges(QWidget* aParent) +{ + bool ok = true; + +#ifndef _MOBILE + MainWindow* main = dynamic_cast<MainWindow*>(aParent); + main->createProgressDialog(); + + Progress = main->getProgressDialog(); + if (Progress) { + Progress->setMaximum(Tasks); + Progress->setWindowTitle(QApplication::translate("Downloader", "Uploading...")); + } + + QProgressBar* Bar = main->getProgressBar(); + Bar->setTextVisible(false); + + QLabel* Lbl = main->getProgressLabel(); + + if (Progress) + Progress->show(); + + if (theDownloader) + theDownloader->setAnimator(Progress,Lbl,Bar,false); + + if ((ok = start())) + { + OscBuffer.buffer().clear(); + OscBuffer.open(QIODevice::WriteOnly); + OscStream.setDevice(&OscBuffer); + OscStream.writeStartDocument(); + + OscStream.writeStartElement("osmChange "); + OscStream.writeAttribute("version", "0.6"); + OscStream.writeAttribute("generator", QString("Merkaartor %1").arg(STRINGIFY(VERSION))); + + Lbl->setText(QApplication::translate("Downloader","Preparing changes")); + if ((ok = runVisit())) { + Lbl->setText(QApplication::translate("Downloader","Waiting for server response")); + ok = stop(); + } + } + main->deleteProgressDialog(); +#endif + + return ok; +} + +bool DirtyListExecutorOSC::start() +{ + ChangeSetId.clear(); + Progress->setValue(++Done); + qDebug() << QString("OPEN changeset"); + + Progress->setLabelText(tr("OPEN changeset")); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + QString DataIn( + "<osm>" + "<changeset>" + "<tag k=\"created_by\" v=\"Merkaartor %1 (%2)\"/>" + "<tag k=\"comment\" v=\"%3\"/>" + "</changeset>" + "</osm>"); + DataIn = DataIn.arg(STRINGIFY(VERSION)).arg(QLocale::system().name().split("_")[0]).arg(Utils::encodeAttributes(glbChangeSetComment)); + QString DataOut; + QString URL = theDownloader->getURLToOpenChangeSet(); + if (sendRequest("PUT",URL,DataIn, DataOut) != 200) + return false; + + ChangeSetId = DataOut; + + return true; +} + +bool DirtyListExecutorOSC::stop() +{ + QString DataIn, DataOut; + QString errFeat; + + OscStream.writeEndDocument(); + OscBuffer.close(); + qDebug() << OscBuffer.buffer(); + QString URL = theDownloader->getURLToUploadDiff(ChangeSetId); + switch (sendRequest("POST", URL, QString::fromUtf8(OscBuffer.buffer().data()), DataOut)) { + case 200: { + QDomDocument resDoc; + if (resDoc.setContent(DataOut)) { + + QDomNodeList nl = resDoc.elementsByTagName("diffResult"); + if (nl.size()) { + QDomElement resRoot = nl.at(0).toElement(); + QDomElement c = resRoot.firstChildElement(); + while (!c.isNull()) { + IFeature::FeatureType aType = IFeature::FeatureType::Uninitialized; + if (c.tagName() == "node") + aType = IFeature::Point; + else if (c.tagName() == "way") + aType = IFeature::LineString; + else if (c.tagName() == "relation") + aType = IFeature::OsmRelation; + else { + qDebug() << "Unknown element found in response."; + } + + Feature* F = theDocument->getFeature(IFeature::FId(aType, c.attribute("old_id").toLongLong())); + if (F) { + F->setId(IFeature::FId(aType, c.attribute("new_id").toLongLong())); + F->setVersionNumber(c.attribute("new_version").toInt()); + F->setLastUpdated(Feature::OSMServer); + F->setUser("me"); + F->setTime(QDateTime::currentDateTime()); + + if (!g_Merk_Frisius) { + F->layer()->remove(F); + document()->getUploadedLayer()->add(F); + } + F->setUploaded(true); + F->setDirtyLevel(0); + + } else + qDebug() << "Feature not found in diff upload result:" << c.attribute("old_id"); + + c = c.nextSiblingElement(); + } + theDocument->history().cleanup(); + } + } + break; + } + + case 409: { // Confilct +// QRegExp rx(".*node.*(\\d+)", Qt::CaseInsensitive); +// if (rx.indexIn(DataOut) > -1) { +// errFeat = "node_" + rx.cap(1); +// } else { +// QRegExp rx(".*way.*(\\d+)", Qt::CaseInsensitive); +// if (rx.indexIn(DataOut) > -1) { +// errFeat = "way_" + rx.cap(1); +// } else { +// QRegExp rx(".*relation.*(\\d+)", Qt::CaseInsensitive); +// if (rx.indexIn(DataOut) > -1) { +// errFeat = "rel_" + rx.cap(1); +// } +// } +// } +// qDebug() << errFeat; + break; + } + case 410: { // Gone +// QRegExp rx(".*node.*(\\d+)", Qt::CaseInsensitive); +// if (rx.indexIn(DataOut) > -1) { +// errFeat = "node_" + rx.cap(1); +// } else { +// QRegExp rx(".*way.*(\\d+)", Qt::CaseInsensitive); +// if (rx.indexIn(DataOut) > -1) { +// errFeat = "way_" + rx.cap(1); +// } else { +// QRegExp rx(".*relation.*(\\d+)", Qt::CaseInsensitive); +// if (rx.indexIn(DataOut) > -1) { +// errFeat = "rel_" + rx.cap(1); +// } +// } +// } +// qDebug() << errFeat; + break; + } + + default: + break; + } + + qDebug() << QString("CLOSE changeset"); + + Progress->setLabelText(tr("CLOSE changeset")); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + URL = theDownloader->getURLToCloseChangeSet(ChangeSetId); + QUrl theUrl(Web+URL); + theDownloader->setAnimator(NULL, NULL, NULL, false); + if (!theDownloader->request("PUT",theUrl,DataIn)) { + QMessageBox::warning(NULL, tr("Changeset could not be closed."), tr("An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.")); + } + + return true; +} + +void DirtyListExecutorOSC::OscCreate(Feature* F) +{ + if (LastAction != "create") { + if (!LastAction.isEmpty()) + OscStream.writeEndElement(); + OscStream.writeStartElement("create"); + LastAction = "create"; + } + + F->toXML(OscStream, Progress, true, ChangeSetId); +} + +void DirtyListExecutorOSC::OscModify(Feature* F) +{ + if (LastAction != "modify") { + if (!LastAction.isEmpty()) + OscStream.writeEndElement(); + OscStream.writeStartElement("modify"); + LastAction = "modify"; + } + + F->toXML(OscStream, Progress, true, ChangeSetId); +} + +void DirtyListExecutorOSC::OscDelete(Feature* F) +{ + if (LastAction != "delete") { + if (!LastAction.isEmpty()) + OscStream.writeEndElement(); + OscStream.writeStartElement("delete"); + LastAction = "modify"; + } + + F->toXML(OscStream, Progress, true, ChangeSetId); +} + + + +bool DirtyListExecutorOSC::addRelation(Relation *F) +{ + qDebug() << QString("ADD relation %1").arg(F->id().numId); + + Progress->setLabelText(tr("ADD relation %1").arg(F->id().numId) + userName(F)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + OscCreate(F); + + return false; +} + +bool DirtyListExecutorOSC::addRoad(Way *F) +{ + Progress->setValue(++Done); + + qDebug() << QString("ADD road %1").arg(F->id().numId); + + Progress->setLabelText(tr("ADD road %1").arg(F->id().numId) + userName(F)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + OscCreate(F); + + return false; +} + + +bool DirtyListExecutorOSC::addPoint(Node* F) +{ + Progress->setValue(++Done); + + qDebug() << QString("ADD trackpoint %1").arg(F->id().numId); + + Progress->setLabelText(tr("ADD trackpoint %1").arg(F->id().numId) + userName(F)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + OscCreate(F); + + return false; +} + + + +bool DirtyListExecutorOSC::updateRelation(Relation* F) +{ + Progress->setValue(++Done); + + qDebug() << QString("UPDATE relation %1").arg(F->id().numId); + + Progress->setLabelText(tr("UPDATE relation %1").arg(F->id().numId) + userName(F)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + OscModify(F); + + return false; +} + + +bool DirtyListExecutorOSC::updateRoad(Way* F) +{ + Progress->setValue(++Done); + + qDebug() << QString("UPDATE road %1").arg(F->id().numId); + + Progress->setLabelText(tr("UPDATE road %1").arg(F->id().numId) + userName(F)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + OscModify(F); + + return false; +} + +bool DirtyListExecutorOSC::updatePoint(Node* F) +{ + Progress->setValue(++Done); + + qDebug() << QString("UPDATE trackpoint %1").arg(F->id().numId); + + Progress->setLabelText(tr("UPDATE trackpoint %1").arg(F->id().numId) + userName(F)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + OscModify(F); + + return false; +} + +bool DirtyListExecutorOSC::erasePoint(Node *F) +{ + Progress->setValue(++Done); + + qDebug() << QString("REMOVE trackpoint %1").arg(F->id().numId); + + Progress->setLabelText(tr("REMOVE trackpoint %1").arg(F->id().numId) + userName(F)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + OscDelete(F); + + return false; +} + +bool DirtyListExecutorOSC::eraseRoad(Way *F) +{ + Progress->setValue(++Done); + + qDebug() << QString("REMOVE road %1").arg(F->id().numId); + + Progress->setLabelText(tr("REMOVE road %1").arg(F->id().numId) + userName(F)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + OscDelete(F); + + return false; +} + +bool DirtyListExecutorOSC::eraseRelation(Relation *F) +{ + Progress->setValue(++Done); + + qDebug() << QString("REMOVE relation %1").arg(F->id().numId); + + Progress->setLabelText(tr("REMOVE relation %1").arg(F->id().numId) + userName(F)); + QEventLoop L; L.processEvents(QEventLoop::ExcludeUserInputEvents); + + OscDelete(F); + + return false; +} diff --git a/src/Sync/DirtyListExecutorOSC.h b/src/Sync/DirtyListExecutorOSC.h new file mode 100644 index 0000000..614342f --- /dev/null +++ b/src/Sync/DirtyListExecutorOSC.h @@ -0,0 +1,67 @@ +//*************************************************************** +// CLass: DirtyListExecutorOSCOSC +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com> (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +//****************************************************************** + +#ifndef DirtyListExecutorOSC_H +#define DirtyListExecutorOSC_H + +#include "DirtyList.h" + +#include <QXmlStreamWriter> +#include <QBuffer> + +class Downloader; + +class DirtyListExecutorOSC : public QObject, public DirtyListVisit +{ + Q_OBJECT + +public: + DirtyListExecutorOSC(Document* aDoc, const DirtyListBuild& aFuture); + DirtyListExecutorOSC(Document* aDoc, const DirtyListBuild& aFuture, const QString& aWeb, const QString& aUser, const QString& aPwd, int aTasks); + virtual ~DirtyListExecutorOSC(); + + void OscCreate(Feature* F); + void OscModify(Feature* F); + void OscDelete(Feature* F); + + virtual bool start(); + virtual bool stop(); + virtual bool addPoint(Node* Pt); + virtual bool addRoad(Way* R); + virtual bool addRelation(Relation* R); + virtual bool updatePoint(Node* Pt); + virtual bool updateRoad(Way* R); + virtual bool updateRelation(Relation* R); + virtual bool erasePoint(Node* Pt); + virtual bool eraseRoad(Way* R); + virtual bool eraseRelation(Relation* R); + + bool executeChanges(QWidget* Parent); + QByteArray getChanges(); + +private: + int sendRequest(const QString& Method, const QString& URL, const QString& Out, QString& Rcv); + + QXmlStreamWriter OscStream; + QBuffer OscBuffer; + + Ui::SyncListDialog Ui; + int Tasks, Done; + QProgressDialog* Progress; + QString Web,User,Pwd; + Downloader* theDownloader; + QString ChangeSetId; + QString LastAction; +}; + + +#endif // DirtyListExecutorOSC_H diff --git a/src/Sync/DownloadOSM.cpp b/src/Sync/DownloadOSM.cpp new file mode 100644 index 0000000..b1be43e --- /dev/null +++ b/src/Sync/DownloadOSM.cpp @@ -0,0 +1,742 @@ +#include "DownloadOSM.h" + +#include "MainWindow.h" +#include "MapView.h" +#include "Coord.h" +#include "ImportGPX.h" +#include "ImportExportGdal.h" +#include "ImportOSM.h" +#include "Document.h" +#include "Layer.h" +#include "Feature.h" +#include "TrackSegment.h" +#include "SlippyMapWidget.h" +#include "MerkaartorPreferences.h" +#include "OsmLink.h" + +#include "IProgressWindow.h" + +#include <ui_DownloadMapDialog.h> + +#include <QBuffer> +#include <QTimer> +#include <QComboBox> +#include <QMessageBox> +#include <QProgressBar> +#include <QLabel> +#include <QProgressDialog> +#include <QStatusBar> +#include <QInputDialog> + +/* DOWNLOADER */ + +Downloader::Downloader(const QString& aUser, const QString& aPwd) +: User(aUser), Password(aPwd), + currentReply(0),Error(false), AnimatorLabel(0), AnimatorBar(0), AnimationTimer(0) +{ + //IdAuth = Request.setUser(User.toUtf8(), Password.toUtf8()); + connect(&netManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(on_requestFinished(QNetworkReply*))); + connect(&netManager,SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), this,SLOT(on_authenticationRequired(QNetworkReply*,QAuthenticator*))); +} + + +void Downloader::animate() +{ + if (AnimatorBar && AnimationTimer) + AnimatorBar->setValue((AnimatorBar->value()+1) % AnimatorBar->maximum()); +} + +void Downloader::setAnimator(QProgressDialog *anAnimator, QLabel* anAnimatorLabel, QProgressBar* anAnimatorBar, bool anAnimate) +{ + delete AnimationTimer; + + AnimatorLabel = anAnimatorLabel; + AnimatorBar = anAnimatorBar; + if (AnimatorBar && anAnimate) + { + AnimationTimer = new QTimer(this); + connect(AnimationTimer,SIGNAL(timeout()),this,SLOT(animate())); + } + if (AnimatorBar) + { + AnimatorBar->setValue(0); + if (anAnimator) + connect(anAnimator,SIGNAL(canceled()),this,SLOT(on_Cancel_clicked())); + qApp->processEvents(); + } +} + +void Downloader::on_Cancel_clicked() +{ + Error = true; + if (Loop.isRunning()) + Loop.exit(QDialog::Rejected); +} + +#include "QTextBrowser" + +bool Downloader::go(const QUrl& url) { + return request("GET", url, QString()); +} + +bool Downloader::request(const QString& theMethod, const QUrl& url, const QString& theData) { + if (Error) return false; + + qDebug() << "Downloader::request:" << url; + + netManager.setProxy(M_PREFS->getProxy(url)); + QNetworkRequest req(url); + + req.setRawHeader(QByteArray("Content-Type"), QByteArray("text/xml")); + req.setRawHeader(QByteArray("User-Agent"), USER_AGENT.toLatin1()); + + QByteArray dataArray(theData.toUtf8()); + QBuffer dataBuffer(&dataArray); + currentReply = netManager.sendCustomRequest(req, theMethod.toLatin1(), &dataBuffer); + + if (AnimationTimer) { + AnimationTimer->start(200); + connect(currentReply,SIGNAL(downloadProgress(qint64, qint64)), this,SLOT(progress(qint64, qint64))); + } + + if (Loop.exec() == QDialog::Rejected) + return false; + + if (AnimationTimer) + SAFE_DELETE(AnimationTimer); + + /* Test for redirections */ + QVariant redir = currentReply->attribute(QNetworkRequest::RedirectionTargetAttribute); + if (redir.isValid()) { + LocationText = redir.toString(); + if (!LocationText.isEmpty()) { + QUrl newUrl(LocationText); + return request(theMethod, newUrl, theData); + } + } + + /* We will log the error, but reporting shall be done at the call site. */ + if (currentReply->error()) { + qDebug() << "Downloader::request: received response with code" + << currentReply->error() << ", message" << currentReply->errorString(); + } + + + /* Read the data */ + Content = currentReply->readAll(); + Result = currentReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + ResultText = currentReply->errorString(); + ErrorText = currentReply->rawHeader("Error"); + return !Error; +} + +void Downloader::on_authenticationRequired( QNetworkReply *reply, QAuthenticator *auth) { + static QNetworkReply *lastReply = NULL; + + /* Only provide authentication the first time we see this reply, to avoid + * infinite loop providing the same credentials. */ + if (lastReply != reply) { + lastReply = reply; + qDebug() << "Downloader authentication required and provided."; + auth->setUser(User); + auth->setPassword(Password); + } +} + +QByteArray& Downloader::content() +{ + return Content; +} + +void Downloader::on_requestFinished( QNetworkReply *reply) +{ + if (reply->error()) + Error = true; + if ( (reply == currentReply) && Loop.isRunning() ) + Loop.exit(QDialog::Accepted); +} + +void Downloader::progress(qint64 done, qint64 total) +{ + if (AnimatorLabel && AnimatorBar) + { + if (done < 10240) + AnimatorLabel->setText(tr("Downloading from OSM (%n bytes)", "", done)); + else + AnimatorLabel->setText(tr("Downloading from OSM (%n kBytes)", "", (done/1024))); + if (AnimationTimer && total != 0) + { + SAFE_DELETE(AnimationTimer); + AnimatorBar->setMaximum(total); + } + if (!AnimationTimer && AnimatorBar) + AnimatorBar->setValue(done); + } +} + +int Downloader::resultCode() +{ + return Result; +} + +const QString &Downloader::resultText() +{ + return ResultText; +} + +const QString &Downloader::errorText() +{ + return ErrorText; +} + +const QString &Downloader::locationText() +{ + return LocationText; +} + +QString Downloader::getURLToOpenChangeSet() +{ + return QString("/changeset/create"); +} + +QString Downloader::getURLToCloseChangeSet(const QString& Id) +{ + return QString("/changeset/%1/close").arg(Id); +} + +QString Downloader::getURLToUploadDiff(QString changesetId) +{ + return QString("/changeset/%1/upload").arg(changesetId); +} + +QString Downloader::getURLToFetch(const QString &What) +{ + QString URL = QString("/%1?%2="); + return URL.arg(What).arg(What); +} + +QString Downloader::getURLToFetchFull(IFeature::FId id) +{ + QString type; + QString URL; + if (id.type & IFeature::Point) { + type = "node"; + URL = QString("/%1/%2"); + } else { + if (id.type & IFeature::LineString) + type = "way"; + if (id.type & IFeature::OsmRelation) + type = "relation"; + URL = QString("/%1/%2/full"); + } + + return URL.arg(type).arg(id.numId); +} + +QString Downloader::getURLToFetchFull(Feature* aFeature) +{ + return getURLToFetchFull(aFeature->id()); +} + +QString Downloader::getURLToFetch(const QString &What, const QString& Id) +{ + QString URL = QString("/%1/%2"); + return URL.arg(What).arg(Id); +} + +QString Downloader::getURLToCreate(const QString &What) +{ + QString URL = QString("/%1/create"); + return URL.arg(What); +} + +QString Downloader::getURLToUpdate(const QString &What, const QString& Id) +{ + QString URL = QString("/%1/%2"); + return URL.arg(What).arg(Id); +} + +QString Downloader::getURLToDelete(const QString &What, const QString& Id) +{ + QString URL = QString("/%1/%2"); + return URL.arg(What).arg(Id); +} + +QString Downloader::getURLToMap() +{ + QString URL("/map?bbox=%1,%2,%3,%4"); + return URL; +} + +QString Downloader::getURLToTrackPoints() +{ + QString URL = QString("/trackpoints?bbox=%1,%2,%3,%4&page=%5"); + return URL; +} + +bool downloadOSM(QWidget* aParent, const QUrl& theUrl, const QString& aUser, const QString& aPassword, Document* theDocument, Layer* theLayer) +{ + Downloader Rcv(aUser, aPassword); + + IProgressWindow* aProgressWindow = dynamic_cast<IProgressWindow*>(aParent); + if (aProgressWindow) { + + QProgressDialog* dlg = aProgressWindow->getProgressDialog(); + if (dlg) { + dlg->setWindowTitle(QApplication::translate("Downloader","Downloading...")); + dlg->setWindowFlags(dlg->windowFlags() & ~Qt::WindowContextHelpButtonHint); + dlg->setWindowFlags(dlg->windowFlags() | Qt::MSWindowsFixedSizeDialogHint); + } + + QProgressBar* Bar = aProgressWindow->getProgressBar(); + Bar->setTextVisible(false); + Bar->setMaximum(11); + + QLabel* Lbl = aProgressWindow->getProgressLabel(); + Lbl->setText(QApplication::translate("Downloader","Downloading from OSM (connecting)")); + + if (dlg) + dlg->show(); + + Rcv.setAnimator(dlg, Lbl, Bar, true); + } + if (!Rcv.go(theUrl)) + { +#ifndef _MOBILE + /** TODO: Let the caller set the cursor. */ + aParent->setCursor(QCursor(Qt::ArrowCursor)); +#endif + } + int x = Rcv.resultCode(); + qDebug() << "DownloadOSM: Received OSM API response code:" << x << ", processing."; + + /** We will parse the error codes and display the appropriate messages. */ + switch (x) + { + case 200: + qDebug() << "DownloadOSM: Response OK, processing."; + break; + case 301: + case 302: + case 307: { + QString aWeb = Rcv.locationText(); + if (!aWeb.isEmpty()) { + QUrl aURL(aWeb); + return downloadOSM(aParent, aURL, aUser, aPassword, theDocument, theLayer); + } else { + QString msg = QApplication::translate("Downloader","Unexpected http status code (%1)\nServer message is '%2'").arg(x).arg(Rcv.resultText()); + if (!Rcv.errorText().isEmpty()) + msg += QApplication::translate("Downloader", "\nAPI message is '%1'").arg(Rcv.errorText()); + QMessageBox::warning(aParent,QApplication::translate("Downloader","Download failed"), msg); + return false; + } + break; + } + case 401: + QMessageBox::warning(aParent,QApplication::translate("Downloader","Download failed"),QApplication::translate("Downloader","Username/password invalid")); + return false; + default: + QString msg = QApplication::translate("Downloader","Unexpected http status code (%1)\nServer message is '%2'").arg(x).arg(Rcv.resultText()); + if (!Rcv.errorText().isEmpty()) + msg += QApplication::translate("Downloader", "\nAPI message is '%1'").arg(Rcv.errorText()); + QMessageBox::warning(aParent,QApplication::translate("Downloader","Download failed"), msg); + return false; + } + Downloader Down(aUser, aPassword); + bool OK = importOSM(aParent, Rcv.content(), theDocument, theLayer, &Down); + return OK; +} + +bool downloadOSM(QWidget* aParent, const QString& aWeb, const QString& aUser, const QString& aPassword, const CoordBox& aBox , Document* theDocument, Layer* theLayer) +{ + if (checkForConflicts(theDocument)) + { + QMessageBox::warning(aParent,QApplication::translate("Downloader","Unresolved conflicts"), QApplication::translate("Downloader","Please resolve existing conflicts first")); + return false; + } + Downloader Rcv(aUser, aPassword); + QString URL = Rcv.getURLToMap(); + + if ((fabs(aBox.bottomLeft().x()) < 180.0 && fabs(aBox.topRight().x()) > 180.0) + || (fabs(aBox.bottomLeft().x()) > 180.0 && fabs(aBox.topRight().x()) < 180.0)) { + /* Check for +-180 meridian, and split query in two if necessary */ + int sign = (aBox.bottomLeft().x() > 0) ? 1 : -1; + CoordBox q1 = aBox, q2 = aBox; + if (aBox.bottomLeft().x() > 0) { + q1.setRight(180*sign); + q2.setLeft(-180*sign); + q2.setRight(q2.right()-360); + } else { + q1.setLeft(180*sign); + q2.setRight(-180*sign); + q2.setLeft(q2.left()+360); + } + return downloadOSM(aParent, aWeb, aUser, aPassword, q1, theDocument, theLayer) + && downloadOSM(aParent, aWeb, aUser, aPassword, q2, theDocument, theLayer); + + } else { + /* Normal code path */ + URL = URL.arg(aBox.bottomLeft().x(), 0, 'f').arg(aBox.bottomLeft().y(), 0, 'f').arg(aBox.topRight().x(), 0, 'f').arg(aBox.topRight().y(), 0, 'f'); + QUrl theUrl(aWeb+URL); + return downloadOSM(aParent, theUrl, aUser, aPassword, theDocument, theLayer); + } +} + +bool downloadTracksFromOSM(QWidget* Main, const QString& aWeb, const QString& aUser, const QString& aPassword, const CoordBox& aBox , Document* theDocument) +{ + Downloader theDownloader(aUser, aPassword); + QList<TrackLayer*> theTracklayers; + //TrackMapLayer* trackLayer = new TrackMapLayer(QApplication::translate("Downloader","Downloaded tracks")); + //theDocument->add(trackLayer); + + IProgressWindow* aProgressWindow = dynamic_cast<IProgressWindow*>(Main); + if (!aProgressWindow) + return false; + + QProgressDialog* dlg = aProgressWindow->getProgressDialog(); + dlg->setWindowTitle(QApplication::translate("Downloader","Parsing...")); + + QProgressBar* Bar = aProgressWindow->getProgressBar(); + Bar->setTextVisible(false); + Bar->setMaximum(11); + + QLabel* Lbl = aProgressWindow->getProgressLabel(); + Lbl->setText(QApplication::translate("Downloader","Parsing XML")); + + if (dlg) + dlg->show(); + + theDownloader.setAnimator(dlg,Lbl,Bar,true); + for (int Page=0; ;++Page) + { + Lbl->setText(QApplication::translate("Downloader","Downloading trackpoints %1-%2").arg(Page*5000+1).arg(Page*5000+5000)); + QString URL = theDownloader.getURLToTrackPoints(); + URL = URL.arg(aBox.bottomLeft().x()). + arg(aBox.bottomLeft().y()). + arg(aBox.topRight().x()). + arg(aBox.topRight().y()). + arg(Page); + QUrl theUrl(aWeb+URL); + if (!theDownloader.go(theUrl)) + return false; + if (theDownloader.resultCode() != 200) + return false; + int Before = theTracklayers.size(); + QByteArray Ar(theDownloader.content()); + bool OK = ImportGPX::import(Main, Ar, theDocument, theTracklayers, ImportGPX::Option::MakeSegmented | ImportGPX::Option::DetectAnonymizedSegments); + if (!OK) + return false; + if (Before == theTracklayers.size()) + break; + } + return true; +} + + +bool checkForConflicts(Document* theDocument) +{ + for (FeatureIterator it(theDocument); !it.isEnd(); ++it) { + if (it.get()->lastUpdated() == Feature::OSMServerConflict) + return true; + } + return false; +} + +bool downloadFeatures(MainWindow* Main, const QList<Feature*>& aDownloadList , Document* theDocument) +{ + QList<IFeature::FId> list; + foreach (Feature* F, aDownloadList) { + list << F->id(); + } + + bool ok = downloadFeatures(Main, list, theDocument, NULL); + + return ok; +} + +bool downloadFeature(MainWindow* Main, const IFeature::FId& id, Document* theDocument, Layer* theLayer) +{ + QList<IFeature::FId> list; + list << id; + bool ok = downloadFeatures(Main, list, theDocument, theLayer); + + return ok; +} + +bool downloadFeatures(MainWindow* Main, const QList<IFeature::FId>& idList , Document* theDocument, Layer* theLayer) +{ + if (!theLayer) { + if (!theDocument->getLastDownloadLayer()) { + theLayer = new DrawingLayer(QApplication::translate("Downloader","%1 download").arg(QDateTime::currentDateTime().toString(Qt::ISODate))); + theDocument->add(theLayer); + } else + theLayer = (Layer*)theDocument->getLastDownloadLayer(); + } + + QString osmWebsite, osmUser, osmPwd; + + osmWebsite = M_PREFS->getOsmApiUrl(); + osmUser = M_PREFS->getOsmUser(); + osmPwd = M_PREFS->getOsmPassword(); + + if (Main) + Main->view()->setUpdatesEnabled(false); + + bool OK = true; + Downloader Rcv(osmUser, osmPwd); + + for (int i=0; i<idList.size(); ++i) { + QString URL = Rcv.getURLToFetchFull(idList[i]); + QUrl theUrl(osmWebsite+URL); + + downloadOSM(Main, theUrl, osmUser, osmPwd, theDocument, theLayer); + } + + if (Main) + Main->view()->setUpdatesEnabled(true); + if (OK) + { + if (Main) + Main->invalidateView(); + } else + { + if (theLayer != theDocument->getLastDownloadLayer()) { + theDocument->remove(theLayer); + delete theLayer; + } + } + return OK; +} + +bool downloadMapdust(MainWindow* Main, const CoordBox& aBox, Document* theDocument, SpecialLayer* theLayer) +{ + QUrl url; + + url.setUrl(M_PREFS->getMapdustUrl()); + + if (Main) + Main->view()->setUpdatesEnabled(false); + + Downloader theDownloader("", ""); + + SpecialLayer* trackLayer = theLayer; + if (!trackLayer) { + trackLayer = new SpecialLayer(QApplication::translate("Downloader","MapDust"), Layer::MapDustLayer); + trackLayer->setUploadable(false); + theDocument->add(trackLayer); + } + + IProgressWindow* aProgressWindow = dynamic_cast<IProgressWindow*>(Main); + if (!aProgressWindow) + return false; + + QProgressDialog* dlg = aProgressWindow->getProgressDialog(); + dlg->setWindowTitle(QApplication::translate("Downloader","Parsing...")); + + QProgressBar* Bar = aProgressWindow->getProgressBar(); + Bar->setTextVisible(false); + Bar->setMaximum(11); + + QLabel* Lbl = aProgressWindow->getProgressLabel(); + Lbl->setText(QApplication::translate("Downloader","Parsing XML")); + + if (dlg) + dlg->show(); + + theDownloader.setAnimator(dlg,Lbl,Bar,true); + Lbl->setText(QApplication::translate("Downloader","Downloading points")); + +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + QUrlQuery theQuery(url); +#define theQuery theQuery +#else +#define theQuery url +#endif + theQuery.addQueryItem("t", COORD2STRING(aBox.topRight().y())); + theQuery.addQueryItem("l", COORD2STRING(aBox.bottomLeft().x())); + theQuery.addQueryItem("b", COORD2STRING(aBox.bottomLeft().y())); + theQuery.addQueryItem("r", COORD2STRING(aBox.topRight().x())); +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + url.setQuery(theQuery); +#endif +#undef theQuery + + if (!theDownloader.go(url)) + return false; + if (theDownloader.resultCode() != 200) + return false; + QByteArray Ar(theDownloader.content()); + ImportExportGdal gdal(theDocument); + bool OK = gdal.import(trackLayer, Ar, false); + + if (Main) + Main->view()->setUpdatesEnabled(true); + if (OK) { + if (Main) + Main->invalidateView(); + } + return OK; +} + +bool downloadMoreOSM(MainWindow* Main, const CoordBox& aBox , Document* theDocument) +{ + Layer* theLayer; + if (!theDocument->getLastDownloadLayer()) { + theLayer = new DrawingLayer(QApplication::translate("Downloader","%1 download").arg(QDateTime::currentDateTime().toString(Qt::ISODate))); + theDocument->add(theLayer); + } else + theLayer = (Layer*)theDocument->getLastDownloadLayer(); + + QString osmWebsite, osmUser, osmPwd; + + osmWebsite = M_PREFS->getOsmApiUrl(); + osmUser = M_PREFS->getOsmUser(); + osmPwd = M_PREFS->getOsmPassword(); + qDebug() << "Requesting more from " << osmWebsite; + + Main->view()->setUpdatesEnabled(false); + + bool OK = true; + OK = downloadOSM(Main,osmWebsite,osmUser,osmPwd,aBox,theDocument,theLayer); + Main->view()->setUpdatesEnabled(true); + if (OK) + { + theDocument->setLastDownloadLayer(theLayer); + theDocument->addDownloadBox(theLayer, aBox); + // Don't jump around on Download More + // aParent->view()->projection().setViewport(aBox,aParent->view()->rect()); + Main->invalidateView(); + } else + { + if (theLayer != theDocument->getLastDownloadLayer()) { + theDocument->remove(theLayer); + delete theLayer; + } + } + return OK; +} + +bool downloadOSM(MainWindow* Main, const CoordBox& aBox , Document* theDocument) +{ + QString osmWebsite, osmUser, osmPwd; + static bool DownloadRaw = false; + + QDialog * dlg = new QDialog(Main); + + osmWebsite = M_PREFS->getOsmApiUrl(); + osmUser = M_PREFS->getOsmUser(); + osmPwd = M_PREFS->getOsmPassword(); + + Ui::DownloadMapDialog ui; + ui.setupUi(dlg); + SlippyMapWidget* SlippyMap = new SlippyMapWidget(ui.groupBox); +#ifndef _MOBILE + SlippyMap->setMinimumHeight(256); +#endif + CoordBox Clip(aBox); + SlippyMap->setViewportArea(Clip); + ui.verticalLayout->addWidget(SlippyMap); + QObject::connect(SlippyMap, SIGNAL(redraw()), ui.FromMap, SLOT(toggle())); + BookmarkListIterator i(*(M_PREFS->getBookmarks())); + while (i.hasNext()) { + i.next(); + if (i.value().deleted == false) + ui.Bookmarks->addItem(i.key()); + } + ui.edXapiUrl->setText(QString("*[bbox=%1,%2,%3,%4]").arg(aBox.bottomLeft().x(), 0, 'f').arg(aBox.bottomLeft().y(), 0, 'f').arg(aBox.topRight().x(), 0, 'f').arg(aBox.topRight().y(), 0, 'f')); + ui.IncludeTracks->setChecked(DownloadRaw); + ui.ResolveRelations->setChecked(M_PREFS->getResolveRelations()); + bool OK = true, retry = true, directAPI = false; + QString directUrl; + while (retry) { + retry = false; +#ifdef _MOBILE + dlg->setWindowState(Qt::WindowMaximized); +#endif + if (dlg->exec() == QDialog::Accepted) + { + DownloadRaw = false; + if (ui.FromBookmark->isChecked()) + { + Clip = M_PREFS->getBookmarks()->value(ui.Bookmarks->currentText()).Coordinates; + } + else if (ui.FromView->isChecked()) + { + Clip = aBox; + } + else if (ui.FromLink->isChecked()) { + QString link = ui.Link->text(); + + if (link.contains("/api/")) { + directAPI=true; + directUrl = link; + } else if (link.contains("/browse/")) { + QString tag("/browse/"); + int ix = link.lastIndexOf(tag) + tag.length(); + directUrl = M_PREFS->getOsmApiUrl(); + if (!directUrl.endsWith("/")) directUrl += "/"; + directUrl += link.right(link.length() - ix); + if (!directUrl.endsWith("/")) directUrl += "/"; + directUrl += "full"; + directAPI=true; + } else if (link.startsWith("way") || link.startsWith("node") || link.startsWith("relation")) { + directUrl = M_PREFS->getOsmApiUrl(); + if (!directUrl.endsWith("/")) directUrl += "/"; + directUrl += link; + directAPI=true; + } else { + OsmLink ol(link); + Clip = ol.getCoordBox(); + if (Clip.isNull() || Clip.isEmpty()) + retry = true; + } + } + else if (ui.FromXapi->isChecked()) + { + directAPI = true; + directUrl = M_PREFS->getXapiUrl(); + //if (!directUrl.endsWith("/")) directUrl += "/"; + directUrl += ui.edXapiUrl->text(); + } + else if (ui.FromMap->isChecked()) + { + QRectF R(SlippyMap->selectedArea()); + Clip = CoordBox(Coord(R.x(), R.y()), Coord(R.x()+R.width(), R.y()+R.height())); + } + if (retry) continue; + Main->view()->setUpdatesEnabled(false); + Layer* theLayer = new DrawingLayer(QApplication::translate("Downloader","%1 download").arg(QDateTime::currentDateTime().toString(Qt::ISODate))); + theDocument->add(theLayer); + M_PREFS->setResolveRelations(ui.ResolveRelations->isChecked()); + if (directAPI) { + if (ui.FromXapi->isChecked()) + theLayer->setUploadable(false); + OK = downloadOSM(Main,QUrl(QUrl::fromEncoded(directUrl.toLatin1())),osmUser,osmPwd,theDocument,theLayer); + } + else + OK = downloadOSM(Main,osmWebsite,osmUser,osmPwd,Clip,theDocument,theLayer); + if (OK && ui.IncludeTracks->isChecked()) + OK = downloadTracksFromOSM(Main,osmWebsite,osmUser,osmPwd, Clip,theDocument); + Main->view()->setUpdatesEnabled(true); + if (OK) + { + theDocument->setLastDownloadLayer(theLayer); + theDocument->addDownloadBox(theLayer, Clip); +#ifndef _MOBILE + if (directAPI) + Main->on_viewZoomAllAction_triggered(); + else +#endif + Main->view()->setViewport(Clip,Main->view()->rect()); + Main->invalidateView(); + } else { + retry = true; + theDocument->remove(theLayer); + SAFE_DELETE(theLayer); + } + } + } + delete dlg; + return OK; +} + diff --git a/src/Sync/DownloadOSM.h b/src/Sync/DownloadOSM.h new file mode 100644 index 0000000..70a8081 --- /dev/null +++ b/src/Sync/DownloadOSM.h @@ -0,0 +1,89 @@ +#ifndef MERKATOR_DOWNLOADOSM_H_ +#define MERKATOR_DOWNLOADOSM_H_ + +class Document; + +class QString; +class QMainWindow; +class QProgressBar; +class QLabel; +class QProgressDialog; +class QTimer; +class MainWindow; +class CoordBox; +class Feature; +class Layer; +class SpecialLayer; + +#include <QtCore/QByteArray> +#include <QtCore/QEventLoop> +#include <QtCore/QObject> +#include <QNetworkAccessManager> +#include <QUrl> + +#include "IFeature.h" + +class Downloader : public QObject +{ + Q_OBJECT + + public: + Downloader(const QString& aUser, const QString& aPwd); + + bool request(const QString& theMethod, const QUrl& URL, const QString& Out); + bool go(const QUrl& url); + QByteArray& content(); + int resultCode(); + const QString & resultText(); + const QString & errorText(); + const QString & locationText(); + QString getURLToMap(); + QString getURLToTrackPoints(); + QString getURLToFetchFull(IFeature::FId id); + QString getURLToFetchFull(Feature* aFeature); + QString getURLToFetch(const QString& What); + QString getURLToFetch(const QString& What, const QString& Id); + QString getURLToCreate(const QString& What); + QString getURLToUpdate(const QString& What, const QString& Id); + QString getURLToDelete(const QString& What, const QString& Id); + QString getURLToOpenChangeSet(); + QString getURLToCloseChangeSet(const QString& Id); + QString getURLToUploadDiff(QString changesetId); + void setAnimator(QProgressDialog *anAnimator, QLabel* AnimatorLabel, QProgressBar* AnimatorBar, bool anAnimate); + + public slots: + void progress( qint64 done, qint64 total ); + void on_requestFinished( QNetworkReply *reply); + void on_authenticationRequired( QNetworkReply *reply, QAuthenticator *auth); + void animate(); + void on_Cancel_clicked(); + + private: + QNetworkAccessManager netManager; + QString User, Password; + QByteArray Content; + int Result; + QString LocationText; + QString ResultText; + QString ErrorText; + QNetworkReply *currentReply; + int IdAuth; + bool Error; + QEventLoop Loop; + QLabel* AnimatorLabel; + QProgressBar* AnimatorBar; + QTimer *AnimationTimer; +}; + +bool downloadOSM(MainWindow* Main, const CoordBox& aBox , Document* theDocument); +bool downloadMoreOSM(MainWindow* Main, const CoordBox& aBox , Document* theDocument); +bool downloadFeatures(MainWindow* Main, const QList<Feature*>& aDownloadList , Document* theDocument); +bool downloadFeature(MainWindow* Main, const IFeature::FId& id, Document* theDocument, Layer* theLayer=NULL); +bool downloadFeatures(MainWindow* Main, const QList<IFeature::FId>& aDownloadList, Document* theDocument, Layer* theLayer=NULL); +bool downloadMapdust(MainWindow* Main, const CoordBox& aBox, Document* theDocument, SpecialLayer* theLayer=NULL); + +bool checkForConflicts(Document* theDocument); + +#endif + + diff --git a/src/Sync/Sync.pri b/src/Sync/Sync.pri new file mode 100644 index 0000000..38060a8 --- /dev/null +++ b/src/Sync/Sync.pri @@ -0,0 +1,21 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/Sync +DEPENDPATH += $$MERKAARTOR_SRC_DIR/Sync + +HEADERS += \ + DownloadOSM.h + +SOURCES += \ + DownloadOSM.cpp + +!contains(FRISIUS,1) { + HEADERS += \ + DirtyListExecutorOSC.h \ + DirtyList.h + + SOURCES += \ + DirtyListExecutorOSC.cpp \ + DirtyList.cpp + + FORMS += \ + SyncListDialog.ui +} diff --git a/src/Sync/SyncListDialog.ui b/src/Sync/SyncListDialog.ui new file mode 100644 index 0000000..dd37ea5 --- /dev/null +++ b/src/Sync/SyncListDialog.ui @@ -0,0 +1,319 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>SyncListDialog</class> + <widget class="QDialog" name="SyncListDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>597</width> + <height>412</height> + </rect> + </property> + <property name="windowTitle"> + <string>Upload to Openstreetmap</string> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="lblChangesetComment"> + <property name="text"> + <string>Comment</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edChangesetComment"/> + </item> + </layout> + </item> + <item> + <widget class="QLabel" name="label_2"> + <property name="font"> + <font> + <pointsize>8</pointsize> + </font> + </property> + <property name="text"> + <string>A good comment should concisely and adequately describe the edit.</string> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>The following changes will be committed:</string> + </property> + </widget> + </item> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="2" column="1"> + <widget class="QLabel" name="lblNodesAdded"> + <property name="text"> + <string notr="true">-</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_4"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Added</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_5"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Updated</string> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="label_6"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Deleted</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLabel" name="label_8"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Ways</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="label_7"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Nodes</string> + </property> + </widget> + </item> + <item row="1" column="3"> + <widget class="QLabel" name="label_9"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Relations</string> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLabel" name="lblWaysAdded"> + <property name="text"> + <string notr="true">-</string> + </property> + </widget> + </item> + <item row="2" column="3"> + <widget class="QLabel" name="lblRelationsAdded"> + <property name="text"> + <string notr="true">-</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="lblNodesUpdated"> + <property name="text"> + <string notr="true">-</string> + </property> + </widget> + </item> + <item row="3" column="2"> + <widget class="QLabel" name="lblWaysUpdated"> + <property name="text"> + <string notr="true">-</string> + </property> + </widget> + </item> + <item row="3" column="3"> + <widget class="QLabel" name="lblRelationsUpdated"> + <property name="text"> + <string notr="true">-</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QLabel" name="lblNodesDeleted"> + <property name="text"> + <string notr="true">-</string> + </property> + </widget> + </item> + <item row="4" column="2"> + <widget class="QLabel" name="lblWaysDeleted"> + <property name="text"> + <string notr="true">-</string> + </property> + </widget> + </item> + <item row="4" column="3"> + <widget class="QLabel" name="lblRelationsDeleted"> + <property name="text"> + <string notr="true">-</string> + </property> + </widget> + </item> + <item row="1" column="4"> + <widget class="QLabel" name="label_10"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Sum</string> + </property> + </widget> + </item> + <item row="2" column="4"> + <widget class="QLabel" name="lblAdded"> + <property name="text"> + <string notr="true">-</string> + </property> + </widget> + </item> + <item row="3" column="4"> + <widget class="QLabel" name="lblUpdated"> + <property name="text"> + <string notr="true">-</string> + </property> + </widget> + </item> + <item row="4" column="4"> + <widget class="QLabel" name="lblDeleted"> + <property name="text"> + <string notr="true">-</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QListWidget" name="ChangesList"/> + </item> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>131</width> + <height>31</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="okButton"> + <property name="text"> + <string>OK</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="cancelButton"> + <property name="text"> + <string>Cancel</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>okButton</sender> + <signal>clicked()</signal> + <receiver>SyncListDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>278</x> + <y>253</y> + </hint> + <hint type="destinationlabel"> + <x>96</x> + <y>254</y> + </hint> + </hints> + </connection> + <connection> + <sender>cancelButton</sender> + <signal>clicked()</signal> + <receiver>SyncListDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>369</x> + <y>253</y> + </hint> + <hint type="destinationlabel"> + <x>179</x> + <y>282</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/TagTemplate/TagTemplate.cpp b/src/TagTemplate/TagTemplate.cpp new file mode 100644 index 0000000..20a427f --- /dev/null +++ b/src/TagTemplate/TagTemplate.cpp @@ -0,0 +1,1114 @@ +// +// C++ Implementation: TagTemplate +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "TagTemplate.h" + +#include "Features.h" +#include "FeatureCommands.h" +#include "MapView.h" + +#include <QComboBox> +#include <QLabel> +#include <QCheckBox> +#include <QGroupBox> +#include <QLineEdit> +#include <QRegExp> + +/** TagTemplateWidget **/ + +TagTemplateWidget::TagTemplateWidget() + : theMainWidget(0), theWidget(0), theLabelWidget(0), theSelector(0) +{ +} + +TagTemplateWidget::~TagTemplateWidget() +{ + // No need to delete; will be destroyed automatically by parent + crash if no active widget. + // delete theMainWidget; + qDeleteAll(theValues); + delete theSelector; +} + +TagTemplateWidget* TagTemplateWidget::fromXml(const QDomElement& e) +{ + if (e.tagName() != "widget") { + return NULL; + } + + TagTemplateWidget* aTW = NULL; + const QString tp = e.attribute("type"); + if (tp == "combo") { + aTW = TagTemplateWidgetCombo::fromXml(e); + } else + if (tp == "yesno") { + aTW = TagTemplateWidgetYesno::fromXml(e); + } else + if (tp == "constant") { + aTW = TagTemplateWidgetConstant::fromXml(e); + } else + if (tp == "edit") { + aTW = TagTemplateWidgetEdit::fromXml(e); + } else + Q_ASSERT(false); + + if (aTW) { + aTW->theId = e.attribute("id"); + aTW->theType = tp; + aTW->theTag = e.attribute("tag"); + } + + return aTW; +} + +void TagTemplateWidget::parseCommonElements(const QDomElement& e) +{ + if (e.tagName() == "description") { + theDescriptions.insert(e.attribute("locale"), e.firstChild().toText().nodeValue()); + } else + if (e.tagName() == "link") { + theUrl = QUrl(e.attribute("src")); + } else + if (e.tagName() == "selector") { + theSelector = TagSelector::parse(e.attribute("expr")); + } else + if (e.tagName() == "value") { + TagTemplateWidgetValue* aTCV = TagTemplateWidgetValue::fromXml(e); + if (aTCV) + theValues.append(aTCV); + } +} + +void TagTemplateWidget::generateCommonElements(QDomElement& e) +{ + if (!theUrl.isEmpty()) { + QDomElement c = e.ownerDocument().createElement("link"); + e.appendChild(c); + + c.setAttribute("src", theUrl.toString()); + } + + QHashIterator<QString, QString > itD(theDescriptions); + while(itD.hasNext()) { + itD.next(); + + QDomElement d = e.ownerDocument().createElement("description"); + e.appendChild(d); + + d.setAttribute("locale", itD.key()); + + QDomText v = e.ownerDocument().createTextNode(itD.value()); + d.appendChild(v); + } + + if (theSelector) { + QDomElement s = e.ownerDocument().createElement("selector"); + e.appendChild(s); + s.setAttribute("expr", theSelector->asExpression(false)); + } + + for (int i=0; i<theValues.size(); ++i) { + theValues[i]->toXML(e, false); + } +} + +/** TagTemplateWidgetValue **/ + +TagTemplateWidgetValue* TagTemplateWidgetValue::fromXml(const QDomElement& e) +{ + TagTemplateWidgetValue* aTCV = new TagTemplateWidgetValue(e.attribute("tag")); + + for(QDomNode d = e.firstChild(); !d.isNull(); d = d.nextSibling()) { + QDomElement c = d.toElement(); + if (c.isNull()) + continue; + + aTCV->parseCommonElements(c); + } + return aTCV; +} + +bool TagTemplateWidgetValue::toXML(QDomElement& xParent, bool /* header */) +{ + QDomElement v = xParent.ownerDocument().createElement("value"); + xParent.appendChild(v); + + v.setAttribute("tag", theTagValue); + generateCommonElements(v); + + return true; +} + + +/** TagTemplateWidgetCombo **/ + +TagTemplateWidgetCombo::~TagTemplateWidgetCombo() +{ +} + +QWidget* TagTemplateWidgetCombo::getWidget(const Feature* F, const MapView* V) +{ + if (theSelector && (theSelector->matches(F,V->pixelPerM()) != TagSelect_Match && theSelector->matches(F,V->pixelPerM()) != TagSelect_DefaultMatch)) + return NULL; + + QString lang = getDefaultLanguage(); + QString defLang = "en"; + if (lang == "-" || !M_PREFS->getTranslateTags()) + lang = "en"; + + theWidget = new QWidget(); + QHBoxLayout* aLayout = new QHBoxLayout(theWidget); + aLayout->setContentsMargins(0, 0, 0, 0); + + QLabel* aLabel = new QLabel(); + aLabel->setOpenExternalLinks(true); + aLabel->setWordWrap(true); + aLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + aLabel->setMaximumWidth(55); + aLayout->addWidget(aLabel); + + QString url; + if (theDescriptions.count(lang)) + theDescription = theDescriptions[lang]; + else + if (theDescriptions.count(defLang)) + theDescription = theDescriptions[defLang]; + else + theDescription = theTag; + if (!theUrl.isEmpty()) + url = theUrl.toString(); + + QComboBox* aCombo = new QComboBox(); + aCombo->setEditable(true); +// aCombo->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon); + aCombo->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); + aCombo->setMinimumWidth(100); + aLayout->addWidget(aCombo); + + aCombo->addItem(tr("Undefined"), qVariantFromValue(new TagTemplateWidgetValue("__NULL__"))); + QString val = F->tagValue(theTag, "__NULL__"); + int idx = -1; + for (int i=0; i<theValues.size(); ++i) { + if (theValues[i]->theDescriptions.count(lang)) + aCombo->addItem(theValues[i]->theDescriptions[lang], qVariantFromValue(theValues[i])); + else + if (theValues[i]->theDescriptions.count(defLang)) + aCombo->addItem(theValues[i]->theDescriptions[defLang], qVariantFromValue(theValues[i])); + else + aCombo->addItem(theValues[i]->theTagValue, qVariantFromValue(theValues[i])); + + if (theValues[i]->theTagValue == val) + idx = aCombo->count() - 1; + } + + if (val != "__NULL__") { + if (idx == -1) { + aCombo->insertItem(1, val); + aCombo->setCurrentIndex(1); + } else { + aCombo->setCurrentIndex(idx); + if (!theValues[idx-1]->theUrl.isEmpty()) + url = theValues[idx-1]->theUrl.toString(); + } + } else + aCombo->setCurrentIndex(0); + + if (!url.isEmpty()) + aLabel->setText(QString("<a href=\"%1\">%2</a>").arg(url).arg(theDescription)); + else + aLabel->setText(theDescription); + + connect(aCombo,SIGNAL(activated(int)), this, SLOT(on_combo_activated(int))); + theMainWidget = aCombo; + theLabelWidget = aLabel; + + return theWidget; +} + +TagTemplateWidgetCombo* TagTemplateWidgetCombo::fromXml(const QDomElement& e) +{ + TagTemplateWidgetCombo* aCW = new TagTemplateWidgetCombo(); + + for(QDomNode n = e.firstChild(); !n.isNull(); n = n.nextSibling()) { + QDomElement t = n.toElement(); + if (t.isNull()) + continue; + + aCW->parseCommonElements(t); + } + + return aCW; +} + +bool TagTemplateWidgetCombo::toXML(QDomElement& xParent, bool header) +{ + bool OK = true; + + if (!header) { + QDomElement e = xParent.ownerDocument().createElement("widgetref"); + xParent.appendChild(e); + if (!theId.isEmpty()) + e.setAttribute("id", theId); + else + e.setAttribute("id", theTag); + } else { + QDomElement e = xParent.ownerDocument().createElement("widget"); + xParent.appendChild(e); + + if (!theId.isEmpty()) + e.setAttribute("id", theId); + e.setAttribute("type", theType); + e.setAttribute("tag", theTag); + generateCommonElements(e); + } + + return OK; +} + +void TagTemplateWidgetCombo::on_combo_activated(int idx) +{ + QComboBox* W = dynamic_cast<QComboBox*>(theMainWidget); + TagTemplateWidgetValue* aTCV = W->itemData(idx).value<TagTemplateWidgetValue*>(); + + QString val; + if (aTCV) { + if (!aTCV->theUrl.isEmpty()) { + ((QLabel *)theLabelWidget)->setText(QString("<a href=\"%1\">%2</a>").arg(aTCV->theUrl.toString()).arg(theDescription)); + } else { + if (!theUrl.isEmpty()) { + ((QLabel *)theLabelWidget)->setText(QString("<a href=\"%1\">%2</a>").arg(theUrl.toString()).arg(theDescription)); + } else { + ((QLabel *)theLabelWidget)->setText(theDescription); + } + } + + val = aTCV->theTagValue; + } else + val = W->currentText(); + + if (val == "__NULL__") + emit tagCleared(theTag); + else + emit tagChanged(theTag, val); +} + +void TagTemplateWidgetCombo::apply(const Feature*) +{ +} + +/** TagTemplateWidgetYesno **/ + +QWidget* TagTemplateWidgetYesno::getWidget(const Feature* F, const MapView* V) +{ + if (theSelector && (theSelector->matches(F,V->pixelPerM()) != TagSelect_Match && theSelector->matches(F,V->pixelPerM()) != TagSelect_DefaultMatch)) + return NULL; + + QString lang = getDefaultLanguage(); + QString defLang = "en"; + if (lang == "-" || !M_PREFS->getTranslateTags()) + lang = "en"; + + theWidget = new QWidget(); + QHBoxLayout* aLayout = new QHBoxLayout(theWidget); + aLayout->setContentsMargins(0, 0, 0, 0); + + QLabel* aLabel = new QLabel(); + aLabel->setOpenExternalLinks(true); + aLayout->addWidget(aLabel); + + QCheckBox* aCB = new QCheckBox(); + aCB->setTristate(); + aLayout->addWidget(aCB); + + if (theDescriptions.count(lang)) + theDescription = theDescriptions[lang]; + else + if (theDescriptions.count(defLang)) + theDescription = theDescriptions[defLang]; + else + theDescription = theTag; + + QString val = F->tagValue(theTag, "__NULL__"); + if (val == "yes" || val == "1" || val == "true") + aCB->setCheckState(Qt::Checked); + else + if (val == "no" || val == "0" || val == "false") + aCB->setCheckState(Qt::Unchecked); + else + aCB->setCheckState(Qt::PartiallyChecked); + + if (!theUrl.isEmpty()) + aLabel->setText(QString("<a href=\"%1\">%2</a>").arg(theUrl.toString()).arg(theDescription)); + else + aLabel->setText(theDescription); + + connect(aCB,SIGNAL(stateChanged(int)), this, SLOT(on_checkbox_stateChanged (int))); + theMainWidget = aCB; + theLabelWidget = aLabel; + + return theWidget; +} + +void TagTemplateWidgetYesno::on_checkbox_stateChanged(int state) +{ + //QCheckBox* W = dynamic_cast<QCheckBox*>(theMainWidget); + if (state == Qt::PartiallyChecked) { + emit tagCleared(theTag); + } else { + QString value = (state == Qt::Checked) ? "yes" : "no"; + emit tagChanged(theTag, value); + } +} + +void TagTemplateWidgetYesno::apply(const Feature*) +{ +} + +TagTemplateWidgetYesno* TagTemplateWidgetYesno::fromXml(const QDomElement& e) +{ + TagTemplateWidgetYesno* aCB = new TagTemplateWidgetYesno(); + + for(QDomNode n = e.firstChild(); !n.isNull(); n = n.nextSibling()) { + QDomElement t = n.toElement(); + if (t.isNull()) + continue; + + aCB->parseCommonElements(t); + } + + return aCB; +} + +bool TagTemplateWidgetYesno::toXML(QDomElement& xParent, bool header) +{ + bool OK = true; + + if (!header) { + QDomElement e = xParent.ownerDocument().createElement("widgetref"); + xParent.appendChild(e); + if (!theId.isEmpty()) + e.setAttribute("id", theId); + else + e.setAttribute("id", theTag); + } else { + QDomElement e = xParent.ownerDocument().createElement("widget"); + xParent.appendChild(e); + + if (!theId.isEmpty()) + e.setAttribute("id", theId); + e.setAttribute("type", theType); + e.setAttribute("tag", theTag); + generateCommonElements(e); + } + + return OK; +} + +/** TagTemplateWidgetConstant **/ + +TagTemplateWidgetConstant::~TagTemplateWidgetConstant() +{ +} + +QWidget* TagTemplateWidgetConstant::getWidget(const Feature* F, const MapView* V) +{ + if (theSelector && (theSelector->matches(F,V->pixelPerM()) != TagSelect_Match && theSelector->matches(F,V->pixelPerM()) != TagSelect_DefaultMatch)) + return NULL; + + QString lang = getDefaultLanguage(); + QString defLang = "en"; + if (lang == "-" || !M_PREFS->getTranslateTags()) + lang = "en"; + + theWidget = new QWidget(); + QHBoxLayout* aLayout = new QHBoxLayout(theWidget); + aLayout->setContentsMargins(0, 0, 0, 0); + + QLabel* aLabel = new QLabel(); + aLabel->setOpenExternalLinks(true); + aLabel->setWordWrap(true); + aLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + aLabel->setMaximumWidth(55); + aLayout->addWidget(aLabel); + + QString url; + if (theDescriptions.count(lang)) + theDescription = theDescriptions[lang]; + else + if (theDescriptions.count(defLang)) + theDescription = theDescriptions[defLang]; + else + theDescription = theTag; + if (!theUrl.isEmpty()) + url = theUrl.toString(); + + QLabel* aValue = new QLabel(); + aValue->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard); + aValue->setWordWrap(true); + aLayout->addWidget(aValue); + + if (theValues.count()) { + QString aValueStr; + if (theValues[0]->theDescriptions.count(lang)) + aValueStr = theValues[0]->theDescriptions[lang]; + else + if (theValues[0]->theDescriptions.count(defLang)) + aValueStr = theValues[0]->theDescriptions[defLang]; + else + aValueStr = theValues[0]->theTagValue; + + aValue->setText(QString("<b>%1</b>").arg(aValueStr)); + + if (!theValues[0]->theUrl.isEmpty()) + url = theValues[0]->theUrl.toString(); + + if (!url.isEmpty()) + aLabel->setText(QString("<a href=\"%1\">%2</a>").arg(url).arg(theDescription)); + else + aLabel->setText(theDescription); + } else + aValue->setText(QString("<b>%1</b>").arg(F->tagValue(theTag, QString()))); + + theMainWidget = aValue; + theLabelWidget = aLabel; + + return theWidget; +} + +void TagTemplateWidgetConstant::apply(const Feature* F) +{ + if (!theValues.count()) { + ((QLabel*)theMainWidget)->setText(QString("<b>%1</b>").arg(F->tagValue(theTag, QString()))); + return; + } + bool Regexp = false; + bool OK = true; + QString oldVal = F->tagValue(theTag, "__NULL__"); + QString newVal = theValues[0]->theTagValue; + QRegExp subst("\\$\\[(.+)\\]"); + subst.setMinimal(true); + int pos = 0; + while ((pos = subst.indexIn(newVal, pos)) != -1) { + Regexp = true; + QString rep = F->tagValue(subst.cap(1), "__NULL__"); + if (rep == "__NULL__") { + OK = false; + break; + } + newVal.replace(subst.cap(0), rep); + pos += rep.length(); + } + if (!Regexp || (Regexp && OK)) { + ((QLabel*)theMainWidget)->setText(QString("<b>%1</b>").arg(newVal)); + if (newVal != oldVal) { + emit tagChanged(theTag, newVal); + } + } else + ((QLabel*)theMainWidget)->setText(QString("<b>%1</b>").arg(F->tagValue(theTag, QString()))); +} + +TagTemplateWidgetConstant* TagTemplateWidgetConstant::fromXml(const QDomElement& e) +{ + TagTemplateWidgetConstant* aCW = new TagTemplateWidgetConstant(); + + for(QDomNode n = e.firstChild(); !n.isNull(); n = n.nextSibling()) { + QDomElement t = n.toElement(); + if (t.isNull()) + continue; + + aCW->parseCommonElements(t); + } + + return aCW; +} + +bool TagTemplateWidgetConstant::toXML(QDomElement& xParent, bool header) +{ + bool OK = true; + + if (header) return OK; + + QDomElement e = xParent.ownerDocument().createElement("widget"); + xParent.appendChild(e); + + if (!theId.isEmpty()) + e.setAttribute("id", theId); + e.setAttribute("type", theType); + e.setAttribute("tag", theTag); + generateCommonElements(e); + + return OK; +} + +/** TagTemplateWidgetEdit **/ + +QWidget* TagTemplateWidgetEdit::getWidget(const Feature* F, const MapView* V) +{ + if (theSelector && (theSelector->matches(F,V->pixelPerM()) != TagSelect_Match && theSelector->matches(F,V->pixelPerM()) != TagSelect_DefaultMatch)) + return NULL; + + QString lang = getDefaultLanguage(); + QString defLang = "en"; + if (lang == "-" || !M_PREFS->getTranslateTags()) + lang = "en"; + + theWidget = new QWidget(); + QHBoxLayout* aLayout = new QHBoxLayout(theWidget); + aLayout->setContentsMargins(0, 0, 0, 0); + + QLabel* aLabel = new QLabel(); + aLabel->setOpenExternalLinks(true); + aLabel->setWordWrap(true); + aLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + aLabel->setMaximumWidth(55); + aLayout->addWidget(aLabel); + + QString url; + if (theDescriptions.count(lang)) + theDescription = theDescriptions[lang]; + else + if (theDescriptions.count(defLang)) + theDescription = theDescriptions[defLang]; + else + theDescription = theTag; + if (!theUrl.isEmpty()) + url = theUrl.toString(); + + if (!url.isEmpty()) + aLabel->setText(QString("<a href=\"%1\">%2</a>").arg(url).arg(theDescription)); + else + aLabel->setText(theDescription); + + QLineEdit* aValue = new QLineEdit(); + aLayout->addWidget(aValue); + + QString val = F->tagValue(theTag, "__NULL__"); + if (val != "__NULL__") + aValue->setText(val); + + connect(aValue,SIGNAL(editingFinished()),this, SLOT(on_editingFinished())); + theMainWidget = aValue; + theLabelWidget = aLabel; + + return theWidget; +} + +void TagTemplateWidgetEdit::apply(const Feature*) +{ +} + +TagTemplateWidgetEdit* TagTemplateWidgetEdit::fromXml(const QDomElement& e) +{ + TagTemplateWidgetEdit* aCW = new TagTemplateWidgetEdit(); + + for(QDomNode n = e.firstChild(); !n.isNull(); n = n.nextSibling()) { + QDomElement t = n.toElement(); + if (t.isNull()) + continue; + + aCW->parseCommonElements(t); + } + + return aCW; +} + +bool TagTemplateWidgetEdit::toXML(QDomElement& xParent, bool header) +{ + bool OK = true; + + if (!header) { + QDomElement e = xParent.ownerDocument().createElement("widgetref"); + xParent.appendChild(e); + if (!theId.isEmpty()) + e.setAttribute("id", theId); + else + e.setAttribute("id", theTag); + } else { + QDomElement e = xParent.ownerDocument().createElement("widget"); + xParent.appendChild(e); + + if (!theId.isEmpty()) + e.setAttribute("id", theId); + e.setAttribute("type", theType); + e.setAttribute("tag", theTag); + generateCommonElements(e); + } + + return OK; +} + +void TagTemplateWidgetEdit::on_editingFinished() +{ + QLineEdit* W = dynamic_cast<QLineEdit*>(theMainWidget); + + if (W->text().isEmpty()) { + emit tagCleared(theTag); + } else { + emit tagChanged(theTag, W->text()); + } +} + + +/** TagTemplate **/ + +TagTemplate::TagTemplate() + : theWidget(0), theSelector(0) +{ +} + +TagTemplate::TagTemplate(QString aName) + : theWidget(0), theSelector(0) +{ + theDescriptions[getDefaultLanguage()] = aName; +} + +TagTemplate::TagTemplate(QString aName, QString aSelector) + : theWidget(0) +{ + theDescriptions[getDefaultLanguage()] = aName; + theSelector = TagSelector::parse(aSelector); +} + +TagTemplate::TagTemplate(const TagTemplate& aTemplate) + : QObject(), theSelector(aTemplate.theSelector) +{ +} + +TagTemplate::~TagTemplate() +{ + delete theSelector; +} + +TagSelectorMatchResult TagTemplate::matchesTag(const Feature* F, const MapView* V) +{ + TagSelectorMatchResult res; + + if (!theSelector) return TagSelect_NoMatch; + // Special casing for multipolygon roads + if (const Way* R = dynamic_cast<const Way*>(F)) + { + // TODO create a isPartOfMultiPolygon(R) function for this + for (int i=0; i<R->sizeParents(); ++i) + { + if (const Relation* Parent = dynamic_cast<const Relation*>(R->getParent(i))) + if (!Parent->isDeleted()) + if (Parent->tagValue("type",QString()) == "multipolygon") + return TagSelect_NoMatch; + } + } + if ((res = theSelector->matches(F,V->pixelPerM()))) + return res; + // Special casing for multipolygon relations + if (const Relation* R = dynamic_cast<const Relation*>(F)) + { + if (R->tagValue("type",QString()) == "multipolygon") { + for (int i=0; i<R->size(); ++i) + if (!R->get(i)->isDeleted()) + if ((res = theSelector->matches(R->get(i),V->pixelPerM()))) + return res; + } + } + return TagSelect_NoMatch; +} + +QWidget* TagTemplate::getWidget(const Feature* F, const MapView* V) +{ + QString lang = getDefaultLanguage(); + QString defLang = "en"; + if (lang == "-" || !M_PREFS->getTranslateTags()) + lang = "en"; + + theWidget = new QWidget(); + //if (theDescriptions.count(lang)) + // theWidget->setTitle(theDescriptions[lang]); + //else + // theWidget->setTitle(theDescriptions[defLang]); + QVBoxLayout* aLayout = new QVBoxLayout(theWidget); + aLayout->setContentsMargins(2, 2, 2, 2); + + for (int i=0; i<theFields.size(); ++i) { + QWidget* W = theFields[i]->getWidget(F,V); + if (W) + aLayout->addWidget(W); + } + + return theWidget; +} + +void TagTemplate::setSelector(const QString& anExpression) +{ + delete theSelector; + theSelector = TagSelector::parse(anExpression); +} + +void TagTemplate::setSelector(TagSelector* aSel) +{ + delete theSelector; + theSelector = aSel; +} + +void TagTemplate::apply(const Feature* F) +{ + for (int i=0; i<theFields.size(); ++i) { + theFields[i]->apply(F); + } +} + +TagTemplate* TagTemplate::fromXml(const QDomElement& e, TagTemplates* templates) +{ + TagTemplate* aTemplate = new TagTemplate(); + + if (e.tagName() != "template") { + return NULL; + } + + for(QDomNode n = e.firstChild(); !n.isNull(); n = n.nextSibling()) { + QDomElement t = n.toElement(); + if (t.isNull()) + continue; + + if (t.tagName() == "description") { + aTemplate->theDescriptions.insert(t.attribute("locale"), t.firstChild().toText().nodeValue()); + } else + if (t.tagName() == "selector") { + TagSelector* aSel = TagSelector::parse(t.attribute("expr")); + if (!aSel) + return NULL; + aTemplate->setSelector(aSel); + } else + if (t.tagName() == "widget") { + TagTemplateWidget* aTW = TagTemplateWidget::fromXml(t); + if (aTW) { + templates->addWidget(aTW); + aTemplate->theFields.append(aTW); + connect(aTW, SIGNAL(tagChanged(QString, QString)), aTemplate, SLOT(on_tag_changed(QString, QString))); + connect(aTW, SIGNAL(tagCleared(QString)), aTemplate, SLOT(on_tag_cleared(QString))); + } + } else + if (t.tagName() == "widgetref") { + TagTemplateWidget* aTW = templates->findWidget(t.attribute("id")); + if (aTW) { + aTemplate->theFields.append(aTW); + connect(aTW, SIGNAL(tagChanged(QString, QString)), aTemplate, SLOT(on_tag_changed(QString, QString))); + connect(aTW, SIGNAL(tagCleared(QString)), aTemplate, SLOT(on_tag_cleared(QString))); + } + } + } + return aTemplate; +} + +bool TagTemplate::toXML(QDomElement& xParent) +{ + bool OK = true; + + QDomElement e = xParent.ownerDocument().createElement("template"); + xParent.appendChild(e); + + if (theSelector) { + QDomElement s = xParent.ownerDocument().createElement("selector"); + e.appendChild(s); + s.setAttribute("expr", theSelector->asExpression(false)); + } + + QHashIterator<QString, QString > itD(theDescriptions); + while(itD.hasNext()) { + itD.next(); + + QDomElement d = xParent.ownerDocument().createElement("description"); + e.appendChild(d); + + d.setAttribute("locale", itD.key()); + + QDomText v = xParent.ownerDocument().createTextNode(itD.value()); + d.appendChild(v); + } + + for (int i=0; i<theFields.size(); ++i) { + theFields[i]->toXML(e, false); + } + + return OK; +} + +void TagTemplate::on_tag_changed(QString k, QString v) +{ + emit tagChanged(k, v); +} + +void TagTemplate::on_tag_cleared(QString k) +{ + emit tagCleared(k); +} + +/** TagTemplates **/ + +TagTemplates::TagTemplates() + : theWidget(0), theFeature(0), curTemplate(0) +{ +} + +TagTemplates::~TagTemplates() +{ + qDeleteAll(widgets); + qDeleteAll(items); +} + +QWidget* TagTemplates::getWidget(const Feature* F, const MapView* V) +{ + QString lang = getDefaultLanguage(); + QString defLang = "en"; + if (lang == "-" || !M_PREFS->getTranslateTags()) + lang = "en"; + + if (curTemplate) { + disconnect(curTemplate, 0, this, 0); + curTemplate = NULL; + } + if (F != theFeature) + forcedTemplate = NULL; + else + curTemplate = forcedTemplate; + theFeature = F; + + theWidget = new QWidget(); + //if (theDescriptions.count(lang)) + // theWidget->setTitle(theDescriptions[lang]); + //else + // theWidget->setTitle(theDescriptions[defLang]); + QVBoxLayout* aLayout = new QVBoxLayout(theWidget); + aLayout->setContentsMargins(2, 2, 2, 2); + + QHBoxLayout* headLayout = new QHBoxLayout(); + headLayout->setContentsMargins(0, 0, 0, 0); + aLayout->addLayout(headLayout); + + theCombo = new QComboBox(); + theCombo->setEditable(true); + theCombo->setInsertPolicy(QComboBox::InsertAtBottom); +// QFont f = theCombo->font(); +// f.setPointSize(6); +// theCombo->setFont(f); +// theCombo->setMaximumHeight(16); + theCombo->setMinimumWidth(100); + theCombo->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + + headLayout->addWidget(theCombo); + + QFrame* line = new QFrame(); + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Sunken); + headLayout->addWidget(line); + + int idx = -1; + theCombo->addItem(tr("Undefined"), "__NULL__"); + for (int i=0; i<items.size(); ++i) { + if (items[i]->theDescriptions.count(lang)) + theCombo->addItem(items[i]->theDescriptions[lang], qVariantFromValue(items[i])); + else + theCombo->addItem(items[i]->theDescriptions[defLang], qVariantFromValue(items[i])); + + if (forcedTemplate) { + if (items[i] == forcedTemplate) { + idx = i+1; + } + } + } + if (!forcedTemplate) { + for (int i=0; i<items.size(); ++i) { + if (idx == -1 && items[i]->matchesTag(F,V) == TagSelect_Match) { + curTemplate = items[i]; + idx = i+1; + } + } + } + if (!forcedTemplate && idx == -1) { + for (int i=0; i<items.size(); ++i) { + if (idx == -1 && items[i]->matchesTag(F,V) == TagSelect_DefaultMatch) { + curTemplate = items[i]; + idx = i+1; + } + } + } + + if (idx == -1) + theCombo->setCurrentIndex(0); + else + theCombo->setCurrentIndex(idx); + + if (curTemplate) { + aLayout->addWidget(curTemplate->getWidget(F,V)); + connect(curTemplate, SIGNAL(tagChanged(QString, QString)), this, SLOT(on_tag_changed(QString, QString))); + connect(curTemplate, SIGNAL(tagCleared(QString)), this, SLOT(on_tag_cleared(QString))); + } + connect(theCombo,SIGNAL(activated(int)), this, SLOT(on_combo_activated(int))); + + line = new QFrame(); + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Sunken); + aLayout->addWidget(line); + + return theWidget; +} + +void TagTemplates::on_combo_activated(int idx) +{ + if (idx > items.count() -1) { + TagTemplate* newTmpl = new TagTemplate(theCombo->currentText()); + items.append(newTmpl); + + if (curTemplate) { + for (int i=0; i<curTemplate->theFields.count(); ++i) { + curTemplate->theFields[i]->getCurrentValue(); + } + } + } else { + forcedTemplate = theCombo->itemData(idx).value<TagTemplate*>(); + + emit templateChanged(forcedTemplate); + } +} + +TagTemplates* TagTemplates::fromXml(const QDomElement& e) +{ + TagTemplates* aTemplates = new TagTemplates(); + + if (e.tagName() != "templates") { + return NULL; + } + + for(QDomNode n = e.firstChild(); !n.isNull(); n = n.nextSibling()) + { + QDomElement t = n.toElement(); + if (t.isNull()) + continue; + + if (t.tagName() == "template") { + TagTemplate* tmpl = TagTemplate::fromXml(t, aTemplates); + if (tmpl) + aTemplates->items.append(tmpl); + else + return NULL; + } else + if (t.tagName() == "widgets") { + for(QDomNode n = t.firstChild(); !n.isNull(); n = n.nextSibling()) + { + QDomElement w = n.toElement(); + if (w.tagName() == "widget") { + TagTemplateWidget* aTW = TagTemplateWidget::fromXml(w); + if (aTW) + aTemplates->addWidget(aTW); + else + return NULL; + } + } + } + } + return aTemplates; +} + +bool TagTemplates::mergeXml(const QDomElement& e) +{ + if (e.tagName() != "templates") { + return false; + } + + for(QDomNode n = e.firstChild(); !n.isNull(); n = n.nextSibling()) + { + QDomElement t = n.toElement(); + if (t.isNull()) + continue; + + if (t.tagName() == "template") { + TagTemplate* tmpl = TagTemplate::fromXml(t, this); + if (tmpl) + items.append(tmpl); + else + return false; + } else + if (t.tagName() == "widgets") { + for(QDomNode n = t.firstChild(); !n.isNull(); n = n.nextSibling()) + { + QDomElement w = n.toElement(); + if (w.tagName() == "widget") { + TagTemplateWidget* aTW = TagTemplateWidget::fromXml(w); + if (aTW) + addWidget(aTW); + else + return false; + } + } + } + } + return true; +} + +TagTemplate* TagTemplates::match(const Feature* F, const MapView* V) +{ + for (int i=0; i<items.size(); ++i) { + if (items[i]->matchesTag(F,V) == TagSelect_Match) + return items[i]; + } + for (int i=0; i<items.size(); ++i) { + if (items[i]->matchesTag(F,V) == TagSelect_DefaultMatch) + return items[i]; + } + return NULL; +} + +bool TagTemplates::toXML(QDomDocument& doc) +{ + bool OK = true; + + QDomElement e = doc.createElement("templates"); + doc.appendChild(e); + + QDomElement w = doc.createElement("widgets"); + e.appendChild(w); + + for (int i=0; i<widgets.size(); ++i) + OK = widgets[i]->toXML(w, true); + + for (int i=0; i<items.size(); ++i) + OK = items[i]->toXML(e); + + return OK; +} + +TagTemplateWidget* TagTemplates::findWidget(const QString& id) +{ + for (int i=0; i<widgets.size(); ++i) { + if (widgets[i]->id() == id) + return widgets[i]; + } + + return NULL; +} + +void TagTemplates::on_tag_changed(QString k, QString v) +{ + emit tagChanged(k, v); +} + +void TagTemplates::on_tag_cleared(QString k) +{ + emit tagCleared(k); +} + +void TagTemplates::addWidget(TagTemplateWidget* aWidget) +{ + widgets.append(aWidget); +} + +void TagTemplates::apply(const Feature* F) +{ + if (curTemplate) + curTemplate->apply(F); +} diff --git a/src/TagTemplate/TagTemplate.h b/src/TagTemplate/TagTemplate.h new file mode 100644 index 0000000..09762bd --- /dev/null +++ b/src/TagTemplate/TagTemplate.h @@ -0,0 +1,246 @@ +// +// C++ Interface: TagTemplate +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef TAGTEMPLATE_H +#define TAGTEMPLATE_H + +#include <QWidget> +#include <QList> +#include <QHash> +#include <QDomElement> +#include <QUrl> +#include <QVariant> + +#include "TagSelector.h" + +class MapView; +class Feature; +class QGroupBox; +class QDomElement; +class QComboBox; +class TagTemplates; +class CommandList; +class SetTagCommand; +class TagTemplateWidgetValue; + +class TagTemplateWidget: public QObject +{ + Q_OBJECT + + public: + TagTemplateWidget(); + virtual ~TagTemplateWidget(); + + public: + QString id() {return (!theId.isEmpty() ? theId : theTag);} + QString tag() {return theTag;} + virtual QWidget* getWidget(const Feature* /* F */, const MapView* /*V*/) {return NULL;} + virtual TagTemplateWidgetValue* getCurrentValue() {return NULL;} + + virtual void apply(const Feature*) {} + + virtual bool toXML(QDomElement& /* xParent */, bool /* header */) {return false;} + static TagTemplateWidget* fromXml(const QDomElement& e); + + void parseCommonElements(const QDomElement& e); + void generateCommonElements(QDomElement& e); + + protected: + QString theId; + QString theTag; + QString theType; + QWidget* theMainWidget; + QWidget* theWidget; + QWidget* theLabelWidget; + QString theDescription; + TagSelector* theSelector; + QList<TagTemplateWidgetValue*> theValues; + + public: + QHash<QString, QString> theDescriptions; + QUrl theUrl; + + signals: + void tagCleared(QString k); + void tagChanged(QString k, QString v); +}; + +class TagTemplateWidgetValue: public TagTemplateWidget +{ + Q_OBJECT + + public: + TagTemplateWidgetValue(const QString& aTagValue) : theTagValue(aTagValue) {} + + public: + QString theTagValue; + + public: + virtual bool toXML(QDomElement& xParent, bool /* header */); + static TagTemplateWidgetValue* fromXml(const QDomElement& e); + +}; + +Q_DECLARE_METATYPE( TagTemplateWidgetValue * ); + +class TagTemplateWidgetCombo: public TagTemplateWidget +{ + Q_OBJECT + + public: + virtual ~TagTemplateWidgetCombo(); + + public: + QWidget* getWidget(const Feature* F, const MapView* V); + + virtual void apply(const Feature* F); + + static TagTemplateWidgetCombo* fromXml(const QDomElement& e); + bool toXML(QDomElement& xParent, bool header); + + public slots: + void on_combo_activated(int idx); +}; + +class TagTemplateWidgetYesno: public TagTemplateWidget +{ + Q_OBJECT + + public: + QWidget* getWidget(const Feature* F, const MapView* V); + + virtual void apply(const Feature* F); + + static TagTemplateWidgetYesno* fromXml(const QDomElement& e); + bool toXML(QDomElement& xParent, bool header); + + public slots: + void on_checkbox_stateChanged(int state); +}; + +class TagTemplateWidgetConstant: public TagTemplateWidget +{ + Q_OBJECT + + public: + ~TagTemplateWidgetConstant(); + + public: + QWidget* getWidget(const Feature* F, const MapView* V); + + virtual void apply(const Feature* F); + + static TagTemplateWidgetConstant* fromXml(const QDomElement& e); + bool toXML(QDomElement& xParent, bool header); +}; + +class TagTemplateWidgetEdit: public TagTemplateWidget +{ + Q_OBJECT + + public: + QWidget* getWidget(const Feature* F, const MapView* V); + + virtual void apply(const Feature* F); + + static TagTemplateWidgetEdit* fromXml(const QDomElement& e); + bool toXML(QDomElement& xParent, bool header); + + public slots: + void on_editingFinished(); +}; + +class TagTemplate: public QObject +{ + Q_OBJECT + + friend class TagTemplates; + + public: + TagTemplate(); + TagTemplate(QString aName); + TagTemplate(QString aName, QString aSelector); + TagTemplate(const TagTemplate& aTemplate); + + ~TagTemplate(); + + public: + TagSelectorMatchResult matchesTag(const Feature* F, const MapView* V); + QWidget* getWidget(const Feature* F, const MapView* V); + + void setSelector(const QString& aName); + void setSelector(TagSelector* aSelector); + + virtual void apply(const Feature* F); + + bool toXML(QDomElement& xParent); + static TagTemplate* fromXml(const QDomElement& e, TagTemplates* templates); + + protected: + QWidget* theWidget; + TagSelector* theSelector; + QList < TagTemplateWidget* > theFields; + QHash<QString, QString> theDescriptions; + + public slots: + void on_tag_cleared(QString k); + void on_tag_changed(QString k, QString vaL); + + signals: + void tagCleared(QString k); + void tagChanged(QString k, QString v); +}; + +Q_DECLARE_METATYPE( TagTemplate * ); + +class TagTemplates : public QObject +{ + Q_OBJECT + + public: + TagTemplates(); + ~TagTemplates(); + + public: + QWidget* getWidget(const Feature* F, const MapView* V); + QList<TagTemplate*> items; + TagTemplate* match(const Feature* F, const MapView* V); + + void addWidget(TagTemplateWidget* aWidget); + TagTemplateWidget* findWidget(const QString& tag); + + virtual void apply(const Feature* F); + + static TagTemplates* fromXml(const QDomElement& e); + bool mergeXml(const QDomElement& e); + bool toXML(QDomDocument& doc); + + protected: + QList<TagTemplateWidget*> widgets; + QWidget* theWidget; + QComboBox* theCombo; + const Feature* theFeature; + TagTemplate* curTemplate; + TagTemplate* forcedTemplate; + + public slots: + void on_combo_activated(int idx); + void on_tag_cleared(QString k); + void on_tag_changed(QString k, QString v); + + signals: + void tagCleared(QString k); + void tagChanged(QString k, QString v); + void templateChanged(TagTemplate* aNewTemplate); +}; + + +#endif // TAGTEMPLATE_H diff --git a/src/TagTemplate/TagTemplate.pri b/src/TagTemplate/TagTemplate.pri new file mode 100644 index 0000000..ab65d5a --- /dev/null +++ b/src/TagTemplate/TagTemplate.pri @@ -0,0 +1,16 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/TagTemplate +DEPENDPATH += $$MERKAARTOR_SRC_DIR/TagTemplate + +#Header files +HEADERS += \ + TagTemplate.h + +#Source files +SOURCES += \ + TagTemplate.cpp + +#Forms +FORMS += + +#Resource file(s) +RESOURCES +=../Templates/Templates.qrc diff --git a/src/Tools/ActionsDialog.cpp b/src/Tools/ActionsDialog.cpp new file mode 100644 index 0000000..83ab9ed --- /dev/null +++ b/src/Tools/ActionsDialog.cpp @@ -0,0 +1,177 @@ +#include <QTableWidget> +#include <QHeaderView> +#include <QAction> +#include <QLayout> +#include <QPushButton> +#include <QFileDialog> +#include <QMessageBox> + +#include "MainWindow.h" +#include "MerkaartorPreferences.h" +#include "ActionsDialog.h" +#include "Global.h" + +ActionsDialog::ActionsDialog(QList<QAction *>& actions, MainWindow *parent) + : QDialog(parent), Main(parent) +{ + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + actionsTable = new QTableWidget(actions.count(), 2, this); + QStringList hdr; + hdr << tr("Description") << tr("Shortcut"); + actionsTable->setHorizontalHeaderLabels(hdr); + actionsTable->verticalHeader()->hide(); + actionsTable->horizontalHeader()->setMinimumSectionSize(100); +#ifdef QT5 +#define setResizeMode setSectionResizeMode +#endif + actionsTable->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch); + actionsTable->horizontalHeader()->setResizeMode(1, QHeaderView::ResizeToContents); +#undef setResizeMode + //actionsTable->setColumnReadOnly(0, true); + + int row = 0; + + for (int i=0; i<actions.size(); ++i) { + QAction *action = static_cast<QAction*>(actions.at(i)); + QTableWidgetItem* it = new QTableWidgetItem(action->toolTip()); + it->setFlags(0); + actionsTable->setItem(row, 0, it); + actionsTable->setItem(row, 1, new QTableWidgetItem(action->shortcut().toString())); + + actionsList.append(action); + ++row; + } + + QPushButton *importButton = new QPushButton(tr("&Import"), this); + QPushButton *exportButton = new QPushButton(tr("&Export"), this); + QPushButton *defaultButton = new QPushButton(tr("&Default"), this); + QPushButton *okButton = new QPushButton(tr("&OK"), this); + QPushButton *cancelButton = new QPushButton(tr("&Cancel"), this); + + connect(actionsTable, SIGNAL(currentCellChanged(int, int, int, int)), + this, SLOT(recordAction(int, int))); + connect(actionsTable, SIGNAL(cellChanged(int, int)), + this, SLOT(validateAction(int, int))); + connect(importButton, SIGNAL(clicked()), this, SLOT(importShortcuts())); + connect(exportButton, SIGNAL(clicked()), this, SLOT(exportShortcuts())); + connect(defaultButton, SIGNAL(clicked()), this, SLOT(resetToDefault())); + connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); + connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); + + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->setSpacing(8); + buttonLayout->addStretch(1); + buttonLayout->addWidget(importButton); + buttonLayout->addWidget(exportButton); + buttonLayout->addWidget(defaultButton); + buttonLayout->addWidget(okButton); + buttonLayout->addWidget(cancelButton); + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setMargin(8); + mainLayout->setSpacing(8); + mainLayout->addWidget(actionsTable); + mainLayout->addLayout(buttonLayout); + + setWindowTitle(tr("Shortcut Editor")); + cancelButton->setFocus(); +} + +void ActionsDialog::resetToDefault() +{ + for (int row = 0; row < (int)actionsList.size(); ++row) { + QAction *action = actionsList[row]; + actionsTable->item(row, 1)->setText(Main->shortcutsDefault[action->objectName()]); + } +} + +void ActionsDialog::accept() +{ + QStringList shortcuts; + for (int row = 0; row < (int)actionsList.size(); ++row) { + QAction *action = actionsList[row]; + action->setShortcut(QKeySequence(actionsTable->item(row, 1)->text())); + shortcuts.append(action->objectName()); + shortcuts.append(action->shortcut().toString()); + } + M_PREFS->setShortcuts(shortcuts); + + QDialog::accept(); +} + +void ActionsDialog::recordAction(int row, int column) +{ + oldAccelText = actionsTable->item(row, column)->text(); +} + +void ActionsDialog::validateAction(int row, int column) +{ + QTableWidgetItem *item = actionsTable->item(row, column); + QString accelText = QString(QKeySequence(item->text()).toString()); + + if (accelText.isEmpty() && !item->text().isEmpty()) + item->setText(oldAccelText); + else + item->setText(accelText); +} + +void ActionsDialog::importShortcuts() +{ + QString fileName = QFileDialog::getOpenFileName(this, tr("Load Shortcut scheme"), QString(), tr("Merkaartor shortcut scheme (*.mss)")); + if (!fileName.isNull()) { + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QMessageBox::critical(this, tr("Unable to open file"), tr("%1 could not be opened.").arg(fileName)); + return; + } + + QTextStream ts(&file); + while (!ts.atEnd()) { + QString s = ts.readLine(); + if (!s.isNull()) { + QStringList t = s.split(":"); + for (int row = 0; row < (int)actionsList.size(); ++row) { + if (actionsTable->item(row, 0)->text() == t[0]) { + actionsTable->item(row, 1)->setText(t[1]); + break; + } + } + } + } + } +} + +void ActionsDialog::exportShortcuts() +{ + QString fileName; + QFileDialog dlg(this, tr("Save Shortcut scheme"), QString("%1/%2.mss").arg(M_PREFS->getworkingdir()).arg(tr("untitled")), tr("Merkaartor shortcut scheme (*.mss)") + "\n" + tr("All Files (*)")); + dlg.setFileMode(QFileDialog::AnyFile); + dlg.setDefaultSuffix("mss"); + dlg.setAcceptMode(QFileDialog::AcceptSave); + + if (dlg.exec()) { + if (dlg.selectedFiles().size()) + fileName = dlg.selectedFiles()[0]; + } + +// QString fileName = QFileDialog::getSaveFileName(this, +// tr("Save Shortcut scheme"), QString("%1/%2.mss").arg(M_PREFS->getworkingdir()).arg(tr("untitled")), tr("Merkaartor shortcut scheme (*.mss)")); + + if (!fileName.isNull()) { + QFile file(fileName); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QMessageBox::critical(this, tr("Unable to open save file"), tr("%1 could not be opened for writing.").arg(fileName)); + return; + } + + QTextStream ts(&file); + QStringList shortcuts; + for (int row = 0; row < (int)actionsList.size(); ++row) { + ts << actionsTable->item(row, 0)->text() << ":" << actionsTable->item(row, 1)->text() << endl; + } + + file.close(); + } +} + diff --git a/src/Tools/ActionsDialog.h b/src/Tools/ActionsDialog.h new file mode 100644 index 0000000..7ecbe84 --- /dev/null +++ b/src/Tools/ActionsDialog.h @@ -0,0 +1,37 @@ +#ifndef ACTIONSDIALOG_H +#define ACTIONSDIALOG_H + +#include <qdialog.h> +#include <qlist.h> + +class QAction; +class QTableWidget; +class QTableItem; +class QWidget; +class MainWindow; + +class ActionsDialog : public QDialog +{ + Q_OBJECT + +public: + ActionsDialog(QList<QAction *>& actions, MainWindow *parent = 0); + +protected slots: + void accept(); + void resetToDefault(); + +private slots: + void recordAction(int row, int column); + void validateAction(int row, int column); + void importShortcuts(); + void exportShortcuts(); + +private: + MainWindow* Main; + QString oldAccelText; + QTableWidget *actionsTable; + QList<QAction*> actionsList; +}; + +#endif diff --git a/src/Tools/QFatFs/QFat.cpp b/src/Tools/QFatFs/QFat.cpp new file mode 100644 index 0000000..3f17280 --- /dev/null +++ b/src/Tools/QFatFs/QFat.cpp @@ -0,0 +1,585 @@ +#include "QFat.h" + +#include <QBuffer> + +QDataStream &operator<<(QDataStream &ds, const FatTocEntry &toc) +{ + ds << toc.flags; + ds << toc.creationTimestamp; + ds << toc.modificationTimestamp; + ds << toc.size; + ds << toc.startCluster; + ds << toc.name; + + return ds; +} + +QDataStream &operator>>(QDataStream &ds, FatTocEntry &toc) +{ + ds >> toc.flags; + ds >> toc.creationTimestamp; + ds >> toc.modificationTimestamp; + ds >> toc.size; + ds >> toc.startCluster; + ds >> toc.name; + + return ds; +} + +QFat::QFat(const QString& filename, quint16 clusterCount, quint16 clusterSize) + : m_filename(filename) + , m_clusterCount(clusterCount) + , m_clusterSize(clusterSize) + , m_fatFile(0) +{ +} + +FatError QFat::open() +{ + FatError ret; + + m_fatFile = new QFile(m_filename); + if (m_fatFile->exists()) { + if (!m_fatFile->open(QIODevice::ReadWrite)) + return FatSysError; + + char magic[4]; // "QFAT" + m_fatFile->read((char*)&magic, 4); + if (magic[0] != 'Q' || magic[1] != 'F' || magic[2] != 'A' || magic[3] != 'T') + return FatNotFatFile; + + m_ds.setDevice(m_fatFile); + m_ds >> m_clusterCount; + m_ds >> m_clusterSize; + + FAT_FAT_TYPE val; + m_fat.reserve(m_clusterCount); + for (int i=0; i<m_clusterCount; ++i) { + m_ds >> val; + m_fat << val; + } + + m_startOfData = sizeof(FatHeader) + (m_clusterCount * sizeof(FAT_FAT_TYPE)); + m_rootToc = readTocData(0); + } else { + m_fat.reserve(m_clusterCount); + for (int i=0; i<m_clusterCount; ++i) + m_fat.append(0); + + m_startOfData = sizeof(FatHeader) + (m_clusterCount * sizeof(FAT_FAT_TYPE)); + } + + return FatNoError; +} + +bool QFat::isOpen() +{ + if (!m_fatFile) + return false; + + return true; +} + +void QFat::writeFat() +{ + m_fatFile->seek(0); + + char magic[5] = "QFAT"; + m_fatFile->write(magic, 4); + m_ds.setDevice(m_fatFile); + m_ds << m_clusterCount; + m_ds << m_clusterSize; + + for (int i=0; i<m_clusterCount; ++i) + m_ds << m_fat[i]; +} + +void QFat::close() +{ + if (m_fatFile) { + if (m_fatFile->isOpen()) { + writeFat(); + m_fatFile->close(); + } + delete m_fatFile; + m_fatFile = NULL; + } +} + +FatError QFat::checkAndCreate(FAT_FAT_TYPE clusterNum) +{ + FatError ret; + + if (!m_fatFile) + return FatNotOpen; + + if (!m_fatFile->isOpen()) { + + if (!m_fatFile->open(QIODevice::ReadWrite)) + return FatSysError; + + if (!m_fatFile->resize(m_startOfData + m_clusterSize)) + return FatOutOfSpace; + + char magic[5] = "QFAT"; + m_fatFile->write(magic, 4); + m_ds.setDevice(m_fatFile); + m_ds << m_clusterCount; + m_ds << m_clusterSize; + + for (int i=0; i<m_clusterCount; ++i) + m_ds << m_fat[i]; + + writeTocData(m_rootToc, 0); + } + + if (m_fatFile->size() < m_startOfData + (clusterNum+1 * m_clusterSize)) { + if (!m_fatFile->resize(m_startOfData + (clusterNum+1 * m_clusterSize))) + return FatOutOfSpace; + } + return FatNoError; +} + +FAT_FAT_TYPE QFat::findFreeCluster() +{ + FAT_FAT_TYPE freeCluster = 1; + for (;freeCluster < m_clusterCount; ++freeCluster) + if (!m_fat[freeCluster]) + return freeCluster; + + return m_clusterCount; +} + +void QFat::eraseData(FAT_FAT_TYPE clusterNum) +{ + if (clusterNum == FAT_FAT_TYPE_NOVALUE) + return; + + FAT_FAT_TYPE cluster = clusterNum; + do { + FAT_FAT_TYPE nextCluster = m_fat[cluster]; + m_fat[cluster] = 0; + cluster = nextCluster; + } while (cluster && cluster != FAT_FAT_TYPE_NOVALUE); +} + +QByteArray QFat::readData(FAT_FAT_TYPE clusterNum, qint32 maxSize) +{ + QByteArray data; + if (clusterNum == FAT_FAT_TYPE_NOVALUE) + return data; + + char readBuffer[m_clusterSize]; + qint32 alreadyRead = 0; + qint32 justRead; + quint16 nextCluster = clusterNum; + m_fatFile->seek(m_startOfData + (nextCluster * m_clusterSize)); + do { + if (maxSize == -1 || alreadyRead+m_clusterSize < maxSize) + justRead = m_fatFile->read(readBuffer, m_clusterSize); + else + justRead = m_fatFile->read(readBuffer, maxSize-alreadyRead); + alreadyRead += justRead; + data.append(readBuffer, justRead); + + FAT_FAT_TYPE oldCluster = nextCluster; + nextCluster = m_fat[nextCluster]; + if (nextCluster != FAT_FAT_TYPE_NOVALUE && nextCluster != oldCluster+1) + m_fatFile->seek(m_startOfData + (nextCluster * m_clusterSize)); + } while (nextCluster && nextCluster != FAT_FAT_TYPE_NOVALUE); + + return data; +} + +FAT_FAT_TYPE QFat::writeData(const QByteArray& data, FAT_FAT_TYPE reqCluster) +{ + FAT_FAT_TYPE startCluster; + if (reqCluster == FAT_FAT_TYPE_NOVALUE) + startCluster = findFreeCluster(); + else + startCluster = reqCluster; + if (startCluster == m_clusterCount) + return m_clusterCount; + + quint64 written; + quint32 idx = 0; + FAT_FAT_TYPE cluster = startCluster; + if (checkAndCreate(cluster) != FatNoError) + return m_clusterCount; + m_fatFile->seek(m_startOfData + (cluster * m_clusterSize)); + forever { + written = m_fatFile->write(data.data() + idx, ((idx + m_clusterSize) < data.size() ? m_clusterSize : data.size() - idx)); + if (written == m_clusterSize) { + idx += written; + m_fat[cluster] = 0xff; + FAT_FAT_TYPE nextCluster = findFreeCluster(); + if (nextCluster == m_clusterCount) + return m_clusterCount; + if (checkAndCreate(nextCluster) != FatNoError) + return m_clusterCount; + m_fat[cluster] = nextCluster; + if (nextCluster != cluster+1) + m_fatFile->seek(m_startOfData + (nextCluster * m_clusterSize)); + cluster = nextCluster; + } else { + m_fat[cluster] = FAT_FAT_TYPE_NOVALUE; + break; + } + } + + return startCluster; +} + +FatTocEntries QFat::readTocData(quint16 clusterNum) +{ + QByteArray a = readData(clusterNum); + QDataStream ds(a); + FatTocEntries tocs; + + ds >> tocs; + return tocs; +} + +FAT_FAT_TYPE QFat::writeTocData(const FatTocEntries &toc, FAT_FAT_TYPE cluster) +{ + QByteArray a; + QDataStream ds(&a, QIODevice::WriteOnly); + ds << toc; + + return writeData(a, cluster); +} + +FatError QFat::setCurrentTocs(const QString &path) +{ + if (path.isEmpty()) { + m_curTocs = m_rootToc; + m_curTocsPath = "/"; + m_curTocsCluster = 0; + return FatNoError; + } + if (path == m_curTocsPath && !m_curTocsPath.isEmpty()) + return FatNoError; + + FatTocEntries curTocs = m_rootToc; + FAT_FAT_TYPE curTocCluster = 0; + + QStringList levels = path.split("/", QString::SkipEmptyParts); + + bool found = false; + for (int i=0; i<levels.size(); ++i) { + for (int j=0; j<curTocs.size(); ++j) { + if (curTocs[j].name == levels[i]) { + if (curTocs[j].flags & FLAG_FOLDER) { + curTocCluster = curTocs[j].startCluster; + curTocs = readTocData(curTocCluster); + found = true; + break; + } else { + break; + } + } + } + if (!found) + break; + } + if (found) { + m_curTocs = curTocs; + m_curTocsCluster = curTocCluster; + m_curTocsPath = path; + return FatNoError; + } else { + m_curTocsPath.clear(); + return FatDirNotFound; + } +} + +FatError QFat::getToc(const QString &filename, FatTocEntry& toc) +{ + FatTocEntry emptyToc; + if (filename.isEmpty()) + return FatFileNotFound; + + QStringList levels = filename.split("/", QString::SkipEmptyParts); + QString name = levels.takeLast(); + QString path = levels.join("/"); + + return getToc(path, name, toc); +} + +FatError QFat::getToc(const QString &path, const QString& name, FatTocEntry& toc) +{ + FatError ret = setCurrentTocs(path); + if (ret != FatNoError) { + return ret; + } + + for (int j=0; j<m_curTocs.size(); ++j) { + if (m_curTocs[j].name == name) { + toc = m_curTocs[j]; + return FatNoError; + } + } + return FatFileNotFound; +} + +FatError QFat::getTocEntries(const QString &reqpath, FatTocEntries& tocs) +{ + FatTocEntry toc; + + if (reqpath.isEmpty() || reqpath == "/") { + tocs = m_rootToc; + } else { + QStringList levels = reqpath.split("/", QString::SkipEmptyParts); + QString name = levels.takeLast(); + QString path = levels.join("/"); + + FatError ret; + ret = getToc(path, name, toc); + if (ret != FatNoError) + return FatDirNotFound; + + tocs = readTocData(toc.startCluster); + } + + return FatNoError; +} + + +FatError QFat::addToc(const QString &filename, const FatTocEntry &toc) +{ + QStringList levels = filename.split("/", QString::SkipEmptyParts); + QString name = levels.takeLast(); + QString path = levels.join("/"); + return addToc(path, name, toc); +} + +FatError QFat::addToc(const QString &path, const QString& name, const FatTocEntry &toc) +{ + FatError ret = setCurrentTocs(path); + if (ret != FatNoError) + return ret; + + for (int j=0; j<m_curTocs.size(); ++j) { + if (m_curTocs[j].name == name) { + m_curTocs.removeAt(j); + } + } + + m_curTocs.push_back(toc); + eraseData(m_curTocsCluster); + FAT_FAT_TYPE clnum = writeTocData(m_curTocs, m_curTocsCluster); + if (clnum == m_clusterCount) + return FatOutOfSpace; + if (m_curTocsCluster == 0) + m_rootToc = m_curTocs; + + return FatNoError; +} + +FatError QFat::deleteToc(const QString &filename) +{ + QStringList levels = filename.split("/", QString::SkipEmptyParts); + QString name = levels.takeLast(); + QString path = levels.join("/"); + return deleteToc(path, name); +} + +FatError QFat::deleteToc(const QString &path, const QString& name) +{ + FatError ret = setCurrentTocs(path); + if (ret != FatNoError) + return ret; + + for (int j=0; j<m_curTocs.size(); ++j) { + if (m_curTocs[j].name == name) { + m_curTocs.removeAt(j); + eraseData(m_curTocsCluster); + FAT_FAT_TYPE clnum = writeTocData(m_curTocs, m_curTocsCluster); + if (clnum == m_clusterCount) + return FatOutOfSpace; + + if (m_curTocsCluster == 0) + m_rootToc = m_curTocs; + + return FatNoError; + } + } + return FatFileNotFound; +} + +FatError QFat::makeDir(const QString &reqpath) +{ + FatError ret; + + FatTocEntry toc; + FatTocEntries emptyToc; + ret = getToc(reqpath, toc); + if (ret == FatNoError) + return FatDirAlreadyExists; + + QStringList levels = reqpath.split("/", QString::SkipEmptyParts); + QString name = levels.takeLast(); + QString path = levels.join("/"); + + FAT_FAT_TYPE clnum = writeTocData(emptyToc, FAT_FAT_TYPE_NOVALUE); + if (clnum == m_clusterCount) + return FatOutOfSpace; + + toc.flags = FLAG_FOLDER; + QDateTime dt = QDateTime::currentDateTime(); + toc.creationTimestamp = dt.toTime_t(); + toc.modificationTimestamp = dt.toTime_t(); + toc.size = 0; + toc.name = name; + toc.startCluster = clnum; + + if((ret = addToc(path, name, toc)) != FatNoError) { + eraseData(clnum); + return ret; + } + return FatNoError; +} + +FatError QFat::makeDirRecursive(const QString &reqpath) +{ + FatError ret; + + FatTocEntry toc; + ret = getToc(reqpath, toc); + if (ret == FatNoError) + return FatDirAlreadyExists; + + QString partPath; + int i = 0; + QStringList levels = reqpath.split("/", QString::SkipEmptyParts); + + while (i<levels.size()) { + partPath = levels[0]; + for (int j=1; j<=i; ++j) + partPath += "/" + levels[j]; + ret = makeDir(partPath); + if (ret != FatNoError && ret != FatDirAlreadyExists) + return ret; + ++i; + } + + return FatNoError; +} + +FatError QFat::removeDir(const QString& reqpath) +{ + FatError ret; + FatTocEntry toc; + + ret = setCurrentTocs(reqpath); + if (ret != FatNoError) + return ret; + if (m_curTocs.size()) + return FatDirNotEmpty; + + ret = getToc(reqpath, toc); + if (ret != FatNoError) + return ret; + + eraseData(toc.startCluster); + ret = deleteToc(reqpath); + if (ret != FatNoError) + return ret; + + return FatNoError; +} + +FatError QFat::removeDirRecursive(const QString& reqpath) +{ + FatError ret; + + ret = setCurrentTocs(reqpath); + if (ret != FatNoError) + return ret; + if (m_curTocs.size()) + return FatDirNotEmpty; + + QString partPath = reqpath; + while (!partPath.isEmpty()) { + ret = removeDir(partPath); + if (ret != FatNoError) + return ret; + + QStringList levels = partPath.split("/", QString::SkipEmptyParts); + levels.takeLast(); + partPath = levels.join("/"); + } + + return FatNoError; +} + +FatError QFat::removeFile(const QString& reqpath) +{ + FatError ret; + FatTocEntry toc; + + ret = getToc(reqpath, toc); + if (ret != FatNoError) + return ret; + + eraseData(toc.startCluster); + ret = deleteToc(reqpath); + if (ret != FatNoError) + return ret; + + return FatNoError; +} + +QString QFat::statusToc(const QString& path, int indent) +{ + QString ret; + QString fill; + fill.fill(' ', indent*2); + + FatTocEntries curToc; + getTocEntries(path, curToc); + + for (int i=0; i<curToc.size(); ++i) { + if (curToc[i].flags & FLAG_FILE) { + ret += QString("%3(%4) %1\t%2\n").arg(curToc[i].name).arg(curToc[i].size).arg(fill).arg(curToc[i].startCluster, sizeof(FAT_FAT_TYPE)*2, 16); + } else if (curToc[i].flags & FLAG_FOLDER) { + ret += QString("%3(%4) %1/\n").arg(curToc[i].name).arg(fill).arg(curToc[i].startCluster, sizeof(FAT_FAT_TYPE)*2, 16); + ret += statusToc(path + curToc[i].name + "/", indent + 1); + } + } + + return ret; +} + +QString QFat::status() +{ + QString ret; + + int countFat = 0; + int col = 0; + ret = QString("FAT in use:\n "); + for (int i=0; i<m_fat.size(); ++i) { + if (m_fat[i]) { + ret += QString("(%1)%2").arg(i, sizeof(FAT_FAT_TYPE)*2, 16).arg(m_fat[i], sizeof(FAT_FAT_TYPE)*2, 16); + if (col<3) { + ++col; + ret += " "; + } else { + col = 0; + ret += "\n "; + } + countFat++; + } + } + if (col) + ret += "\n"; + ret += QString(" Count = %1\n").arg(countFat); + ret += QString(" Fat Size: %1\n").arg(m_clusterCount*sizeof(FAT_FAT_TYPE)); + ret += "\n"; + ret += "TOC:\n"; + ret += statusToc("/", 1); + ret += "\n" + QString("FatFile Size: %1\n").arg(m_fatFile->size()); + + + return ret; +} diff --git a/src/Tools/QFatFs/QFat.h b/src/Tools/QFatFs/QFat.h new file mode 100644 index 0000000..37916ba --- /dev/null +++ b/src/Tools/QFatFs/QFat.h @@ -0,0 +1,114 @@ +#ifndef QFAT_H +#define QFAT_H + +#include <QtCore> + +#define FAT_FAT_TYPE quint16 +#define FAT_FAT_TYPE_NOVALUE 0xffff + +// Big fat: max 512Mb +//#define FAT_CLUSTER_COUNT 65535 +//#define FAT_CLUSTER_SIZE 8192 + +//Small Fat: max 10Mb +//#define FAT_CLUSTER_COUNT 5120 +//#define FAT_CLUSTER_SIZE 2048 + +struct FatHeader +{ + char magic[4]; // "QFAT" + quint16 cluster_count; + quint16 cluster_size; +}; + +#define FLAG_FILE 0x20 +#define FLAG_FOLDER 0x10 + +enum FatError +{ + FatNoError, + FatSysError, + FatNotFatFile, + FatNotOpen, + FatFileNotFound, + FatDirNotFound, + FatDirNotEmpty, + FatDirAlreadyExists, + FatOutOfSpace +}; + +struct FatTocEntry +{ + FatTocEntry() : flags(0) {} + + quint8 flags; + quint32 creationTimestamp; + quint32 modificationTimestamp; + quint32 size; + FAT_FAT_TYPE startCluster; + QString name; +}; + +typedef QList<FatTocEntry> FatTocEntries; + +QDataStream &operator<<(QDataStream &ds, const FatTocEntry &toc); +QDataStream &operator>>(QDataStream &ds, FatTocEntry &toc); + +class QFat +{ + friend class QFatEngine; + +public: + QFat(const QString& filename, quint16 clusterCount=5120, quint16 clusterSize=2048); + + FatError open(); + void close(); + FatError checkAndCreate(FAT_FAT_TYPE clusterNum); + bool isOpen(); + + FAT_FAT_TYPE findFreeCluster(); + void eraseData(FAT_FAT_TYPE clusterNum); + FAT_FAT_TYPE writeData(const QByteArray &data, FAT_FAT_TYPE cluster=FAT_FAT_TYPE_NOVALUE); + QByteArray readData(FAT_FAT_TYPE clusterNum, qint32 maxSize=-1); + + FatTocEntries readTocData(FAT_FAT_TYPE clusterNum); + FAT_FAT_TYPE writeTocData(const FatTocEntries& toc, FAT_FAT_TYPE cluster); + + FatError setCurrentTocs(const QString& path); + FatError getToc(const QString &path, const QString& name, FatTocEntry& toc); + FatError getToc(const QString& filename, FatTocEntry& toc); + FatError getTocEntries(const QString &repath, FatTocEntries &tocs); + FatError addToc(const QString &filename, const FatTocEntry& toc); + FatError addToc(const QString &path, const QString& name, const FatTocEntry &toc); + FatError deleteToc(const QString &filename); + FatError deleteToc(const QString &path, const QString& name); + + FatError makeDir(const QString& path); + FatError makeDirRecursive(const QString &reqpath); + + FatError removeDir(const QString &reqpath); + FatError removeDirRecursive(const QString &reqpath); + FatError removeFile(const QString &reqpath); + + QString status(); + QString statusToc(const QString& path, int indent); + QString fileName() const { return m_filename; } + + void writeFat(); +protected: + QString m_filename; + QFile* m_fatFile; + QDataStream m_ds; + + quint16 m_clusterCount; + quint16 m_clusterSize; + QList<FAT_FAT_TYPE> m_fat; + quint64 m_startOfData; + + FatTocEntries m_rootToc; + FatTocEntries m_curTocs; + QString m_curTocsPath; + FAT_FAT_TYPE m_curTocsCluster; +}; + +#endif // QFAT_H diff --git a/src/Tools/QFatFs/QFatFile.cpp b/src/Tools/QFatFs/QFatFile.cpp new file mode 100644 index 0000000..c95fd51 --- /dev/null +++ b/src/Tools/QFatFs/QFatFile.cpp @@ -0,0 +1,78 @@ +#include "QFatFile.h" + +QFatFile::QFatFile(QFat* fat) + : QBuffer() + , m_fat(fat) +{ +} + +QFatFile::QFatFile(const QString& fileName, QFat* fat) + : QBuffer() + , m_fat(fat) +{ + setFilename(fileName); +} + +void QFatFile::setFilename(const QString &filename) +{ + if (filename.length() == 0) + return; + + QStringList tokens = filename.split("/", QString::SkipEmptyParts); + m_name = tokens.takeLast(); + m_path = tokens.join("/"); +} + +bool QFatFile::open(QIODevice::OpenMode mode) +{ + if (!m_fat->isOpen()) + return false; //FatNotOpen; + + FatError ret = m_fat->getToc(m_path, m_name, m_toc); + if (ret == FatFileNotFound) { + if (mode & QIODevice::ReadOnly) + return false; //FatFileNotFound; + + QDateTime dt = QDateTime::currentDateTime(); + m_toc.flags = FLAG_FILE; + m_toc.creationTimestamp = dt.toTime_t(); + m_toc.modificationTimestamp = dt.toTime_t(); + m_toc.size = 0; + m_toc.name = m_name; + m_toc.startCluster = FAT_FAT_TYPE_NOVALUE; + + if (m_fat->addToc(m_path, m_name, m_toc) != FatNoError) { + qDebug() << "QFatFile::open: Error as-dding toc"; + return false; + } + } else if (ret == FatNoError){ + buffer() = m_fat->readData(m_toc.startCluster, m_toc.size); + } else + return false; + + if (!QBuffer::open(mode)) + return false; //FatSysError; + + return true; //FatNoError; +} + +void QFatFile::close() +{ + if (openMode() & QIODevice::WriteOnly) { + QBuffer::close(); + m_fat->eraseData(m_toc.startCluster); + if (buffer().size()) + m_toc.startCluster = m_fat->writeData(buffer(), m_toc.startCluster); + else + m_toc.startCluster = FAT_FAT_TYPE_NOVALUE; + m_toc.size = size(); + m_toc.modificationTimestamp = QDateTime::currentDateTime().toTime_t(); + if (m_fat->addToc(m_path, m_name, m_toc) != FatNoError) { + qDebug() << "QFatFile::close: Error adding toc"; + return; + } + m_fat->writeFat(); + } else + QBuffer::close(); + +} diff --git a/src/Tools/QFatFs/QFatFile.h b/src/Tools/QFatFs/QFatFile.h new file mode 100644 index 0000000..8910bb8 --- /dev/null +++ b/src/Tools/QFatFs/QFatFile.h @@ -0,0 +1,29 @@ +#ifndef QFATFILE_H +#define QFATFILE_H + +#include <QtCore> + +#include "QFat.h" + +class QFatFile : public QBuffer +{ +public: + QFatFile(QFat* fat); + QFatFile(const QString& fileName, QFat* fat); + void setFilename(const QString& filename); + + bool open ( OpenMode mode ); + void close (); + +private: + QFat* m_fat; + QString m_path; + QString m_name; + QDateTime m_creationTime; + QDateTime m_modificationTime; + + FatTocEntry m_toc; + +}; + +#endif // QFATFILE_H diff --git a/src/Tools/QFatFs/QFatFs.cpp b/src/Tools/QFatFs/QFatFs.cpp new file mode 100644 index 0000000..52a282b --- /dev/null +++ b/src/Tools/QFatFs/QFatFs.cpp @@ -0,0 +1,278 @@ +#include "QFatFs.h" + +static QMap<QString,QFat*> cache; + +QFatFsHandler::~QFatFsHandler() +{ + QMapIterator<QString,QFat*> i(cache); + while (i.hasNext()) { + i.next(); + i.value()->close(); + delete i.value(); + } +} + +QAbstractFileEngine * QFatFsHandler::create(const QString &fileName) const +{ + + QUrl u(fileName); + if (!u.isValid()) + return NULL; + if (u.scheme() != "fat") + return NULL; + + QString fatPath; + QString path = u.path(); + if (!u.host().isEmpty()) + fatPath = u.host() + u.path(); + else { + fatPath = u.path(); + } + if (fatPath.startsWith("/")) + fatPath.remove(0, 1); + + QString name = u.fragment(); + + QMutexLocker locker(&mutex); + QFat* fat = cache[fatPath]; + if(!fat) { + fat = new QFat(fatPath, m_clusterCount, m_clusterSize); + if(!fat) return 0; + if (fat->open() != FatNoError) + return 0; + cache[fatPath] = fat; + } + return new QFatEngine(fat,fatPath, name); +} + +/*******************************/ + +FatIterator::FatIterator(QDir::Filters filters, const QStringList &nameFilters, QFat *fat, const QString& fatpath, const QString &name) + : QAbstractFileEngineIterator(filters,nameFilters) + , m_fat(fat) + , m_fatpath(fatpath) + , m_name(name) + +{ + m_curPath = m_name; + m_fat->getTocEntries(m_name, m_tocs); + m_curIndex = -1; +} + +int FatIterator::getNextIndex() const +{ + for (int i=m_curIndex+1; i<m_tocs.size(); ++i) { + if (filters() & QDir::AllEntries) + return i; + else if (filters() & QDir::Dirs) { + if (m_tocs[i].flags & FLAG_FOLDER) + return i; + } else if (filters() & QDir::Files) { + if (m_tocs[i].flags & FLAG_FILE) + return i; + } + } + return m_tocs.size(); +} + +bool FatIterator::hasNext() const +{ + return (getNextIndex() < m_tocs.size()); +} + +QString FatIterator::next() +{ + m_curIndex = getNextIndex(); + QString path = "fat:///" + m_fatpath + "#" + m_name; + if(!path.endsWith("/")) path += "/"; + return path + m_tocs[m_curIndex].name; +} + +QString FatIterator::currentFileName() const +{ + return m_tocs[m_curIndex].name; +} + +/**************************/ + +QMutex glob_mutex; + +QFatEngine::QFatEngine(QFat* fat, const QString& path, const QString& name) + : m_fat(fat) + , m_fatpath(path) + , m_name(name) + , m_flags(0xffffffff) + +{ + m_flags &= (int)m_fat->m_fatFile->permissions(); + if (m_name.isEmpty() || m_name == "/") { + m_flags |= RootFlag; + m_flags |= ExistsFlag; + m_flags |= DirectoryType; + } else { + QMutexLocker locker(&glob_mutex); + FatError ret = m_fat->getToc(m_name, m_toc); + if (ret == FatNoError && m_toc.flags) { + m_flags |= ExistsFlag; + if (m_toc.flags & FLAG_FILE) + m_flags |= FileType; + else if (m_toc.flags & FLAG_FOLDER) { + m_flags |= DirectoryType; + } + } else { + if(m_name.endsWith('/')) { + m_flags|= DirectoryType; + } else { + m_flags |= FileType; + } + } + } +} + +bool QFatEngine::open( QIODevice::OpenMode mode) +{ + QMutexLocker locker(&glob_mutex); + + fatFile = new QFatFile(m_name, m_fat); + if (!fatFile->open(mode)) { + delete fatFile; + return false; + } + return true; +} + +qint64 QFatEngine::read( char * data, qint64 maxlen ) +{ + QMutexLocker locker(&glob_mutex); + return fatFile->read(data,maxlen); +} + +qint64 QFatEngine::readLine(char *data, qint64 maxlen) +{ + QMutexLocker locker(&glob_mutex); + return fatFile->readLine(data,maxlen); +} + +qint64 QFatEngine::write(const char *data, qint64 len) +{ + QMutexLocker locker(&glob_mutex); + return fatFile->write(data,len); +} + +bool QFatEngine::close() +{ + QMutexLocker locker(&glob_mutex); + fatFile->close(); + delete fatFile; + return true; +} + +QAbstractFileEngine::Iterator * QFatEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames) +{ + QMutexLocker locker(&glob_mutex); + return new FatIterator(filters, filterNames, m_fat, m_fatpath, m_name); +} + +QDateTime QFatEngine::fileTime(QAbstractFileEngine::FileTime time) const +{ + switch (time) { + case QAbstractFileEngine::CreationTime: + return QDateTime::fromTime_t(m_toc.creationTimestamp); + case QAbstractFileEngine::ModificationTime: + return QDateTime::fromTime_t(m_toc.modificationTimestamp); + default: + return QDateTime(); + } +} + +bool QFatEngine::mkdir(const QString &dirName, bool createParentDirectories) const +{ + QUrl u(dirName); + if (!u.isValid() || u.scheme() != "fat") + return false; + + bool ret; + + QMutexLocker locker(&glob_mutex); + + if (createParentDirectories) + ret = (m_fat->makeDirRecursive(u.fragment()) == FatNoError) ? true : false; + else + ret = (m_fat->makeDir(u.fragment()) == FatNoError) ? true : false; + m_fat->writeFat(); + + return ret; +} + +bool QFatEngine::rmdir(const QString &dirName, bool recurseParentDirectories) const +{ + QUrl u(dirName); + if (!u.isValid() || u.scheme() != "fat") + return false; + + bool ret; + + QMutexLocker locker(&glob_mutex); + + if (recurseParentDirectories) + ret = (m_fat->removeDirRecursive(u.fragment()) == FatNoError) ? true : false; + else + ret = (m_fat->removeDir(u.fragment()) == FatNoError) ? true : false; + m_fat->writeFat(); + + return ret; +} + + +bool QFatEngine::extension(QAbstractFileEngine::Extension extension, const QAbstractFileEngine::ExtensionOption *option, QAbstractFileEngine::ExtensionReturn *output) +{ + switch (extension) { + case QAbstractFileEngine::AtEndExtension: + return fatFile->atEnd(); + default: + return false; + } +} + +bool QFatEngine::remove() +{ + QMutexLocker locker(&glob_mutex); + if (m_fat->removeFile(m_name) != FatNoError) + return false; + m_fat->writeFat(); + + return true; +} + +QString QFatEngine::fileName(QAbstractFileEngine::FileName file) const +{ + QStringList tokens; + tokens = m_name.split("/"); + QString name = tokens.takeLast(); + QString path = tokens.join("/"); + + switch (file) { + case QAbstractFileEngine::DefaultName: + case QAbstractFileEngine::AbsoluteName: + case QAbstractFileEngine::CanonicalName: + return "fat:///" + m_fatpath + "#" + m_name; + case QAbstractFileEngine::BaseName: + return name; + case QAbstractFileEngine::PathName: + case QAbstractFileEngine::AbsolutePathName: + case QAbstractFileEngine::CanonicalPathName: + return "fat:///" + m_fatpath + "#" + path; + } +} + +bool QFatEngine::flush() +{ + return true; +} + +bool QFatEngine::seek(qint64 offset) +{ + return fatFile->seek(offset); +} + + diff --git a/src/Tools/QFatFs/QFatFs.h b/src/Tools/QFatFs/QFatFs.h new file mode 100644 index 0000000..5d515f9 --- /dev/null +++ b/src/Tools/QFatFs/QFatFs.h @@ -0,0 +1,91 @@ +#ifndef QFATFS_H +#define QFATFS_H + +#include <QtCore> + +#include "QFat.h" +#include "QFatFile.h" + +class FatIterator : public QAbstractFileEngineIterator +{ +public: + FatIterator(QDir::Filters filters, const QStringList &nameFilters, QFat* fat, const QString& path, const QString& name); + + bool hasNext() const; + QString next(); + QString currentFileName() const; + +private: + QFat* m_fat; + QString m_fatpath; + QString m_name; + QString m_curPath; + + FatTocEntries m_tocs; + int m_curIndex; + +protected: + int getNextIndex() const; + +}; + +class QFatFsHandler : public QAbstractFileEngineHandler { +public: + QFatFsHandler(quint16 clusterCount=5120, quint16 clusterSize=2048) + : m_clusterCount(clusterCount), m_clusterSize(clusterSize) {} + ~QFatFsHandler(); + QAbstractFileEngine* create(const QString& fileName) const; + +private: + quint16 m_clusterCount; + quint16 m_clusterSize; + + mutable QMutex mutex; + +}; + +class QFatEngine : public QAbstractFileEngine +{ +public: + explicit QFatEngine(QFat* fat, const QString& path, const QString& name); + + bool open(QIODevice::OpenMode mode); + qint64 read(char *data, qint64 maxlen); + qint64 readLine ( char * data, qint64 maxlen ); + qint64 write (const char * data, qint64 len); + bool close(); + bool remove(); + bool flush (); + bool setSize ( qint64 /*size*/ ) { return true; } + + QString fileName(FileName file) const; + Iterator* beginEntryList(QDir::Filters filters, const QStringList &filterNames); + + bool caseSensitive () const { return true; } + qint64 size() const { return m_toc.size; } + QDateTime fileTime ( FileTime time ) const; + FileFlags fileFlags(FileFlags) const { return m_flags; } + bool supportsExtension ( Extension ) const { return QAbstractFileEngine::AtEndExtension; } + bool extension ( Extension extension, const ExtensionOption * option = 0, ExtensionReturn * output = 0 ); + bool isSequential () const { return false; } + + bool mkdir ( const QString & dirName, bool createParentDirectories ) const; + bool rmdir ( const QString & dirName, bool recurseParentDirectories ) const; + + qint64 pos () const { return fatFile->pos(); } + bool seek ( qint64 offset ); +signals: + +public slots: + +private: + QFat* m_fat; + QString m_fatpath; + QString m_name; + FileFlags m_flags; + FatTocEntry m_toc; + + QFatFile* fatFile; +}; + +#endif // QFATFS_H diff --git a/src/Tools/QFatFs/QFatFs.pri b/src/Tools/QFatFs/QFatFs.pri new file mode 100644 index 0000000..960c83f --- /dev/null +++ b/src/Tools/QFatFs/QFatFs.pri @@ -0,0 +1,12 @@ +INCLUDEPATH += $$PWD +DEPENDPATH += $$PWD + +SOURCES += \ + QFatFs.cpp \ + QFat.cpp \ + QFatFile.cpp + +HEADERS += \ + QFatFs.h \ + QFat.h \ + QFatFile.h diff --git a/src/Tools/RegionMapWidget.cpp b/src/Tools/RegionMapWidget.cpp new file mode 100644 index 0000000..e18edd2 --- /dev/null +++ b/src/Tools/RegionMapWidget.cpp @@ -0,0 +1,138 @@ +// +// C++ Implementation: RegionMapWidget +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "RegionMapWidget.h" +#include "Utils/SlippyMapWidget.h" + +#include "ImportExport/ImportExportOsmBin.h" + +#include <QPainter> +#include <QMouseEvent> + +RegionMapWidget::RegionMapWidget(QWidget* aParent) +: SlippyMapWidget(aParent), showGrid(false) +{ +} + +RegionMapWidget::~RegionMapWidget(void) +{ +} + +void RegionMapWidget::setShowGrid(bool val) +{ + showGrid = val; +} + +bool RegionMapWidget::getShowGrid() +{ + return showGrid; +} + +void RegionMapWidget::paintEvent(QPaintEvent* anEvent) +{ + SlippyMapWidget::paintEvent(anEvent); + + if (!showGrid) return; + + QPainter P(this); + QRectF R(viewArea()); + CoordBox v = CoordBox(Coord(R.x(), R.y()), Coord( R.x()+R.width(), R.y()+R.height()); + P.setPen(QPen(Qt::blue,2)); + P.setBrush(Qt::NoBrush); + + double sx = (double)width() / v.lonDiff(); + if (REGION_WIDTH * sx < 6) return; + + double sy = (double)height() / v.latDiff(); + + qint32 l = v.bottomLeft().lon() / REGION_WIDTH; + qint32 t = v.bottomLeft().lat() / REGION_WIDTH; + //for (int x = l*REGION_WIDTH; x<v.width(); x+=REGION_WIDTH) { + // for (int y = t*REGION_WIDTH; y<v.height(); y+=REGION_WIDTH) { + // P.drawRect(x * sx, y * sy, REGION_WIDTH * sx, REGION_WIDTH * sy); + // } + //} + for (qint64 x = l; x<= v.topRight().lon() / REGION_WIDTH; ++x) { + P.drawLine(int((x * REGION_WIDTH - v.bottomLeft().lon()) * sx), 0, int((x * REGION_WIDTH - v.bottomLeft().lon()) * sx), height()); + } + for (qint64 y = t; y<= v.topRight().lat() / REGION_WIDTH; ++y) { + P.drawLine(0, int(height() - ((y * REGION_WIDTH - v.bottomLeft().lat()) * sy)), width(), int(height() - ((y * REGION_WIDTH - v.bottomLeft().lat()) * sy))); + } + for (qint64 x = l; x<= v.topRight().lon() / REGION_WIDTH; ++x) + for (qint64 y = t; y<= v.topRight().lat() / REGION_WIDTH; ++y) { + quint32 rg = (y + NUM_REGIONS/2)*NUM_REGIONS + (x + NUM_REGIONS/2); + QRect rgRect = QRect(int((x * REGION_WIDTH - v.bottomLeft().lon()) * sx), + int(height() - ((y * REGION_WIDTH - v.bottomLeft().lat()) * sy)), + int(REGION_WIDTH * sx), int(-REGION_WIDTH * sy)); + //P.setClipRect(rgRect.adjusted(-1, -1, 1, 1)); + if (ExistingRegions[rg]) + P.drawText(int((x * REGION_WIDTH - v.bottomLeft().lon()) * sx), + int(height() - ((y * REGION_WIDTH - v.bottomLeft().lat()) * sy)), + QString("%1 - %2").arg(QString::number(rg)).arg(DateRegions[rg].toString("yyyy-MM-dd"))); + else + P.drawText(int((x * REGION_WIDTH - v.bottomLeft().lon()) * sx), + int(height() - ((y * REGION_WIDTH - v.bottomLeft().lat()) * sy)), + QString("%1").arg(QString::number(rg))); + + if (ExistingRegions[rg] && !DeleteRegions[rg]) { + //qDebug() << (y + NUM_REGIONS/2)*NUM_REGIONS + (x + NUM_REGIONS/2); + P.save(); + P.setPen(Qt::NoPen); + P.setBrush(QBrush(Qt::green, Qt::FDiagPattern)); + + P.drawRect(rgRect); + + P.restore(); + } + if (SelectedRegions[rg] && !DeleteRegions[rg]) { + //qDebug() << (y + NUM_REGIONS/2)*NUM_REGIONS + (x + NUM_REGIONS/2); + P.save(); + P.setPen(Qt::NoPen); + P.setBrush(QBrush(Qt::blue, Qt::BDiagPattern)); + + P.drawRect(rgRect); + + P.restore(); + } + } + + +} + +void RegionMapWidget::mouseReleaseEvent(QMouseEvent* ev) +{ + if (!isDragging()) { + QRectF R(viewArea()); + CoordBox v = CoordBox(Coord(R.x(), R.y()), Coord(R.x()+R.width(), R.y()+R.height())); + QPointF P = ev->pos(); + + Coord Pt(int(((height()-P.y()) / height() * v.latDiff()) + v.bottomLeft().lat()), int((P.x() / width() * v.lonDiff()) + v.bottomLeft().lon())); + int x = int(((qint64)Pt.lon()) / REGION_WIDTH); + x = (x < 0) ? x-1 :x; + int y = int(((qint64)Pt.lat()) / REGION_WIDTH); + y = (y < 0) ? y-1 :y; + int rg = (y + NUM_REGIONS/2)*NUM_REGIONS + (x + NUM_REGIONS/2); + + if (SelectedRegions[rg] && ExistingRegions[rg]) { + SelectedRegions[rg] = false; + DeleteRegions[rg] = true; + } else + if (!SelectedRegions[rg] && DeleteRegions[rg]) + DeleteRegions[rg] = false; + else + SelectedRegions[rg] = !SelectedRegions[rg]; + + update(); + } + + SlippyMapWidget::mouseReleaseEvent(ev); +} + diff --git a/src/Tools/RegionMapWidget.h b/src/Tools/RegionMapWidget.h new file mode 100644 index 0000000..81e1033 --- /dev/null +++ b/src/Tools/RegionMapWidget.h @@ -0,0 +1,43 @@ +// +// C++ Interface: RegionMapWidget +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef REGIONMAPWIDGET_H +#define REGIONMAPWIDGET_H + +#include "Utils/SlippyMapWidget.h" + +#include <QHash> +#include <QDateTime> + +class RegionMapWidget : public SlippyMapWidget +{ + Q_OBJECT + + public: + RegionMapWidget(QWidget* aParent); + virtual ~RegionMapWidget(); + + void setShowGrid(bool val); + bool getShowGrid(); + + virtual void paintEvent(QPaintEvent* ev); + virtual void mouseReleaseEvent(QMouseEvent* ev); + + QHash <quint32, bool> SelectedRegions; + QHash <quint32, bool> ExistingRegions; + QHash <quint32, bool> DeleteRegions; + QHash <quint32, QDateTime> DateRegions; + + private: + bool showGrid; +}; + +#endif diff --git a/src/Tools/Tools.pri b/src/Tools/Tools.pri new file mode 100644 index 0000000..d1bcfdb --- /dev/null +++ b/src/Tools/Tools.pri @@ -0,0 +1,19 @@ +#include(QFatFs/QFatFs.pri) + +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/Tools +DEPENDPATH += $$MERKAARTOR_SRC_DIR/Tools + +#HEADERS += ZipEngine.h +#SOURCES += ZipEngine.cpp + +isEmpty(MOBILE) { + #Header files + HEADERS += \ + ActionsDialog.h + + #Source files + SOURCES += \ + ActionsDialog.cpp +} + + diff --git a/src/Utils/CheckBoxList.cpp b/src/Utils/CheckBoxList.cpp new file mode 100644 index 0000000..5b7ce70 --- /dev/null +++ b/src/Utils/CheckBoxList.cpp @@ -0,0 +1,156 @@ +/////////////////////////////////////////////////////////// +// CheckBoxList.cpp +// Implementation of the Class CheckBoxList +// Created on: 02-Jun-2008 6:53:56 PM +// Original author: Nasser M. Al-Ansari (Da-Crystal) +/////////////////////////////////////////////////////////// +// Modification History: +// +// Who(SNo) Date Description +// +/////////////////////////////////////////////////////////// + +#include "CheckBoxList.h" +#include <QtGui> +#include <QItemDelegate> +#include <QApplication> +#include <QCheckBox> +#include <QAbstractItemView> +#include <QStylePainter> + + +// internal private delegate +class CheckBoxListDelegate : public QItemDelegate +{ +public: + CheckBoxListDelegate(QObject *parent) + : QItemDelegate(parent) + { + ; + } + + void paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const + { + //Get item data + bool value = index.data(Qt::UserRole).toBool(); + QString text = index.data(Qt::DisplayRole).toString(); + + // fill style options with item data + const QStyle *style = QApplication::style(); + QStyleOptionButton opt; + opt.state |= value ? QStyle::State_On : QStyle::State_Off; + opt.state |= QStyle::State_Enabled; + opt.text = text; + opt.rect = option.rect; + + // draw item data as CheckBox + style->drawControl(QStyle::CE_CheckBox,&opt,painter); + } + + QWidget *createEditor(QWidget *parent, + const QStyleOptionViewItem & /*option*/, + const QModelIndex & /*index*/ ) const + { + // create check box as our editor + QCheckBox *editor = new QCheckBox(parent); + return editor; + } + + void setEditorData(QWidget *editor, + const QModelIndex &index) const + { + //set editor data + QCheckBox *myEditor = static_cast<QCheckBox*>(editor); + myEditor->setText(index.data(Qt::DisplayRole).toString()); + myEditor->setChecked(index.data(Qt::UserRole).toBool()); + } + + void setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const + { + //get the value from the editor (CheckBox) + QCheckBox *myEditor = static_cast<QCheckBox*>(editor); + bool value = myEditor->isChecked(); + + //set model data + QMap<int,QVariant> data; + data.insert(Qt::DisplayRole,myEditor->text()); + data.insert(Qt::UserRole,value); + model->setItemData(index,data); + } + + void updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, const QModelIndex & /*index*/ ) const + { + editor->setGeometry(option.rect); + } + }; + + + +CheckBoxList::CheckBoxList(QWidget *widget ) +:QComboBox(widget) +{ + // set delegate items view + view()->setItemDelegate(new CheckBoxListDelegate(this)); + + // Enable editing on items view + view()->setEditTriggers(QAbstractItemView::CurrentChanged); + + // set "CheckBoxList::eventFilter" as event filter for items view + view()->viewport()->installEventFilter(this); + + // it just cool to have it as defualt ;) + view()->setAlternatingRowColors(true); +} + + +CheckBoxList::~CheckBoxList() +{ + ; +} + + +bool CheckBoxList::eventFilter(QObject *object, QEvent *event) +{ + // don't close items view after we release the mouse button + // by simple eating MouseButtonRelease in viewport of items view + if(event->type() == QEvent::MouseButtonRelease && object==view()->viewport()) + { + return true; + } + return QComboBox::eventFilter(object,event); +} + + +void CheckBoxList::paintEvent(QPaintEvent *) +{ + QStylePainter painter(this); + painter.setPen(palette().color(QPalette::Text)); + + // draw the combobox frame, focusrect and selected etc. + QStyleOptionComboBox opt; + initStyleOption(&opt); + + // if no display text been set , use "..." as default + if(m_DisplayText.isNull()) + opt.currentText = "..."; + else + opt.currentText = m_DisplayText; + painter.drawComplexControl(QStyle::CC_ComboBox, opt); + + // draw the icon and text + painter.drawControl(QStyle::CE_ComboBoxLabel, opt); +} + + +void CheckBoxList::SetDisplayText(QString text) +{ + m_DisplayText = text; +} + +QString CheckBoxList::GetDisplayText() const +{ + return m_DisplayText; +} diff --git a/src/Utils/CheckBoxList.h b/src/Utils/CheckBoxList.h new file mode 100644 index 0000000..a2293ec --- /dev/null +++ b/src/Utils/CheckBoxList.h @@ -0,0 +1,35 @@ +/////////////////////////////////////////////////////////// +// CheckBoxList.h +// Header of the Class CheckBoxList +// Created on: 02-Jun-2008 6:53:56 PM +// Original author: Nasser M. Al-Ansari (Da-Crystal) +/////////////////////////////////////////////////////////// +// Modification History: +// +// Who(SNo) Date Description +// +/////////////////////////////////////////////////////////// + +#ifndef CHECKBOXLIST_H +#define CHECKBOXLIST_H + +#include <QtGui> +#include <QComboBox> + +class CheckBoxList: public QComboBox +{ + Q_OBJECT; + +public: + CheckBoxList(QWidget *widget = 0); + virtual ~CheckBoxList(); + bool eventFilter(QObject *object, QEvent *event); + virtual void paintEvent(QPaintEvent *); + void SetDisplayText(QString text); + QString GetDisplayText() const; + +private: + QString m_DisplayText; +}; + +#endif // CHECKBOXLIST_H diff --git a/src/Utils/EditCompleterDelegate.cpp b/src/Utils/EditCompleterDelegate.cpp new file mode 100644 index 0000000..01799df --- /dev/null +++ b/src/Utils/EditCompleterDelegate.cpp @@ -0,0 +1,140 @@ +// +// C++ Implementation: editcompleterdelegate +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "Global.h" + +#include "EditCompleterDelegate.h" +#include "MainWindow.h" +#include "Document.h" +#include "TagModel.h" + +#include <QLineEdit> +#include <QKeyEvent> + +EditCompleterDelegate::EditCompleterDelegate(QObject* parent): QItemDelegate(parent) +{ +} + + +EditCompleterDelegate::~EditCompleterDelegate() +{ +} + +QWidget* EditCompleterDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& /* option */, const QModelIndex& index) const +{ + QCompleter* completer = NULL; + + QWidget* edit; + + if (index.column() == 0) { + + QStringList tagKeys = g_getTagKeyList(); + + // Exclude any tags already defined in the current model + for (int i=0; i<index.model()->rowCount(); i++) { + if (i != index.row()) { + QModelIndex r = index.model()->index(0, 0); + tagKeys.removeAll(index.model()->data(r).toString()); + } + } + + // QCompleter relies on the list order, so sort it for + // consistent completion behaviour + tagKeys.sort(); + + completer = new QCompleter(tagKeys, (QObject *)this); + QComboBox *cb = new QComboBox(parent); + cb->setInsertPolicy(QComboBox::InsertAlphabetically); + cb->insertItems(-1, tagKeys); + cb->setEditable(true); + completer->setCompletionMode(QCompleter::InlineCompletion); + completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel); + cb->setCompleter(completer); + + edit = cb; + } else { + QModelIndex i = index.model()->index(index.row(), 0); + QString k = index.model()->data(i).toString(); + if (k != "name") { + QStringList sl = g_getTagValueList(k); + sl.sort(); + completer = new QCompleter(sl, (QObject *)this); + + QComboBox *cb = new QComboBox(parent); + cb->setInsertPolicy(QComboBox::InsertAlphabetically); + cb->insertItems(-1, sl); + cb->setEditable(true); + completer->setCompletionMode(QCompleter::InlineCompletion); + completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel); + cb->setCompleter(completer); + + edit = cb; + } else { + QLineEdit* le = new QLineEdit(parent); + edit = le; + } + } + return edit; +} + +void EditCompleterDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const +{ + if (QComboBox *edit = dynamic_cast<QComboBox*>(editor)) { + if (index.model()->data(index).toString() != TagModel::newKeyText()) + edit->setEditText(index.model()->data(index).toString()); + else + edit->clearEditText(); + edit->lineEdit()->selectAll(); + } else + if (QLineEdit *edit = dynamic_cast<QLineEdit*>(editor)) { + edit->setText(index.model()->data(index).toString()); + } +} + +void EditCompleterDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const +{ + QString newVal; + if (QComboBox *edit = dynamic_cast<QComboBox*>(editor)) + newVal = edit->currentText(); + else + if (QLineEdit *edit = dynamic_cast<QLineEdit*>(editor)) + newVal = edit->text(); + + if (newVal == index.model()->data(index).toString()) return; + if (!newVal.isEmpty() || index.column() == 1) + model->setData(index, newVal); +} + +void EditCompleterDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& /* index */) const +{ + editor->setGeometry(option.rect); +} + +/* On enter commit the current text and move to the next field */ +bool EditCompleterDelegate::eventFilter(QObject* object, QEvent* event) +{ + QWidget* editor = qobject_cast<QWidget*>(object); + if (!editor) + return false; + + // Note that keys already bound to shortcuts will be QEvent::ShortcutOverride not QEvent::KeyPress + if (event->type() == QEvent::KeyPress) { + QKeyEvent *keyEvent = (QKeyEvent*)event; + switch (keyEvent->key()) { + case Qt::Key_Enter: + case Qt::Key_Return: + emit commitData(editor); + emit closeEditor(editor, QAbstractItemDelegate::EditNextItem); + return true; + } + } + return QItemDelegate::eventFilter(object, event); +} diff --git a/src/Utils/EditCompleterDelegate.h b/src/Utils/EditCompleterDelegate.h new file mode 100644 index 0000000..5072288 --- /dev/null +++ b/src/Utils/EditCompleterDelegate.h @@ -0,0 +1,39 @@ +// +// C++ Interface: editcompleterdelegate +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef EDITCOMPLETERDELEGATE_H +#define EDITCOMPLETERDELEGATE_H + +#include <QItemDelegate> +#include <QComboBox> +#include <QModelIndex> +#include <QObject> +#include <QCompleter> + +/** + @author cbro <cbro@semperpax.com> +*/ +class EditCompleterDelegate : public QItemDelegate +{ +Q_OBJECT +public: + EditCompleterDelegate(QObject* parent = 0); + + ~EditCompleterDelegate(); + + QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const; + void setEditorData(QWidget* editor, const QModelIndex& index) const; + void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const; + void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const; + bool eventFilter(QObject* object, QEvent* event); +}; + +#endif diff --git a/src/Utils/LineF.h b/src/Utils/LineF.h new file mode 100644 index 0000000..0d20f55 --- /dev/null +++ b/src/Utils/LineF.h @@ -0,0 +1,299 @@ +#ifndef MERKAARTOR_LINEF_ +#define MERKAARTOR_LINEF_ + +#include "Coord.h" + +#include <QtCore/QPointF> + +#include <math.h> +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#ifndef M_PI_2 +#define M_PI_2 1.57079632679489661923 +#endif + +inline qreal distance(const QPointF& A, const QPointF& B) +{ + qreal dx = A.x()-B.x(); + qreal dy = A.y()-B.y(); + return sqrt( dx*dx+dy*dy ); +} + +inline qreal length(const QPointF& A) +{ + return sqrt(A.x()*A.x()+A.y()*A.y()); +} + +inline qreal angle(const QPointF& A, const QPointF& B) +{ + qreal d = A.x()*B.x()+A.y()*B.y(); + qreal x = A.x()*B.y()-A.y()*B.x(); + // numerical stability : in extreme cases the argument of asin gets slightly larger than 1 + if (fabs(d) < 0.00001) + return (x>0)?M_PI_2:-M_PI; + x = asin(x/(length(A)*length(B))); + if (d<0) + { + if (x > 0) + x = M_PI - x; + else + x = -M_PI - x; + } + return x; + +} + +inline qreal angle(const QPointF& A) +{ + return atan2(A.y(),A.x()); +} + +class LineF +{ +public: + LineF(const QLineF& l) + : P1(l.p1()), P2(l.p2()) + { + init(); + } + + LineF(const QPointF& aP1, const QPointF& aP2) + : P1(aP1), P2(aP2), Valid(true) + { + init(); + } + + LineF(const QPoint& aP1, const QPoint& aP2) + : P1(aP1), P2(aP2), Valid(true) + { + init(); + } + + LineF(const Coord& aP1, const Coord& aP2) + : P1(aP1.x(),aP1.y()), P2(aP2.x(),aP2.y()), Valid(true) + { + init(); + } + + void init() + { + A = P2.y()-P1.y(); + B = -P2.x()+P1.x(); + C = -P1.y()*B-P1.x()*A; + qreal F = sqrt(A*A+B*B); + if (F<0.00000001) + Valid=false; + else + { + A/=F; + B/=F; + C/=F; + } + } + + void slide(qreal d) + { + C += d*sqrt(A*A+B*B); + } + + qreal distance(const QPointF& P) const + { + if (Valid) + return fabs(A*P.x()+B*P.y()+C); + else + return sqrt( (P.x()-P1.x())*(P.x()-P1.x()) + (P.y()-P1.y())*(P.y()-P1.y()) ); + } + + //qreal capDistance(const QPointF& P) const + //{ + // if (Valid) + // { + // qreal dx = P2.x()-P1.x(); + // qreal dy = P2.y()-P1.y(); + // qreal px = P.x()-P1.x(); + // qreal py = P.y()-P1.y(); + // if ( (dx*px+dy*py) < 0) + // return ::distance(P,P1); + // px = P.x()-P2.x(); + // py = P.y()-P2.y(); + // if ( (dx*px+dy*py) > 0) + // return ::distance(P,P2); + // return fabs(A*P.x()+B*P.y()+C); + // } + // else + // return sqrt( (P.x()-A)*(P.x()-A) + (P.y()-B)*(P.y()-B) ); + //} + + qreal capDistance(const Coord& P) + { + if (Valid) + { + qreal dx = P2.x()-P1.x(); + qreal dy = P2.y()-P1.y(); + qreal px = P.x()-P1.x(); + qreal py = P.y()-P1.y(); + if ( (dx*px+dy*py) < 0) + return ::distance(P,P1); + px = P.x()-P2.x(); + py = P.y()-P2.y(); + if ( (dx*px+dy*py) > 0) + return ::distance(P,P2); + return fabs(A*P.x()+B*P.y()+C); + } + else + return sqrt( (P.x()-A)*(P.x()-A) + (P.y()-B)*(P.y()-B) ); + } + + Coord project(const Coord& P) + { + if (Valid) + { + qreal SD = A*P.x()+B*P.y()+C; + return Coord(P.x()-A*SD,P.y()-B*SD); + } + return Coord(P1.x(),P1.y()); + } + QPointF project(const QPointF& P) + { + if (Valid) + { + qreal SD = A*P.x()+B*P.y()+C; + return QPointF(P.x()-A*SD,P.y()-B*SD); + } + return P1; + } + QPointF project(const QPoint& P) + { + return project(QPointF(P)); + } + + bool intersectsWith(const CoordBox& C) const + { + QPointF intersection; + if ( QLineF(P1, P2).intersect( QLineF( C.topLeft(), C.topRight() ), &intersection) == QLineF::BoundedIntersection ) return true; + if ( QLineF(P1, P2).intersect( QLineF( C.topRight(), C.bottomRight() ), &intersection) == QLineF::BoundedIntersection ) return true; + if ( QLineF(P1, P2).intersect( QLineF( C.bottomRight(), C.bottomLeft() ), &intersection) == QLineF::BoundedIntersection ) return true; + if ( QLineF(P1, P2).intersect( QLineF( C.bottomLeft(), C.topLeft() ), &intersection) == QLineF::BoundedIntersection ) return true; + return false; + } + + void intersectionWith(const CoordBox& C, Coord* C1, Coord* C2) const + { + QPointF intersection; + bool hasC1 = false; + + if ( QLineF(P1, P2).intersect( QLineF( C.topLeft(), C.topRight() ), &intersection) == QLineF::BoundedIntersection ) { + *C1 = intersection; + hasC1 = true; + } + if ( QLineF(P1, P2).intersect( QLineF( C.topRight(), C.bottomRight() ), &intersection) == QLineF::BoundedIntersection ) { + if (hasC1) { + *C2 = intersection; + return; + } else { + *C1 = intersection; + hasC1 = true; + } + } + if ( QLineF(P1, P2).intersect( QLineF( C.bottomRight(), C.bottomLeft() ), &intersection) == QLineF::BoundedIntersection ) { + if (hasC1) { + *C2 = intersection; + return; + } else { + *C1 = intersection; + hasC1 = true; + } + } + if ( QLineF(P1, P2).intersect( QLineF( C.bottomLeft(), C.topLeft() ), &intersection) == QLineF::BoundedIntersection ) { + if (hasC1) { + *C2 = intersection; + return; + } else { + *C1 = intersection; + hasC1 = true; + } + } + } + + QPointF intersectionWith(const LineF& L) + { + qreal D = A*L.B - L.A*B; + if (fabs(D) < 0.00001) + return P2; + qreal x = B*L.C - L.B*C; + qreal y = L.A*C - A*L.C; + return QPointF(x/D,y/D); + } + + bool segmentContains(const QPointF& X) + { + return + ( ((P1.x() <= X.x()) && (X.x() <= P2.x())) || + ((P1.x() >= X.x()) && (X.x() >= P2.x())) ) && + ( ((P1.y() <= X.y()) && (X.y() <= P2.y())) || + ((P1.y() >= X.y()) && (X.y() >= P2.y())) ); + } + + +private: + QPointF P1, P2; + bool Valid; + qreal A,B,C; +}; + +class BezierF +{ + public: + BezierF(const QPointF& aA, const QPointF& aB, const QPointF& aC, const QPointF& aD) + : A(aA), B(aB), C(aC), D(aD) + { + } + BezierF(const QPoint& aA, const QPoint& aB, const QPoint& aC, const QPoint& aD) + : A(aA), B(aB), C(aC), D(aD) + { + } + + BezierF(const Coord& aA, const Coord& aB, const Coord& aC, const Coord& aD) + : A(aA), B(aB), C(aC), D(aD) + { + } + + qreal distance(const QPointF& T) const + { + qreal LowestZ = ::distance(A,T); + for (qreal t=0;t<1.0125; t+=0.025) + { + QPointF P = A*(1-t)*(1-t)*(1-t) + 3*B*(1-t)*(1-t)*t + 3*C*(1-t)*t*t + D*t*t*t; + qreal z = ::distance(P,T); + if (z < LowestZ) + LowestZ = z; + } + return LowestZ; + } + + QPointF project(const QPointF& T) const + { + qreal LowestZ = ::distance(A,T); + QPointF ClosestP(A); + for (qreal t=0;t<1.0125; t+=0.025) + { + QPointF P = A*(1-t)*(1-t)*(1-t) + 3*B*(1-t)*(1-t)*t + 3*C*(1-t)*t*t + D*t*t*t; + qreal z = ::distance(P,T); + if (z < LowestZ) + { + LowestZ = z; + ClosestP = P; + } + } + return ClosestP; + } + + + private: + QPointF A,B,C,D; +}; + +#endif + + diff --git a/src/Utils/MDiscardableDialog.cpp b/src/Utils/MDiscardableDialog.cpp new file mode 100644 index 0000000..d743596 --- /dev/null +++ b/src/Utils/MDiscardableDialog.cpp @@ -0,0 +1,81 @@ +#include "MDiscardableDialog.h" +#include "MerkaartorPreferences.h" + +#include <QVBoxLayout> +#include <QApplication> +#include <QLabel> +#include <QSettings> + +MDiscardableDialog::MDiscardableDialog(QWidget *parent, QString title) + : QDialog(parent), mainWidget(0), Title(title) +{ + QSettings* Sets = M_PREFS->getQSettings(); + Sets->beginGroup("DiscardableDialogs"); + DiscardableRole = Sets->value(title, -1).toInt(); + Sets->endGroup(); + + setWindowTitle(title); + setMinimumSize(300, 100); + + theLayout = new QVBoxLayout(this); + theLayout->setSpacing(4); + theLayout->setMargin(4); + + theDSA.setText(tr("Don't ask me this again")); + theLayout->addWidget(&theDSA); +} + +void MDiscardableDialog::setWidget ( QWidget * widget ) +{ + if (mainWidget) + theLayout->removeWidget(mainWidget); + + mainWidget = widget; + mainWidget->setParent(this); + theLayout->insertWidget(0, mainWidget); +} + +QWidget* MDiscardableDialog::getWidget() +{ + mainWidget = new QWidget(); + mainWidget->setParent(this); + + theLayout->addWidget(mainWidget); + + return mainWidget; +} + +int MDiscardableDialog::check() +{ + if (DiscardableRole != -1) + return DiscardableRole; + + int tmpRet = exec(); + if (theDSA.isChecked()) { + DiscardableRole = tmpRet; + + QSettings* Sets = M_PREFS->getQSettings(); + Sets->beginGroup("DiscardableDialogs"); + Sets->setValue(Title, DiscardableRole); + Sets->endGroup(); + } + + return tmpRet; +} + +/* MDiscardableMessage */ + +MDiscardableMessage::MDiscardableMessage(QWidget *parent, QString title, QString msg) + : MDiscardableDialog(parent, title) +{ + theBB.setStandardButtons(QDialogButtonBox::Yes | QDialogButtonBox::No); + theLayout->addWidget(&theBB); + + connect(&theBB, SIGNAL(accepted()), this, SLOT(accept())); + connect(&theBB, SIGNAL(rejected()), this, SLOT(reject())); + + QLabel * txt = new QLabel(); + txt->setText(msg); + setWidget(txt); +} + diff --git a/src/Utils/MDiscardableDialog.h b/src/Utils/MDiscardableDialog.h new file mode 100644 index 0000000..40ed8b5 --- /dev/null +++ b/src/Utils/MDiscardableDialog.h @@ -0,0 +1,37 @@ +#ifndef MDISCARDABLEDIALOG_H +#define MDISCARDABLEDIALOG_H + +#include <QDialog> +#include <QDialogButtonBox> +#include <QCheckBox> + +class QVBoxLayout; + +class MDiscardableDialog : public QDialog +{ +Q_OBJECT + +public: + MDiscardableDialog(QWidget *parent = 0, QString title = QString()); + void setWidget ( QWidget * widget ); + QWidget* getWidget(); + virtual int check(); + +protected: + QVBoxLayout* theLayout; + QWidget* mainWidget; + QCheckBox theDSA; + QString Title; + int DiscardableRole; +}; + +class MDiscardableMessage : public MDiscardableDialog +{ +public: + MDiscardableMessage(QWidget *parent = 0, QString title = QString(), QString msg = QString()); + +protected: + QDialogButtonBox theBB; +}; + +#endif //MDISCARDABLEDIALOG_H diff --git a/src/Utils/OsmLink.cpp b/src/Utils/OsmLink.cpp new file mode 100644 index 0000000..a8179e2 --- /dev/null +++ b/src/Utils/OsmLink.cpp @@ -0,0 +1,238 @@ +#include "OsmLink.h" + +#include <QApplication> +#include <QMessageBox> +#include <QStringList> +#include "Global.h" + +OsmLink::OsmLink(QString url) + : m_IsValid(false) +{ + QString s = parseUrl(QUrl(url, QUrl::TolerantMode)); + if (!m_IsValid) + qDebug() << "OsmLink:" << s; +} + +OsmLink::OsmLink(QUrl url) + : m_IsValid(false) +{ + QString s = parseUrl(url); + if (!m_IsValid) + qDebug() << "OsmLink:" << s; +} + +#define ARG_VALID(param) if (!parseOk) return QString("Unparsed " #param "=\"%1\"").arg(theQuery.queryItemValue(#param)) +#define PARSE_ERROR(val) if (!parseOk) return QString("Unparsed " #val "=\"%1\"").arg(val) + +QString OsmLink::parseUrl(QUrl theUrl) +{ + // On parse failure, we bail early, leaving m_isValid unset + bool parseOk; +#ifdef QT5 + QUrlQuery theQuery; +#define theQuery theQuery +#else +#define theQuery theUrl +#endif + + if (!theUrl.isValid()) return QString("Invalid URL: %1").arg(theUrl.toString());; + + if (theUrl.toString().contains("openstreetmap.org/") && theUrl.toString().contains("#map=")) { + // first is 'map', zoom, lat and lon follows + // afterwards, optionally &layers= may follow + QStringList list = theUrl.fragment().split(QRegExp("[/=&]")); + if(list[0] != "map") + return QString("Unexpected fragment parameter %1").arg(list[0]); + qreal zoom = list[1].toInt(&parseOk); ARG_VALID(zoom); + qreal lat = list[2].toDouble(&parseOk); ARG_VALID(lat); + qreal lon = list[3].toDouble(&parseOk); ARG_VALID(lon); + + setLatLonZoom(lat, lon, zoom); + } + else if (theUrl.toString().contains("osm.org/go")) + { + parseShortUrl(theUrl.path().section('/', -1)); + } + else if (theQuery.hasQueryItem("lat") && theQuery.hasQueryItem("lon") && theQuery.hasQueryItem("zoom")) + { + qreal lat = theQuery.queryItemValue("lat").toDouble(&parseOk); ARG_VALID(lat); + qreal lon = theQuery.queryItemValue("lon").toDouble(&parseOk); ARG_VALID(lon); + qreal zoom = theQuery.queryItemValue("zoom").toInt(&parseOk); ARG_VALID(zoom); + + setLatLonZoom(lat, lon, zoom); + } + else if (theQuery.hasQueryItem("mlat") && theQuery.hasQueryItem("mlon") && theQuery.hasQueryItem("zoom")) + { + qreal lat = theQuery.queryItemValue("mlat").toDouble(&parseOk); ARG_VALID(lat); + qreal lon = theQuery.queryItemValue("mlon").toDouble(&parseOk); ARG_VALID(lon); + qreal zoom = theQuery.queryItemValue("zoom").toInt(&parseOk); ARG_VALID(zoom); + + setLatLonZoom(lat, lon, zoom); + } + else if (theQuery.hasQueryItem("minlon") && theQuery.hasQueryItem("maxlon") && + theQuery.hasQueryItem("minlat") && theQuery.hasQueryItem("maxlat")) + { + qreal bottom = theQuery.queryItemValue("minlat").toDouble(&parseOk); ARG_VALID(minlat); + qreal left = theQuery.queryItemValue("minlon").toDouble(&parseOk); ARG_VALID(minlon); + qreal top = theQuery.queryItemValue("maxlat").toDouble(&parseOk); ARG_VALID(maxlat); + qreal right = theQuery.queryItemValue("maxlon").toDouble(&parseOk); ARG_VALID(maxlon); + + setMinMax(bottom, left, top, right); + } + else if (theQuery.hasQueryItem("left") && theQuery.hasQueryItem("right") && + theQuery.hasQueryItem("bottom") && theQuery.hasQueryItem("top")) + { + qreal bottom = theQuery.queryItemValue("bottom").toDouble(&parseOk); ARG_VALID(minlat); + qreal left = theQuery.queryItemValue("left").toDouble(&parseOk); ARG_VALID(minlon); + qreal top = theQuery.queryItemValue("top").toDouble(&parseOk); ARG_VALID(maxlat); + qreal right = theQuery.queryItemValue("right").toDouble(&parseOk); ARG_VALID(maxlon); + + setMinMax(bottom, left, top, right); + } + else if (theQuery.hasQueryItem("left") && theQuery.hasQueryItem("right") && + theQuery.hasQueryItem("bottom") && theQuery.hasQueryItem("top")) + { + qreal bottom = theQuery.queryItemValue("bottom").toDouble(&parseOk); ARG_VALID(minlat); + qreal left = theQuery.queryItemValue("left").toDouble(&parseOk); ARG_VALID(minlon); + qreal top = theQuery.queryItemValue("top").toDouble(&parseOk); ARG_VALID(maxlat); + qreal right = theQuery.queryItemValue("right").toDouble(&parseOk); ARG_VALID(maxlon); + + setMinMax(bottom, left, top, right); + } + else if ((theUrl.host().contains("maps.google.com") || theUrl.host().contains("maps.google.co.uk")) && + theQuery.hasQueryItem("ll") && theQuery.hasQueryItem("spn")) + { + QStringList ll = theQuery.queryItemValue("ll").split(","); if (ll.count() != 2) return QString("Unsplit=\"%2\" (%1 elements)").arg(ll.count()).arg(theQuery.queryItemValue("ll")); + qreal lat = ll[0].toDouble(&parseOk); PARSE_ERROR(ll[0]); + qreal lon = ll[1].toDouble(&parseOk); PARSE_ERROR(ll[1]); + QStringList spn = theQuery.queryItemValue("spn").split(","); if (spn.count() != 2) return QString("Unsplit=\"%2\" (%1 elements)").arg(spn.count()).arg(theQuery.queryItemValue("spn")); + qreal spanLat = spn[0].toDouble(&parseOk); PARSE_ERROR(spn[0]); + qreal spanLon = spn[1].toDouble(&parseOk); PARSE_ERROR(spn[1]); + + setMinMax(lat-spanLat, lon-spanLon/2, lat+spanLat, lon+spanLon/2); + } else if (theUrl.host().contains("mapy.cz")) { + + qreal zoom = theQuery.queryItemValue("z").toInt(&parseOk); ARG_VALID(zoom); + qreal lat = theQuery.queryItemValue("y").toDouble(&parseOk); ARG_VALID(lat); + qreal lon = theQuery.queryItemValue("x").toDouble(&parseOk); ARG_VALID(lon); + + setLatLonZoom(lat, lon, zoom); + } else if (theUrl.toString().contains("/#map=")) { + // http://www.openstreetmap.org/#map=<zoom>/<lat>/<lon> + QRegExp rx("/#map=([0-9]+)/([0-9.]+)/([0-9.]+)$"); + if (rx.indexIn(theUrl.toString()) >= 0) { + qreal zoom = rx.cap(1).toUInt(&parseOk); PARSE_ERROR(rx.cap(1)); + qreal lat = rx.cap(2).toDouble(&parseOk); PARSE_ERROR(rx.cap(2)); + qreal lon = rx.cap(3).toDouble(&parseOk); PARSE_ERROR(rx.cap(3)); + + setLatLonZoom(lat, lon, zoom); + } + } else if (theUrl.toString().contains("/maps/@")) { + // https://www.google.de/maps/@<lat>,<lon>,<zoom>z + QRegExp rx("/maps/@([0-9.]+),([0-9.]+),([0-9.]+)z$"); + if (rx.indexIn(theUrl.toString()) >= 0) { + qreal lat = rx.cap(1).toDouble(&parseOk); PARSE_ERROR(rx.cap(1)); + qreal lon = rx.cap(2).toDouble(&parseOk); PARSE_ERROR(rx.cap(2)); + qreal zoom = rx.cap(3).toDouble(&parseOk); PARSE_ERROR(rx.cap(3)); + + setLatLonZoom(lat, lon, zoom); + } + } else if (theUrl.toString().startsWith("geo:")) { + // geo:<lat>,<lon>?z=<zoom> + QRegExp rx("^geo:([0-9.]+),([0-9.]+)"); + if (rx.indexIn(theUrl.toString()) >= 0) { + qreal lat = rx.cap(1).toDouble(&parseOk); PARSE_ERROR(rx.cap(1)); + qreal lon = rx.cap(2).toDouble(&parseOk); PARSE_ERROR(rx.cap(2)); + qreal zoom = 16; // default value + + rx.setPattern("\\?z=([0-9]+)$"); + if (rx.indexIn(theUrl.toString()) >= 0) + zoom = rx.cap(1).toUInt(&parseOk); PARSE_ERROR(rx.cap(1)); + + setLatLonZoom(lat, lon, zoom); + } + } +#undef theQuery + return QString("Unrecognised URL: %1").arg(theUrl.toString()); +} + +void OsmLink::parseShortUrl(QString code) +{ + // TWO_32 defined in terms of 1<<16 because 1L<<32 may overflow if long is only 32 bits + static const qreal TWO_32 = (double)(1<<16) * (double)(1<<16); + static const QByteArray possibleChar("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_@"); + int x = 0; + int y = 0; + int z = 0; + int z_offset = 0; + + QByteArray ar = code.toLatin1(); + for (int i=0; i<ar.size(); ++i) { + qint8 t = possibleChar.indexOf(ar.at(i)); + if (t == -1) + z_offset += 1; + else { + for (int j=0; j<3; ++j) { + x <<= 1; + if ((t & 32) != 0) + x |= 1; + t <<= 1; + + y <<= 1; + if ((t & 32) != 0) + y |= 1; + t <<= 1; + } + z += 3; + } + } + + x <<= (32 - z); + y <<= (32 - z); + + qreal lon = (x * 360. / TWO_32) - 180.; + qreal lat = (y * 180. / TWO_32) - 90.; + if (z_offset) + z_offset = (3 - (z_offset % 3)); + int zoom = z - 8 - z_offset; + + if (lon < -180.) lon += 360.; + if (lon > 180.) lon -= 360; + if (lat < -90.) lat += 180; + if (lat > 90.) lat -= 180; + + setLatLonZoom(lat, lon, zoom); +} + +void OsmLink::setLatLonZoom(qreal lat, qreal lon, int zoom) +{ + // Constrain zoom + if (zoom > 20) + zoom = 20; + if (zoom < 1) // probably a parse error; at least try + zoom = 15; + + /* term to calculate the angle from the zoom-value */ + qreal zoomLat = 360.0 / (double)(1 << zoom); + qreal zoomLon = zoomLat / fabs(cos(angToRad(lat))); + /* the following line is equal to the line above. (just for explanation) */ + //qreal zoomLon = zoomLat / aParent->view()->projection().latAnglePerM() * aParent->view()->projection().lonAnglePerM(angToRad(lat)); + + /* the OSM link contains the coordinates from the middle of the visible map so we have to add and sub zoomLon/zoomLat */ + setMinMax(lat-zoomLat, lon-zoomLon, lat+zoomLat, lon+zoomLon); +} + +void OsmLink::setMinMax(qreal bottom, qreal left, qreal top, qreal right) +{ + const qreal minwidth = 0.0001; + if (right-left < minwidth) { + left = (left + right - minwidth) / 2.0; + right = left + minwidth; + } + if (top-bottom < minwidth) { + top = (top + bottom + minwidth) / 2.0; + bottom = top - minwidth; + } + m_Box = CoordBox(Coord(left, bottom), Coord(right, top)); + m_IsValid = true; +} diff --git a/src/Utils/OsmLink.h b/src/Utils/OsmLink.h new file mode 100644 index 0000000..4c14177 --- /dev/null +++ b/src/Utils/OsmLink.h @@ -0,0 +1,27 @@ +#ifndef OSMLINK_H +#define OSMLINK_H + +#include <QUrl> + +#include "Coord.h" + +class OsmLink +{ +public: + OsmLink(QUrl url); + OsmLink(QString url); + + bool isValid() const { return m_IsValid; } + CoordBox getCoordBox() const { return m_Box; } + +private: + bool m_IsValid; + CoordBox m_Box; + + QString parseUrl(QUrl url); + void parseShortUrl(QString code); + void setLatLonZoom(qreal lat, qreal lon, int zoom); + void setMinMax(qreal bottom, qreal left, qreal top, qreal right); +}; + +#endif // OSMLINK_H diff --git a/src/Utils/PictureViewerDialog.cpp b/src/Utils/PictureViewerDialog.cpp new file mode 100644 index 0000000..43e7f9b --- /dev/null +++ b/src/Utils/PictureViewerDialog.cpp @@ -0,0 +1,71 @@ +// +// C++ Implementation: PictureViewerDialog +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "PictureViewerDialog.h" + +#include <QFileDialog> +#include <QFile> + +PictureViewerDialog::PictureViewerDialog(const QString& title, const QString &filename, QWidget *parent) + :QDialog(parent), m_filename(filename) +{ + setupUi(this); + + pixWidget->loadFile(filename); + setWindowTitle(title); +} + +PictureViewerDialog::PictureViewerDialog(const QString& title, const QPixmap& thePixmap, QWidget *parent) + :QDialog(parent) +{ + setupUi(this); + + pixWidget->setPixmap(thePixmap); + setWindowTitle(title); +} + +void PictureViewerDialog::on_buttonBox_clicked(QAbstractButton * button) +{ + if (buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) { + if (m_filename.endsWith("svg", Qt::CaseInsensitive)) { + QString s; + QFileDialog dlg(this, tr("Output filename"), QString("%1.svg").arg(tr("untitled")), tr("SVG files (*.svg)") + "\n" + tr("All Files (*)")); + dlg.setFileMode(QFileDialog::AnyFile); + dlg.setDefaultSuffix("svg"); + dlg.setAcceptMode(QFileDialog::AcceptSave); + + if (dlg.exec()) { + if (dlg.selectedFiles().size()) + s = dlg.selectedFiles()[0]; + } +// QString s = QFileDialog::getSaveFileName(this,tr("Output filename"),"",tr("SVG files (*.svg)")); + if (!s.isNull()) { + QFile(s).remove(); + QFile(m_filename).copy(s); + } + } else { + QString s; + QFileDialog dlg(this, tr("Output filename"), QString("%1.png").arg(tr("untitled")), tr("Image files (*.png *.jpg)") + "\n" + tr("All Files (*)")); + dlg.setFileMode(QFileDialog::AnyFile); + dlg.setDefaultSuffix("png"); + dlg.setAcceptMode(QFileDialog::AcceptSave); + + if (dlg.exec()) { + if (dlg.selectedFiles().size()) + s = dlg.selectedFiles()[0]; + } +// QString s = QFileDialog::getSaveFileName(this,tr("Output filename"),"",tr("Image files (*.png *.jpg)")); + if (!s.isNull()) { + pixWidget->pixmap()->save(s); + } + } + } +} diff --git a/src/Utils/PictureViewerDialog.h b/src/Utils/PictureViewerDialog.h new file mode 100644 index 0000000..804bc70 --- /dev/null +++ b/src/Utils/PictureViewerDialog.h @@ -0,0 +1,39 @@ +// +// C++ Interface: PictureViewerDialog +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef PICTUREVIEWERDIALOG_H +#define PICTUREVIEWERDIALOG_H + +#include <QWidget> + +#include <ui_PictureViewerDialog.h> + +class PictureViewerDialog: public QDialog , public Ui::PictureViewerDialog +{ + Q_OBJECT + +public: + PictureViewerDialog(const QString& title, const QString &filename, QWidget *parent=NULL); + PictureViewerDialog(const QString& title, const QPixmap& thePixmap, QWidget *parent=NULL); + +private: + QString m_filename; + +public slots: + void on_buttonBox_clicked(QAbstractButton * button); + +protected: + +private: + +}; + +#endif diff --git a/src/Utils/PictureViewerDialog.ui b/src/Utils/PictureViewerDialog.ui new file mode 100644 index 0000000..c3f9061 --- /dev/null +++ b/src/Utils/PictureViewerDialog.ui @@ -0,0 +1,55 @@ +<ui version="4.0" > + <class>PictureViewerDialog</class> + <widget class="QDialog" name="PictureViewerDialog" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>557</width> + <height>475</height> + </rect> + </property> + <property name="windowTitle" > + <string>Dialog</string> + </property> + <layout class="QVBoxLayout" > + <item> + <widget class="PixmapWidget" native="1" name="pixWidget" /> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox" > + <property name="standardButtons" > + <set>QDialogButtonBox::Close|QDialogButtonBox::Save</set> + </property> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>PixmapWidget</class> + <extends>QWidget</extends> + <header location="global" >PixmapWidget.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>PictureViewerDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel" > + <x>501</x> + <y>456</y> + </hint> + <hint type="destinationlabel" > + <x>453</x> + <y>476</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/Utils/PixmapWidget.cpp b/src/Utils/PixmapWidget.cpp new file mode 100644 index 0000000..07bee77 --- /dev/null +++ b/src/Utils/PixmapWidget.cpp @@ -0,0 +1,158 @@ +#include <QPixmap> +#include <QPainter> +#include <QWheelEvent> +#include <QSvgRenderer> + +#include "PixmapWidget.h" +#include "MerkaartorPreferences.h" + +PixmapWidget::PixmapWidget( QWidget *parent ) + : QWidget( parent ), m_pm(0), m_svgr(0), zoomFactor(1.0), done(false) +{ +} + +void PixmapWidget::loadFile( const QString &filename ) +{ + m_pm = new QPixmap( filename ); + // All that follows in not used, as QPixmap loads SVG + // but could be useful if we want to do a real SVG preview + if (m_pm->isNull()) { + SAFE_DELETE(m_pm); + m_svgr = new QSvgRenderer(filename, this); + if (m_svgr->isValid()) + SAFE_DELETE(m_svgr); + } + + if (!m_pm && m_svgr) { + m_pm = new QPixmap(width(), height()); + QPainter p(m_pm); + m_svgr->render(&p); + } +} + +void PixmapWidget::setPixmap( const QPixmap &aPix ) +{ + m_pm = new QPixmap( aPix ); +} + +QPixmap* PixmapWidget::pixmap() +{ + return m_pm; +} + +bool PixmapWidget::isPixmap() +{ + return (m_pm != NULL && m_svgr == NULL); +} + +bool PixmapWidget::isSvg() +{ + return (m_svgr != NULL); +} + +PixmapWidget::~PixmapWidget() +{ + delete m_pm; +} + +void PixmapWidget::setZoomFactor( qreal f ) +{ + if( f == zoomFactor ) + return; + + zoomFactor = f; + emit( zoomFactorChanged( zoomFactor ) ); + + update(); +} + +void PixmapWidget::paintEvent( QPaintEvent * /*anEvent*/ ) +{ + int xoffset, yoffset; + bool drawBorder = true; + + xoffset = Delta.x(); + yoffset = Delta.y(); + + QPainter p( this ); + p.setRenderHint(QPainter::Antialiasing); + p.save(); + p.translate( xoffset, yoffset ); + p.scale( zoomFactor, zoomFactor ); + p.drawPixmap( 0, 0, *m_pm ); + p.restore(); + if( drawBorder ) + { + p.setPen( Qt::black ); + p.drawRect( xoffset-1, yoffset-1, int(m_pm->width()*zoomFactor+1), int(m_pm->height()*zoomFactor+1) ); + } +} + +void PixmapWidget::wheelEvent( QWheelEvent *anEvent ) +{ + qreal f; + + f = zoomFactor + 0.001*anEvent->delta(); + if( f < 32.0/m_pm->width() ) + f = 32.0/m_pm->width(); + + + QPoint p = anEvent->pos() - Delta; + Delta -= (QPointF(p) / zoomFactor * f).toPoint() - p; + + setZoomFactor( f ); +} + +void PixmapWidget::mousePressEvent ( QMouseEvent * anEvent ) +{ + if ( + ((anEvent->buttons() & Qt::RightButton) && !M_PREFS->getMouseSingleButton()) || + ((anEvent->buttons() & Qt::LeftButton) && M_PREFS->getMouseSingleButton()) + ) + { + Panning = true; + LastPan = anEvent->pos(); + } +} + +void PixmapWidget::mouseReleaseEvent ( QMouseEvent * anEvent ) +{ + if ( + ((anEvent->buttons() & Qt::RightButton) && !M_PREFS->getMouseSingleButton()) || + ((anEvent->buttons() & Qt::LeftButton) && M_PREFS->getMouseSingleButton()) + ) + { + if (Panning) { + Panning = false; + } + } +} + +void PixmapWidget::mouseMoveEvent ( QMouseEvent * anEvent ) +{ + if ( + ((anEvent->buttons() & Qt::RightButton) && !M_PREFS->getMouseSingleButton()) || + ((anEvent->buttons() & Qt::LeftButton) && M_PREFS->getMouseSingleButton()) + ) + { + if (Panning) { + Delta += anEvent->pos() - LastPan; + LastPan = anEvent->pos(); + update(); + } + } +} + +void PixmapWidget::resizeEvent ( QResizeEvent * anEvent ) +{ + if (!done) { + qreal rd = (double)m_pm->width() / (double)m_pm->height(); + qreal rw = (double)width() / (double)height(); + zoomFactor = rd < rw ? (double)height() / (double)m_pm->height() : (double)width() / (double)m_pm->width(); + done = true; + Delta = QPointF(((double)width() - (double)m_pm->width() * zoomFactor) /2, ((double)height() - (double)m_pm->height()* zoomFactor) / 2).toPoint(); + } + + + QWidget::resizeEvent(anEvent); +} diff --git a/src/Utils/PixmapWidget.h b/src/Utils/PixmapWidget.h new file mode 100644 index 0000000..0912cac --- /dev/null +++ b/src/Utils/PixmapWidget.h @@ -0,0 +1,50 @@ +#ifndef PIXMAPWIDGET_H +#define PIXMAPWIDGET_H + +#include <QWidget> +#include <QString> + +class QPixmap; +class QSvgRenderer; + +class PixmapWidget : public QWidget +{ + Q_OBJECT + +public: + PixmapWidget( QWidget *parent=0 ); + ~PixmapWidget(); + + void loadFile( const QString &filename ); + void setPixmap( const QPixmap &aPix ); + QPixmap* pixmap(); + + bool isPixmap(); + bool isSvg(); + +public slots: + void setZoomFactor( qreal ); + +signals: + void zoomFactorChanged( qreal ); + +protected: + virtual void paintEvent( QPaintEvent* anEvent); + virtual void wheelEvent( QWheelEvent* anEvent); + virtual void resizeEvent ( QResizeEvent * anEvent ); + + virtual void mousePressEvent ( QMouseEvent * anEvent ) ; + virtual void mouseReleaseEvent ( QMouseEvent * anEvent ); + virtual void mouseMoveEvent ( QMouseEvent * anEvent ); + +private: + QPixmap *m_pm; + QSvgRenderer *m_svgr; + qreal zoomFactor; + bool Panning; + QPoint Delta; + QPoint FirstPan, LastPan; + bool done; +}; + +#endif // PIXMAPWIDGET_H diff --git a/src/Utils/ProjectionChooser.cpp b/src/Utils/ProjectionChooser.cpp new file mode 100644 index 0000000..71abff4 --- /dev/null +++ b/src/Utils/ProjectionChooser.cpp @@ -0,0 +1,129 @@ +#include "ProjectionChooser.h" +#include "ui_ProjectionChooser.h" + +#ifndef NO_PREFS +#include "MerkaartorPreferences.h" +#endif + +#include "ogrsf_frmts.h" + +#include <QMessageBox> + +ProjectionChooser::ProjectionChooser(QWidget *parent) : + QDialog(parent), + ui(new Ui::ProjectionChooser) +{ + ui->setupUi(this); +} + +ProjectionChooser::~ProjectionChooser() +{ + delete ui; +} + +QString ProjectionChooser::getProjection(QString title, bool bShowPredefined, QString initialProj, QWidget* parent) +{ + QString sPrj; + + ProjectionChooser* dlg = new ProjectionChooser(parent); + dlg->setWindowTitle(title); + +#ifndef NO_PREFS + if (bShowPredefined) { + int idx = 0, curIdx = 0; + foreach (ProjectionItem it, *M_PREFS->getProjectionsList()->getProjections()) { + if (it.deleted) + continue; + dlg->ui->cbPredefined->addItem(it.name, it.projection); + if (it.name.contains(":4326")) + curIdx = idx; + ++idx; + } + dlg->ui->cbPredefined->setCurrentIndex(curIdx); + dlg->ui->chkPredefined->setChecked(true); + } else { + dlg->ui->chkPredefined->setVisible(false); + dlg->ui->cbPredefined->setVisible(false); + } +#else + Q_UNUSED(bShowPredefined); + dlg->ui->chkPredefined->setVisible(false); + dlg->ui->cbPredefined->setVisible(false); +#endif + + if (!initialProj.isEmpty()) { + if (initialProj.startsWith("+proj")) { + dlg->ui->txtCustom->setText(initialProj); + dlg->ui->chkCustom->setChecked(true); + } else if (initialProj.startsWith("PROJCS")) { + dlg->ui->txWkt->setPlainText(initialProj); + dlg->ui->chkWkt->setChecked(true); + } + } + + dlg->adjustSize(); + + if (dlg->exec() == QDialog::Accepted) { + if (dlg->ui->chkPredefined->isChecked()) + sPrj = dlg->ui->cbPredefined->itemData(dlg->ui->cbPredefined->currentIndex()).toString(); + else if (dlg->ui->chkStandard->isChecked()) { + sPrj = dlg-> ui->txtStandard->text().trimmed(); + bool ok; + int iEpsg = sPrj.toInt(&ok); + if (ok) { + sPrj = "EPSG:" + sPrj; + + OGRSpatialReference *poSRS; + poSRS = new OGRSpatialReference(); + poSRS->importFromEPSG(iEpsg); + + char* cTheProj4; + if (poSRS->exportToProj4(&cTheProj4) != OGRERR_NONE) { + QMessageBox::critical(parent, tr("Error in WKT string"), tr("Cannot export to PROJ4 format")); + sPrj = QString(); + } else { + sPrj = QString(cTheProj4); + } + poSRS->Release(); + } + } else if (dlg->ui->chkWkt->isChecked()) { + OGRSpatialReference *poSRS; + poSRS = new OGRSpatialReference(); + QByteArray ba = dlg->ui->txWkt->toPlainText().toLatin1(); + char* pszInput = ba.data(); + char** ppszInput = &pszInput; + if (poSRS->importFromWkt((const char **)ppszInput) != OGRERR_NONE) { + if (poSRS->importFromESRI(ppszInput) != OGRERR_NONE) { + QMessageBox::critical(parent, tr("Error in WKT string"), tr("Invalid WKT string")); + poSRS->Release(); + sPrj = QString(); + } + } + poSRS->morphFromESRI(); + char* cTheProj4; + if (poSRS->exportToProj4(&cTheProj4) != OGRERR_NONE) { + QMessageBox::critical(parent, tr("Error in WKT string"), tr("Cannot export to PROJ4 format")); + sPrj = QString(); + } else { + sPrj = QString(cTheProj4); + } + poSRS->Release(); + } else + sPrj = dlg->ui->txtCustom->text().trimmed(); + } + + delete dlg; + return sPrj; +} + +void ProjectionChooser::changeEvent(QEvent *e) +{ + QDialog::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} diff --git a/src/Utils/ProjectionChooser.h b/src/Utils/ProjectionChooser.h new file mode 100644 index 0000000..966e509 --- /dev/null +++ b/src/Utils/ProjectionChooser.h @@ -0,0 +1,25 @@ +#ifndef PROJECTIONCHOOSER_H +#define PROJECTIONCHOOSER_H + +#include <QDialog> + +namespace Ui { + class ProjectionChooser; +} + +class ProjectionChooser : public QDialog { + Q_OBJECT +public: + ProjectionChooser(QWidget *parent = 0); + ~ProjectionChooser(); + + static QString getProjection(QString title=QString(), bool bShowPredefined=true, QString initialProj = QString(), QWidget* parent=0); + +protected: + void changeEvent(QEvent *e); + +private: + Ui::ProjectionChooser *ui; +}; + +#endif // PROJECTIONCHOOSER_H diff --git a/src/Utils/ProjectionChooser.ui b/src/Utils/ProjectionChooser.ui new file mode 100644 index 0000000..2da115b --- /dev/null +++ b/src/Utils/ProjectionChooser.ui @@ -0,0 +1,204 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ProjectionChooser</class> + <widget class="QDialog" name="ProjectionChooser"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>500</width> + <height>227</height> + </rect> + </property> + <property name="minimumSize"> + <size> + <width>500</width> + <height>0</height> + </size> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QRadioButton" name="chkPredefined"> + <property name="text"> + <string>Predefined</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QRadioButton" name="chkStandard"> + <property name="text"> + <string>Standard (EPSG:...)</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="txtStandard"/> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="cbPredefined"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>500</width> + <height>16777215</height> + </size> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QRadioButton" name="chkCustom"> + <property name="text"> + <string>Custom PROJ4(+proj=...)</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="txtCustom"/> + </item> + <item row="3" column="0"> + <widget class="QRadioButton" name="chkWkt"> + <property name="text"> + <string>WKT</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QTextEdit" name="txWkt"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>100</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>100</height> + </size> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>ProjectionChooser</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>266</x> + <y>217</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>ProjectionChooser</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>334</x> + <y>217</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>cbPredefined</sender> + <signal>currentIndexChanged(int)</signal> + <receiver>chkPredefined</receiver> + <slot>toggle()</slot> + <hints> + <hint type="sourcelabel"> + <x>239</x> + <y>29</y> + </hint> + <hint type="destinationlabel"> + <x>107</x> + <y>23</y> + </hint> + </hints> + </connection> + <connection> + <sender>txtStandard</sender> + <signal>textEdited(QString)</signal> + <receiver>chkStandard</receiver> + <slot>toggle()</slot> + <hints> + <hint type="sourcelabel"> + <x>395</x> + <y>81</y> + </hint> + <hint type="destinationlabel"> + <x>139</x> + <y>79</y> + </hint> + </hints> + </connection> + <connection> + <sender>txtCustom</sender> + <signal>textEdited(QString)</signal> + <receiver>chkCustom</receiver> + <slot>toggle()</slot> + <hints> + <hint type="sourcelabel"> + <x>384</x> + <y>55</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>53</y> + </hint> + </hints> + </connection> + <connection> + <sender>txWkt</sender> + <signal>textChanged()</signal> + <receiver>chkWkt</receiver> + <slot>toggle()</slot> + <hints> + <hint type="sourcelabel"> + <x>259</x> + <y>129</y> + </hint> + <hint type="destinationlabel"> + <x>60</x> + <y>135</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/Utils/RemoteControlServer.cpp b/src/Utils/RemoteControlServer.cpp new file mode 100644 index 0000000..52302eb --- /dev/null +++ b/src/Utils/RemoteControlServer.cpp @@ -0,0 +1,134 @@ +/****************************************************************************** + * Filename: RemoteControlServer.cpp + * + * Created: 2018/07/29 22:20 + * Author: Ladislav Láska + * e-mail: krakonos@krakonos.org + * + ******************************************************************************/ + +#include <QTcpSocket> +#include <QDateTime> + +#include "RemoteControlServer.hpp" + +using namespace Merkaartor; +using namespace Merkaartor::RemoteControlServerPriv; + +static QString date_time_rfc7231() { + const auto now = QDateTime::currentDateTimeUtc(); + + //generate format string to format UTC timestamp similar to + //"Sun, 06 Nov 1994 08:49:37 GMT" + //use *non-localized* names for day & month. + + QString fmt_IMF_fixdate; + fmt_IMF_fixdate.reserve(35); + + switch(now.date().dayOfWeek()) { + case Qt::Monday: fmt_IMF_fixdate.append("'Mon'"); break; + case Qt::Tuesday: fmt_IMF_fixdate.append("'Tue'"); break; + case Qt::Wednesday: fmt_IMF_fixdate.append("'Wed'"); break; + case Qt::Thursday: fmt_IMF_fixdate.append("'Thu'"); break; + case Qt::Friday: fmt_IMF_fixdate.append("'Fri'"); break; + case Qt::Saturday: fmt_IMF_fixdate.append("'Sat'"); break; + case Qt::Sunday: fmt_IMF_fixdate.append("'Sun'"); break; + //other values are possible, so use localized name as fallback + default: fmt_IMF_fixdate.append("ddd"); break; + } + fmt_IMF_fixdate.append(", dd "); + switch(now.date().month()) { + case 1: fmt_IMF_fixdate.append("'Jan'"); break; + case 2: fmt_IMF_fixdate.append("'Feb'"); break; + case 3: fmt_IMF_fixdate.append("'Mar'"); break; + case 4: fmt_IMF_fixdate.append("'Apr'"); break; + case 5: fmt_IMF_fixdate.append("'May'"); break; + case 6: fmt_IMF_fixdate.append("'Jun'"); break; + case 7: fmt_IMF_fixdate.append("'Jul'"); break; + case 8: fmt_IMF_fixdate.append("'Aug'"); break; + case 9: fmt_IMF_fixdate.append("'Sep'"); break; + case 10: fmt_IMF_fixdate.append("'Oct'"); break; + case 11: fmt_IMF_fixdate.append("'Nov'"); break; + case 12: fmt_IMF_fixdate.append("'Dec'"); break; + //other values are possible, so use localized name as fallback + default: fmt_IMF_fixdate.append("MMM"); break; + } + fmt_IMF_fixdate.append(" yyyy HH:mm:ss 'GMT'"); + + return now.toString(fmt_IMF_fixdate); +}; + +void RemoteControlConnection::readyRead() { + qDebug() << "RemoteControlConnection: readyRead."; + if ( m_socket->canReadLine() ) { + qDebug() << "RemoteControlConnection: canReadLine."; + QString ln = m_socket->readLine(); + QStringList tokens = ln.split( QRegExp("[ \r\n][ \r\n]*"), QString::SkipEmptyParts ); + if ( tokens[0] == "GET" ) { + m_responseStream << "HTTP/1.1 200 OK\r\n"; + m_responseStream << "Date: " << date_time_rfc7231() << "\r\n"; + m_responseStream << "Server: Merkaartor RemoteControl\r\n"; + m_responseStream << "Content-type: text/plain\r\n"; + m_responseStream << "Access-Control-Allow-Origin: *\r\n"; + m_responseStream << "Content-length: 4\r\n\r\n"; + m_responseStream << "OK\r\n"; + m_responseStream << flush; + m_socket->disconnectFromHost(); + + qDebug() << "RemoteControlConnection: url read, response sent."; + emit requestReceived(tokens[1]); + } + } +} + +RemoteControlConnection::RemoteControlConnection( QTcpSocket *socket ) + : m_socket(socket), m_responseStream(socket) +{ + connect( m_socket, &QTcpSocket::readyRead, this, &RemoteControlConnection::readyRead); + connect( m_socket, &QTcpSocket::disconnected, m_socket, &QTcpSocket::deleteLater ); + connect( m_socket, &QTcpSocket::destroyed, this, &QObject::deleteLater ); +} + + +RemoteControlServer::RemoteControlServer( QObject* parent ) + :QObject(parent) +{ + m_tcpServer = new QTcpServer(this); + connect(m_tcpServer, &QTcpServer::newConnection, this, &RemoteControlServer::newConnection ); +} + +void RemoteControlServer::newConnection() { + QTcpSocket *socket = m_tcpServer->nextPendingConnection(); + if (socket == nullptr) { + qDebug() << "RemoteControlServer::newConnection invoked, but no connection is pending."; + return; + } + /* The RemoteControlconnection will handle it's own destruction when the connection is broken. */ + auto connHandler = new RemoteControlConnection(socket); + /* Note: + * Qt::QueuedConnection is a workaround for a problem hit in issue #147. + * When this signal is called, it triggers a long sequence of events, some + * of them opening it's own QEventLoop (dialogs). This seems to cause + * issues in deleting the RemoteControlConnection objects, specifically the + * QTcpSocket inside is destroyed, and after that a signal is called on it. + * This seems to be a bug in Qt, as we correctly use deleteLater(). + * However, there might be more to it, as I have been unable to put + * together a minimal testcase. + * + * For now, we make sure the main EventLoop is executing the download + * dialogs and hopefully avoid this problem. + */ + connect( connHandler, &RemoteControlConnection::requestReceived, + this, [this](QString requestUrl) { emit requestReceived(requestUrl); }, Qt::QueuedConnection); + +} + +void RemoteControlServer::listen() { + if (!m_tcpServer->listen( QHostAddress::LocalHost, 8111 )) { + qWarning() << "Unable to open port localhost:8111: " << m_tcpServer->errorString(); + } +} + +void RemoteControlServer::close() { + m_tcpServer->close(); +} diff --git a/src/Utils/RemoteControlServer.hpp b/src/Utils/RemoteControlServer.hpp new file mode 100644 index 0000000..ed81b71 --- /dev/null +++ b/src/Utils/RemoteControlServer.hpp @@ -0,0 +1,77 @@ +/****************************************************************************** + * Filename: RemoteControlServer.hpp + * + * Created: 2018/07/29 22:08 + * Author: Ladislav Láska + * e-mail: krakonos@krakonos.org + * + ******************************************************************************/ + +#ifndef __REMOTECONTROLSERVER_HPP__ +#define __REMOTECONTROLSERVER_HPP__ + +#include <QObject> +#include <QTcpServer> + + +namespace Merkaartor { +namespace RemoteControlServerPriv { + +/** + * Instance is spawned for each connection to the remote control port. Once a + * request is received, it emits requestReceived signal and closes the + * connection gracefully. + * + * This object shall not be used outside of RemoteControlServer. The server + * proxies the requestReceived() signal. + * + * The object destroys itself after the connection is closed. + */ +class RemoteControlConnection : public QObject { + Q_OBJECT + public: + RemoteControlConnection( QTcpSocket *socket ); + public slots: + void readyRead(); + signals: + void requestReceived(QString requestUrl); + private: + QTcpSocket* m_socket; + QTextStream m_responseStream; +}; + +} + +class RemoteControlServer : public QObject { + Q_OBJECT + + public: + RemoteControlServer(QObject* parent = nullptr); + + /** Start listening for remote requests. Request is automatically + * accepted and appropriate requestReceived signal is emitted. This + * includes invalid requests as well. */ + void listen(); + + /** + * Close the port and stop listening. No further requests will be + * received, but pending connections might still trigger events. */ + void close(); + + signals: + /** + * Emitted every time a new remote control request is received. + */ + void requestReceived(QString requestUrl); + + private slots: + /** Internal slot to handle incoming TCP connections. */ + void newConnection(); + + private: + QTcpServer* m_tcpServer; +}; + +} /* namespace Merkaartor */ + +#endif diff --git a/src/Utils/SelectionDialog.cpp b/src/Utils/SelectionDialog.cpp new file mode 100644 index 0000000..5959371 --- /dev/null +++ b/src/Utils/SelectionDialog.cpp @@ -0,0 +1,115 @@ +// +// C++ Implementation: SelectionDialog +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "Global.h" + +#include "SelectionDialog.h" +#include "MainWindow.h" +#include "Document.h" + +#include <QCompleter> + +SelectionDialog::SelectionDialog(QWidget *parent, bool showMaxResult) + : QDialog(parent) +{ + setupUi(this); + if (!showMaxResult) + widgetMaxResult->setVisible(false); + + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint); + + cbKey->setInsertPolicy(QComboBox::InsertAlphabetically); + cbValue->setInsertPolicy(QComboBox::InsertAlphabetically); + + QStringList ksl = g_getTagKeyList(); + QCompleter* completer = new QCompleter(ksl, (QObject *)this); + + cbKey->insertItems(-1, ksl); + //special keys + cbKey->insertItem(-1, ":zoomlevel"); + cbKey->insertItem(-1, ":version"); + cbKey->insertItem(-1, ":user"); + cbKey->insertItem(-1, ":uploaded"); + cbKey->insertItem(-1, ":time"); + cbKey->insertItem(-1, ":pixelperm"); + cbKey->insertItem(-1, ":dirty"); + cbKey->insertItem(-1, ":id"); + + completer->setCompletionMode(QCompleter::InlineCompletion); + completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel); + cbKey->setCompleter(completer); + cbKey->setEditable(true); + + + cbValue->insertItems(-1, g_getTagValueList("*")); + //special values + cbValue->insertItem(-1, "_NULL_"); + + cbValue->setEditable(true); + + edName->setText(M_PREFS->getLastSearchName()); + cbKey->setEditText(M_PREFS->getLastSearchKey()); + cbValue->setEditText(M_PREFS->getLastSearchValue()); + sbMaxResult->setValue(M_PREFS->getLastMaxSearchResults()); + edTagQuery->setText(M_PREFS->getLastSearchTagSelector()); +} + +SelectionDialog::~SelectionDialog() +{ +} + +void SelectionDialog::on_cbKey_editTextChanged(const QString & text) +{ + cbValue->clear(); + + QStringList sl = g_getTagValueList(text); + QCompleter* completer = new QCompleter(sl, (QObject *)this); + cbValue->insertItems(-1, g_getTagValueList(text)); + cbValue->insertItem(-1, "_NULL_"); + completer->setCompletionMode(QCompleter::InlineCompletion); + completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel); + if (cbValue->completer()) + delete cbValue->completer(); + cbValue->setCompleter(completer); + + edTagQuery->setText("[" + text + "] = " + cbValue->currentText()); + +} + +void SelectionDialog::on_cbValue_editTextChanged(const QString & text) +{ + if (!cbKey->currentText().isEmpty()) + edTagQuery->setText("[" + cbKey->currentText() + "] = " + text); + else + edTagQuery->setText("[*] = " + text); +} + +void SelectionDialog::on_edName_textChanged(const QString &text) +{ + edTagQuery->setText("[name] = *" + text + "*"); +} + +void SelectionDialog::on_edID_textChanged(const QString &text) +{ + edTagQuery->setText("[:id] = " + text); +} + +void SelectionDialog::on_buttonBox_accepted() +{ + M_PREFS->setLastSearchName(edName->text()); + M_PREFS->setLastSearchKey(cbKey->currentText()); + M_PREFS->setLastSearchValue(cbValue->currentText()); + M_PREFS->setLastMaxSearchResults(sbMaxResult->value()); + M_PREFS->setLastSearchTagSelector(edTagQuery->text()); + + emit accept(); +} diff --git a/src/Utils/SelectionDialog.h b/src/Utils/SelectionDialog.h new file mode 100644 index 0000000..5ba72fb --- /dev/null +++ b/src/Utils/SelectionDialog.h @@ -0,0 +1,42 @@ +// +// C++ Interface: SelectionDialog +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef SELECTIONDIALOG_H +#define SELECTIONDIALOG_H + +#include <QDialog> +#include <ui_SelectionDialog.h> + +/** + @author cbro <cbro@semperpax.com> +*/ +class SelectionDialog : public QDialog, public Ui::SelectionDialog +{ + Q_OBJECT + +public: + SelectionDialog(QWidget *parent = 0, bool showMaxResult=true); + ~SelectionDialog(); + +private slots: + void on_cbKey_editTextChanged(const QString & text); + void on_cbValue_editTextChanged(const QString & text); + + void on_edName_textChanged(const QString& text); + void on_edID_textChanged(const QString& text); + + void on_buttonBox_accepted(); + +private: + QString getOp(); +}; + +#endif diff --git a/src/Utils/SelectionDialog.ui b/src/Utils/SelectionDialog.ui new file mode 100644 index 0000000..e8c32a8 --- /dev/null +++ b/src/Utils/SelectionDialog.ui @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>SelectionDialog</class> + <widget class="QDialog" name="SelectionDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>511</width> + <height>246</height> + </rect> + </property> + <property name="windowTitle"> + <string>Selection</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <layout class="QGridLayout"> + <property name="spacing"> + <number>0</number> + </property> + <item row="2" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Key</string> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Value</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="label_3"> + <property name="maximumSize"> + <size> + <width>50</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string>=</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Name</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLineEdit" name="edName"/> + </item> + <item row="3" column="0"> + <widget class="QComboBox" name="cbKey"/> + </item> + <item row="3" column="2"> + <widget class="QComboBox" name="cbValue"/> + </item> + <item row="4" column="0" colspan="3"> + <widget class="Line" name="line"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLineEdit" name="edID"/> + </item> + <item row="0" column="2"> + <widget class="QLabel" name="label_6"> + <property name="text"> + <string>Id</string> + </property> + </widget> + </item> + <item row="5" column="0"> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>Query</string> + </property> + </widget> + </item> + <item row="6" column="0" colspan="3"> + <widget class="QLineEdit" name="edTagQuery"/> + </item> + </layout> + </item> + <item> + <widget class="QWidget" name="widgetMaxResult" native="true"> + <layout class="QFormLayout" name="formLayout"> + <property name="margin"> + <number>0</number> + </property> + <item row="0" column="0"> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Maximum returned results (0 for all)</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <layout class="QFormLayout" name="layoutMaxResult"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::AllNonFixedFieldsGrow</enum> + </property> + <item row="0" column="0"> + <widget class="QSpinBox" name="sbMaxResult"> + <property name="minimum"> + <number>0</number> + </property> + <property name="maximum"> + <number>99999</number> + </property> + <property name="value"> + <number>999</number> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>buttonBox</tabstop> + <tabstop>edName</tabstop> + <tabstop>edID</tabstop> + <tabstop>cbKey</tabstop> + <tabstop>cbValue</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>SelectionDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>325</x> + <y>188</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/Utils/ShortcutOverrideFilter.cpp b/src/Utils/ShortcutOverrideFilter.cpp new file mode 100644 index 0000000..786a1f8 --- /dev/null +++ b/src/Utils/ShortcutOverrideFilter.cpp @@ -0,0 +1,69 @@ +// +// C++ Implementation: ShortcutOverrideFilter +// +// Description: Provide an event filter usable via installEventFilter +// that will veto specified application shortcut sequences +// for the target allowing it to handle them as it normally +// would if they weren't bound to a shortcut. +// +// Author: Travers Carter <tcarter@noggin.com.au>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// + +#include "ShortcutOverrideFilter.h" + +#include <QWidget> +#include <QLineEdit> +#include <QComboBox> +#include <QEvent> +#include <QKeyEvent> + +#include "TagTemplate.h" + + +ShortcutOverrideFilter::ShortcutOverrideFilter() { +} + +ShortcutOverrideFilter::~ShortcutOverrideFilter() {} + +void ShortcutOverrideFilter::addOverride(const QString &key) { + overrides.append(QKeySequence(key)); +} + +void ShortcutOverrideFilter::addOverride(int key) { + overrides.append(QKeySequence(key)); +} + +bool ShortcutOverrideFilter::eventFilter(QObject* object, QEvent* event) { + QWidget* widget = qobject_cast<QWidget*>(object); + int i; + if (!widget) + return false; + + // If a key sequence is bound to a shortcut, Qt dispatches a ShortcutOverride + // event event instead of a KeyPress, if it is handled, then the normal keypress + // event will follow, otherwise the shortcut is activated + if (event->type() == QEvent::ShortcutOverride) { + QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); + QKeySequence pressed(keyEvent->key() + keyEvent->modifiers()); + + if (keyEvent->key() == Qt::Key_Escape) { + if (widget->hasFocus()) { + if (qobject_cast<QLineEdit*>(object) || qobject_cast<QComboBox*>(object)) { + event->accept(); + return true; + } + } + } else { + for (i=0; i<overrides.size(); i++) { + if (pressed == overrides.at(i)) { + event->accept(); + return true; + } + } + } + } + return false; +} + diff --git a/src/Utils/ShortcutOverrideFilter.h b/src/Utils/ShortcutOverrideFilter.h new file mode 100644 index 0000000..4e9d6ef --- /dev/null +++ b/src/Utils/ShortcutOverrideFilter.h @@ -0,0 +1,29 @@ +#ifndef SHORTCUTOVERRIDEFILTER_H +#define SHORTCUTOVERRIDEFILTER_H + +#include <QObject> +#include <QEvent> +#include <QList> +#include <QKeySequence> + +/** + @author Travers Carter <tcarter@noggin.com.au> +*/ +class ShortcutOverrideFilter : public QObject +{ +Q_OBJECT +public: + ShortcutOverrideFilter(); + ~ShortcutOverrideFilter(); + + void addOverride(const QString &key); + void addOverride(int key); + bool eventFilter(QObject* object, QEvent* event); + + +private: + QList<QKeySequence> overrides; + +}; + +#endif diff --git a/src/Utils/SlippyMapWidget.cpp b/src/Utils/SlippyMapWidget.cpp new file mode 100644 index 0000000..8db23d4 --- /dev/null +++ b/src/Utils/SlippyMapWidget.cpp @@ -0,0 +1,513 @@ +#include "SlippyMapWidget.h" + +#include <QFile> +#include <QApplication> +#include <QPainter> +#include <QPixmap> +#include <QWheelEvent> +#include <QMenu> + +#include <math.h> + +#include "MerkaartorPreferences.h" + +#define TILESIZE 256 +#define MINZOOMLEVEL 0 +#define MAXZOOMLEVEL 19 + + +/* SLIPPYMAPWIDGET */ + +class SlippyMapWidgetPrivate +{ + public: + SlippyMapWidgetPrivate(SlippyMapWidget* w) + : theWidget(w), InDrag(false), InSelection(false) + { + Sets = M_PREFS->getQSettings(); + Sets->beginGroup("SlippyMapWidget"); + Lat = Sets->value("Lat", 1).toDouble(); + Lon = Sets->value("Lon", 1).toDouble(); + Zoom = Sets->value("Zoom", 1).toInt(); + Sets->endGroup(); + VpLat = Lat; + VpLon = Lon; + VpZoom = Zoom; + } + ~SlippyMapWidgetPrivate() + { + Sets->beginGroup("SlippyMapWidget"); + Sets->setValue("Lat", Lat); + Sets->setValue("Lon", Lon); + Sets->setValue("Zoom", Zoom); + Sets->endGroup(); + } + + QPixmap* getImage(int x, int y); + void newData(int x, int y, int zoom); + + SlippyMapWidget* theWidget; + int Zoom, VpZoom; + qreal Lat,Lon, VpLat, VpLon; + QPoint PreviousDrag; + /* Used only during selection */ + bool InSelection; + QPoint SelectionStart, SelectionEnd; + + /* Current selection in coordinates */ + QRectF CurrentSelectionCoord; + + bool InDrag; + QSettings* Sets; +}; + +QPixmap* SlippyMapWidgetPrivate::getImage(int x, int y) +{ + int Max = 1 << Zoom; + if (x<0 || x>=Max) return 0; + if (y<0 || y>=Max) return 0; + QPixmap* img = theWidget->theSlippyCache->getImage(x,y,Zoom); + if (img) return img; + img = new QPixmap(TILESIZE,TILESIZE); + QPainter Painter(img); + Painter.setPen(QColor(0,0,0)); + Painter.fillRect(0,0,TILESIZE-1,TILESIZE-1,QColor(255,255,255)); + Painter.drawRect(0,0,TILESIZE-1,TILESIZE-1); + Painter.drawText(10,TILESIZE/2,(QApplication::translate("Downloader","Downloading %1,%2 (zoom %3)...")).arg(x).arg(y).arg(Zoom)); + return img; +} + +void SlippyMapWidgetPrivate::newData(int, int, int) +{ + theWidget->update(); +} + +SlippyMapWidget::SlippyMapWidget(QWidget* aParent) +: QWidget(aParent) +{ + p = new SlippyMapWidgetPrivate(this); + theSlippyCache->setMap(p); + resize(500,400); +} + +SlippyMapWidget::~SlippyMapWidget(void) +{ + theSlippyCache->setMap(0); + delete p; +} + +/* http://wiki.openstreetmap.org/index.php/Slippy_map_tilenames#C.2FC.2B.2B */ +static qreal tile2lon(qreal x, int z) +{ + return x / pow(2.0, z) * 360.0 - 180; +} + +/* http://wiki.openstreetmap.org/index.php/Slippy_map_tilenames#C.2FC.2B.2B */ +static qreal tile2lat(qreal y, int z) +{ + qreal n = M_PI - 2.0 * M_PI * y / pow(2.0, z); + return 180.0 / M_PI * atan(0.5 * (exp(n) - exp(-n))); +} + +static int long2tile(qreal lon, int z) +{ + return (int)(floor((lon + 180.0) / 360.0 * pow(2.0, z))); +} + +static int lat2tile(qreal lat, int z) +{ + return (int)(floor((1.0 - log( tan(lat * M_PI/180.0) + 1.0 / cos(lat * M_PI/180.0)) / M_PI) / 2.0 * pow(2.0, z))); +} + +static qreal long2tileF(qreal lon, int z) +{ + return (lon + 180.0) / 360.0 * pow(2.0, z); +} + +static qreal lat2tileF(qreal lat, int z) +{ + return (1.0 - log( tan(lat * M_PI/180.0) + 1.0 / cos(lat * M_PI/180.0)) / M_PI) / 2.0 * pow(2.0, z); +} + + +QRectF SlippyMapWidget::selectedArea() +{ + if (p->CurrentSelectionCoord.isNull()) + makeSelection(QRect(0,0,width(),height())); + return p->CurrentSelectionCoord; +} + +void SlippyMapWidget::setViewportArea(QRectF theRect) +{ + qreal zoom = 360.0 / theRect.width(); + zoom = log10(zoom)/log10(2.0); + if (zoom < MINZOOMLEVEL) + zoom = MINZOOMLEVEL; + if (zoom > MAXZOOMLEVEL) + zoom = MAXZOOMLEVEL; + p->VpZoom = int(zoom); + + p->VpLon = long2tile(theRect.topRight().x(), p->VpZoom); + p->VpLat = lat2tile(theRect.topRight().y(), p->VpZoom); +} + +void SlippyMapWidget::paintEvent(QPaintEvent*) +{ + QPainter Painter(this); + Painter.fillRect(QRect(0,0,width(),height()),QColor(255,255,255)); + int LonRect = int(floor(p->Lon)); + int LonPixel = int(-(p->Lon - LonRect ) * TILESIZE + width()/2); + int LatRect = int(floor(p->Lat)); + int LatPixel = int(-(p->Lat - LatRect ) * TILESIZE + height()/2); + + while (LatPixel > 0) + LatPixel -=TILESIZE, --LatRect; + while (LonPixel > 0) + LonPixel -= TILESIZE, --LonRect; + + for (int x=LonPixel; x<width(); x += TILESIZE) + for (int y=LatPixel; y<height(); y+= TILESIZE) + { + int ThisLonRect = LonRect + (x-LonPixel)/TILESIZE; + int ThisLatRect = LatRect + (y-LatPixel)/TILESIZE; + QPixmap* img = p->getImage(ThisLonRect,ThisLatRect); + if (img) + Painter.drawPixmap(x,y,*img); + delete img; + } + Painter.setPen(QPen(Qt::NoPen)); + Painter.setBrush(QBrush(QColor(255,255,255,128))); + Painter.drawRect(width()-21,0,20,20); + Painter.drawRect(width()-21,height()-21,20,20); + Painter.drawRect(width()-21,(height()/2)-10,20,20); + + + Painter.setBrush(QBrush(QColor(0,0,0))); + Painter.drawRect(width()-19,8,16,4); + Painter.drawRect(width()-19,height()-13,16,4); + Painter.drawRect(width()-13,height()-19,4,16); + + Painter.setFont(QFont("Times", 19, QFont::Bold)); + Painter.setPen(QPen(Qt::black, 3)); + Painter.setBrush(Qt::NoBrush); + Painter.drawText(QPoint(width()-21,(height()/2)+10), "V"); + + if (p->InSelection) { + Painter.setPen(QPen(Qt::blue, 1, Qt::DashLine)); + Painter.drawRect(QRect(p->SelectionStart, p->SelectionEnd)); + } else if (!p->CurrentSelectionCoord.isNull()) { + Painter.setPen(QPen(Qt::blue, 1)); + QPoint topLeft = coord2relative(p->CurrentSelectionCoord.topLeft()); + QPoint bottomRight = coord2relative(p->CurrentSelectionCoord.bottomRight()); + Painter.drawRect(QRect(topLeft, bottomRight)); + } +} + +void SlippyMapWidget::ZoomTo(const QPoint & NewCenter, int NewZoom) +{ + if (NewZoom < MINZOOMLEVEL) + NewZoom = MINZOOMLEVEL; + if (NewZoom > MAXZOOMLEVEL) + NewZoom = MAXZOOMLEVEL; + if ((int)p->Zoom == NewZoom) + return; + + qreal dx = (NewCenter.x()-width()/2)/(TILESIZE*1.0); + qreal dy = (NewCenter.y()-height()/2)/(TILESIZE*1.0); + + p->Lon = (p->Lon + dx) * (1 << NewZoom) / (1 << p->Zoom) - dx; + p->Lat = (p->Lat + dy) * (1 << NewZoom) / (1 << p->Zoom) - dy; + p->Zoom = NewZoom; + normalizeCoordinates(); + update(); +} + +/* The Lat and Lon coordinates are in fact tile coordinates. The valid range for + * world is 0 to 2^zoom-1. Make sure it's so! + */ +void SlippyMapWidget::normalizeCoordinates(void) { + unsigned limit = (1 << p->Zoom); + if (p->Lon < 0) p->Lon = 0; + if (p->Lat < 0) p->Lat = 0; + if (p->Lon > limit) p->Lon = limit; + if (p->Lat > limit) p->Lat = limit; +} + +void SlippyMapWidget::wheelEvent(QWheelEvent* ev) +{ + int NewZoom = ev->delta()/120 + p->Zoom; + ZoomTo(ev->pos(), NewZoom); + emit redraw(); +} + +void SlippyMapWidget::mousePressEvent(QMouseEvent* ev) +{ + if (ev->button() == Qt::MiddleButton) { + on_resetViewAction_triggered(true); + } else if (ev->button() == Qt::LeftButton) { + if (ev->pos().x() > width()-20) + { + if (ev->pos().y() < 20) + { + ZoomTo(QPoint(width()/2,height()/2),p->Zoom-1); + emit redraw(); + return; + } + else if (ev->pos().y() > height()-20) + { + ZoomTo(QPoint(width()/2,height()/2),p->Zoom+1); + emit redraw(); + return; + } + else if ((ev->pos().y() > (height()/2)-20) && (ev->pos().y() < (height()/2))) + { + p->Lon = p->VpLon; + p->Lat = p->VpLat; + p->Zoom = p->VpZoom; + normalizeCoordinates(); + update(); + emit redraw(); + return; + } + } + + /* No special place, start selection */ + p->InSelection = true; + p->SelectionStart = p->SelectionEnd = ev->pos(); + qDebug() << "Enter selection"; + } else { + /* RightButton, start drag */ + p->PreviousDrag = ev->pos(); + p->InDrag = true; + } + emit redraw(); +} + +/* TODO: relative2coord could be split off this */ +void SlippyMapWidget::makeSelection(const QRect& relative) { + /* Compute viewport boundingbox */ + qreal X1 = p->Lon - (width()/2.0)/TILESIZE; + qreal Y1 = p->Lat - (height()/2.0)/TILESIZE; + qreal X2 = p->Lon + (width()/2.0)/TILESIZE; + qreal Y2 = p->Lat + (height()/2.0)/TILESIZE; + + /* Actual difference per pixel */ + qreal xpixel = (X2-X1)/width(); + qreal ypixel = (Y2-Y1)/height(); + + /* Shift the border according to relative */ + X1 += xpixel * relative.topLeft().x(); + Y1 += ypixel * relative.topLeft().y(); + X2 -= xpixel * (width() - relative.bottomRight().x()); + Y2 -= ypixel * (height() - relative.bottomRight().y()); + + qreal Lon1 = tile2lon(X1, p->Zoom); + qreal Lat1 = tile2lat(Y1, p->Zoom); + + qreal Lon2 = tile2lon(X2, p->Zoom); + qreal Lat2 = tile2lat(Y2, p->Zoom); + + /* Save the selection */ + p->CurrentSelectionCoord = QRectF(Lon1, Lat2, Lon2-Lon1, Lat1-Lat2); + + qDebug() << "Selection rectangle: " << p->CurrentSelectionCoord; +} + +/* Convert absolute coordinates to relative (to the widget) */ +QPoint SlippyMapWidget::coord2relative(const QPointF& coord) const { + /* Convert into local coordinate */ + qreal X = long2tileF(coord.x(), p->Zoom); + qreal Y = lat2tileF(coord.y(), p->Zoom); + + /* p->Lon and p->Lat are the center, but in the same units as X and Y. */ + X -= p->Lon; + Y -= p->Lat; + + /* Now, the p->Lon and p->Lat is equal to width()/2 and height()/2, and X + * and Y are the distance in multiples of TILESIZE */ + QPoint pt(X*TILESIZE, Y*TILESIZE); + + /* Finally shift it relative to topLeft */ + return pt+QPoint(width()/2, height()/2); +} + +void SlippyMapWidget::mouseReleaseEvent(QMouseEvent*) +{ + if (p->InSelection) { + QRect SelectionRect(p->SelectionStart, p->SelectionEnd); + if (SelectionRect.width() && SelectionRect.height()) { + makeSelection(SelectionRect); + update(); + emit redraw(); + } else { + /* Default to full viewport */ + makeSelection(QRect(0, 0, width(), height())); + } + } + p->InDrag = false; + p->InSelection = false; +} + +void SlippyMapWidget::mouseMoveEvent(QMouseEvent* ev) +{ + if (p->InDrag) { + QPoint Delta = ev->pos()-p->PreviousDrag; + if (!Delta.isNull()) + { + p->Lon -= Delta.x()/(TILESIZE*1.); + p->Lat -= Delta.y()/(TILESIZE*1.); + p->PreviousDrag = ev->pos(); + update(); + emit redraw(); + } + } else if (p->InSelection) { + p->SelectionEnd = ev->pos(); + update(); + emit redraw(); + } +} + +void SlippyMapWidget::on_resetViewAction_triggered(bool) +{ + p->Lon = 1.0; + p->Lat = 1.0; + p->Zoom = 1; + update(); +} + +bool SlippyMapWidget::isDragging() +{ + return p->InDrag; +} + + +/* SLIPPYMAPCACHE */ + +SlippyMapCache::SlippyMapCache() +: QObject(0), DownloadReply(0), DownloadBusy(false), theMap(0) +{ + baseUrl.setUrl("http://tile.openstreetmap.org"); + Download.setProxy(M_PREFS->getProxy(baseUrl)); + + connect(&Download,SIGNAL(finished(QNetworkReply*)),this,SLOT(on_requestFinished(QNetworkReply*))); + + preload(Coord(0,0,0),":/Tiles/000.png"); + preload(Coord(0,0,1),":/Tiles/100.png"); + preload(Coord(0,1,1),":/Tiles/101.png"); + preload(Coord(1,0,1),":/Tiles/110.png"); + preload(Coord(1,1,1),":/Tiles/111.png"); +} + +void SlippyMapCache::setMap(SlippyMapWidgetPrivate* aMap) +{ + theMap = aMap; + int Use = 0; + for (QMap<Coord, QByteArray>::iterator i = Memory.begin(); i != Memory.end(); ++i) + Use += i.value().length(); + Dirties.clear(); +} + + +void SlippyMapCache::preload(const Coord& C, const QString& Filename) +{ + QFile f(Filename); + f.open(QIODevice::ReadOnly); + QByteArray ba(f.readAll()); + if (ba.length()) + Memory[C] = ba; +} + + +void SlippyMapCache::on_requestFinished(QNetworkReply *reply) +{ + if (reply->error() != QNetworkReply::NoError) { + qWarning() << "SlippyMap: Finished with error code " << reply->error() << ": " << reply->errorString(); + } + if (reply == DownloadReply) + { + DownloadBusy = false; + if (!reply->error()) + { + Memory[DownloadCoord] = reply->readAll(); + if (theMap) + theMap->newData(DownloadCoord.X,DownloadCoord.Y,DownloadCoord.Zoom); + QMap<Coord,QByteArray>::iterator i = Dirties.find(DownloadCoord); + if (i != Dirties.end()) + Dirties.erase(i); + } + } +} + +QPixmap* SlippyMapCache::getImage(int x, int y, int Zoom) +{ + Coord C; + C.X = x; + C.Y = y; + C.Zoom = Zoom; + QMap<Coord,QByteArray>::iterator i = Memory.find(C); + if (i == Memory.end()) + { + addToQueue(C); + return getDirty(x,y,Zoom); + } + QPixmap* img = new QPixmap; + img->loadFromData(i.value()); + return img; +} + +QPixmap* SlippyMapCache::getDirty(int x, int y, int Zoom) +{ + if (Zoom == MINZOOMLEVEL) return 0; + QMap<Coord,QByteArray>::iterator i = Dirties.find(Coord(x,y,Zoom)); + if (i != Dirties.end()) + { + QPixmap* img = new QPixmap; + img->loadFromData(i.value()); + return img; + } + QPixmap* img = getImage(x/2,y/2,Zoom-1); + if (!img) return 0; + QPixmap* pm = new QPixmap(img->copy((x%2)*TILESIZE/2,(y%2)*TILESIZE/2,TILESIZE/2,TILESIZE/2).scaled(TILESIZE,TILESIZE)); + delete img; + QByteArray Data; + QBuffer Buffer(&Data); + Buffer.open(QIODevice::WriteOnly); + pm->save(&Buffer,"PNG"); + Coord C(x,y,Zoom); + Dirties[C] = Data; + return pm; +} + +void SlippyMapCache::addToQueue(const Coord& C) +{ + for (int i=Queue.size(); i; --i) + if (Queue[i-1].Zoom != C.Zoom) + Queue.erase(Queue.begin()+(i-1)); + Queue.push_back(C); + startDownload(); +} + +void SlippyMapCache::startDownload() +{ + if (Queue.empty()) return; + if (DownloadBusy) return; + while (Queue.size()) + { + QMap<Coord,QByteArray>::iterator i = Memory.find(Queue[0]); + if (i == Memory.end()) + { + DownloadBusy = true; + DownloadCoord = Queue[0]; + Queue.erase(Queue.begin()); + QUrl reqUrl(baseUrl); + reqUrl.setPath(QString("/%1/%2/%3.png").arg(DownloadCoord.Zoom).arg(DownloadCoord.X).arg(DownloadCoord.Y)); + //qDebug() << "Starting download with url:" << reqUrl; + QNetworkRequest req(reqUrl); + req.setRawHeader(QByteArray("User-Agent"), USER_AGENT.toLatin1()); + DownloadReply = Download.get(req); + return; + } + Queue.erase(Queue.begin()); + } +} + diff --git a/src/Utils/SlippyMapWidget.h b/src/Utils/SlippyMapWidget.h new file mode 100644 index 0000000..1f9d7bd --- /dev/null +++ b/src/Utils/SlippyMapWidget.h @@ -0,0 +1,94 @@ +#ifndef MERKAARTOR_SLIPPYMAPWIDGET_H_ +#define MERKAARTOR_SLIPPYMAPWIDGET_H_ + +#include <QtCore/QBuffer> +#include <QtCore/QByteArray> +#include <QWidget> +#include <QNetworkAccessManager> + +#include <QMap> +#include <QList> +#include <QUrl> + +class SlippyMapWidgetPrivate; + +class SlippyMapCache : public QObject +{ + Q_OBJECT + + struct Coord + { + Coord() : X(0), Y(0), Zoom(0) {} + Coord(int x, int y, int z) : X(x), Y(y), Zoom(z) {} + int X,Y,Zoom; + bool operator<(const Coord C) const + { + return (X<C.X) || + ( (X==C.X) && (Y<C.Y) ) || + ( (X==C.X) && (Y==C.Y) && (Zoom < C.Zoom) ); + } + }; + + public: + SlippyMapCache(); + + void setMap(SlippyMapWidgetPrivate* aMap); + + QPixmap* getImage(int x, int y, int Zoom); + QPixmap* getDirty(int x, int y, int Zoom); + private slots: + void on_requestFinished( QNetworkReply *reply); + private: + void addToQueue(const Coord& C); + void startDownload(); + void preload(const Coord& C, const QString& filename); + + QMap<Coord, QByteArray> Memory, Dirties; + QList<Coord> Queue; + QUrl baseUrl; + QNetworkAccessManager Download; + QByteArray DownloadData; + QBuffer DownloadBuffer; + QNetworkReply *DownloadReply; + Coord DownloadCoord; + bool DownloadBusy; + SlippyMapWidgetPrivate* theMap; +}; + +class SlippyMapWidget : public QWidget +{ + Q_OBJECT + + public: + SlippyMapWidget(QWidget* aParent); + ~SlippyMapWidget(); + + virtual void paintEvent(QPaintEvent* ev); + virtual void wheelEvent (QWheelEvent* ev ); + virtual void mousePressEvent(QMouseEvent* ev); + virtual void mouseMoveEvent(QMouseEvent* ev); + virtual void mouseReleaseEvent(QMouseEvent* ev); + + bool isDragging(); + + void setViewportArea(QRectF theRect); + QRectF selectedArea(); + + static SlippyMapCache* theSlippyCache; + + signals: + void redraw(); + + private: + SlippyMapWidgetPrivate* p; + void ZoomTo(const QPoint & NewCenter, int NewZoom); + void normalizeCoordinates(void); + void makeSelection(const QRect& relative); + QPoint coord2relative(const QPointF &coord) const; + + private slots: + virtual void on_resetViewAction_triggered(bool); +}; + +#endif + diff --git a/src/Utils/SvgCache.cpp b/src/Utils/SvgCache.cpp new file mode 100644 index 0000000..53749b7 --- /dev/null +++ b/src/Utils/SvgCache.cpp @@ -0,0 +1,35 @@ +#include "SvgCache.h" + +#include <QtCore/QMap> +#include <QtCore/QPair> +#include <QtGui/QPainter> +#include <QtSvg/QSvgRenderer> +#include <QFileInfo> +#include <QDebug> + +QImage* getSVGImageFromFile(const QString& aName, int Size) +{ + static QMap<QPair<QString, int>, QImage> Cache; + QPair<QString, int> Key(aName,Size); + if (!Cache.contains(Key)) + { + QFileInfo fi(aName); + if (fi.suffix().toUpper() == "SVG") { + if (!Size) + Size = 16; + QImage result(Size, Size, QImage::Format_ARGB32_Premultiplied); + result.fill(Qt::transparent); + QPainter p(&result); + QSvgRenderer Monet(aName); + Monet.render(&p,QRectF(0,0,Size,Size)); + Cache[Key] = result; + } else { + QImage result(aName); + if (Size) + result = result.scaledToWidth(Size); + Cache[Key] = result; + } + } + return &(Cache[Key]); +} + diff --git a/src/Utils/SvgCache.h b/src/Utils/SvgCache.h new file mode 100644 index 0000000..6d6c7be --- /dev/null +++ b/src/Utils/SvgCache.h @@ -0,0 +1,8 @@ +#ifndef MERKAARTOR_SVGCACHE_H_ +#define MERKAARTOR_SVGCACHE_H_ + +#include <QImage> + +QImage* getSVGImageFromFile(const QString& aName, int Size); + +#endif diff --git a/src/Utils/TagSelector.cpp b/src/Utils/TagSelector.cpp new file mode 100644 index 0000000..a49ed2a --- /dev/null +++ b/src/Utils/TagSelector.cpp @@ -0,0 +1,1167 @@ +#include "TagSelector.h" + +#include "IFeature.h" + +void skipWhite(const QString& Expression, int& idx) +{ + while (idx < Expression.length()) + if (Expression[idx] == ' ') + ++idx; + else + return; +} + +bool canParseSymbol(const QString& Expression, int& idx, char Symbol) +{ + skipWhite(Expression, idx); + if ((idx < Expression.length()) && (Expression[idx] == Symbol)) + { + ++idx; + return true; + } + return false; +} + +bool canParseString(const QString& Expression, int& idx, QString& Key) +{ + Key.clear(); + skipWhite(Expression,idx); + if (idx >= Expression.length()) + return false; + + if (Expression[idx] != '/' && Expression[idx] != '"') + return false; + Key += Expression[idx++]; + while (idx < Expression.length()) + { + if (Expression[idx] != '/' && Expression[idx] != '"') + Key += Expression[idx++]; + else + break; + } + if (Expression[idx] == '/' || Expression[idx] == '"') { + Key += Expression[idx++]; + return Key.length() > 0; + } + return false; +} + + +bool canParseValue(const QString& Expression, int& idx, QString& Key) +{ + Key.clear(); + skipWhite(Expression,idx); + if (idx >= Expression.length()) + return false; + + unsigned short opened =0; + if (Expression[idx] == '/' || Expression[idx] == '"') //Constants + return false; + while (idx < Expression.length()) + { + if ( ((Expression[idx] == '_') || (Expression[idx].isLetterOrNumber()) || (Expression[idx] == '-') /*|| (Expression[idx].isPunct())*/ || (Expression[idx] == '*') || (Expression[idx] == ':') || (Expression[idx] == '?')) + && ( (Expression[idx] != '[') && (Expression[idx] != ']') && (Expression[idx] != ',') && (Expression[idx] != '(')&& (Expression[idx] != ')')) ) + Key += Expression[idx++]; + else if ( Expression[idx] == '[' ) + { + opened++; + Key += Expression[idx++]; + } + else if ( Expression[idx] == ']' ) + { + if( opened == 0) break; + opened--; + Key += Expression[idx++]; + } + else + break; + } + return Key.length() > 0; +} + +bool canParseKey(const QString& Expression, int& idx, QString& Key) +{ + if (idx >= Expression.length()) + return false; + + if (!canParseSymbol(Expression,idx,'[')) + return false; + if (!canParseValue(Expression,idx,Key)) + return false; + canParseSymbol(Expression,idx,']'); + return true; +} + +bool canParseLiteral(const QString& Expression, int& idx, const QString& Literal) +{ + skipWhite(Expression,idx); + if (idx >= Expression.length()) + return false; + + if (Expression.indexOf(Literal, idx, Qt::CaseInsensitive) == idx) { + idx += Literal.length(); + return true; + } + return false; +} + +TagSelectorOperator* parseTagSelectorOperator(const QString& Expression, int& idx) +{ + QString Key, Oper, Value; + if ((!canParseKey(Expression, idx, Key)) && (!canParseValue(Expression, idx, Key))) + return 0; + + if (canParseLiteral(Expression, idx, "is")) + Oper = "="; + if (canParseLiteral(Expression, idx, "!=")) + Oper = "!="; + if (canParseSymbol(Expression, idx, '<')) + Oper = "<"; + if (canParseSymbol(Expression, idx, '>')) + Oper = ">"; + if (canParseLiteral(Expression, idx, "<=")) + Oper = "<="; + if (canParseLiteral(Expression, idx, ">=")) + Oper = ">="; + if (canParseSymbol(Expression, idx, '=')) + Oper = "="; + if (Oper.isNull()) + return 0; + + if (!canParseString(Expression, idx, Value) && !canParseValue(Expression, idx, Value)) + return 0; + return new TagSelectorOperator(Key, Oper, Value); +} + +TagSelectorTypeIs* parseTagSelectorTypeIs(const QString& Expression, int& idx) +{ + if (canParseLiteral(Expression, idx, "node")) + return new TagSelectorTypeIs("node"); + if (canParseLiteral(Expression, idx, "way")) + return new TagSelectorTypeIs("way"); + if (canParseLiteral(Expression, idx, "relation")) + return new TagSelectorTypeIs("relation"); + + QString Type; + if (!canParseLiteral(Expression, idx, "Type")) + return 0; + if (!canParseLiteral(Expression, idx, "is")) + return 0; + if (!canParseValue(Expression, idx, Type)) + return 0; + return new TagSelectorTypeIs(Type); +} + +TagSelectorHasTags* parseTagSelectorHasTags(const QString& Expression, int& idx) +{ + if (!canParseLiteral(Expression, idx, "HasTags")) + return 0; + return new TagSelectorHasTags(); +} + +TagSelectorIsOneOf* parseTagSelectorIsOneOf(const QString& Expression, int& idx) +{ + QString Key; + if (!canParseKey(Expression, idx, Key)) + return 0; + if (!canParseLiteral(Expression, idx, "isoneof")) + return 0; + if (!canParseSymbol(Expression, idx, '(')) + return 0; + QStringList Values; + while (true) + { + QString Value; + if (!canParseValue(Expression, idx, Value)) + break; + Values.push_back(Value); + if (!canParseSymbol(Expression, idx, ',')) + break; + } + canParseSymbol(Expression, idx, ')'); + if (Values.size()) + return new TagSelectorIsOneOf(Key,Values); + return 0; +} + +TagSelectorFalse* parseTagSelectorFalse(const QString& Expression, int& idx) +{ + if (!canParseLiteral(Expression, idx, "false")) + return 0; + return new TagSelectorFalse(); +} + +TagSelectorTrue* parseTagSelectorTrue(const QString& Expression, int& idx) +{ + if (!canParseLiteral(Expression, idx, "true")) + return 0; + return new TagSelectorTrue(); +} + +TagSelector* parseTagSelector(const QString& Expression, int& idx); + +TagSelector* parseFactor(const QString& Expression, int& idx) +{ + TagSelector* Current = 0; + if (canParseLiteral(Expression,idx,"[Default]")) { + TagSelector* defFactor = parseTagSelector(Expression, idx); + Current = new TagSelectorDefault(defFactor); + } + int Saved = idx; + if (!Current) { + if (canParseSymbol(Expression, idx, '(')) + { + Current = parseTagSelector(Expression, idx); + canParseSymbol(Expression, idx, ')'); + } + } + + if (!Current) + { + idx = Saved; + Current = parseTagSelectorTypeIs(Expression, idx); + } + if (!Current) + { + idx = Saved; + Current = parseTagSelectorIsOneOf(Expression, idx); + } + if (!Current) { + idx = Saved; + Current = parseTagSelectorOperator(Expression, idx); + } + + if (!Current) + { + idx = Saved; + Current = parseTagSelectorFalse(Expression, idx); + } + if (!Current) + { + idx = Saved; + Current = parseTagSelectorTrue(Expression, idx); + } + if (!Current) + { + Current = parseTagSelectorHasTags(Expression, idx); + } + if (!Current) + { + idx = Saved; + if ((canParseLiteral(Expression,idx,"not")) || canParseSymbol(Expression,idx,'!')) { + TagSelector* notFactor = parseFactor(Expression, idx); + Current = new TagSelectorNot(notFactor); + } + } + if (!Current) + { + idx = Saved; + if (canParseLiteral(Expression,idx,"parent")) { + TagSelector* parentFactor = parseFactor(Expression, idx); + Current = new TagSelectorParent(parentFactor); + } + } + if (!Current) { + idx = Saved; + if (canParseSymbol(Expression, idx, '[')) + { + Current = parseFactor(Expression, idx); + canParseSymbol(Expression, idx, ']'); + } + } + if (!Current) + { + idx = Saved; + QString Key; + if (canParseValue(Expression,idx,Key)) { + int TmpIdx = 0; + Current = parseFactor("not(" + Key + " is _NULL_)", TmpIdx); + } + } + if (!Current) + { + ++idx; + return NULL; + } + return Current; +} + +TagSelector* parseTerm(const QString& Expression, int& idx) +{ + QList<TagSelector*> Factors; + while (idx < Expression.length()) + { + TagSelector* Current = parseFactor(Expression, idx); + if (!Current) + break; + Factors.push_back(Current); + if (canParseLiteral(Expression,idx,"and")) + continue; + int TempIdx = idx; + if (canParseSymbol(Expression, TempIdx, '[')) + continue; + break; + } + if (Factors.size() == 1) + return Factors[0]; + else if (Factors.size() > 1) + return new TagSelectorAnd(Factors); + return 0; +} + +TagSelector* parseTagSelector(const QString& Expression, int& idx) +{ + QList<TagSelector*> Terms; + while (idx < Expression.length()) + { + TagSelector* Current = parseTerm(Expression, idx); + if (!Current) + break; + Terms.push_back(Current); + if ((!canParseLiteral(Expression,idx,"or")) && (!canParseLiteral(Expression,idx,","))) + break; + } + if (Terms.size() == 1) + return Terms[0]; + else if (Terms.size() > 1) + return new TagSelectorOr(Terms); + return new TagSelectorFalse(); +} + +TagSelector* TagSelector::parse(const QString& Expression) +{ + int idx = 0; + return parseTagSelector(Expression,idx); +} + +TagSelector* TagSelector::parse(const QString& Expression, int& idx) +{ + return parseTagSelector(Expression,idx); +} + +TagSelector::~TagSelector() +{ +} + + +/* TAGSELECTOROPERATOR */ + +TagSelectorOperator::TagSelectorOperator(const QString& key, const QString& oper, const QString& value) + : Key(key), Oper(oper), Value(value), UseSimpleRegExp(false), UseFullRegExp(false) + , specialKey(TagSelectKey_None) + , specialValue(TagSelectValue_None) +{ + if (key.toLower() == ":id") + specialKey = TagSelectKey_Id; + else if (key.toLower() == ":user") + specialKey = TagSelectKey_User; + else if (key.toLower() == ":time") { + specialKey = TagSelectKey_Time; + dtValue = QDateTime::fromString(value, Qt::ISODate); + } else if (key.toLower() == ":version") { + specialKey = TagSelectKey_Version; + bool ok; + numValue = value.toDouble(&ok); + if (!ok) + numValue = -1; + } else if (key.toLower() == ":zoomlevel") + specialKey = TagSelectKey_ZoomLevel; + else if (key.toLower() == ":pixelperm") + specialKey = TagSelectKey_PixelPerM; + else if (key.toLower() == ":dirty") + specialKey = TagSelectKey_Dirty; + else if (key.toLower() == ":uploaded") + specialKey = TagSelectKey_Uploaded; + + boolVal = false; + if (value.toUpper() == "_NULL_") { + specialValue = TagSelectValue_Empty; + } else if (value.toUpper() == "TRUE") { + boolVal = true; + valB = true; + } else if (Value.toUpper() == "FALSE") { + boolVal = true; + valB = false; + } else if (value.startsWith("/") && value.endsWith("/")) { + UseFullRegExp = true; + QString r = value.mid(1); + r.chop(1); + rx = QRegExp(r, Qt::CaseInsensitive); + rx.setPatternSyntax(QRegExp::RegExp2); + } else if (value.contains(QRegExp("[][*?]"))) { + UseSimpleRegExp = true; + rx = QRegExp(value, Qt::CaseInsensitive); + rx.setPatternSyntax(QRegExp::Wildcard); + } + valN = Value.toDouble(&okval); + + // Else exact match against ->Value only + + if (Oper == ">") + theOp = GT; + else if (Oper == "<") + theOp = LT; + else if (Oper == ">=") + theOp = GE; + else if (Oper == "<=") + theOp = LE; + else if (Oper == "!=") + theOp = NE; + else + theOp = EQ; +} + +TagSelector* TagSelectorOperator::copy() const +{ + return new TagSelectorOperator(Key,Oper,Value); +} + +static const QString emptyString("__EMPTY__"); + +TagSelectorMatchResult TagSelectorOperator::evaluateVal(const QString& val) const +{ + if (val == emptyString && specialValue != TagSelectValue_Empty) + return TagSelect_NoMatch; + if (specialValue == TagSelectValue_Empty) { + if (theOp == EQ) { + if (val.toUpper() == emptyString) return TagSelect_Match; + } else { + if (val.toUpper() != emptyString) return TagSelect_Match; + } + } else if (UseSimpleRegExp) { + QRegExp lrx(rx); + if (lrx.exactMatch(val)) { + if (theOp == EQ) + return TagSelect_Match; + } else { + if (theOp != EQ) + return TagSelect_Match; + } + + } else if (UseFullRegExp) { + QRegExp lrx(rx); + if (lrx.indexIn(val) != -1) { + if (theOp == EQ) + return TagSelect_Match; + } else { + if (theOp != EQ) + return TagSelect_Match; + } + + } else { + bool okkey; + qreal keyN = val.toDouble(&okkey); + if (boolVal) + switch (theOp) { + case EQ: + if (valB) { + if (val.toLower() == "true" || val.toLower() == "yes" || val == "1") + return TagSelect_Match; + } else { + if (val.toLower() == "false" || val.toLower() == "no" || val == "0") + return TagSelect_Match; + } + break; + + case NE: + if (valB) { + if (val.toLower() == "false" || val.toLower() == "no" || val == "0") + return TagSelect_Match; + } else { + if (val.toLower() == "true" || val.toLower() == "yes" || val == "1") + return TagSelect_Match; + } + break; + + default: + break; + } + else if (okkey && okval) + switch (theOp) { + case EQ: + if (keyN == valN) return TagSelect_Match; + break; + case NE: + if (keyN != valN) return TagSelect_Match; + break; + case GT: + if (keyN > valN) return TagSelect_Match; + break; + case LT: + if (keyN < valN) return TagSelect_Match; + break; + case GE: + if (keyN >= valN) return TagSelect_Match; + break; + case LE: + if (keyN <= valN) return TagSelect_Match; + break; + } + else + switch (theOp) { + case EQ: + if ((QString::compare(val, Value, Qt::CaseInsensitive)) == 0) return TagSelect_Match; + break; + case NE: + if ((QString::compare(val, Value, Qt::CaseInsensitive)) != 0 ) return TagSelect_Match; + break; + case GT: + if ((QString::compare(val, Value, Qt::CaseInsensitive)) > 0) return TagSelect_Match; + break; + case LT: + if ((QString::compare(val, Value, Qt::CaseInsensitive)) < 0) return TagSelect_Match; + break; + case GE: + if ((QString::compare(val, Value, Qt::CaseInsensitive)) >= 0) return TagSelect_Match; + break; + case LE: + if ((QString::compare(val, Value, Qt::CaseInsensitive)) <= 0) return TagSelect_Match; + break; + } + } + return TagSelect_NoMatch; +} + +TagSelectorMatchResult TagSelectorOperator::matches(const IFeature* F, qreal PixelPerM) const +{ + if (specialKey != TagSelectKey_None) { + switch (specialKey) { + case TagSelectKey_Id: + switch (theOp) { + case EQ: + return (F->xmlId() == Value ? TagSelect_Match : TagSelect_NoMatch); + break; + case NE: + return (F->xmlId() != Value ? TagSelect_Match : TagSelect_NoMatch); + break; + case GT: + return (F->xmlId() > Value ? TagSelect_Match : TagSelect_NoMatch); + break; + case LT: + return (F->xmlId() < Value ? TagSelect_Match : TagSelect_NoMatch); + break; + case GE: + return (F->xmlId() >= Value ? TagSelect_Match : TagSelect_NoMatch); + break; + case LE: + return (F->xmlId() <= Value ? TagSelect_Match : TagSelect_NoMatch); + break; + } + break; + +#ifndef FRISIUS_BUILD + case TagSelectKey_User: + switch (theOp) { + case EQ: + return (QString::compare(F->user(), Value, Qt::CaseInsensitive) == 0 ? TagSelect_Match : TagSelect_NoMatch); + break; + case NE: + return (QString::compare(F->user(), Value, Qt::CaseInsensitive) != 0 ? TagSelect_Match : TagSelect_NoMatch); + break; + case GT: + return (QString::compare(F->user(), Value, Qt::CaseInsensitive) > 0 ? TagSelect_Match : TagSelect_NoMatch); + break; + case LT: + return (QString::compare(F->user(), Value, Qt::CaseInsensitive) < 0 ? TagSelect_Match : TagSelect_NoMatch); + break; + case GE: + return (QString::compare(F->user(), Value, Qt::CaseInsensitive) >= 0 ? TagSelect_Match : TagSelect_NoMatch); + break; + case LE: + return (QString::compare(F->user(), Value, Qt::CaseInsensitive) <= 0 ? TagSelect_Match : TagSelect_NoMatch); + break; + } + break; + + case TagSelectKey_Time: { + if (!dtValue.isValid()) + return TagSelect_NoMatch; + if (dtValue.time() == QTime(0, 0, 0)) + switch (theOp) { + case EQ: + return (F->time().date() == dtValue.date() ? TagSelect_Match : TagSelect_NoMatch); + break; + case NE: + return (F->time().date() != dtValue.date() ? TagSelect_Match : TagSelect_NoMatch); + break; + case GT: + return (F->time().date() > dtValue.date() ? TagSelect_Match : TagSelect_NoMatch); + break; + case LT: + return (F->time().date() < dtValue.date() ? TagSelect_Match : TagSelect_NoMatch); + break; + case GE: + return (F->time().date() >= dtValue.date() ? TagSelect_Match : TagSelect_NoMatch); + break; + case LE: + return (F->time().date() <= dtValue.date() ? TagSelect_Match : TagSelect_NoMatch); + break; + } + else + switch (theOp) { + case EQ: + return (F->time() == dtValue ? TagSelect_Match : TagSelect_NoMatch); + break; + case NE: + return (F->time() != dtValue ? TagSelect_Match : TagSelect_NoMatch); + break; + case GT: + return (F->time() > dtValue ? TagSelect_Match : TagSelect_NoMatch); + break; + case LT: + return (F->time() < dtValue ? TagSelect_Match : TagSelect_NoMatch); + break; + case GE: + return (F->time() >= dtValue ? TagSelect_Match : TagSelect_NoMatch); + break; + case LE: + return (F->time() <= dtValue ? TagSelect_Match : TagSelect_NoMatch); + break; + } + + break; + } + + case TagSelectKey_Version: + switch (theOp) { + case EQ: + return (F->versionNumber() == numValue ? TagSelect_Match : TagSelect_NoMatch); + break; + case NE: + return (F->versionNumber() != numValue ? TagSelect_Match : TagSelect_NoMatch); + break; + case GT: + return (F->versionNumber() > numValue ? TagSelect_Match : TagSelect_NoMatch); + break; + case LT: + return (F->versionNumber() < numValue ? TagSelect_Match : TagSelect_NoMatch); + break; + case GE: + return (F->versionNumber() >= numValue ? TagSelect_Match : TagSelect_NoMatch); + break; + case LE: + return (F->versionNumber() <= numValue ? TagSelect_Match : TagSelect_NoMatch); + break; + } + + break; +#endif + + case TagSelectKey_PixelPerM: { + if (!PixelPerM) + return TagSelect_Match; + bool okval; + qreal valN = Value.toDouble(&okval); + if (!okval) + return TagSelect_NoMatch; + switch (theOp) { + case EQ: + return (PixelPerM == valN ? TagSelect_Match : TagSelect_NoMatch); + break; + case NE: + return (PixelPerM != valN ? TagSelect_Match : TagSelect_NoMatch); + break; + case GT: + return (PixelPerM > valN ? TagSelect_Match : TagSelect_NoMatch); + break; + case LT: + return (PixelPerM < valN ? TagSelect_Match : TagSelect_NoMatch); + break; + case GE: + return (PixelPerM >= valN ? TagSelect_Match : TagSelect_NoMatch); + break; + case LE: + return (PixelPerM <= valN ? TagSelect_Match : TagSelect_NoMatch); + break; + } + break; + } + + case TagSelectKey_Dirty: { + if (!boolVal) + return TagSelect_NoMatch; + + switch (theOp) { + case EQ: + if (valB) { + if (F->isDirty()) + return TagSelect_Match; + else + return TagSelect_NoMatch; + } else { + if (!F->isDirty()) + return TagSelect_Match; + else + return TagSelect_NoMatch; + } + break; + + case NE: + if (valB) { + if (F->isDirty()) + return TagSelect_NoMatch; + else + return TagSelect_Match; + } else { + if (!F->isDirty()) + return TagSelect_NoMatch; + else + return TagSelect_Match; + } + break; + + default: + return TagSelect_NoMatch; + } + break; + } + + case TagSelectKey_Uploaded: { + if (!boolVal) + return TagSelect_NoMatch; + + switch (theOp) { + case EQ: + if (valB) { + if (F->isUploaded()) + return TagSelect_Match; + else + return TagSelect_NoMatch; + } else { + if (!F->isUploaded()) + return TagSelect_Match; + else + return TagSelect_NoMatch; + } + break; + + case NE: + if (valB) { + if (F->isUploaded()) + return TagSelect_NoMatch; + else + return TagSelect_Match; + } else { + if (!F->isUploaded()) + return TagSelect_NoMatch; + else + return TagSelect_Match; + } + break; + + default: + return TagSelect_NoMatch; + } + break; + } + + default: + return TagSelect_NoMatch; + break; + } + } else { + if (Key != "*") + return evaluateVal(F->tagValue(Key, emptyString)); + else { + for (int i=0; i<F->tagSize(); ++i) + if (evaluateVal(F->tagValue(i)) == TagSelect_Match) + return TagSelect_Match; + } + } + return TagSelect_NoMatch; +} + +QString TagSelectorOperator::asExpression(bool) const +{ + return "[" + Key + "]" + Oper + Value; +} + +/* TAGSELECTORISONEOF */ + +TagSelectorIsOneOf::TagSelectorIsOneOf(const QString& key, const QStringList& values) + : Key(key), Values(values) + , specialKey(TagSelectKey_None) + , specialValue(TagSelectValue_None) +{ + if (key.toUpper() == ":ID") + specialKey = TagSelectKey_Id; + else if (key.toUpper() == ":USER") + specialKey = TagSelectKey_User; + else if (key.toUpper() == ":TIME") + specialKey = TagSelectKey_Time; + else if (key.toUpper() == ":VERSION") + specialKey = TagSelectKey_Version; + + for (int i=0; i<values.size(); ++i) + { + if (values[i].toUpper() == "_NULL_") { + specialValue = TagSelectValue_Empty; + } else if (values[i].contains(QRegExp("[][*?]"))) { + QRegExp rx(values[i], Qt::CaseInsensitive); + rx.setPatternSyntax(QRegExp::Wildcard); + rxv.append(rx); + } else { + exactMatchv.append(values[i]); + } + } +} + +TagSelector* TagSelectorIsOneOf::copy() const +{ + return new TagSelectorIsOneOf(Key,Values); +} + +TagSelectorMatchResult TagSelectorIsOneOf::matches(const IFeature* F, qreal /*PixelPerM*/) const +{ + if (specialKey != TagSelectKey_None) { + foreach (QString Value, exactMatchv) { + switch (specialKey) { + case TagSelectKey_Id: + if (F->xmlId() == Value) + return TagSelect_Match; + break; + +#ifndef FRISIUS_BUILD + case TagSelectKey_User: + if (QString::compare(F->user(), Value, Qt::CaseInsensitive) == 0) + return TagSelect_Match; + break; + + case TagSelectKey_Time: { + QDateTime dtValue = QDateTime::fromString(Value, Qt::ISODate); + if (!dtValue.isValid()) + break; + if (dtValue.time() == QTime(0, 0, 0)) { + if (F->time().date() == dtValue.date()) + return TagSelect_Match; + } else { + if (F->time() == dtValue) + return TagSelect_Match; + } + + break; + } + + case TagSelectKey_Version: + if (F->versionNumber() == Value.toInt()) + return TagSelect_Match; + break; +#endif + + default: + break; + } + } + } else { + QString V = F->tagValue(Key, emptyString); + if (specialValue == TagSelectValue_Empty && V.isEmpty()) { + return TagSelect_Match; + } + foreach (QString pattern, exactMatchv) { + if (QString::compare(V, pattern) == 0) return TagSelect_Match; + } + foreach (QRegExp pattern, rxv) { + if (pattern.exactMatch(V)) return TagSelect_Match; + } + } + return TagSelect_NoMatch; +} + +QString TagSelectorIsOneOf::asExpression(bool) const +{ + return "[" + Key + "] isoneof (" + Values.join(" , ") + ")"; +} + +/* TAGSELECTORTYPEIS */ + +TagSelectorTypeIs::TagSelectorTypeIs(const QString& type) +: Type(type) +{ +} + +TagSelector* TagSelectorTypeIs::copy() const +{ + return new TagSelectorTypeIs(Type); +} + +TagSelectorMatchResult TagSelectorTypeIs::matches(const IFeature* F, qreal /*PixelPerM*/) const +{ + QString t = Type.toLower(); + if (t == "node") + return (F->getType() & IFeature::Point) ? TagSelect_Match : TagSelect_NoMatch; + else if (t == "way") + return (F->getType() & IFeature::LineString && !(F->getType() & IFeature::Polygon)) ? TagSelect_Match : TagSelect_NoMatch; + else if (t == "area") + return (F->getType() & IFeature::Polygon) ? TagSelect_Match : TagSelect_NoMatch; + else if (t == "relation") + return (F->getType() & IFeature::OsmRelation) ? TagSelect_Match : TagSelect_NoMatch; + else if (t == "tracksegment") + return (F->getType() & IFeature::GpxSegment) ? TagSelect_Match : TagSelect_NoMatch; + + return TagSelect_NoMatch; +} + +QString TagSelectorTypeIs::asExpression(bool) const +{ + return "Type is " + Type; +} + +/* TAGSELECTORHASTAGS */ + +TagSelectorHasTags::TagSelectorHasTags() +{ + TechnicalTags = QString(TECHNICAL_TAGS).split("#"); +} + +TagSelector* TagSelectorHasTags::copy() const +{ + return new TagSelectorHasTags(); +} + +TagSelectorMatchResult TagSelectorHasTags::matches(const IFeature* F, qreal /*PixelPerM*/) const +{ + for (int i=0; i<F->tagSize(); ++i) { + if (!TechnicalTags.contains(F->tagKey(i))) { + return TagSelect_Match; + } + } + return TagSelect_NoMatch; +} + +QString TagSelectorHasTags::asExpression(bool) const +{ + return "HasTags"; +} + +/* TAGSELECTOROR */ + +TagSelectorOr::TagSelectorOr(const QList<TagSelector*> terms) +: Terms(terms) +{ +} + +TagSelectorOr::~TagSelectorOr() +{ + qDeleteAll(Terms); +} + +TagSelector* TagSelectorOr::copy() const +{ + QList<TagSelector*> Copied; + for (int i=0; i<Terms.size(); ++i) + Copied.push_back(Terms[i]->copy()); + return new TagSelectorOr(Copied); +} + +TagSelectorMatchResult TagSelectorOr::matches(const IFeature* F, qreal PixelPerM) const +{ + for (int i=0; i<Terms.size(); ++i) + if (Terms[i]->matches(F,PixelPerM) == TagSelect_Match) + return TagSelect_Match; + return TagSelect_NoMatch; +} + +QString TagSelectorOr::asExpression(bool Precedence) const +{ + QString R; + if (Precedence) + R += "("; + for (int i=0; i<Terms.size(); ++i) + { + if (i) + R += " or "; + R += Terms[i]->asExpression(false); + } + if (Precedence) + R += ")"; + return R; +} + + +/* TAGSELECTORAND */ + +TagSelectorAnd::TagSelectorAnd(const QList<TagSelector*> terms) +: Terms(terms) +{ +} + +TagSelectorAnd::~TagSelectorAnd() +{ + qDeleteAll(Terms); +} + +TagSelector* TagSelectorAnd::copy() const +{ + QList<TagSelector*> Copied; + for (int i=0; i<Terms.size(); ++i) + Copied.push_back(Terms[i]->copy()); + return new TagSelectorAnd(Copied); +} + +TagSelectorMatchResult TagSelectorAnd::matches(const IFeature* F, qreal PixelPerM) const +{ + for (int i=0; i<Terms.size(); ++i) + if (Terms[i]->matches(F,PixelPerM) == TagSelect_NoMatch) + return TagSelect_NoMatch; + return TagSelect_Match; +} + +QString TagSelectorAnd::asExpression(bool /* Precedence */) const +{ + QString R; + for (int i=0; i<Terms.size(); ++i) + { + if (i) + R += " and "; + R += Terms[i]->asExpression(true); + } + return R; +} + +/* TAGSELECTORNOT */ + +TagSelectorNot::TagSelectorNot(TagSelector* term) +: Term(term) +{ +} + +TagSelectorNot::~TagSelectorNot() +{ + delete Term; +} + +TagSelector* TagSelectorNot::copy() const +{ + if (!Term) + return NULL; + return new TagSelectorNot(Term->copy()); +} + +TagSelectorMatchResult TagSelectorNot::matches(const IFeature* F, qreal PixelPerM) const +{ + if (!Term) + return TagSelect_NoMatch; + return (Term->matches(F,PixelPerM) == TagSelect_Match) ? TagSelect_NoMatch : TagSelect_Match; +} + +QString TagSelectorNot::asExpression(bool /* Precedence */) const +{ + if (!Term) + return QString(); + return "not(" + Term->asExpression(true) + ")"; +} + +/* TAGSELECTORPARENT */ + +TagSelectorParent::TagSelectorParent(TagSelector* term) +: Term(term) +{ +} + +TagSelectorParent::~TagSelectorParent() +{ + delete Term; +} + +TagSelector* TagSelectorParent::copy() const +{ + if (!Term) + return NULL; + return new TagSelectorParent(Term->copy()); +} + +TagSelectorMatchResult TagSelectorParent::matches(const IFeature* F, qreal PixelPerM) const +{ + if (!Term) + return TagSelect_NoMatch; + + TagSelectorMatchResult ret = TagSelect_NoMatch; + for (int i=0; i<F->sizeParents(); ++i) { + if (Term->matches(F->getParent(i),PixelPerM) == TagSelect_Match) { + ret = TagSelect_Match; + break; + } + } + return ret; +} + +QString TagSelectorParent::asExpression(bool /* Precedence */) const +{ + if (!Term) + return QString(); + return " parent(" + Term->asExpression(true) + ")"; +} + +/* TAGSELECTORFALSE */ + +TagSelectorFalse::TagSelectorFalse() +{ +} + +TagSelector* TagSelectorFalse::copy() const +{ + return new TagSelectorFalse(); +} + +TagSelectorMatchResult TagSelectorFalse::matches(const IFeature* /* F */, qreal /*PixelPerM*/) const +{ + return TagSelect_NoMatch; +} + +QString TagSelectorFalse::asExpression(bool /* Precedence */) const +{ + return " false "; +} + +/* TAGSELECTORTRUE */ + +TagSelectorTrue::TagSelectorTrue() +{ +} + +TagSelector* TagSelectorTrue::copy() const +{ + return new TagSelectorFalse(); +} + +TagSelectorMatchResult TagSelectorTrue::matches(const IFeature* /* F */, qreal /*PixelPerM*/) const +{ + return TagSelect_Match; +} + +QString TagSelectorTrue::asExpression(bool /* Precedence */) const +{ + return " true "; +} + +/* TAGSELECTORDEFAULT */ + +TagSelectorDefault::TagSelectorDefault(TagSelector* term) +: Term(term) +{ +} + +TagSelectorDefault::~TagSelectorDefault() +{ + delete Term; +} + +TagSelector* TagSelectorDefault::copy() const +{ + return new TagSelectorDefault(Term->copy()); +} + +TagSelectorMatchResult TagSelectorDefault::matches(const IFeature* F, qreal PixelPerM) const +{ + //return (Term->matches(F) == TagSelect_Match) ? TagSelect_DefaultMatch : TagSelect_NoMatch; + if (Term->matches(F,PixelPerM) == TagSelect_Match) + return TagSelect_DefaultMatch; + else + return TagSelect_NoMatch; +} + +QString TagSelectorDefault::asExpression(bool /* Precedence */) const +{ + return " [Default] " + Term->asExpression(true); +} + diff --git a/src/Utils/TagSelector.h b/src/Utils/TagSelector.h new file mode 100644 index 0000000..92493e7 --- /dev/null +++ b/src/Utils/TagSelector.h @@ -0,0 +1,218 @@ +#ifndef MERKAARTOR_STYLE_TAGSELECTOR_H_ +#define MERKAARTOR_STYLE_TAGSELECTOR_H_ + +class IFeature; + +#include <QtCore/QString> +#include <QRegExp> +#include <QList> +#include <QStringList> + +#include <QDateTime> + +enum TagSelectorMatchResult { + TagSelect_NoMatch, + TagSelect_Match, + TagSelect_DefaultMatch +}; + +enum TagSelectorSpecialKey { + TagSelectKey_None, + TagSelectKey_Id, + TagSelectKey_User, + TagSelectKey_Time, + TagSelectKey_Version, + TagSelectKey_ZoomLevel, + TagSelectKey_PixelPerM, + TagSelectKey_Dirty, + TagSelectKey_Uploaded +}; + +enum TagSelectorSpecialValue { + TagSelectValue_None, + TagSelectValue_Empty +}; + +class TagSelector +{ + public: + virtual ~TagSelector() = 0; + + virtual TagSelector* copy() const = 0; + virtual TagSelectorMatchResult matches(const IFeature* F, qreal PixelPerM) const = 0; + virtual QString asExpression(bool Precedence) const = 0; + + static TagSelector* parse(const QString& Expression); + static TagSelector* parse(const QString& Expression, int& idx); +}; + +class TagSelectorOperator : public TagSelector +{ + enum Ops { + EQ, + NE, + GT, + LT, + LE, + GE + }; + public: + TagSelectorOperator(const QString& key, const QString& oper, const QString& value); + + virtual TagSelector* copy() const; + virtual TagSelectorMatchResult matches(const IFeature* F, qreal PixelPerM) const; + virtual QString asExpression(bool Precedence) const; + + private: + TagSelectorMatchResult evaluateVal(const QString& val) const; + + QRegExp rx; + QString Key, Oper, Value; + Ops theOp; + qreal numValue; + QDateTime dtValue; + bool UseSimpleRegExp; + bool UseFullRegExp; + TagSelectorSpecialKey specialKey; + TagSelectorSpecialValue specialValue; + bool boolVal, valB; + bool okval; + qreal valN; +}; + +class TagSelectorIsOneOf : public TagSelector +{ + public: + TagSelectorIsOneOf(const QString& key, const QStringList& values); + + virtual TagSelector* copy() const; + virtual TagSelectorMatchResult matches(const IFeature* F, qreal PixelPerM) const; + virtual QString asExpression(bool Precedence) const; + + private: + QList<QRegExp> rxv; + QStringList exactMatchv; + QString Key; + QStringList Values; + TagSelectorSpecialKey specialKey; + TagSelectorSpecialValue specialValue; +}; + +class TagSelectorTypeIs : public TagSelector +{ + public: + TagSelectorTypeIs(const QString& type); + + virtual TagSelector* copy() const; + virtual TagSelectorMatchResult matches(const IFeature* F, qreal PixelPerM) const; + virtual QString asExpression(bool Precedence) const; + + private: + QString Type; +}; + +class TagSelectorHasTags : public TagSelector +{ + public: + TagSelectorHasTags(); + + virtual TagSelector* copy() const; + virtual TagSelectorMatchResult matches(const IFeature* F, qreal PixelPerM) const; + virtual QString asExpression(bool Precedence) const; + + private: + QStringList TechnicalTags; +}; + +class TagSelectorOr : public TagSelector +{ + public: + TagSelectorOr(const QList<TagSelector*> Terms); + virtual ~TagSelectorOr(); + + virtual TagSelector* copy() const; + virtual TagSelectorMatchResult matches(const IFeature* F, qreal PixelPerM) const; + virtual QString asExpression(bool Precedence) const; + + private: + QList<TagSelector*> Terms; +}; + +class TagSelectorAnd : public TagSelector +{ + public: + TagSelectorAnd(const QList<TagSelector*> Terms); + virtual ~TagSelectorAnd(); + + virtual TagSelector* copy() const; + virtual TagSelectorMatchResult matches(const IFeature* F, qreal PixelPerM) const; + virtual QString asExpression(bool Precedence) const; + + private: + QList<TagSelector*> Terms; +}; + +class TagSelectorNot : public TagSelector +{ + public: + TagSelectorNot(TagSelector* Term); + virtual ~TagSelectorNot(); + + virtual TagSelector* copy() const; + virtual TagSelectorMatchResult matches(const IFeature* F, qreal PixelPerM) const; + virtual QString asExpression(bool Precedence) const; + + private: + TagSelector* Term; +}; + +class TagSelectorParent : public TagSelector +{ + public: + TagSelectorParent(TagSelector* Term); + virtual ~TagSelectorParent(); + + virtual TagSelector* copy() const; + virtual TagSelectorMatchResult matches(const IFeature* F, qreal PixelPerM) const; + virtual QString asExpression(bool Precedence) const; + + private: + TagSelector* Term; +}; + +class TagSelectorFalse : public TagSelector +{ + public: + TagSelectorFalse(); + + virtual TagSelector* copy() const; + virtual TagSelectorMatchResult matches(const IFeature* F, qreal PixelPerM) const; + virtual QString asExpression(bool Precedence) const; +}; + +class TagSelectorTrue : public TagSelector +{ + public: + TagSelectorTrue(); + + virtual TagSelector* copy() const; + virtual TagSelectorMatchResult matches(const IFeature* F, qreal PixelPerM) const; + virtual QString asExpression(bool Precedence) const; +}; + +class TagSelectorDefault : public TagSelector +{ + public: + TagSelectorDefault(TagSelector* Term); + virtual ~TagSelectorDefault(); + + virtual TagSelector* copy() const; + virtual TagSelectorMatchResult matches(const IFeature* F, qreal PixelPerM) const; + virtual QString asExpression(bool Precedence) const; + + private: + TagSelector* Term; +}; + + +#endif diff --git a/src/Utils/TagSelectorWidget.cpp b/src/Utils/TagSelectorWidget.cpp new file mode 100644 index 0000000..8013210 --- /dev/null +++ b/src/Utils/TagSelectorWidget.cpp @@ -0,0 +1,65 @@ +#include "Global.h" + +#include "TagSelectorWidget.h" +#include "ui_TagSelectorWidget.h" + +#include <QCompleter> + +#include "MainWindow.h" +#include "Document.h" + +TagSelectorWidget::TagSelectorWidget(MainWindow* mw, QWidget *parent) : + QWidget(parent), + ui(new Ui::TagSelectorWidget), + main(mw) +{ + ui->setupUi(this); + + ui->cbKey->setInsertPolicy(QComboBox::InsertAlphabetically); + ui->cbValue->setInsertPolicy(QComboBox::InsertAlphabetically); + + QStringList ksl = g_getTagKeyList(); + QCompleter* completer = new QCompleter(ksl, (QObject *)this); + ui->cbKey->insertItems(-1, ksl); + completer->setCompletionMode(QCompleter::InlineCompletion); + completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel); + ui->cbKey->setCompleter(completer); + ui->cbKey->setEditable(true); + + ui->cbValue->insertItems(-1, g_getTagValueList("*")); + ui->cbValue->setEditable(true); + + connect(ui->btAnd, SIGNAL(clicked()), this, SIGNAL(sigAnd())); +} + +TagSelectorWidget::~TagSelectorWidget() +{ + delete ui; +} + +void TagSelectorWidget::changeEvent(QEvent *e) +{ + QWidget::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + +void TagSelectorWidget::on_cbKey_editTextChanged(const QString & text) +{ + ui->cbValue->clear(); + + QStringList sl = g_getTagValueList(text); + QCompleter* completer = new QCompleter(sl, (QObject *)this); + ui->cbValue->insertItems(-1, g_getTagValueList(text)); + completer->setCompletionMode(QCompleter::InlineCompletion); + completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel); + if (ui->cbValue->completer()) + delete ui->cbValue->completer(); + ui->cbValue->setCompleter(completer); +} + diff --git a/src/Utils/TagSelectorWidget.h b/src/Utils/TagSelectorWidget.h new file mode 100644 index 0000000..db36c76 --- /dev/null +++ b/src/Utils/TagSelectorWidget.h @@ -0,0 +1,35 @@ +#ifndef TAGSELECTORWIDGET_H +#define TAGSELECTORWIDGET_H + +#include <QWidget> + +class MainWindow; + +namespace Ui { + class TagSelectorWidget; +} + +class TagSelectorWidget : public QWidget { + Q_OBJECT +public: + TagSelectorWidget(MainWindow* mw, QWidget *parent = 0); + ~TagSelectorWidget(); + +protected: + void changeEvent(QEvent *e); + +signals: + void sigOr(); + void sigAnd(); + void sigNot(); + +private slots: + void on_cbKey_editTextChanged(const QString & text); + +private: + Ui::TagSelectorWidget *ui; + + MainWindow* main; +}; + +#endif // TAGSELECTORWIDGET_H diff --git a/src/Utils/TagSelectorWidget.ui b/src/Utils/TagSelectorWidget.ui new file mode 100644 index 0000000..ac2cf7a --- /dev/null +++ b/src/Utils/TagSelectorWidget.ui @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>TagSelectorWidget</class> + <widget class="QWidget" name="TagSelectorWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>379</width> + <height>30</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="margin"> + <number>0</number> + </property> + <item> + <layout class="QGridLayout"> + <property name="spacing"> + <number>0</number> + </property> + <item row="0" column="1"> + <widget class="QComboBox" name="cbKey"/> + </item> + <item row="0" column="3"> + <widget class="QComboBox" name="cbValue"/> + </item> + <item row="0" column="4"> + <widget class="QToolButton" name="btOr"> + <property name="text"> + <string>OR</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="0" column="5"> + <widget class="QToolButton" name="btAnd"> + <property name="text"> + <string>AND</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QToolButton" name="btNot"> + <property name="text"> + <string>NOT</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="0" column="6"> + <widget class="QToolButton" name="btDel"> + <property name="text"> + <string>...</string> + </property> + <property name="icon"> + <iconset resource="../../Icons/AllIcons.qrc"> + <normaloff>:/Icons/actions/edit_delete.png</normaloff>:/Icons/actions/edit_delete.png</iconset> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QComboBox" name="comboBox"> + <item> + <property name="text"> + <string>is</string> + </property> + </item> + <item> + <property name="text"> + <string>isoneof</string> + </property> + </item> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <resources> + <include location="../../Icons/AllIcons.qrc"/> + </resources> + <connections> + <connection> + <sender>btDel</sender> + <signal>clicked()</signal> + <receiver>TagSelectorWidget</receiver> + <slot>close()</slot> + <hints> + <hint type="sourcelabel"> + <x>366</x> + <y>14</y> + </hint> + <hint type="destinationlabel"> + <x>189</x> + <y>14</y> + </hint> + </hints> + </connection> + </connections> + <slots> + <signal>removed()</signal> + <signal>and()</signal> + <signal>or()</signal> + <signal>not()</signal> + </slots> +</ui> diff --git a/src/Utils/Utils.cpp b/src/Utils/Utils.cpp new file mode 100644 index 0000000..462c2d0 --- /dev/null +++ b/src/Utils/Utils.cpp @@ -0,0 +1,115 @@ +//*************************************************************** +// CLass: Utils +// +// Description: Various static functions +// +// +// Author: Chris Browet <cbro@semperpax.com> (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +//****************************************************************** + +#include "Utils.h" +#include "MerkaartorPreferences.h" + +#include <QNetworkAccessManager> +#include <QNetworkReply> +#include <QEventLoop> +#include <QTimer> + +const QString Utils::encodeAttributes(const QString & text) +{ + QString s = text; + s.replace( "&", "&" ); + s.replace( ">", ">" ); + s.replace( "<", "<" ); + s.replace( "\"", """ ); + s.replace( "\'", "'" ); + return s; +} + +bool Utils::QRectInterstects(const QRectF& r, const QLineF& lF, QPointF& a, QPointF& b) +{ + QPointF pF; + bool hasP1 = false; + bool hasP2 = false; + + if (QLineF(r.topLeft(), r.bottomLeft()).intersect(lF, &pF) == QLineF::BoundedIntersection) { + a = pF; + hasP1 = true; + } + if (QLineF(r.bottomLeft(), r.bottomRight()).intersect(lF, &pF) == QLineF::BoundedIntersection) { + if (hasP1) { + b = pF; + hasP2 = true; + } else { + a = pF; + hasP1 = true; + } + } + if (QLineF(r.bottomRight(), r.topRight()).intersect(lF, &pF) == QLineF::BoundedIntersection) { + if (hasP1) { + b = pF; + hasP2 = true; + } else { + a = pF; + hasP1 = true; + } + } + if (QLineF(r.topRight(), r.topLeft()).intersect(lF, &pF) == QLineF::BoundedIntersection) { + if (hasP1) { + b = pF; + hasP2 = true; + } else { + a = pF; + hasP1 = true; + } + } + + if (hasP1 && hasP2) { +#if (QT_VERSION >= QT_VERSION_CHECK(4, 4, 0)) + qreal la1 = QLineF(a,b).angleTo(lF); +#else + qreal la1 = QLineF(a,b).angle(lF); +#endif + if (la1 > 15.0 && la1 < 345.0) { + QPointF t = b; + b = a; + a = t; + } + } + if (hasP1) + return true; + else + return false; +} + +bool Utils::sendBlockingNetRequest(const QUrl& theUrl, QString& reply) +{ + QNetworkAccessManager manager; + QEventLoop q; + QTimer tT; + + manager.setProxy(M_PREFS->getProxy(QUrl("http://merkaartor.be"))); + + tT.setSingleShot(true); + connect(&tT, SIGNAL(timeout()), &q, SLOT(quit())); + connect(&manager, SIGNAL(finished(QNetworkReply*)), + &q, SLOT(quit())); + + QNetworkReply *netReply = manager.get(QNetworkRequest(theUrl)); + + tT.start(M_PREFS->getNetworkTimeout()); + q.exec(); + if(tT.isActive()) { + // download complete + tT.stop(); + } else { + return false; + } + + reply = netReply->readAll(); + return true; +} + diff --git a/src/Utils/Utils.h b/src/Utils/Utils.h new file mode 100644 index 0000000..e0ed700 --- /dev/null +++ b/src/Utils/Utils.h @@ -0,0 +1,33 @@ +//*************************************************************** +// CLass: Utils +// +// Description: Various static functions +// +// +// Author: Chris Browet <cbro@semperpax.com> (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +//****************************************************************** + +#ifndef UTILS_H +#define UTILS_H + +#include <QObject> +#include <QUrl> +#include <QRectF> +#include <QLineF> +#include <QPointF> + +class Utils: public QObject +{ + Q_OBJECT + +public: + + static const QString encodeAttributes(const QString & text); + static bool QRectInterstects(const QRectF& r, const QLineF& l, QPointF& a, QPointF& b); + static bool sendBlockingNetRequest(const QUrl& theUrl, QString& reply); +}; + +#endif // UTILS_H diff --git a/src/Utils/Utils.pri b/src/Utils/Utils.pri new file mode 100644 index 0000000..a85f848 --- /dev/null +++ b/src/Utils/Utils.pri @@ -0,0 +1,54 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/Utils +DEPENDPATH += $$MERKAARTOR_SRC_DIR/Utils + +HEADERS += \ + LineF.h \ + ShortcutOverrideFilter.h \ + SlippyMapWidget.h \ + EditCompleterDelegate.h \ + PictureViewerDialog.h \ + PixmapWidget.h \ + RemoteControlServer.hpp \ + SelectionDialog.h \ + SvgCache.h \ + MDiscardableDialog.h \ + OsmLink.h \ + Utils.h \ + TagSelector.h \ + TagSelectorWidget.h \ + CheckBoxList.h + +SOURCES += \ + ShortcutOverrideFilter.cpp \ + SlippyMapWidget.cpp \ + EditCompleterDelegate.cpp \ + PictureViewerDialog.cpp \ + PixmapWidget.cpp \ + RemoteControlServer.cpp \ + SelectionDialog.cpp \ + SvgCache.cpp \ + MDiscardableDialog.cpp \ + OsmLink.cpp \ + Utils.cpp \ + TagSelector.cpp \ + TagSelectorWidget.cpp \ + CheckBoxList.cpp + +FORMS += \ + PictureViewerDialog.ui \ + SelectionDialog.ui \ + TagSelectorWidget.ui \ + +RESOURCES += \ + Utils.qrc + +isEmpty(MOBILE) { + HEADERS += \ + ProjectionChooser.h + + SOURCES += \ + ProjectionChooser.cpp + + FORMS += \ + ProjectionChooser.ui +} diff --git a/src/Utils/Utils.qrc b/src/Utils/Utils.qrc new file mode 100644 index 0000000..a94d32c --- /dev/null +++ b/src/Utils/Utils.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/Utils"> + <file alias="CHANGELOG">../../CHANGELOG</file> + </qresource> +</RCC> diff --git a/src/common/AboutDialog.ui b/src/common/AboutDialog.ui new file mode 100644 index 0000000..6bb6deb --- /dev/null +++ b/src/common/AboutDialog.ui @@ -0,0 +1,255 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>AboutDialog</class> + <widget class="QDialog" name="AboutDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>525</width> + <height>469</height> + </rect> + </property> + <property name="windowTitle"> + <string>About Merkaartor</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="sizeConstraint"> + <enum>QLayout::SetMinimumSize</enum> + </property> + <item> + <layout class="QGridLayout" name="gridLayout"> + <property name="horizontalSpacing"> + <number>20</number> + </property> + <property name="verticalSpacing"> + <number>-1</number> + </property> + <item row="2" column="1"> + <widget class="QLabel" name="ProjVersion"> + <property name="styleSheet"> + <string notr="true">QLabel { font-size:small; font-weight:bold; }</string> + </property> + <property name="text"> + <string notr="true">%1</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="Version"> + <property name="styleSheet"> + <string notr="true">QLabel { font-size:small; font-weight:bold; }</string> + </property> + <property name="text"> + <string notr="true">%1</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="VersionLabel"> + <property name="styleSheet"> + <string notr="true">QLabel { font-size: x-small; font-style: italic; }</string> + </property> + <property name="text"> + <string>Merkaartor version</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="QTVersion"> + <property name="styleSheet"> + <string notr="true">QLabel { font-size:small; font-weight:bold; }</string> + </property> + <property name="text"> + <string notr="true">%1 (%2)</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="GdalVersion"> + <property name="styleSheet"> + <string notr="true">QLabel { font-size:small; font-weight:bold; }</string> + </property> + <property name="text"> + <string notr="true">%1</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="QTVersionLabel"> + <property name="styleSheet"> + <string notr="true">QLabel { font-size: x-small; font-style: italic; }</string> + </property> + <property name="text"> + <string>Qt version</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="ProjVersionLabel"> + <property name="styleSheet"> + <string notr="true">QLabel { font-size: x-small; font-style: italic; }</string> + </property> + <property name="text"> + <string>PROJ version</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="GdalVersionLabel"> + <property name="styleSheet"> + <string notr="true">QLabel { font-size: x-small; font-style: italic; }</string> + </property> + <property name="text"> + <string>GDAL version</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="pxIcon"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>100</horstretch> + <verstretch>100</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>100</width> + <height>100</height> + </size> + </property> + <property name="text"> + <string notr="true">TextLabel</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>This program is licensed under the GNU General Public License v2</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="lblUrl"> + <property name="text"> + <string notr="true"><a href="http://merkaartor.be/">http://merkaartor.be/</a></string> + </property> + <property name="openExternalLinks"> + <bool>true</bool> + </property> + <property name="textInteractionFlags"> + <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> + </property> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Changelog</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QTextEdit" name="txtChangelog"> + <property name="lineWrapMode"> + <enum>QTextEdit::NoWrap</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + <property name="tabStopWidth"> + <number>4</number> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>131</width> + <height>31</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="okButton"> + <property name="text"> + <string>OK</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>okButton</sender> + <signal>clicked()</signal> + <receiver>AboutDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>278</x> + <y>253</y> + </hint> + <hint type="destinationlabel"> + <x>96</x> + <y>254</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/common/Coord.cpp b/src/common/Coord.cpp new file mode 100644 index 0000000..a8de798 --- /dev/null +++ b/src/common/Coord.cpp @@ -0,0 +1,196 @@ +#include "Coord.h" +#include "LineF.h" + +#include <stdio.h> + +/* +qreal angle(Coord & vertex, Coord p1, Coord p2) +{ + p1=p1-vertex; + p2=p2-vertex; + return angle(p2)-angle(p1); +} +*/ +qreal angle(Coord p1) +{ + if (p1.length() == 0) + return 0; + qreal adjacent = (double)p1.x() / p1.length(); + if (p1.y() > 0) + return acos(adjacent); + return -acos(adjacent); +} + +void rotate(Coord & p1,qreal angle) +{ + Coord p1p(cos(angle)*p1.x()-sin(angle)*p1.y(), sin(angle)*p1.x()+cos(angle)*p1.y()); + p1=p1p; +} + +CoordBox::CoordBox(const Coord &C1, const Coord &C2) +{ + setBottomLeft(QPointF(C1.x()<C2.x()?C1.x():C2.x(), C1.y()<C2.y()?C1.y():C2.y())); + setTopRight(QPointF(C1.x()>C2.x()?C1.x():C2.x(), C1.y()>C2.y()?C1.y():C2.y())); +} + +CoordBox CoordBox::zoomed(qreal f) const +{ + Coord C(center()); + qreal DLat = latDiff()/2*f; + qreal DLon = lonDiff()/2*f; + return CoordBox(Coord(C.x()-DLon, C.y()-DLat), Coord(C.x()+DLon, C.y()+DLat) ); +} + +bool CoordBox::toXML(QString elName, QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement(elName); + Coord(topRight()).toXML("topright", stream); + Coord(bottomLeft()).toXML("bottomleft", stream); + stream.writeEndElement(); + + return OK; +} + +bool CoordBox::toXML(QString elName, QDomElement& xParent) const +{ + bool OK = true; + + QDomElement e = xParent.ownerDocument().createElement(elName); + xParent.appendChild(e); + + Coord(topRight()).toXML("topright", e); + Coord(bottomLeft()).toXML("bottomleft", e); + + return OK; +} + +CoordBox CoordBox::fromXML(QDomElement e) +{ + Coord tr = Coord::fromXML(e.firstChildElement("topright")); + Coord bl = Coord::fromXML(e.firstChildElement("bottomleft")); + + return CoordBox(Coord(bl.x(), tr.y()), Coord(tr.x(), bl.y())); +} + +CoordBox CoordBox::fromXML(QXmlStreamReader& stream) +{ + Coord tr, bl; + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "topright") + tr = Coord::fromXML(stream); + else if (stream.name() == "bottomleft") + bl = Coord::fromXML(stream); + + stream.readNext(); + } + + return CoordBox(Coord(bl.x(), tr.y()), Coord(tr.x(), bl.y())); +} + +#define EQUATORIALRADIUSKM 6378.137 +qreal Coord::distanceFrom(const Coord& other) const +{ + qreal dlon = other.x() - x(); + + const qreal slat1 = sin(angToRad(y())); + const qreal clat1 = cos(angToRad(y())); + + const qreal slat2 = sin(angToRad(other.y())); + const qreal clat2 = cos(angToRad(other.y())); + + const qreal sdlon = sin(angToRad(dlon)); + const qreal cdlon = cos(angToRad(dlon)); + + const qreal t1 = clat2 * sdlon; + const qreal t2 = clat1 * slat2 - slat1 * clat2 * cdlon; + const qreal t3 = slat1 * slat2 + clat1 * clat2 * cdlon; + const qreal dist = atan2(sqrt(t1*t1 + t2*t2), t3); + + return dist * EQUATORIALRADIUSKM; +} + +bool Coord::toXML(QString elName, QXmlStreamWriter& stream) const +{ + bool OK = true; + + stream.writeStartElement(elName); + stream.writeAttribute("lon",COORD2STRING(x())); + stream.writeAttribute("lat", COORD2STRING(y())); + stream.writeEndElement(); + + return OK; +} + +bool Coord::toXML(QString elName, QDomElement& xParent) const +{ + bool OK = true; + + QDomElement e = xParent.ownerDocument().createElement(elName); + xParent.appendChild(e); + + e.setAttribute("lon",COORD2STRING(x())); + e.setAttribute("lat", COORD2STRING(y())); + + return OK; +} + +Coord Coord::fromXML(QDomElement e) +{ + qreal lat = e.attribute("lat").toDouble(); + qreal lon = e.attribute("lon").toDouble(); + + return Coord(lon, lat); +} + +Coord Coord::fromXML(QXmlStreamReader& stream) +{ + qreal lat = stream.attributes().value("lat").toString().toDouble(); + qreal lon = stream.attributes().value("lon").toString().toDouble(); + stream.readNext(); + + return Coord(lon, lat); +} + +void CoordBox::resize(qreal d) +{ + qreal dlat = (topRight().y()-bottomLeft().y())*(d-1)/2; + qreal dlon = (topRight().x()-bottomLeft().x())*(d-1)/2; + setBottom(bottom()-dlat); + setLeft(left()-dlon); + setTop(top()+dlat); + setRight(right()+dlon); +} + +bool CoordBox::visibleLine(const CoordBox & viewport, Coord & last, Coord & here) +{ + if (viewport.contains(last) && viewport.contains(here)) + return true; + + Coord A, B; + LineF(last, here).intersectionWith(viewport, &A, &B); + if (A.isNull() && B.isNull()) + return false; + + if (!A.isNull() && !B.isNull()) { + last = A; + here = B; + return true; + } + + if (viewport.contains(here)) + last = A; + else + here = A; + + return true; +// return viewport.intersects( CoordBox(last, here) ); +} + +uint qHash(const Coord &c) +{ + return (uint)(c.y() + 65537 * c.x()); +} diff --git a/src/common/Coord.h b/src/common/Coord.h new file mode 100644 index 0000000..44547a8 --- /dev/null +++ b/src/common/Coord.h @@ -0,0 +1,213 @@ +#ifndef MERKATOR_COORD_H_ +#define MERKATOR_COORD_H_ + +#include <math.h> +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#include <QRectF> +#include <QtDebug> +#include <QtXml> + +#define COORD_MAX (qreal)180.0 +#define COORD_ENLARGE (qreal)0.00015 + +#define COORD2STRING(c) QString::number(c, 'f', 7) +inline QString Coord2Sexa(qreal c) +{ + int deg = int(c); + qreal min = fabs((c - deg)*60); + qreal sec = (min - int(min)) *60; + + return QString::fromUtf8("%1° %2' %3\"").arg(deg).arg(int(min)).arg(sec, 0, 'f', 2); +} + + +inline qreal angToRad(qreal a) +{ + return a*M_PI/180.; +} + +inline qreal radToAng(qreal a) +{ + return a*180/M_PI; +} + +class Coord : public QPointF +{ + public: + Coord() + : QPointF() {} + Coord(const Coord& c) + : QPointF(c.x(), c.y()) {} + Coord(const QPoint& P) + : QPointF(P.x(), P.y()) {} + Coord(const QPointF& P) + : QPointF(P.x(), P.y()) {} + Coord(qreal aLon, qreal aLat) + : QPointF(aLon, aLat) {} + + qreal length() const + { + return sqrt((y()*y()+x()*x())); + } + + qreal distanceFrom(const Coord& other) const; + + bool toXML(QString elName, QXmlStreamWriter& stream) const; + bool toXML(QString elName, QDomElement& xParent) const; + static Coord fromXML(QDomElement e); + static Coord fromXML(QXmlStreamReader& stream); + + + Coord& operator=(const Coord&) = default; +}; + +uint qHash(const Coord &c); + + +inline Coord operator-(const Coord& A, const Coord& B) +{ + return Coord(A.x()-B.x(), A.y()-B.y()); +} + +inline Coord operator-(const Coord& A, const qreal B) +{ + return Coord(A.x()-B, A.y()-B); +} + +inline Coord operator+(const Coord& A, const Coord& B) +{ + return Coord(A.x()+B.x(), A.y()+B.y()); +} + +inline Coord operator+(const Coord& A, const qreal B) +{ + return Coord(A.x()+B, A.y()+B); +} + +inline Coord operator*(const Coord& A, qreal d) +{ + return Coord(A.x()*d, A.y()*d); +} + +inline Coord operator/(const Coord& A, qreal d) +{ + if(d==0) + { + qDebug()<<"Error: divide by 0"<<endl; + return A; + } + return Coord(A.x()/d, A.y()/d); +} + +inline bool operator==(const Coord& A,const Coord& B) +{ + return A.y()==B.y() && A.x()==B.x(); +} + +qreal angle(Coord p1); +void rotate(Coord & p1,qreal angle); + +class CoordBox : public QRectF +{ + public: + CoordBox() + : QRectF() {} + CoordBox(const CoordBox& cb) + : QRectF(cb) {} + CoordBox(const QRectF& r) + : QRectF(r) {} + CoordBox(const Coord& C1, const Coord& C2); + + bool isNull() const + { + return (bottomLeft().isNull() && topRight().isNull()); + } + bool isEmpty() const + { + return (lonDiff() == 0 || latDiff() == 0); + } + + void merge(const Coord& C) + { + if (C.y() < bottom()) + setBottom(C.y()); + if (C.x() < left()) + setLeft(C.x()); + if (C.y() > top()) + setTop(C.y()); + if (C.x() > right()) + setRight(C.x()); + } + + void merge(const CoordBox& B) + { + merge(B.bottomLeft()); + merge(B.topRight()); + } + + Coord center() const + { + return Coord(QRectF::center()); + } + + qreal lonDiff() const + { + return width(); + } + qreal latDiff() const + { + return -height(); + } + CoordBox zoomed(qreal f) const; + + bool contains(const Coord& C) const + { + return (bottomLeft().y() <= C.y()) && (bottomLeft().x() <= C.x()) && + (C.y() < topRight().y()) && (C.x() <= topRight().x()); + } + + bool contains(const CoordBox& B) const + { + return contains(B.bottomLeft()) && contains(B.topRight()); + } + + bool intersects(const CoordBox& B) const + { + if ((B.latDiff() == 0) && (B.lonDiff() == 0)) { + return contains(B.bottomLeft()); + } + return QRectF::intersects(B); + } + + bool disjunctFrom(const CoordBox& B) const + { + return !intersects(B); + } + + void resize(qreal f); + + static bool visibleLine(const CoordBox & viewport, Coord & last, Coord & here); + + bool toXML(QString elName, QXmlStreamWriter& stream) const; + bool toXML(QString elName, QDomElement& xParent) const; + static CoordBox fromXML(QDomElement e); + static CoordBox fromXML(QXmlStreamReader& stream); + + CoordBox& operator=(const CoordBox&) = default; +}; + +Q_DECLARE_METATYPE( CoordBox ); + +#ifndef _MOBILE +#if QT_VERSION < 0x040700 || defined(FORCE_46) +#include <ggl/geometries/register/box.hpp> + +GEOMETRY_REGISTER_BOX(CoordBox, Coord, bottomLeft, topRight) +#endif +#endif + +#endif + + diff --git a/src/common/Document.cpp b/src/common/Document.cpp new file mode 100644 index 0000000..46adb21 --- /dev/null +++ b/src/common/Document.cpp @@ -0,0 +1,1284 @@ +#include "Global.h" + +#include "Command.h" + +#include "Feature.h" +#include "Document.h" +#include "ImageMapLayer.h" + +#include "ImportNMEA.h" +#include "ImportExportKML.h" +#include "ImportExportCSV.h" +#include "ImportExportOSC.h" +#include "ImportExportGdal.h" +#ifdef USE_PROTOBUF +#include "ImportExportPBF.h" +#endif + +#include "MainWindow.h" +#include "MerkaartorPreferences.h" +#include "LayerWidget.h" + +#include "TagSelector.h" +#include "IPaintStyle.h" +#include "FeaturePainter.h" + +#include "LayerIterator.h" +#include "IMapAdapter.h" + + +#include <QString> +#include <QMultiMap> +#include <QProgressDialog> +#include <QProgressBar> +#include <QClipboard> +#include <QMap> +#include <QList> +#include <QMenu> +#include <QSet> +#include <QReadWriteLock> + +/* MAPDOCUMENT */ + +class MapDocumentPrivate +{ +public: + MapDocumentPrivate() + : History(new CommandHistory()) + , dirtyLayer(0) + , uploadedLayer(0) + /*, trashLayer(0)*/ + , theDock(0) + , lastDownloadLayer(0) + , tagFilter(0), FilterRevision(0) + , layerNum(0) + , theFeaturePaintersLock( QReadWriteLock::Recursive ) + { + }; + ~MapDocumentPrivate() + { + History->cleanup(); + delete History; + for (int i=0; i<Layers.size(); ++i) { + if (theDock) + theDock->deleteLayer(Layers[i]); + delete Layers[i]; + } + } + CommandHistory* History; + QList<Layer*> Layers; + DirtyLayer* dirtyLayer; + UploadedLayer* uploadedLayer; + LayerDock* theDock; + Layer* lastDownloadLayer; + QDateTime lastDownloadTimestamp; + QHash<Layer*, CoordBox> downloadBoxes; + + TagSelector* tagFilter; + int FilterRevision; + QString title; + int layerNum; + mutable QString Id; + + QList<FeaturePainter> theFeaturePainters; + QReadWriteLock theFeaturePaintersLock; +}; + +Document::Document() + : p(new MapDocumentPrivate) +{ + setFilterType(M_PREFS->getCurrentFilter()); + p->title = tr("untitled"); + + for (int i=0; i<M_STYLE->painterSize(); ++i) { + p->theFeaturePainters.append(FeaturePainter(*M_STYLE->getPainter(i))); + } +} + +Document::Document(LayerDock* aDock) + : p(new MapDocumentPrivate) +{ + p->theDock = aDock; + setFilterType(M_PREFS->getCurrentFilter()); + p->title = tr("untitled"); + + for (int i=0; i<M_STYLE->painterSize(); ++i) { + p->theFeaturePainters.append(FeaturePainter(*M_STYLE->getPainter(i))); + } +} + +Document::Document(const Document&, LayerDock*) +: p(0) +{ + p->title = tr("untitled"); +} + +Document::~Document() +{ + delete p; +} + +const QString& Document::id() const +{ + if (p->Id.isEmpty()) + p->Id = QUuid::createUuid().toString(); + return p->Id; +} + +void Document::setPainters(QList<Painter> aPainters) +{ + lockPaintersForWrite(); + p->theFeaturePainters.clear(); + for (int i=0; i<aPainters.size(); ++i) { + FeaturePainter fp(aPainters[i]); + p->theFeaturePainters.append(fp); + } + for (FeatureIterator it(this); !it.isEnd(); ++it) + { + it.get()->invalidatePainter(); + } + unlockPainters(); +} + +int Document::getPaintersSize() +{ + return p->theFeaturePainters.size(); +} + +void Document::unlockPainters() { + p->theFeaturePaintersLock.unlock(); +} + +void Document::lockPainters() { + p->theFeaturePaintersLock.lockForRead(); +} + +void Document::lockPaintersForWrite() { + p->theFeaturePaintersLock.lockForWrite(); +} + +const Painter* Document::getPainter(int i) +{ + return &p->theFeaturePainters[i]; +} + +void Document::addDefaultLayers() +{ + /*ImageMapLayer*l = */addImageLayer(); + + if (g_Merk_Frisius) { + DrawingLayer* aLayer = addDrawingLayer(); + setLastDownloadLayer(aLayer); + } else { + p->dirtyLayer = new DirtyLayer(tr("Dirty layer")); + add(p->dirtyLayer); + + p->uploadedLayer = new UploadedLayer(tr("Uploaded layer")); + add(p->uploadedLayer); + } + + addFilterLayers(); +} + +void Document::addFilterLayers() +{ + foreach (FilterItem it, *M_PREFS->getFiltersList()->getFilters()) { + if (it.deleted) + continue; + FilterLayer* f = new FilterLayer(it.id.toString(), it.name, it.filter); + addFilterLayer(f); + } +} + +bool Document::toXML(QXmlStreamWriter& stream, bool asTemplate, QProgressDialog * progress) +{ + bool OK = true; + + stream.writeStartElement("MapDocument"); + + stream.writeAttribute("xml:id", id()); + if (!asTemplate) + stream.writeAttribute("layernum", QString::number(p->layerNum)); + if (p->lastDownloadLayer) { + stream.writeAttribute("lastdownloadlayer", p->lastDownloadLayer->id()); + stream.writeAttribute("lastdownloadtimestamp", p->lastDownloadTimestamp.toUTC().toString(Qt::ISODate)+"Z"); + } + + for (int i=0; i<p->Layers.size(); ++i) { + progress->setMaximum(progress->maximum() + p->Layers[i]->getDisplaySize()); + } + + for (int i=0; i<p->Layers.size(); ++i) { + if (p->Layers[i]->isEnabled()) { + if (asTemplate && p->Layers[i]->classType() == Layer::DrawingLayerType) + continue; + p->Layers[i]->toXML(stream, asTemplate, progress); + } + } + + if (!asTemplate) { + OK = history().toXML(stream, progress); + } + stream.writeEndElement(); + + return OK; +} + +Document* Document::fromXML(QString title, QXmlStreamReader& stream, qreal version, LayerDock* aDock, QProgressDialog * progress) +{ + Document* NewDoc = new Document(aDock); + NewDoc->p->title = title; + + CommandHistory* h = 0; + + if (stream.attributes().hasAttribute("xml:id")) + NewDoc->p->Id = stream.attributes().value("xml:id").toString(); + if (stream.attributes().hasAttribute("layernum")) + NewDoc->p->layerNum = stream.attributes().value("layernum").string()->toInt(); + else + NewDoc->p->layerNum = 1; + QString lastdownloadlayerId; + if (stream.attributes().hasAttribute("lastdownloadlayer")) { + NewDoc->p->lastDownloadTimestamp = QDateTime::fromString(stream.attributes().value("lastdownloadtimestamp").toString().left(19), Qt::ISODate); + NewDoc->p->lastDownloadTimestamp.setTimeSpec(Qt::UTC); + lastdownloadlayerId = stream.attributes().value("lastdownloadlayer").toString(); + } + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "ImageMapLayer") { + /*ImageMapLayer* l =*/ ImageMapLayer::fromXML(NewDoc, stream, progress); + } else if (stream.name() == "DeletedMapLayer") { + /*DeletedMapLayer* l =*/ DeletedLayer::fromXML(NewDoc, stream, progress); + } else if (stream.name() == "DirtyLayer" || stream.name() == "DirtyMapLayer") { + /*DirtyMapLayer* l =*/ DirtyLayer::fromXML(NewDoc, stream, progress); + } else if (stream.name() == "UploadedLayer" || stream.name() == "UploadedMapLayer") { + /*UploadedMapLayer* l =*/ UploadedLayer::fromXML(NewDoc, stream, progress); + } else if (stream.name() == "DrawingLayer" || stream.name() == "DrawingMapLayer") { + /*DrawingMapLayer* l =*/ DrawingLayer::fromXML(NewDoc, stream, progress); + } else if (stream.name() == "TrackLayer" || stream.name() == "TrackMapLayer") { + /*TrackMapLayer* l =*/ TrackLayer::fromXML(NewDoc, stream, progress); + } else if (stream.name() == "ExtractedLayer") { + /*DrawingMapLayer* l =*/ DrawingLayer::fromXML(NewDoc, stream, progress); + } else if (stream.name() == "FilterLayer") { + /*FilterLayer* l =*/ FilterLayer::fromXML(NewDoc, stream, progress); + } else if (stream.name() == "CommandHistory") { + if (version > 1.0) + h = CommandHistory::fromXML(NewDoc, stream, progress); + } else if (!stream.isWhitespace()) { + qDebug() << "Doc: logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + + if (progress && progress->wasCanceled()) + break; + + stream.readNext(); + } + + if (progress && progress->wasCanceled()) { + delete NewDoc; + NewDoc = NULL; + } + + if (NewDoc) { + if (!lastdownloadlayerId.isEmpty()) + NewDoc->p->lastDownloadLayer = NewDoc->getLayer(lastdownloadlayerId); + + if (h) + NewDoc->setHistory(h); + else + h = &NewDoc->history(); + + if (!h->size() && NewDoc->getDirtySize()) { + if (progress) + progress->setLabelText("History was corrupted. Rebuilding it..."); + qDebug() << "History was corrupted. Rebuilding it..."; + NewDoc->rebuildHistory(); + } + } + + return NewDoc; +} + +void Document::setLayerDock(LayerDock* aDock) +{ + p->theDock = aDock; +} + +LayerDock* Document::getLayerDock(void) +{ + return p->theDock; +} + +void Document::clear() +{ + delete p; + p = new MapDocumentPrivate; + addDefaultLayers(); +} + +void Document::setHistory(CommandHistory* h) +{ + delete p->History; + p->History = h; + emit(historyChanged()); +} + +CommandHistory& Document::history() +{ + return *(p->History); +} + +const CommandHistory& Document::history() const +{ + return *(p->History); +} + +void Document::addHistory(Command* aCommand) +{ + p->History->add(aCommand); + emit(historyChanged()); +} + +void Document::redoHistory() +{ + p->History->redo(); + emit(historyChanged()); +} + +void Document::undoHistory() +{ + p->History->undo(); + emit(historyChanged()); +} + +void Document::add(Layer* aLayer) +{ + p->Layers.push_back(aLayer); + aLayer->setDocument(this); + if (p->theDock) + p->theDock->addLayer(aLayer); +} + +void Document::moveLayer(Layer* aLayer, int pos) +{ + p->Layers.move(p->Layers.indexOf(aLayer), pos); +} + +ImageMapLayer* Document::addImageLayer(ImageMapLayer* aLayer) +{ + ImageMapLayer* theLayer = aLayer; + if (!theLayer) + theLayer = new ImageMapLayer(tr("Background imagery")); + add(theLayer); + + connect(theLayer, SIGNAL(imageRequested(ImageMapLayer*)), + this, SLOT(on_imageRequested(ImageMapLayer*)), Qt::QueuedConnection); + connect(theLayer, SIGNAL(imageReceived(ImageMapLayer*)), + this, SLOT(on_imageReceived(ImageMapLayer*)), Qt::QueuedConnection); + connect(theLayer, SIGNAL(loadingFinished(ImageMapLayer*)), + this, SLOT(on_loadingFinished(ImageMapLayer*)), Qt::QueuedConnection); + + return theLayer; +} + +DrawingLayer* Document::addDrawingLayer(DrawingLayer *aLayer) +{ + DrawingLayer* theLayer = aLayer; + if (!theLayer) + theLayer = new DrawingLayer(tr("Drawing layer #%1").arg(p->layerNum++)); + add(theLayer); + return theLayer; +} + +FilterLayer* Document::addFilterLayer(FilterLayer *aLayer) +{ + FilterLayer* theLayer = aLayer; + if (!theLayer) + theLayer = new FilterLayer(QUuid::createUuid().toString(), tr("Filter layer #%1").arg(++p->layerNum), "false"); + add(theLayer); + + FeatureIterator it(this); + for(;!it.isEnd(); ++it) { + it.get()->updateFilters(); + } + + return theLayer; +} + +void Document::remove(Layer* aLayer) +{ + QList<Layer*>::iterator i = qFind(p->Layers.begin(),p->Layers.end(), aLayer); + if (i != p->Layers.end()) { + p->Layers.erase(i); + } + if (aLayer == p->lastDownloadLayer) + p->lastDownloadLayer = NULL; + if (p->theDock) + p->theDock->deleteLayer(aLayer); +} + +bool Document::exists(Layer* L) const +{ + for (int i=0; i<p->Layers.size(); ++i) + if (p->Layers[i] == L) return true; + return false; +} + +bool Document::exists(Feature* F) const +{ + for (int i=0; i<p->Layers.size(); ++i) + if (p->Layers[i]->exists(F)) return true; + return false; +} + +void Document::deleteFeature(Feature* aFeature) +{ + for (int i=0; i<p->Layers.size(); ++i) + if (p->Layers[i]->exists(aFeature)) { + p->Layers[i]->deleteFeature(aFeature); + return; + } +} + +int Document::layerSize() const +{ + return p->Layers.size(); +} + +Layer* Document::getLayer(const QString& id) +{ + for (int i=0; i<p->Layers.size(); ++i) + { + if (p->Layers[i]->id() == id) return p->Layers[i]; + } + return 0; +} + +Layer* Document::getLayer(int i) +{ + return p->Layers.at(i); +} + +const Layer* Document::getLayer(int i) const +{ + return p->Layers[i]; +} + +QList<Feature*> Document::getFeatures(Layer::LayerType layerType) +{ + QList<Feature*> theFeatures; + for (VisibleFeatureIterator i(this); !i.isEnd(); ++i) { + if (!layerType) + theFeatures.append(i.get()); + else + if (i.get()->layer()->classType() == layerType) + theFeatures.append(i.get()); + } + return theFeatures; +} + +Feature* Document::getFeature(const IFeature::FId& id) +{ + for (int i=0; i<p->Layers.size(); ++i) + { + Feature* F = p->Layers[i]->get(id); + if (F) + return F; + } + return NULL; +} + +void Document::setDirtyLayer(DirtyLayer* aLayer) +{ + p->dirtyLayer = aLayer; +} + +Layer* Document::getDirtyLayer() +{ + if (!p->dirtyLayer) { + p->dirtyLayer = new DirtyLayer(tr("Dirty layer")); + add(p->dirtyLayer); + } + return p->dirtyLayer; +} + +Layer* Document::getDirtyOrOriginLayer(Layer* aLayer) +{ + if (g_Merk_Frisius) { + if (aLayer) + return aLayer; + DrawingLayer* firstDrLayer = NULL; + for (int i=0; i<layerSize(); ++i) { + if (!getLayer(i)->isEnabled()) + continue; + if (getLayer(i)->classType() == Layer::DrawingLayerType) { + if (!firstDrLayer) + firstDrLayer = dynamic_cast<DrawingLayer*>(getLayer(i)); + if (getLayer(i)->isSelected()) + return (Layer*)getLayer(i); + } + } + + if (p->lastDownloadLayer) + return p->lastDownloadLayer; + else { + if (firstDrLayer) + return firstDrLayer; + else + return addDrawingLayer(); + } + } else { + if (!aLayer || (aLayer && !aLayer->isUploadable())) + return p->dirtyLayer; + else + return aLayer; + } +} + +Layer* Document::getDirtyOrOriginLayer(Feature* F) +{ + if (g_Merk_Frisius) { + return getDirtyOrOriginLayer(F->layer()); + } + + if (!F || !F->layer() || F->layer()->isUploadable()) + return p->dirtyLayer; + else + return F->layer(); +} + +int Document::getDirtySize() const +{ + int dirtyObjects = 0; + for (int i=0; i<layerSize(); ++i) { + dirtyObjects += getLayer(i)->getDirtySize(); + } + return dirtyObjects; +} + +int Document::size() const +{ + int sz = 0; + for (int i=0; i<layerSize(); ++i) { + sz += getLayer(i)->size(); + } + return sz; +} + + +void Document::setUploadedLayer(UploadedLayer* aLayer) +{ + p->uploadedLayer = aLayer; +} + + +UploadedLayer* Document::getUploadedLayer() const +{ + return p->uploadedLayer; +} + +void Document::exportOSM(QWidget* main, QIODevice* device, QList<Feature*> aFeatures) +{ + if (aFeatures.isEmpty()) + return; + + IProgressWindow* aProgressWindow = dynamic_cast<IProgressWindow*>(main); + if (!aProgressWindow) + return; + + QProgressDialog* dlg = aProgressWindow->getProgressDialog(); + if (dlg) + dlg->setWindowTitle(tr("OSM Export")); + + QProgressBar* Bar = aProgressWindow->getProgressBar(); + if (Bar) { + Bar->setTextVisible(false); + Bar->setMaximum(aFeatures.size()); + } + + QLabel* Lbl = aProgressWindow->getProgressLabel(); + if (Lbl) + Lbl->setText(tr("Exporting OSM...")); + + if (dlg) + dlg->show(); + + QXmlStreamWriter stream(device); + stream.setAutoFormatting(true); + stream.setAutoFormattingIndent(2); + stream.writeStartDocument(); + + stream.writeStartElement("osm"); + stream.writeAttribute("version", "0.6"); + stream.writeAttribute("generator", QString("%1 %2").arg(qApp->applicationName()).arg(STRINGIFY(VERSION))); + + CoordBox aCoordBox = aFeatures[0]->boundingBox(true); + aFeatures[0]->toXML(stream, dlg); + for (int i=1; i < aFeatures.size(); i++) { + aCoordBox.merge(aFeatures[i]->boundingBox(true)); + aFeatures[i]->toXML(stream, dlg); + } + + stream.writeStartElement("bound"); + QString S = QString().number(aCoordBox.bottom(),'f',6) + ","; + S += QString().number(aCoordBox.left(),'f',6) + ","; + S += QString().number(aCoordBox.top(),'f',6) + ","; + S += QString().number(aCoordBox.right(),'f',6); + stream.writeAttribute("box", S); + stream.writeAttribute("origin", QString("http://www.openstreetmap.org/api/%1").arg(M_PREFS->apiVersion())); + stream.writeEndElement(); + + stream.writeEndElement(); + stream.writeEndDocument(); +} + +QList<Feature*> Document::exportCoreOSM(QList<Feature*> aFeatures, bool forCopyPaste, QProgressDialog * progress) +{ + QList<Feature*> exportedFeatures; + QList<Feature*>::Iterator i; + + for (i = aFeatures.begin(); i != aFeatures.end(); ++i) { + if (/*Node* n = */dynamic_cast<Node*>(*i)) { + if (!exportedFeatures.contains(*i)) + exportedFeatures.append(*i); + } else { + if (Way* G = dynamic_cast<Way*>(*i)) { + for (int j=0; j < G->size(); j++) { + if (Node* P = dynamic_cast<Node*>(G->get(j))) { + if (!exportedFeatures.contains(P)) + exportedFeatures.append(P); + } + if (!exportedFeatures.contains(G)) + exportedFeatures.append(G); + } + } else { + //FIXME Not working for relation (not made of point?) + if (Relation* G = dynamic_cast<Relation*>(*i)) { + if (!forCopyPaste) { + for (int j=0; j < G->size(); j++) { + if (Way* R = CAST_WAY(G->get(j))) { + for (int k=0; k < R->size(); k++) { + if (Node* P = dynamic_cast<Node*>(R->get(k))) { + if (!exportedFeatures.contains(P)) + exportedFeatures.append(P); + } + } + if (!exportedFeatures.contains(R)) + exportedFeatures.append(R); + } else + if (Node* P = CAST_NODE(G->get(j))) { + if (!exportedFeatures.contains(P)) + exportedFeatures.append(P); + } + + } + } + if (!exportedFeatures.contains(G)) + exportedFeatures.append(G); + } + } + } + if (progress) { + if (progress->wasCanceled()) { + exportedFeatures.clear(); + return exportedFeatures; + } + progress->setValue(progress->value()+1); + } + } + + return exportedFeatures; +} + +bool Document::importNMEA(const QString& filename, TrackLayer* NewLayer) +{ + ImportNMEA imp(this); + if (!imp.loadFile(filename)) + return false; + imp.import(NewLayer); + + if (NewLayer->size()) + return true; + else + return false; +} + +bool Document::importOSC(const QString& filename, DrawingLayer* NewLayer) +{ +#ifndef FRISIUS_BUILD + ImportExportOSC imp(this); + if (!imp.loadFile(filename)) + return false; + imp.import(NewLayer); + + if (NewLayer->size()) + return true; + else + return false; +#endif +} + +bool Document::importKML(const QString& filename, TrackLayer* NewLayer) +{ + ImportExportKML imp(this); + if (!imp.loadFile(filename)) + return false; + imp.import(NewLayer); + + if (NewLayer->size()) + return true; + else + return false; +} + +#ifndef _MOBILE +bool Document::importGDAL(const QString& filename, DrawingLayer* NewLayer) +{ + ImportExportGdal imp(this); + if (!imp.loadFile(filename)) + return false; + bool ret = imp.import(NewLayer); + + if (ret && NewLayer->size()) + return true; + else + return false; +} +#endif + +bool Document::importCSV(const QString& filename, DrawingLayer* NewLayer) +{ + ImportExportCSV imp(this); + if (!imp.loadFile(filename)) + return false; + imp.import(NewLayer); + + if (NewLayer->size()) + return true; + else + return false; +} + +#ifdef USE_PROTOBUF +bool Document::importPBF(const QString& filename, DrawingLayer* NewLayer) +{ + ImportExportPBF imp(this); + if (!imp.loadFile(filename)) + return false; + imp.import(NewLayer); + + if (NewLayer->size()) + return true; + else + return false; +} +#endif + +void Document::addDownloadBox(Layer* l, CoordBox aBox) +{ + p->downloadBoxes.insertMulti(l, aBox); +} + +void Document::removeDownloadBox(Layer* l) +{ + p->downloadBoxes.remove(l); +} + +const QList<CoordBox> Document::getDownloadBoxes() const +{ + return p->downloadBoxes.values(); +} + +const QList<CoordBox> Document::getDownloadBoxes(Layer* l) const +{ + return p->downloadBoxes.values(l); +} + +bool Document::isDownloadedSafe(const CoordBox& bb) const +{ + QHashIterator<Layer*, CoordBox>it(p->downloadBoxes); + while(it.hasNext()) { + it.next(); + if (it.value().intersects(bb)) + return true; + } + + return false; +} + +QDateTime Document::getLastDownloadLayerTime() const +{ + return p->lastDownloadTimestamp; +} + +Layer * Document::getLastDownloadLayer() const +{ + return p->lastDownloadLayer; +} + +void Document::setLastDownloadLayer(Layer * aLayer) +{ + p->lastDownloadLayer = aLayer; + p->lastDownloadTimestamp = QDateTime::currentDateTime(); +} + +void Document::on_imageRequested(ImageMapLayer* anImageLayer) +{ + emit imageRequested(anImageLayer); +} + +void Document::on_imageReceived(ImageMapLayer* anImageLayer) +{ + emit imageReceived(anImageLayer); +} + +void Document::on_loadingFinished(ImageMapLayer* anImageLayer) +{ + emit loadingFinished(anImageLayer); +} + +QPair<bool,CoordBox> Document::boundingBox() +{ + int First; + for (First = 0; First < layerSize(); ++First) + if (getLayer(First)->size() && !getLayer(First)->boundingBox().isNull()) + break; + if (First == layerSize()) + return qMakePair(false,CoordBox(Coord(0,0),Coord(0,0))); + Layer* aLayer = getLayer(First); + CoordBox BBox = aLayer->boundingBox(); + for (int i=First+1; i<layerSize(); ++i) { + aLayer = getLayer(i); + if (aLayer->size() && !aLayer->boundingBox().isNull()) + BBox.merge(aLayer->boundingBox()); + } + return qMakePair(true,BBox); +} + +bool Document::setFilterType(FilterType aFilter) +{ + p->FilterRevision++; + QString theFilter = M_PREFS->getFilter(aFilter).filter; + if (theFilter.isEmpty()) { + if (p->tagFilter) + SAFE_DELETE(p->tagFilter); + return true; + } + p->tagFilter = TagSelector::parse(M_PREFS->getFilter(aFilter).filter); + return (p->tagFilter != NULL); +} + +TagSelector* Document::getTagFilter() +{ + return p->tagFilter; +} + +int Document::filterRevision() const +{ + return p->FilterRevision; +} + +QString Document::title() const +{ + return p->title; +} + +void Document::setTitle(const QString aTitle) +{ + p->title = aTitle; +} + +QString Document::toPropertiesHtml() +{ + QString h; + + h += "<big><strong>" + tr("Document") + "</strong></big><hr/>"; + for (int i=0; i<p->Layers.size(); ++i) { + h += p->Layers[i]->toPropertiesHtml() + "<br/>"; + } + h += ""; + + return h; +} + +QStringList Document::getCurrentSourceTags() +{ + QStringList theSrc; + for (LayerIterator<ImageMapLayer*> ImgIt(this); !ImgIt.isEnd(); ++ImgIt) { + if (ImgIt.get()->isVisible()) { + QString s = ImgIt.get()->getMapAdapter()->getSourceTag(); + if (!s.isEmpty()) + theSrc << ImgIt.get()->getMapAdapter()->getSourceTag(); + } + } + return theSrc; +} + +Document* Document::getDocumentFromXml(QDomDocument* theXmlDoc) +{ + QDomElement c; + c = theXmlDoc->documentElement(); +// if (c.tagName().isNull()) +// c = c.firstChildElement(); +// while (!c.isNull() && c.tagName().isNull()) { +// c =c.nextSiblingElement(); +// } +// if (c.isNull()) +// return NULL; + + if (c.tagName() == "osm") { + QString xml; + QTextStream tstr(&xml, QIODevice::ReadOnly); + c.save(tstr, 2); + + QXmlStreamReader stream(xml); + + Document* NewDoc = new Document(NULL); + DrawingLayer* l = new DrawingLayer("Dummy"); + NewDoc->add(l); + + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "osm") { + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "way") { + Way::fromXML(NewDoc, l, stream); + } else if (stream.name() == "relation") { + Relation::fromXML(NewDoc, l, stream); + } else if (stream.name() == "node") { + Node::fromXML(NewDoc, l, stream); + } else if (!stream.isWhitespace()) { + qDebug() << "Doc::clipboard logic error:" << stream.name() << ":" << stream.tokenType() << "(" << stream.lineNumber() << ")"; + stream.skipCurrentElement(); + } + stream.readNext(); + } + } + + stream.readNext(); + } + + return NewDoc; + } else if (c.tagName() == "kml") { + Document* NewDoc = new Document(NULL); + DrawingLayer* l = new DrawingLayer("Dummy"); + NewDoc->add(l); + + ImportExportKML imp(NewDoc); + QByteArray ba = theXmlDoc->toByteArray(); + QBuffer kmlBuf(&ba); + kmlBuf.open(QIODevice::ReadOnly); + if (imp.setDevice(&kmlBuf)) + imp.import(l); + + return NewDoc; +#ifndef FRISIUS_BUILD + } else if (c.tagName() == "osmChange" || c.tagName() == "osmchange") { + Document* NewDoc = new Document(NULL); + DrawingLayer* l = new DrawingLayer("Dummy"); + NewDoc->add(l); + + ImportExportOSC imp(NewDoc); + QByteArray ba = theXmlDoc->toByteArray(); + QBuffer buf(&ba); + buf.open(QIODevice::ReadOnly); + if (imp.setDevice(&buf)) + imp.import(l); + + return NewDoc; +#endif + } else if (c.tagName() == "gpx") { + } + return NULL; +} + +QList<Feature*> Document::mergeDocument(Document* otherDoc, Layer* layer, CommandList* theList) +{ + QList<Feature*> theFeats; + for (int i=0; i<otherDoc->layerSize(); ++i) + for (int j=0; j<otherDoc->getLayer(i)->size(); ++j) + if (!otherDoc->getLayer(i)->get(j)->isNull()) + theFeats.push_back(otherDoc->getLayer(i)->get(j)); + for (int i=0; i<theFeats.size(); ++i) { + Feature*F = theFeats.at(i); + if (getFeature(F->id())) + F->resetId(); + + // Re-link null features to the ones in the current document + for (int j=0; j<F->size(); ++j) { + Feature* C = F->get(j); + if (C->isNull()) { + if (Feature* CC = getFeature(C->id())) { + if (Relation* R = CAST_RELATION(F)) { + QString role = R->getRole(j); + R->remove(j); + R->add(role, CC, j); + } else if (Way* W = CAST_WAY(F)) { + Node* N = CAST_NODE(CC); + W->remove(j); + W->add(N, j); + } + } else + theFeats.push_back(C); + } + } + F->layer()->remove(F); + if (theList) + theList->add(new AddFeatureCommand(layer, F, true)); + else { + layer->add(F); + } + } + return theFeats; +} + +Document* Document::getDocumentFromClipboard() +{ + QClipboard *clipboard = QApplication::clipboard(); + QDomDocument theXmlDoc; + + if (clipboard->mimeData()->hasFormat("application/x-openstreetmap+xml")) { + if (!theXmlDoc.setContent(clipboard->mimeData()->data("application/x-openstreetmap+xml"))) { + return NULL; + } + } else + if (clipboard->mimeData()->hasFormat("application/vnd.google-earth.kml+xml")) { + if (!theXmlDoc.setContent(clipboard->mimeData()->data("application/vnd.google-earth.kml+xml"))) { + return NULL; + } + } else + if (clipboard->mimeData()->hasText()) { + if (!theXmlDoc.setContent(clipboard->text())) { + return NULL; + } + } else { + return NULL; + } + return Document::getDocumentFromXml(&theXmlDoc); +} + +/* FEATUREITERATOR */ + +FeatureIterator::FeatureIterator(Document *aDoc) +: theDocument(aDoc), curLayerIdx(0), curFeatureIdx(0), isAtEnd(false) +{ + docSize = theDocument->layerSize(); + if (!docSize) + isAtEnd = true; + else { + curLayerSize = theDocument->getLayer(curLayerIdx)->size(); + + if(!check() && !isAtEnd) + ++(*this); + } +} + +FeatureIterator::~FeatureIterator() +{ +} + +Feature* FeatureIterator::get() +{ + return theDocument->getLayer(curLayerIdx)->get(curFeatureIdx); +} + +bool FeatureIterator::isEnd() const +{ + return isAtEnd; +} + +FeatureIterator& FeatureIterator::operator++() +{ + docSize = theDocument->layerSize(); + curLayerSize = theDocument->getLayer(curLayerIdx)->size(); + + if (curFeatureIdx < curLayerSize-1) + curFeatureIdx++; + else + if (curLayerIdx < docSize-1) { + curLayerIdx++; + curLayerSize = theDocument->getLayer(curLayerIdx)->size(); + curFeatureIdx = 0; + } else + isAtEnd = true; + + while(!isAtEnd && !check()) { + if (curFeatureIdx < curLayerSize-1) + curFeatureIdx++; + else + if (curLayerIdx < docSize-1) { + curLayerIdx++; + curLayerSize = theDocument->getLayer(curLayerIdx)->size(); + curFeatureIdx = 0; + } else + isAtEnd = true; + } + + return *this; +} + +int FeatureIterator::index() +{ + return (curLayerIdx*10000000)+curFeatureIdx; +} + +bool FeatureIterator::check() +{ + if (curLayerIdx >= docSize) { + isAtEnd = true; + return false; + } + if (curFeatureIdx >= curLayerSize) + return false; + + Feature* curFeature = theDocument->getLayer(curLayerIdx)->get(curFeatureIdx); + if (curFeature->lastUpdated() == Feature::NotYetDownloaded + || curFeature->isDeleted() || curFeature->isVirtual()) + return false; + + return true; +} + + +/* VISIBLEFEATUREITERATOR */ + +VisibleFeatureIterator::VisibleFeatureIterator(Document *aDoc) +: FeatureIterator(aDoc) +{ + if(!check() && !isAtEnd) + ++(*this); +} + +VisibleFeatureIterator::~VisibleFeatureIterator() +{ +} + +bool VisibleFeatureIterator::check() +{ + if (!FeatureIterator::check()) + return false; + else if (theDocument->getLayer(curLayerIdx)->get(curFeatureIdx)->isHidden()) + return false; + + return true; +} + +void Document::rebuildHistory() +{ + delete p->History; + p->History = new CommandHistory(); + CommandHistory* h = p->History; + + // Identify changes + QList<Node*> newNode; + QList<Node*> updNode; + QList<Node*> delNode; + QList<Way*> newWay; + QList<Way*> updWay; + QList<Way*> delWay; + QList<Relation*> newRelation; + QList<Relation*> updRelation; + QList<Relation*> delRelation; + for (FeatureIterator it(this); !it.isEnd(); ++it) { + if (!it.get()->isDirty()) + continue; + + if (CHECK_NODE(it.get())) { + Node* N = STATIC_CAST_NODE(it.get()); + if (N->hasOSMId()) { + if (!N->isDeleted()) + updNode << N; + else + delNode << N; + } else { + if (!N->isDeleted()) + newNode << N; + } + } else if (CHECK_WAY(it.get())) { + Way* W = STATIC_CAST_WAY(it.get()); + if (W->hasOSMId()) { + if (!W->isDeleted()) + updWay << W; + else + delWay << W; + } else { + if (!W->isDeleted()) + newWay << W; + } + } else if (CHECK_RELATION(it.get())) { + Relation* R = STATIC_CAST_RELATION(it.get()); + if (R->hasOSMId()) { + if (!R->isDeleted()) + updRelation << R; + else + delRelation << R; + } else { + if (!R->isDeleted()) + newRelation << R; + } + } + } + + // Recreate history + foreach (Node* N, newNode) { + CommandList* CL = new CommandList(tr("History rebuild: Create node %1").arg(N->description()), N); + Command* C = new AddFeatureCommand(N->layer(), N, true); + CL->add(C); + h->add(CL); + } + foreach (Node* N, updNode) { + CommandList* CL = new CommandList(tr("History rebuild: Update node %1").arg(N->description()), N);; + Command* C = new AddFeatureCommand(N->layer(), N, true); + CL->add(C); + h->add(CL); + } + foreach (Node* N, delNode) { + CommandList* CL = new CommandList(tr("History rebuild: Delete node %1").arg(N->description()), N); + Command* C = new RemoveFeatureCommand(this, N); + CL->add(C); + h->add(CL); + } + foreach (Way* W, newWay) { + CommandList* CL = new CommandList(tr("History rebuild: Create way %1").arg(W->description()), W); + Command* C = new AddFeatureCommand(W->layer(), W, true); + CL->add(C); + h->add(CL); + } + foreach (Way* W, updWay) { + CommandList* CL = new CommandList(tr("History rebuild: Update way %1").arg(W->description()), W); + Command* C = new AddFeatureCommand(W->layer(), W, true); + CL->add(C); + h->add(CL); + } + foreach (Way* W, delWay) { + CommandList* CL = new CommandList(tr("History rebuild: Delete way %1").arg(W->description()), W); + Command* C = new RemoveFeatureCommand(this, W); + CL->add(C); + h->add(CL); + } + foreach (Relation* R, newRelation) { + CommandList* CL = new CommandList(tr("History rebuild: Create relation %1").arg(R->description()), R); + Command* C = new AddFeatureCommand(R->layer(), R, true); + CL->add(C); + h->add(CL); + } + foreach (Relation* R, updRelation) { + CommandList* CL = new CommandList(tr("History rebuild: Update relation %1").arg(R->description()), R); + Command* C = new AddFeatureCommand(R->layer(), R, true); + CL->add(C); + h->add(CL); + } + foreach (Relation* R, delRelation) { + CommandList* CL = new CommandList(tr("History rebuild: Delete relation %1").arg(R->description()), R); + Command* C = new RemoveFeatureCommand(this, R); + CL->add(C); + h->add(CL); + } +} + +/* RELATED */ + + diff --git a/src/common/Document.h b/src/common/Document.h new file mode 100644 index 0000000..37efa15 --- /dev/null +++ b/src/common/Document.h @@ -0,0 +1,188 @@ +#ifndef DOCUMENT_H_ +#define DOCUMENT_H_ + +#include <QtXml> + +#include "IDocument.h" +#include "Layer.h" +#include "Coord.h" +#include "MerkaartorPreferences.h" +#include "LayerDock.h" + +#include <utility> + +class QString; +class QProgressDialog; +class QMainWindow; + +class Command; +class CommandHistory; +class Document; +class MapDocumentPrivate; +class ImageMapLayer; +class TrackLayer; +class DrawingLayer; +class DirtyLayer; +class UploadedLayer; +class DeletedLayer; +class FeaturePainter; + +class Document : public QObject, public IDocument +{ +Q_OBJECT +public: + Document(); + Document(LayerDock* aDock); + +private: + Document(const Document&, LayerDock* aDock); + +public: + ~Document(); + + const QString& id() const; + + void addDefaultLayers(); + void addFilterLayers(); + + void setLayerDock(LayerDock* aDock); + LayerDock* getLayerDock(void); + + void add(Layer* aLayer); + void moveLayer(Layer* aLayer, int pos); + ImageMapLayer* addImageLayer(ImageMapLayer* aLayer = NULL); + DrawingLayer* addDrawingLayer(DrawingLayer* aLayer = NULL); + FilterLayer* addFilterLayer(FilterLayer* aLayer = NULL); + void remove(Layer* aLayer); + bool exists(Layer* aLayer) const; + bool exists(Feature* aFeature) const; + void deleteFeature(Feature* aFeature); + int layerSize() const; + Layer* getLayer(const QString& id); + Layer* getLayer(int i); + const Layer* getLayer(int i) const; + int size() const; + + Feature* getFeature(const IFeature::FId& id); + QList<Feature*> getFeatures(Layer::LayerType layerType = Layer::UndefinedType); + void setHistory(CommandHistory* h); + CommandHistory& history(); + const CommandHistory& history() const; + void addHistory(Command* aCommand); + void redoHistory(); + void undoHistory(); + void rebuildHistory(); + void clear(); + + void setDirtyLayer(DirtyLayer* aLayer); + Layer* getDirtyLayer(); + Layer* getDirtyOrOriginLayer(Layer* aLayer = NULL); + Layer* getDirtyOrOriginLayer(Feature* F); + int getDirtySize() const; + + void setUploadedLayer(UploadedLayer* aLayer); + UploadedLayer* getUploadedLayer() const; + + void exportOSM(QWidget* main, QIODevice* device, QList<Feature*> aFeatures); + QList<Feature*> exportCoreOSM(QList<Feature*> aFeatures, bool forCopyPaste=false, QProgressDialog * progress=NULL); + bool toXML(QXmlStreamWriter& stream, bool asTemplate, QProgressDialog * progress); + static Document* fromXML(QString title, QXmlStreamReader& stream, qreal version, LayerDock* aDock, QProgressDialog * progress); + + bool importNMEA(const QString& filename, TrackLayer* NewLayer); + bool importKML(const QString& filename, TrackLayer* NewLayer); + bool importCSV(const QString& filename, DrawingLayer* NewLayer); + bool importOSC(const QString& filename, DrawingLayer* NewLayer); +#ifndef _MOBILE + bool importGDAL(const QString& filename, DrawingLayer* NewLayer); +#endif +#ifdef USE_PROTOBUF + bool importPBF(const QString& filename, DrawingLayer* NewLayer); +#endif + + QDateTime getLastDownloadLayerTime() const; + Layer* getLastDownloadLayer() const; + void setLastDownloadLayer(Layer * aLayer); + + void addDownloadBox(Layer*l, CoordBox aBox); + void removeDownloadBox(Layer*l); + const QList<CoordBox> getDownloadBoxes() const; + const QList<CoordBox> getDownloadBoxes(Layer* l) const; + bool isDownloadedSafe(const CoordBox& bb) const; + + QPair<bool, CoordBox> boundingBox(); + + bool setFilterType(FilterType aFilter); + TagSelector* getTagFilter(); + int filterRevision() const; + + QString title() const; + void setTitle(const QString aTitle); + + QString toPropertiesHtml(); + + virtual void setPainters(QList<Painter> aPainters); + virtual int getPaintersSize(); + void lockPainters(); + void lockPaintersForWrite(); + void unlockPainters(); + virtual const Painter* getPainter(int i); + + QStringList getCurrentSourceTags(); + + static Document* getDocumentFromXml(QDomDocument* theXmlDoc); + static Document* getDocumentFromClipboard(); + + QList<Feature*> mergeDocument(Document *otherDoc, Layer* layer, CommandList* theList=NULL); +private: + MapDocumentPrivate* p; + +protected slots: + void on_imageRequested(ImageMapLayer* anImageLayer); + void on_imageReceived(ImageMapLayer* anImageLayer); + void on_loadingFinished(ImageMapLayer* anImageLayer); + +signals: + void imageRequested(ImageMapLayer*); + void imageReceived(ImageMapLayer*); + void loadingFinished(ImageMapLayer*); + void historyChanged(); + +}; + +class FeatureIterator +{ + +public: + FeatureIterator(Document* aDoc); + virtual ~FeatureIterator(); + + bool isEnd() const; + FeatureIterator& operator ++(); + Feature* get(); + int index(); + +protected: + virtual bool check(); + Document* theDocument; + int curLayerIdx; + int curFeatureIdx; + bool isAtEnd; + int docSize; + int curLayerSize; +}; + +class VisibleFeatureIterator: public FeatureIterator +{ + +public: + VisibleFeatureIterator(Document* aDoc); + virtual ~VisibleFeatureIterator(); + +protected: + virtual bool check(); +}; + + +#endif + + diff --git a/src/common/DownloadMapDialog.ui b/src/common/DownloadMapDialog.ui new file mode 100644 index 0000000..3e586d2 --- /dev/null +++ b/src/common/DownloadMapDialog.ui @@ -0,0 +1,220 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>DownloadMapDialog</class> + <widget class="QDialog" name="DownloadMapDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>491</width> + <height>258</height> + </rect> + </property> + <property name="windowTitle"> + <string>Download</string> + </property> + <layout class="QVBoxLayout"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Location</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout"> + <item> + <widget class="QRadioButton" name="FromBookmark"> + <property name="text"> + <string>Bookmark</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="Bookmarks"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QRadioButton" name="FromView"> + <property name="text"> + <string>Current view</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout"> + <item> + <widget class="QRadioButton" name="FromLink"> + <property name="text"> + <string>WWW link (OSM/Google maps)</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="Link"/> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QRadioButton" name="FromXapi"> + <property name="text"> + <string>Xapi selector</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="edXapiUrl"/> + </item> + </layout> + </item> + <item> + <widget class="QRadioButton" name="FromMap"> + <property name="text"> + <string>From the map below (map provided by the OpenStreetMap project)</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QCheckBox" name="IncludeTracks"> + <property name="text"> + <string>Also download raw GPS tracks</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="ResolveRelations"> + <property name="text"> + <string>Resolve all relations</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>DownloadMapDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>228</x> + <y>296</y> + </hint> + <hint type="destinationlabel"> + <x>241</x> + <y>175</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>DownloadMapDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>284</x> + <y>296</y> + </hint> + <hint type="destinationlabel"> + <x>283</x> + <y>187</y> + </hint> + </hints> + </connection> + <connection> + <sender>Bookmarks</sender> + <signal>highlighted(int)</signal> + <receiver>FromBookmark</receiver> + <slot>toggle()</slot> + <hints> + <hint type="sourcelabel"> + <x>372</x> + <y>56</y> + </hint> + <hint type="destinationlabel"> + <x>75</x> + <y>56</y> + </hint> + </hints> + </connection> + <connection> + <sender>Link</sender> + <signal>textEdited(QString)</signal> + <receiver>FromLink</receiver> + <slot>toggle()</slot> + <hints> + <hint type="sourcelabel"> + <x>386</x> + <y>125</y> + </hint> + <hint type="destinationlabel"> + <x>89</x> + <y>125</y> + </hint> + </hints> + </connection> + <connection> + <sender>Bookmarks</sender> + <signal>activated(int)</signal> + <receiver>FromBookmark</receiver> + <slot>toggle()</slot> + <hints> + <hint type="sourcelabel"> + <x>372</x> + <y>56</y> + </hint> + <hint type="destinationlabel"> + <x>75</x> + <y>56</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/common/FeatureManipulations.cpp b/src/common/FeatureManipulations.cpp new file mode 100644 index 0000000..76a1e17 --- /dev/null +++ b/src/common/FeatureManipulations.cpp @@ -0,0 +1,1992 @@ +#include "FeatureManipulations.h" + +#include "Global.h" +#include "Coord.h" +#include "DocumentCommands.h" +#include "FeatureCommands.h" +#include "WayCommands.h" +#include "RelationCommands.h" +#include "NodeCommands.h" +#include "Document.h" +#include "Features.h" +#include "PropertiesDock.h" +#include "Projection.h" +#include "ImportExportOSC.h" + +#include "Utils.h" +#include "LineF.h" + +#include <QtCore/QString> +#include <QMessageBox> + +#include <algorithm> + +static void mergeNodes(Document* theDocument, CommandList* theList, Node *node1, Node *node2); + +static bool isNear(Node* a, Node* b) +{ + // For now, only if exactly same position + // Future: use distance threshold? + return a->position() == b->position(); +} + +bool canJoin(Way* R1, Way* R2) +{ + if ( (R1->size() == 0) || (R2->size() == 0) ) + return true; + Node* Start1 = R1->getNode(0); + Node* End1 = R1->getNode(R1->size()-1); + Node* Start2 = R2->getNode(0); + Node* End2 = R2->getNode(R2->size()-1); + return (Start1 == Start2) || + (Start1 == End2) || + (End1 == Start2) || + (End1 == End2) || + isNear(Start1, Start2) || + isNear(Start1, End2) || + isNear(End1, Start2) || + isNear(End1, End2); +} + +bool canBreak(Way* R1, Way* R2) +{ + if ( (R1->size() == 0) || (R2->size() == 0) ) + return false; + for (int i=0; i<R1->size(); i++) + for (int j=0; j<R2->size(); j++) + if (R1->get(i) == R2->get(j)) + return true; + return false; +} + +bool canJoinRoads(PropertiesDock* theDock) +{ + QHash<Coord,int> ends; + for (int i=0; i<theDock->selectionSize(); ++i) + if (Way* R = CAST_WAY(theDock->selection(i))) { + if (R->isClosed()) continue; + if (!R->size()) continue; + Coord start = R->getNode(0)->position(); + Coord end = R->getNodes().back()->position(); + ++ends[start]; + ++ends[end]; + } + + return ends.values().contains(2); +} + +bool canBreakRoads(PropertiesDock* theDock) +{ + QList<Way*> Input; + for (int i=0; i<theDock->selectionSize(); ++i) + if (Way* R = CAST_WAY(theDock->selection(i))) + Input.push_back(R); + for (int i=0; i<Input.size(); ++i) + for (int j=i+1; j<Input.size(); ++j) + if (canBreak(Input[i],Input[j])) + return true; + return false; +} + +bool canDetachNodes(PropertiesDock* theDock) +{ + QList<Way*> Roads, Result; + QList<Node*> Points; + for (int i=0; i<theDock->selectionSize(); ++i) + if (Way* R = CAST_WAY(theDock->selection(i))) + Roads.push_back(R); + else if (Node* Pt = CAST_NODE(theDock->selection(i))) + Points.push_back(Pt); + + if (Roads.size() > 1 && Points.size() > 1) + return false; + + if (Roads.size() == 0 && Points.size()) { + for (int i=0; i<Points.size(); ++i) { + Way * R = Way::GetSingleParentRoad(Points[i]); + if (R) + return true; + } + return false; + } + + if (Roads.size() && Points.size() == 1) + return true; + + if (Roads.size() == 1 && Points.size()) + return true; + + return false; +} + +void reversePoints(Document* theDocument, CommandList* theList, Way* R) +{ + Layer *layer=theDocument->getDirtyOrOriginLayer(R->layer()); + for (int i=R->size()-2; i>=0; --i) + { + Node* Pt = R->getNode(i); + theList->add(new WayRemoveNodeCommand(R,i,layer)); + theList->add(new WayAddNodeCommand(R,Pt,layer)); + } +} + + +static qreal distanceFrom(QLineF ab, const Coord& c) +{ + // distance in metres from c to line segment ab + qreal ab_len2 = ab.dx() * ab.dx() + ab.dy() * ab.dy(); + QPointF dp; + if (ab_len2) { + QLineF ac(ab.p1(), c); + qreal u = (ac.dx() * ab.dx() + ac.dy() * ab.dy()) / ab_len2; + if (u < 0.0) u = 0.0; + else if (u > 1.0) u = 1.0; + dp = ab.pointAt(u); + } else { + dp = ab.p1(); + } + Coord dc(dp); + return dc.distanceFrom(c); +} + +void simplifyWay(Document *doc, Layer *layer, CommandList *theList, Way *w, int start, int end, qreal threshold) +{ + // Douglas-Peucker reduction of uninteresting points in way, subject to maximum error in metres + + // TODO Performance: Use path-hull algorithm described at http://www.cs.ubc.ca/cgi-bin/tr/1992/TR-92-07.ps + if (end - start <= 1) + // no removable nodes + return; + + QLineF segment(w->getNode(start)->position(), w->getNode(end)->position()); + qreal maxdist = -1; + int maxpos = 0; + for (int i = start+1; i < end; i++) { + qreal d = distanceFrom(segment, w->getNode(i)->position()); + if (d > maxdist) { + maxdist = d; + maxpos = i; + } + } + // maxdist is in kilometres + if (maxpos && maxdist * 1000 > threshold) { + simplifyWay(doc, layer, theList, w, maxpos, end, threshold); + simplifyWay(doc, layer, theList, w, start, maxpos, threshold); + } else { + for (int i = end - 1; i > start; i--) { + Feature *n = w->get(i); + if (!doc->isDownloadedSafe(n->boundingBox()) && n->hasOSMId()) + continue; + theList->add(new WayRemoveNodeCommand(w, i, layer)); + theList->add(new RemoveFeatureCommand(doc, n)); + } + } +} +QSet<QString> uninterestingKeys; +bool isNodeInteresting(Node *n) +{ + for (int i = 0; i < n->tagSize(); i++) + if (!uninterestingKeys.contains(n->tagKey(i))) + return true; + return false; +} + +void simplifyRoads(Document* theDocument, CommandList* theList, PropertiesDock* theDock, qreal threshold) +{ + if (uninterestingKeys.isEmpty()) + uninterestingKeys << "source"; + + for (int i = 0; i < theDock->selectionSize(); ++i) + if (Way* w = CAST_WAY(theDock->selection(i))) { + Layer *layer = theDocument->getDirtyOrOriginLayer(w->layer()); + int end = w->size() - 1; + for (int i = end; i >= 0; i--) { + Node *n = w->getNode(i); + if (i == 0 || n->sizeParents() > 1 || isNodeInteresting(n)) { + simplifyWay(theDocument, layer, theList, w, i, end, threshold); + end = i; + } + } + } +} + +static void appendPoints(Document* theDocument, CommandList* L, Way* Dest, Way* Src, bool prepend, bool reverse) +{ + Layer *layer = theDocument->getDirtyOrOriginLayer(Dest->layer()); + int srclen = Src->size(); + int destpos = prepend ? 0 : Dest->size(); + for (int i=1; i<srclen; ++i) { + int j = (reverse ? srclen-i : i) - (prepend != reverse ? 1 : 0); + Node* Pt = Src->getNode(j); + if (!Pt->layer() || layer != Pt->layer()) { + L->add(new AddFeatureCommand(layer, Pt, false)); + } + L->add(new WayAddNodeCommand(Dest, Pt, destpos++, layer)); + } +} + +static Way* join(Document* theDocument, CommandList* L, Way* R1, Way* R2) +{ + QList<Feature*> Alternatives; + if (R1->size() == 0) + { + Feature::mergeTags(theDocument,L,R2,R1); + L->add(new RemoveFeatureCommand(theDocument,R1,Alternatives)); + return R2; + } + if (R2->size() == 0) + { + Feature::mergeTags(theDocument,L,R1,R2); + L->add(new RemoveFeatureCommand(theDocument,R2,Alternatives)); + return R1; + } + Node* Start1 = R1->getNode(0); + Node* End1 = R1->getNode(R1->size()-1); + Node* Start2 = R2->getNode(0); + Node* End2 = R2->getNode(R2->size()-1); + + bool prepend = false; // set true if R2 meets beginning of R1 + bool reverse = false; // set true if R2 is opposite direction to R1 + + if (End1 == Start2) { + // nothing to do, but skip the other tests + } else if (End1 == End2) { + reverse = true; + } else if (Start1 == Start2) { + prepend = true; + reverse = true; + } else if (Start1 == End2) { + prepend = true; + } else if (isNear(End1, Start2)) { + mergeNodes(theDocument, L, End1, Start2); + } else if (isNear(End1, End2)) { + mergeNodes(theDocument, L, End1, End2); + reverse = true; + } else if (isNear(Start1, Start2)) { + mergeNodes(theDocument, L, Start1, Start2); + prepend = true; + reverse = true; + } else if (isNear(Start1, End2)) { + mergeNodes(theDocument, L, Start1, End2); + prepend = true; + } + + appendPoints(theDocument, L, R1, R2, prepend, reverse); + Feature::mergeTags(theDocument,L,R1,R2); + L->add(new RemoveFeatureCommand(theDocument,R2,Alternatives)); + + // Auto-merge nearly-closed ways + Node *StartResult = R1->getNode(0); + Node *EndResult = R1->getNode(R1->size()-1); + if (StartResult != EndResult && isNear(StartResult, EndResult)) + mergeNodes(theDocument, L, StartResult, EndResult); + return R1; +} + +template<typename T> +static void replaceItem(QList<T> &list, T oldItem, T newItem) +{ + int i = list.indexOf(oldItem); + if (i >= 0) + list.replace(i, newItem); +} + +void joinRoads(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + QList<Feature*> selection = theDock->selection(); + QHash<Coord,QList<Way*> > ends; + + foreach (Feature *F, selection) + if (Way* R = CAST_WAY(F)) + if (!R->isClosed()) { + Coord start = R->getNode(0)->position(); + ends[start] << R; + Coord end = R->getNodes().back()->position(); + ends[end] << R; + } + + foreach (Coord c, ends.keys()) { + QList<Way*> ways = ends[c]; + if (ways.count() != 2) continue; + Way *R1 = ways[0]; + Way *R2 = ways[1]; + if (R1 == R2) { + Node *firstNode = R1->getNode(0); + Node *lastNode = R1->getNode(R1->size()-1); + if (firstNode != lastNode && R1->size() >= 4 && firstNode->position() == lastNode->position()) { + // almost-area; close it properly + mergeNodes(theDocument, theList, R1->getNode(0), R1->getNode(R1->size()-1)); + } + } else { + R1 = join(theDocument, theList, R1, R2); + // replace R2 with R1 for subsequent operations + replaceItem(ends[R2->getNode(0)->position()], R2, R1); + replaceItem(ends[R2->getNodes().back()->position()], R2, R1); + selection.removeOne(R2); + } + } + theDock->setSelection(selection); +} + +static bool handleWaysplitSpecialRestriction(Document* theDocument, CommandList* theList, Way* FirstPart, Way* NextPart, Relation* theRel) +{ + if (theRel->tagValue("type","") != "restriction") + return false; + + for (int k=0; k < theRel->size(); k++) + { + // check for via + if (theRel->getRole(k) == "via") + { + if (theRel->get(k) == FirstPart) + { + // whoops, we just split a via way, just add the new way, too + theList->add(new RelationAddFeatureCommand(theRel, theRel->getRole(k), NextPart, k+1, theDocument->getDirtyOrOriginLayer(FirstPart->layer()))); + // we just added a member, so get over it + k++; + } + else if ((theRel->get(k))->getType() == IFeature::Point) + { + // this seems to be a via node, check if it is member the nextPart + if (NextPart->find(theRel->get(k)) < NextPart->size()) + { + // yes it is, so remove First Part and add Next Part to it + int idx = theRel->find(FirstPart); + theList->add(new RelationAddFeatureCommand(theRel, theRel->getRole(idx), NextPart, idx+1, theDocument->getDirtyOrOriginLayer(FirstPart->layer()))); + theList->add(new RelationRemoveFeatureCommand(theRel, idx, theDocument->getDirtyOrOriginLayer(FirstPart->layer()))); + } + } + else if ((theRel->get(k))->getType() & IFeature::LineString) + { + // this is a way, check the nodes + Way* W = CAST_WAY(theRel->get(k)); + for (int l=0; l<W->size(); l++) + { + // check if this node is member the nextPart + if (NextPart->find(W->get(l)) < NextPart->size()) + { + // yes it is, so remove First Part and add Next Part to it + int idx = theRel->find(FirstPart); + theList->add(new RelationAddFeatureCommand(theRel, theRel->getRole(idx), NextPart, idx+1, theDocument->getDirtyOrOriginLayer(FirstPart->layer()))); + theList->add(new RelationRemoveFeatureCommand(theRel, idx, theDocument->getDirtyOrOriginLayer(FirstPart->layer()))); + break; + } + } + } + } + } + return true; +} + +static void handleWaysplitRelations(Document* theDocument, CommandList* theList, Way* FirstPart, Way* NextPart) +{ + /* since we may delete First Part from some Relations here, we first build a list of the relations to check */ + QList<Relation*> checkList; + + for (int j=0; j < FirstPart->sizeParents(); j++) { + checkList.append(CAST_RELATION(FirstPart->getParent(j))); + } + + for (int j=0; j < checkList.count(); j++) { + Relation* L = checkList.at(j); + if (!handleWaysplitSpecialRestriction(theDocument, theList, FirstPart, NextPart, L)) + { + int idx = L->find(FirstPart); + theList->add(new RelationAddFeatureCommand(L, L->getRole(idx), NextPart, idx+1, theDocument->getDirtyOrOriginLayer(FirstPart->layer()))); + } + } +} + + +static void splitRoad(Document* theDocument, CommandList* theList, Way* In, const QList<Node*>& Points, QList<Way*>& Result) +{ + int pos = 0; + if (In->isClosed()) { // Special case: If area, rotate the area so that the start node is the first point of splitting + + QList<Node*> Target; + for (int i=0; i < Points.size(); i++) + if ((pos = In->find(Points[i])) != In->size()) { + for (int j=pos+1; j<In->size(); ++j) + Target.push_back(In->getNode(j)); + for (int j=1; j<= pos; ++j) + Target.push_back(In->getNode(j)); + break; + } + if (pos == In->size()) + return; + + if (Points.size() == 1) // Special case: For a 1 point area splitting, de-close the road, i.e. duplicate the selected node + { + Node* N = g_backend.allocNode(theDocument->getDirtyOrOriginLayer(In->layer()), *(In->getNode(pos))); + theList->add(new AddFeatureCommand(theDocument->getDirtyOrOriginLayer(In->layer()),N,true)); + + Target.prepend(N); + } else // otherwise, just close the modified area + Target.prepend(In->getNode(pos)); + + // Now, reconstruct the road/area + while (In->size()) + theList->add(new WayRemoveNodeCommand(In,(int)0,theDocument->getDirtyOrOriginLayer(In->layer()))); + + for (int i=0; i<Target.size(); ++i) + theList->add(new WayAddNodeCommand(In,Target[i],theDocument->getDirtyOrOriginLayer(In->layer()))); + + if (Points.size() == 1) { // For 1-point, we are done + Result.push_back(In); + return; + } + } + + Way* FirstPart = In; + bool FirstWayValid = false; + for (int i=1; (i+1)<FirstPart->size(); ++i) + { + if (std::find(Points.begin(),Points.end(),FirstPart->get(i)) != Points.end() and FirstPart->get(i) != FirstPart->get(i+1) \ + and (FirstWayValid or FirstPart->get(0) != FirstPart->get(i))) { + Way* NextPart = g_backend.allocWay(theDocument->getDirtyOrOriginLayer(In->layer())); + theList->add(new AddFeatureCommand(theDocument->getDirtyOrOriginLayer(In->layer()),NextPart,true)); + copyTags(NextPart,FirstPart); + theList->add(new WayAddNodeCommand(NextPart, FirstPart->getNode(i), theDocument->getDirtyOrOriginLayer(In->layer()))); + while ( (i+1) < FirstPart->size() ) + { + theList->add(new WayAddNodeCommand(NextPart, FirstPart->getNode(i+1), theDocument->getDirtyOrOriginLayer(In->layer()))); + theList->add(new WayRemoveNodeCommand(FirstPart,i+1,theDocument->getDirtyOrOriginLayer(In->layer()))); + } + handleWaysplitRelations(theDocument, theList, FirstPart, NextPart); + + FirstWayValid = true; + Result.push_back(FirstPart); + FirstPart = NextPart; + i=0; + } + } + Result.push_back(FirstPart); + +} + +void splitRoads(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + QList<Way*> Roads, Result; + QList<Node*> Points; + for (int i=0; i<theDock->selectionSize(); ++i) + if (Way* R = CAST_WAY(theDock->selection(i))) + Roads.push_back(R); + else if (Node* Pt = CAST_NODE(theDock->selection(i))) + Points.push_back(Pt); + + if (Roads.size() == 0 && Points.size() == 1) + { + Way * R = Way::GetSingleParentRoadInner(Points[0]); + if (R) + Roads.push_back(R); + } + + for (int i=0; i<Roads.size(); ++i) + splitRoad(theDocument, theList,Roads[i],Points, Result); + theDock->setSelection(Result); +} + +/* Split road by the two nodes and return the way joining them, if there is one. */ +Way *cutoutRoad(Document* theDocument, CommandList* theList, PropertiesDock* /* theDock */, Node *N1, Node *N2) { + QList<Way*> Roads, Result; + QList<Node*> Points; + + Way *R1 = Way::GetSingleParentRoadInner( N1 ); + Way *R2 = Way::GetSingleParentRoadInner( N2 ); + + if (R1) + Roads.push_back(R1); + if (R2) + Roads.push_back(R2); + + Points.push_back(N1); + Points.push_back(N2); + + for (int i=0; i<Roads.size(); ++i) + splitRoad(theDocument, theList, Roads[i], Points, Result); + + for (int i = 0; i < Result.size(); ++i) { + if (Result[i]->isExtrimity(N1) && Result[i]->isExtrimity(N2)) + return Result[i]; + } + return NULL; +} + +static void breakRoad(Document* theDocument, CommandList* theList, Way* R, Node* Pt) +{ + for (int i=0; i<R->size(); ++i) { + if (R->get(i) == Pt) { + Node* New = g_backend.allocNode(theDocument->getDirtyOrOriginLayer(R->layer()), *Pt); + theList->add(new AddFeatureCommand(theDocument->getDirtyOrOriginLayer(R->layer()),New,true)); + copyTags(New,Pt); + theList->add(new WayRemoveNodeCommand(R,i,theDocument->getDirtyOrOriginLayer(R->layer()))); + theList->add(new WayAddNodeCommand(R,New,i,theDocument->getDirtyOrOriginLayer(R->layer()))); + } + } + if (!Pt->sizeParents()) + theList->add(new RemoveFeatureCommand(theDocument,Pt)); +} + +void breakRoads(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + QList<Way*> Roads, Result; + QList<Node*> Points; + for (int i=0; i<theDock->selectionSize(); ++i) + if (Way* R = CAST_WAY(theDock->selection(i))) + Roads.push_back(R); + else if (Node* Pt = CAST_NODE(theDock->selection(i))) + Points.push_back(Pt); + + if (Roads.size() == 0 && Points.size() == 1) + { + for (int i=0; i<Points[0]->sizeParents() ; ++i) { + Way * R = CAST_WAY(Points[0]->getParent(i)); + if (R && !R->isDeleted()) + Roads.push_back(R); + } + } + + if (Roads.size() == 1 && Points.size() ) { + splitRoad(theDocument, theList,Roads[0],Points, Result); + if (Roads[0]->area() > 0.0) { + for (int i=0; i<Points.size(); ++i) + breakRoad(theDocument, theList, Roads[0],Points[i]); + } else { + Roads = Result; + } + } + + for (int i=0; i<Roads.size(); ++i) + for (int j=0; j<Roads[i]->size(); ++j) + for (int k=i+1; k<Roads.size(); ++k) + breakRoad(theDocument, theList, Roads[k],CAST_NODE(Roads[i]->get(j))); +} + +bool canCreateJunction(PropertiesDock* theDock) +{ + return createJunction(NULL, NULL, theDock, false); +} + +int createJunction(Document* theDocument, CommandList* theList, PropertiesDock* theDock, bool doIt) +{ + //TODO test that the junction do not already exists! + + QList<Way*> Roads, Result; + for (int i=0; i<theDock->selectionSize(); ++i) + if (Way* R = CAST_WAY(theDock->selection(i))) + Roads.push_back(R); + + if (Roads.size() < 2) + return 0; + + Way* R1 = Roads[0]; + Way* R2 = Roads[1]; + + return Way::createJunction(theDocument, theList, R1, R2, doIt); +} + +#define STREET_NUMBERS_LENGTH .0000629 +#define STREET_NUMBERS_ANGLE 30.0 + +void createStreetNumbers(Document* theDocument, CommandList* theList, Way* theRoad, bool Left) +{ + QString streetName = theRoad->tagValue("name", ""); + QLineF l, l2, nv; + + Node* N; + Way* R = g_backend.allocWay(theDocument->getDirtyOrOriginLayer()); + theList->add(new AddFeatureCommand(theDocument->getDirtyOrOriginLayer(),R,true)); + theList->add(new SetTagCommand(R, "addr:interpolation", "")); + theList->add(new SetTagCommand(R, "addr:street", streetName)); + QPointF prevPoint; + + for (int j=0; j < theRoad->size(); j++) { + if (j == 0) { + l2 = QLineF(theRoad->getNode(j)->position(), theRoad->getNode(j+1)->position()); + l = l2; + l.setAngle(l2.angle() + 180.); + prevPoint = l.p2(); + } else + if (j == theRoad->size()-1) { + l = QLineF(theRoad->getNode(j)->position(), theRoad->getNode(j-1)->position()); + l2 = l; + l2.setAngle(l.angle() + 180.); + } else { + l = QLineF(theRoad->getNode(j)->position(), theRoad->getNode(j-1)->position()); + l2 = QLineF(theRoad->getNode(j)->position(), theRoad->getNode(j+1)->position()); + } + nv = l.normalVector().unitVector(); + + qreal theAngle = (l.angle() - l2.angle()); + if (theAngle < 0.0) theAngle = 360. + theAngle; + theAngle /= 2.; + nv.setAngle(l2.angle() + theAngle); + nv.setLength(STREET_NUMBERS_LENGTH/sin(angToRad(theAngle))); + if (Left) + nv.setAngle(nv.angle() + 180.0); + + QLineF lto(prevPoint, nv.p2()); + lto.setLength(lto.length()+STREET_NUMBERS_LENGTH); + QPointF pto; + + bool intersectedTo = false; + for (int k=0; k < theRoad->getNode(j)->sizeParents(); ++k) { + Way* I = CAST_WAY(theRoad->getNode(j)->getParent(k)); + if (!I || I == theRoad || I->isDeleted()) + continue; + + for (int m=0; m < I->size()-1; ++m) { + QLineF l3 = QLineF(I->getNode(m)->position(), I->getNode(m+1)->position()); + QPointF theIntersection; + if (lto.intersect(l3, &theIntersection) == QLineF::BoundedIntersection) { + intersectedTo = true; + QLineF lt = QLineF(prevPoint, theIntersection); + if (lt.length() < lto.length()) + lto = lt; + } + } + } + + if (j != 0) { + QLineF lfrom = QLineF(nv.p2(), prevPoint); + lfrom.setLength(lfrom.length()*2.); + QPointF pfrom; + + bool intersectedFrom = false; + for (int k=0; k < theRoad->getNode(j-1)->sizeParents(); ++k) { + Way* I = CAST_WAY(theRoad->getNode(j-1)->getParent(k)); + if (!I || I == theRoad || I->isDeleted()) + continue; + + for (int m=0; m < I->size()-1; ++m) { + QLineF l3 = QLineF(I->getNode(m)->position(), I->getNode(m+1)->position()); + QPointF theIntersection; + if (lfrom.intersect(l3, &theIntersection) == QLineF::BoundedIntersection) { + intersectedFrom = true; + QLineF lt = QLineF(nv.p2(), theIntersection); + if (lt.length() < lfrom.length()) + lfrom = lt; + } + } + } + if (intersectedFrom) { + lfrom.setLength(lfrom.length() - STREET_NUMBERS_LENGTH); + pfrom = lfrom.p2(); + + R = g_backend.allocWay(theDocument->getDirtyOrOriginLayer()); + theList->add(new AddFeatureCommand(theDocument->getDirtyOrOriginLayer(),R,true)); + theList->add(new SetTagCommand(R, "addr:interpolation", "")); + theList->add(new SetTagCommand(R, "addr:street", streetName)); + + N = g_backend.allocNode(theDocument->getDirtyOrOriginLayer(), Coord(pfrom)); + theList->add(new AddFeatureCommand(theDocument->getDirtyOrOriginLayer(),N,true)); + theList->add(new WayAddNodeCommand(R, N, theDocument->getDirtyOrOriginLayer(R->layer()))); + theList->add(new SetTagCommand(N, "addr:housenumber", "")); + } else { + pfrom = prevPoint; + } + } + + if (intersectedTo) { + if (j != 0) { + lto.setLength(lto.length() - STREET_NUMBERS_LENGTH); + pto = lto.p2(); + + N = g_backend.allocNode(theDocument->getDirtyOrOriginLayer(), Coord(pto)); + theList->add(new AddFeatureCommand(theDocument->getDirtyOrOriginLayer(),N,true)); + theList->add(new WayAddNodeCommand(R, N, theDocument->getDirtyOrOriginLayer(R->layer()))); + theList->add(new SetTagCommand(N, "addr:housenumber", "")); + } + } else { + if (theAngle < 85. || theAngle > 95. || j== 0 || j == theRoad->size()-1) { + N = g_backend.allocNode(theDocument->getDirtyOrOriginLayer(), Coord(nv.p2())); + theList->add(new AddFeatureCommand(theDocument->getDirtyOrOriginLayer(),N,true)); + theList->add(new WayAddNodeCommand(R, N, theDocument->getDirtyOrOriginLayer(R->layer()))); + theList->add(new SetTagCommand(N, "addr:housenumber", "")); + } + + pto = nv.p2(); + } + prevPoint = nv.p2(); + } +} + +void addStreetNumbers(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + QList<Way*> Roads; + for (int i=0; i<theDock->selectionSize(); ++i) + if (Way* R = CAST_WAY(theDock->selection(i))) + Roads.push_back(R); + + if (Roads.isEmpty()) + return; + + QList<Way*>::const_iterator it = Roads.constBegin(); + for (;it != Roads.constEnd(); ++it) { + if((*it)->size() < 2) + continue; + + createStreetNumbers(theDocument, theList, (*it), false); + createStreetNumbers(theDocument, theList, (*it), true); + } + + if (Roads.size() == 1) + theList->setFeature(Roads.at(0)); +} + +void alignNodes(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + if (theDock->selectionSize() < 3) //thre must be at least 3 nodes to align something + return; + + //We build a list of selected nodes + QList<Node*> Nodes; + for (int i=0; i<theDock->selectionSize(); ++i) + if (Node* N = CAST_NODE(theDock->selection(i))) + Nodes.push_back(N); + + //we check that we have at least 3 nodes and the first two can give a line + if(Nodes.size() < 3) + return; + if(Nodes[0]->position() == Nodes[1]->position()) + return; + + //we do the alignement + Coord pos(0,0); + const Coord p1(Nodes[0]->position()); + const Coord p2(Nodes[1]->position()-p1); + const qreal slope = angle(p2); + for (int i=2; i<Nodes.size(); ++i) { + pos=Nodes[i]->position()-p1; + rotate(pos,-slope); + pos.setY(0); + rotate(pos,slope); + pos=pos+p1; + theList->add(new MoveNodeCommand( Nodes[i], pos, theDocument->getDirtyOrOriginLayer(Nodes[i]->layer()) )); + } +} + +void bingExtract(Document* theDocument, CommandList* theList, PropertiesDock* theDock, CoordBox vp) +{ + //We build a list of selected nodes + QList<Node*> Nodes; + for (int i=0; i<theDock->selectionSize(); ++i) + if (Node* N = CAST_NODE(theDock->selection(i))) + Nodes.push_back(N); + + //we check that we have at least 2 nodes + if(Nodes.size() < 2) + return; + if(Nodes[0]->position() == Nodes[1]->position()) + return; + + //http://3667a17de9b94ccf8fd278f9de62dae4.cloudapp.net/ + QString u("http://magicshop.cloudapp.net/DetectRoad.svc/detect/?"); + u.append(QString("pt1=%1,%2").arg(COORD2STRING(Nodes[0]->position().y())).arg(COORD2STRING(Nodes[0]->position().x()))); + u.append(QString("&pt2=%1,%2").arg(COORD2STRING(Nodes[1]->position().y())).arg(COORD2STRING(Nodes[1]->position().x()))); + u.append(QString("&bbox=%1,%2,%3,%4") + .arg(COORD2STRING(vp.top())) + .arg(COORD2STRING(vp.left())) + .arg(COORD2STRING(vp.bottom())) + .arg(COORD2STRING(vp.right())) + ); + + QString sXml; + if (!Utils::sendBlockingNetRequest(QUrl(u), sXml)) { + QMessageBox::critical(0, QApplication::tr("Bing Road Detect"), QApplication::tr("Cannot get output.")); + return; + } + qDebug() << sXml; + + //Import the OSC + Document* newDoc; + QDomDocument xmlDoc; + xmlDoc.setContent(sXml); + if (!(newDoc = Document::getDocumentFromXml(&xmlDoc))) { + QMessageBox::critical(0, QApplication::tr("Bing Road Detect"), QApplication::tr("No valid data.")); + return; + } + + if (!newDoc->size()) { + QMessageBox::critical(0, QApplication::tr("Bing Road Detect"), QApplication::tr("Cannot parse output.")); + } else { + DrawingLayer* newLayer = new DrawingLayer( "Bing Road Extract" ); + newLayer->setUploadable(false); + theDocument->add(newLayer); + QList<Feature*> theFeats = theDocument->mergeDocument(newDoc, newLayer, theList); + + // Merge in initial nodes + Node * N0 = NULL; + Node * N1 = NULL; + qreal Best0 = 180., Best1 = 180.; + + foreach (Feature* F, theFeats) { + if (CHECK_NODE(F)) { + Node* N = STATIC_CAST_NODE(F); + qreal B = distance(Nodes[0]->position(), N->position()); + if (B < Best0) { + N0 = N; + Best0 = B; + } + B = distance(Nodes[1]->position(), N->position()); + if (B < Best1) { + N1 = N; + Best1 = B; + } + } + } + if (N0) + mergeNodes(theDocument, theList, Nodes[0], N0); + if (N1) + mergeNodes(theDocument, theList, Nodes[1], N1); + } + delete newDoc; +} + +void spreadNodes(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + // There must be at least 3 nodes to align something + if (theDock->selectionSize() < 3) + return; + + // We build a list of selected nodes + // Sort by distance along the line between the first two nodes + QList<Node*> Nodes; + QList<float> Metrics; + Coord p; + Coord delta; + for (int i=0; i<theDock->selectionSize(); ++i) { + if (Node* N = CAST_NODE(theDock->selection(i))) { + Coord pos(N->position()); + if (Nodes.size() == 0) { + p = pos; + Nodes.push_back(N); + Metrics.push_back(0.0f); + } else if (Nodes.size() == 1) { + delta = pos - p; + // First two nodes must form a line + if (delta.isNull()) + return; + Nodes.push_back(N); + Metrics.push_back(delta.x()*delta.x() + delta.y()*delta.y()); + } else { + pos = pos - p; + qreal metric = pos.x()*delta.x() + pos.y()*delta.y(); + // This could be done more efficiently with a binary search + for (int j = 0; j < Metrics.size(); ++j) { + if (metric < Metrics[j]) { + Nodes.insert(j, N); + Metrics.insert(j, metric); + goto inserted; + } + } + Nodes.push_back(N); + Metrics.push_back(metric); +inserted: + ; + } + } + } + + // We check that we have at least 3 nodes + if(Nodes.size() < 3) + return; + + // Do the spreading between the extremes + p = Nodes[0]->position(); + delta = (Nodes[Nodes.size()-1]->position() - p) / (Nodes.size()-1); + + for (int i=1; i<Nodes.size()-1; ++i) { + p = p + delta; + theList->add(new MoveNodeCommand( Nodes[i], p, theDocument->getDirtyOrOriginLayer(Nodes[i]->layer()) )); + } +} + +static void mergeNodes(Document* theDocument, CommandList* theList, Node *node1, Node *node2) +{ + QList<Feature*> alt; + alt.append(node1); + Feature::mergeTags(theDocument, theList, node1, node2); + theList->add(new RemoveFeatureCommand(theDocument, node2, alt)); +} + +void mergeNodes(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + if (theDock->selectionSize() <= 1) + return; + QList<Node*> Nodes; + QList<Feature*> alt; + for (int i=0; i<theDock->selectionSize(); ++i) + if (Node* N = CAST_NODE(theDock->selection(i))) + Nodes.push_back(N); + Node* merged = Nodes[0]; + alt.push_back(merged); + for (int i=1; i<Nodes.size(); ++i) { + Feature::mergeTags(theDocument, theList, merged, Nodes[i]); + theList->add(new RemoveFeatureCommand(theDocument, Nodes[i], alt)); + } +} + +void detachNode(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + QList<Way*> Roads, Result; + QList<Node*> Points; + for (int i=0; i<theDock->selectionSize(); ++i) + if (Way* R = CAST_WAY(theDock->selection(i))) + Roads.push_back(R); + else if (Node* Pt = CAST_NODE(theDock->selection(i))) + Points.push_back(Pt); + + if (Roads.size() > 1 && Points.size() > 1) + return; + + if (Roads.size() == 0 && Points.size()) + { + for (int i=0; i<Points.size(); ++i) { + Way * R = Way::GetSingleParentRoad(Points[i]); + if (R) + theList->add(new WayRemoveNodeCommand(R, Points[i], + theDocument->getDirtyOrOriginLayer(R))); + } + } + + if (Roads.size() > 1 && Points.size() == 1) + { + for (int i=0; i<Roads.size(); ++i) { + if (Roads[i]->find(Points[0]) < Roads[i]->size()) + theList->add(new WayRemoveNodeCommand(Roads[i], Points[0], + theDocument->getDirtyOrOriginLayer(Roads[i]))); + } + } + + if (Roads.size() == 1 && Points.size()) + { + for (int i=0; i<Points.size(); ++i) { + if (Roads[0]->find(Points[i]) < Roads[0]->size()) + theList->add(new WayRemoveNodeCommand(Roads[0], Points[i], + theDocument->getDirtyOrOriginLayer(Roads[0]))); + } + } +} + +void commitFeatures(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + QSet<Feature*> Features; + QQueue<Feature*> ToAdd; + + for (int i=0; i<theDock->selectionSize(); ++i) + if (!theDock->selection(i)->isUploadable() && !theDock->selection(i)->isSpecial()) + ToAdd.enqueue(theDock->selection(i)); + + while (!ToAdd.isEmpty()) { + Feature *feature = ToAdd.dequeue(); + Features.insert(feature); + for (int j=0; j < feature->size(); ++j) { + Feature *member = feature->get(j); + if (!Features.contains(member)) { + ToAdd.enqueue(member); + } + } + } + + if (Features.size()) { + Layer *layer = theDocument->getDirtyLayer(); + foreach (Feature *feature, Features) + theList->add(new AddFeatureCommand(layer,feature,true)); + } +} + +void addRelationMember(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + Relation* theRelation = NULL; + QList<Feature*> Features; + for (int i=0; i<theDock->selectionSize(); ++i) + if ((theDock->selection(i)->getClass() == "Relation") && !theRelation) + theRelation = CAST_RELATION(theDock->selection(i)); + else + Features.push_back(theDock->selection(i)); + + if (!(theRelation && Features.size())) return; + + for (int i=0; i<Features.size(); ++i) { + theList->add(new RelationAddFeatureCommand(theRelation, "", Features[i], theDocument->getDirtyOrOriginLayer(theRelation->layer()))); + } +} + +void removeRelationMember(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + Relation* theRelation = NULL; + QList<Feature*> Features; + for (int i=0; i<theDock->selectionSize(); ++i) + if ((theDock->selection(i)->getClass() == "Relation") && !theRelation) + theRelation = CAST_RELATION(theDock->selection(i)); + else + Features.push_back(theDock->selection(i)); + + if (!theRelation && Features.size() == 1) + theRelation = Feature::GetSingleParentRelation(Features[0]); + if (!(theRelation && Features.size())) return; + + int idx; + for (int i=0; i<Features.size(); ++i) { + if ((idx = theRelation->find(Features[i])) != theRelation->size()) + theList->add(new RelationRemoveFeatureCommand(theRelation, idx, theDocument->getDirtyOrOriginLayer(theRelation->layer()))); + } +} + +void addToMultipolygon(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + Relation* theRelation = NULL; + QList<Way*> theWays; + for (int i=0; i<theDock->selectionSize(); ++i) { + if (!theRelation && CHECK_RELATION(theDock->selection(i)) && theDock->selection(i)->tagValue("type", "") == "multipolygon") + theRelation = STATIC_CAST_RELATION(theDock->selection(i)); + if (CHECK_WAY(theDock->selection(i))) + theWays << STATIC_CAST_WAY(theDock->selection(i)); + } + + if (!theWays.size()) + return; + + if (theRelation) { + for (int i=0; i<theRelation->size(); ++i) { + if (CHECK_WAY(theRelation->get(i)) && !theWays.contains(STATIC_CAST_WAY(theRelation->get(i)))) { + theWays << STATIC_CAST_WAY(theRelation->get(i)); + } + } + } + + Way* outer = theWays[0]; + for (int i=1; i<theWays.size(); ++i) { + if (outer->boundingBox().contains(theWays[i]->boundingBox())) + continue; + if (theWays[i]->boundingBox().contains(outer->boundingBox())) + outer = theWays[i]; + else + if (theWays[i]->boundingBox().intersects(outer->boundingBox())) + outer = NULL; + } + if (outer) { + if (!theRelation) { + theRelation = g_backend.allocRelation(theDocument->getDirtyOrOriginLayer()); + theList->add(new AddFeatureCommand(theDocument->getDirtyOrOriginLayer(),theRelation,true)); + } else { + for (int i=0; i<theRelation->size(); ++i) + theList->add(new RelationRemoveFeatureCommand(theRelation, 0)); + } + theRelation->setTag("type", "multipolygon"); + } else + return; + + theList->add(new RelationAddFeatureCommand(theRelation, "outer", outer)); + for (int i=0; i<theWays.size(); ++i) { + if (theWays[i] != outer) { + theList->add(new RelationAddFeatureCommand(theRelation, "inner", theWays[i])); + } + } +} + +/* Subdivide theRoad between index and index+1 into divisions segments. + * divisions-1 new nodes are created starting at index index+1. + */ +static void subdivideRoad(Document* theDocument, CommandList* theList, + Way* theRoad, unsigned int index, unsigned int divisions) +{ + Node* N0 = theRoad->getNode(index); + Node* N1 = theRoad->getNode(index+1); + Coord nodeBase = N0->position(); + Coord nodeDelta = (N1->position() - nodeBase) / divisions; + for (unsigned int i = 1; i < divisions; ++i) { + nodeBase = nodeBase + nodeDelta; + Node* newNode = g_backend.allocNode(theDocument->getDirtyOrOriginLayer(theRoad), nodeBase); + theList->add(new AddFeatureCommand(theDocument->getDirtyOrOriginLayer(theRoad), newNode, true)); + theList->add(new WayAddNodeCommand(theRoad, newNode, index + i, theDocument->getDirtyOrOriginLayer(theRoad))); + } +} + +bool canSubdivideRoad(PropertiesDock* theDock, Way** outTheRoad, unsigned int* outEdge) +{ + // Get the selected way and nodes + Way* theRoad = NULL; + Node* theNodes[2] = { NULL, NULL }; + for (int i = 0; i < theDock->selectionSize(); ++i) { + if ((theDock->selection(i)->getClass() == "Way") && !theRoad) + theRoad = CAST_WAY(theDock->selection(i)); + else if (theDock->selection(i)->getClass() == "Node") { + if (!theNodes[0]) + theNodes[0] = CAST_NODE(theDock->selection(i)); + else if (!theNodes[1]) + theNodes[1] = CAST_NODE(theDock->selection(i)); + } + } + + // If the way has only two nodes, use them + if (theRoad && theRoad->size() == 2) { + theNodes[0] = theRoad->getNode(0); + theNodes[1] = theRoad->getNode(1); + // Now this would just be silly + if (theNodes[0] == theNodes[1]) + return false; + } + + // A way and 2 nodes + if (!theRoad || !theNodes[0] || !theNodes[1]) + return false; + + // Nodes must be adjacent in the way + int numNodes = theRoad->size(); + int nodeIndex0 = -1; + for (int i = 0; i < numNodes-1; ++i) { + Node* N0 = theRoad->getNode(i); + Node* N1 = theRoad->getNode(i+1); + if ((N0 == theNodes[0] && N1 == theNodes[1]) || + (N0 == theNodes[1] && N1 == theNodes[0])) { + nodeIndex0 = i; + break; + } + } + + if (nodeIndex0 < 0) + return false; + + if (outTheRoad) + *outTheRoad = theRoad; + if (outEdge) + *outEdge = nodeIndex0; + + return true; +} + +void subdivideRoad(Document* theDocument, CommandList* theList, PropertiesDock* theDock, unsigned int divisions) +{ + // Subdividing into 1 division is no-op + if (divisions < 2) + return; + + // Get the selected way and nodes + Way* theRoad; + unsigned int edge; + if (!canSubdivideRoad(theDock, &theRoad, &edge)) + return; + subdivideRoad(theDocument, theList, theRoad, edge, divisions); +} + +/* Remove nodes between theNodes in theArea into a separate way newArea. + * newArea's first node will be theNodes[0], and it's last nodes will be + * theNodes[1] and theNodes[0]. + */ +static bool splitArea(Document* theDocument, CommandList* theList, + Way* theArea, unsigned int nodes[2], Way** outNewArea) +{ + // Make sure nodes are in order + if (nodes[0] > nodes[1]) + qSwap(nodes[0], nodes[1]); + + // And not next to one another + if (nodes[0] + 1 == nodes[1] || + (nodes[0] == 0 && nodes[1] == (unsigned int)theArea->size() - 2)) { + qDebug() << "Nodes must not be adjacent"; + return false; + } + + Node* theNodes[2]; + for (int i = 0; i < 2; ++i) + theNodes[i] = theArea->getNode(nodes[i]); + + // Extract nodes between nodes[0] and nodes[1] into a separate area + // and remove the nodes from the original area + Way* newArea = g_backend.allocWay(theDocument->getDirtyOrOriginLayer(theArea)); + theList->add(new AddFeatureCommand(theDocument->getDirtyOrOriginLayer(theArea), newArea, true)); + copyTags(newArea, theArea); + theList->add(new WayAddNodeCommand(newArea, theNodes[0], theDocument->getDirtyOrOriginLayer(theArea))); + for (unsigned int i = nodes[0]+1; i < nodes[1]; ++i) { + theList->add(new WayAddNodeCommand(newArea, theArea->getNode(nodes[0]+1), + theDocument->getDirtyOrOriginLayer(theArea))); + theList->add(new WayRemoveNodeCommand(theArea, theArea->getNode(nodes[0]+1), + theDocument->getDirtyOrOriginLayer(theArea))); + } + theList->add(new WayAddNodeCommand(newArea, theNodes[1], theDocument->getDirtyOrOriginLayer(theArea))); + theList->add(new WayAddNodeCommand(newArea, theNodes[0], theDocument->getDirtyOrOriginLayer(theArea))); + handleWaysplitRelations(theDocument, theList, theArea, newArea); + + if (outNewArea) + *outNewArea = newArea; + + return true; +} + +// Cycle the node index in an area so it's >= 0, < size-1 (never the last node). +static int cycleNodeIndex(Way* area, int index) +{ + if (index >= area->size()-1) + index -= area->size()-1; + else if (index < 0) + index += area->size()-1; + return index; +} + +// Find the index of a node in an area as close as possible to expected. +// Return -1 if node isn't in area. This is useful for tracing around shared +// nodes of two areas, where we want the indexes to be continuous so we can +// detect where the edges depart from one another. +static int nodeIndexInArea(Way* area, Node* node, int expected) +{ + // parent list is gonna be shorter, so check this first + for (int i = 0; i < node->sizeParents(); ++i) + if (node->getParent(i) == area) { + // now we know it's on the list, find the index + if (area->getNode(expected) == node) + return expected; + int forward = expected; + int backward = expected; + for (int j = 0; j < (area->size()-1)/2; ++j) { + forward = cycleNodeIndex(area, forward + 1); + if (area->getNode(forward) == node) + return forward; + backward = cycleNodeIndex(area, backward - 1); + if (area->getNode(backward) == node) + return backward; + } + break; + } + return -1; +} + +// Determine if two area node indexes are adjacent, and in a particular +// direction if direction is 1 or -1. If they are adjacent, direction is set to +// 1 or -1. This is useful tracing the shared nodes between two areas as the +// direction is initialised to 0 and determined on the first check, and then +// enforced on later checks. +static bool nodeIndexesAdjacent(Way* way, unsigned int n1, unsigned int n2, int* direction) +{ + int dir = n2 - n1; + if (abs(dir) > 1) { + // wrap? + if (!n1) + n1 = way->size() - 1; + else if (!n2) + n2 = way->size() - 1; + else + return false; + dir = n2 - n1; + } + if (abs(dir) != 1) + return false; + + // in the correct direction? + if (!*direction) { + *direction = dir; + return true; + } else + return *direction == dir; +} + +// Join selected areas which are sharing edges. Multiple nodes adjacent in both +// areas must be shared for them to be joined. +// FIXME This does not currently produce multipolygons when the areas form an +// enclosed area. Instead the edge will run around the outside, cut into the +// middle and run around the inner part, and then cut back out the same way. +void joinAreas(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + // Collect the set of selected areas + QSet<Way*> areas; + for (int i = 0; i < theDock->selectionSize(); ++i) + if (theDock->selection(i)->getClass() == "Way") { + Way* area = CAST_WAY(theDock->selection(i)); + if (area->isClosed()) + areas << area; + } + +findNextJoin: + // Go through areas in the set + while (areas.size() > 1) { + Way* area = *areas.begin(); + // Go through nodes shared between multiple features + for (int i = 0; i < area->size() - 1; ++i) { + Node* node = area->getNode(i); + if (node->sizeParents() <= 1) + continue; + // Go through parents of the node that are areas in our set + for (int p1 = 0; p1 < node->sizeParents(); ++p1) { + if (!(node->getParent(p1)->getType() & IFeature::Polygon)) + continue; + Way* otherArea = CAST_WAY(node->getParent(p1)); + if (otherArea == area || !areas.contains(otherArea)) + continue; + // Look for the first shared mutually adjacent node. + for (int n = 0; n < otherArea->size()-1; ++n) { + if (otherArea->getNode(n) != node) + continue; + int otherFirst = n; + int otherLast = otherFirst; + int otherDirection = 0; + int first = i; + int count = 1; + // We want node i to be the first shared node, so if the + // one before it is also shared and adjacent we can safely + // ignore it as we'll hit it again later + int lastOtherIndex = nodeIndexInArea(otherArea, area->getNode(cycleNodeIndex(area, i-1)), n); + if (lastOtherIndex != -1 && nodeIndexesAdjacent(otherArea, n, lastOtherIndex, &otherDirection)) + continue; + // Continue forwards to see how many nodes are shared with + // the other area and adjacent. The first nodeIndexesAdjacent + // will set otherDirection and later nodes have to keep + // going in that direction. + for (int j = 1; j < area->size(); ++j) { + int jIndex = (i + j) % (area->size()-1); + int otherIndex = nodeIndexInArea(otherArea, area->getNode(jIndex), cycleNodeIndex(otherArea, otherLast + otherDirection)); + // is next node in same area? + if (otherIndex == -1) + break; + // must be adjacent to last node (and in same direction) + if (!nodeIndexesAdjacent(otherArea, otherLast, otherIndex, &otherDirection)) + break; + otherLast = otherIndex; + ++count; + } + if (count < 2) + continue; + + // If all of area's nodes are shared (area is enclosed + // inside otherArea), then it is better to swap area and + // otherArea so that area is the one that gets removed. + if (count == area->size()) { + qSwap(area, otherArea); + qSwap(first, otherFirst); + } + + // Remove nodes along the shared edge from area. No need to + // remove from otherArea, it'll get removed anyway. + for (int del = 0; del < count-2; ++del) { + int delIndex = cycleNodeIndex(area, first+1); + theList->add(new WayRemoveNodeCommand(area, delIndex, theDocument->getDirtyOrOriginLayer(area->layer()))); + if (first > delIndex) + --first; + } + + // If otherArea is completely enclosed then the end nodes + // of the shared edge are the same and are now adjacent, so + // remove one of them. + if (count == otherArea->size()) + theList->add(new WayRemoveNodeCommand(area, first, theDocument->getDirtyOrOriginLayer(area->layer()))); + // Seal the crack left over from an enclosed otherArea + // until the nodes on either side of 'first' diverge. + while (area->size() > 3 && + area->getNode(cycleNodeIndex(area, first-1)) == area->getNode(cycleNodeIndex(area, first+1))) { + theList->add(new WayRemoveNodeCommand(area, first, theDocument->getDirtyOrOriginLayer(area->layer()))); + theList->add(new WayRemoveNodeCommand(area, first, theDocument->getDirtyOrOriginLayer(area->layer()))); + first = cycleNodeIndex(area, first-1); + } + // Add the remaining nodes of otherArea that aren't shared + // to area. + for (int add = 1; add < otherArea->size()-count; ++add) { + int index = cycleNodeIndex(otherArea, otherFirst - otherDirection*add); + theList->add(new WayAddNodeCommand(area, otherArea->getNode(index), ++first, theDocument->getDirtyOrOriginLayer(area->layer()))); + } + // Merge tags and remove otherArea. + Feature::mergeTags(theDocument, theList, area, otherArea); + otherArea->deleteChildren(theDocument, theList); + theList->add(new RemoveFeatureCommand(theDocument, otherArea)); + areas.remove(otherArea); + // Remove otherArea from selection. + QList<Feature*> sel = theDock->selection(); + sel.removeOne(otherArea); + theDock->setSelection(sel); + // Restart the process again. + goto findNextJoin; + } + } + } + areas.remove(area); + } +} + +bool canSplitArea(PropertiesDock* theDock, Way** outTheArea, unsigned int outNodes[2]) +{ + if (theDock->selectionSize() != 3) + return false; + + // Get the selected way and nodes + Way* theArea = NULL; + Node* theNodes[2] = { NULL, NULL }; + for (int i = 0; i < theDock->selectionSize(); ++i) { + if ((theDock->selection(i)->getClass() == "Way") && !theArea) + theArea = CAST_WAY(theDock->selection(i)); + else if (theDock->selection(i)->getClass() == "Node") { + if (!theNodes[0]) + theNodes[0] = CAST_NODE(theDock->selection(i)); + else if (!theNodes[1]) + theNodes[1] = CAST_NODE(theDock->selection(i)); + } + } + + // A way and 2 nodes + if (!theArea || !theNodes[0] || !theNodes[1]) + return false; + + // Way must be closed + if (!theArea->isClosed()) + return false; + + // Nodes must belong to way + unsigned int numNodes = theArea->size(); + unsigned int nodeIndex[2]; + for (int i = 0; i < 2; ++i) { + nodeIndex[i] = theArea->find(theNodes[i]); + if (nodeIndex[i] >= numNodes) + return false; + } + + // Make sure nodes are in order + if (nodeIndex[0] > nodeIndex[1]) + qSwap(nodeIndex[0], nodeIndex[1]); + + // And not next to one another + if (nodeIndex[0] + 1 == nodeIndex[1] || + (nodeIndex[0] == 0 && nodeIndex[1] == (unsigned int)theArea->size() - 2)) + return false; + + + if (outTheArea) + *outTheArea = theArea; + if (outNodes) { + outNodes[0] = nodeIndex[0]; + outNodes[1] = nodeIndex[1]; + } + + return true; +} + +void splitArea(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + Way* theArea; + unsigned int nodes[2]; + if (!canSplitArea(theDock, &theArea, nodes)) + return; + + Way* newArea; + if (!splitArea(theDocument, theList, theArea, nodes, &newArea)) + return; + + theDock->setSelection(QList<Way*>() << theArea << newArea); +} + +static void terraceArea(Document* theDocument, CommandList* theList, + Way* theArea, unsigned int sides[2], + unsigned int divisions, int startNode, + QList<Feature*>* outAreas) +{ + // We're adding nodes so ordering is important + if (sides[0] > sides[1]) + qSwap(sides[0], sides[1]); + + bool reverse = (startNode >= 0 && ((5 + startNode - sides[1]) & 2)); + + // Subdivide both sides + subdivideRoad(theDocument, theList, theArea, sides[1], divisions); + subdivideRoad(theDocument, theList, theArea, sides[0], divisions); + + // Split apart + for (unsigned int i = sides[0] + divisions - 1; i > sides[0]; --i) { + Way* newArea; + unsigned int nodes[2] = { i, i + 3 }; + splitArea(theDocument, theList, theArea, nodes, &newArea); + if (newArea && outAreas) { + if (reverse) + outAreas->push_front(newArea); + else + outAreas->push_back(newArea); + } + } + if (outAreas) { + if (reverse) + outAreas->push_front(theArea); + else + outAreas->push_back(theArea); + } +} + +bool canTerraceArea(PropertiesDock* theDock, Way** outTheArea, int* startNode) +{ + // Get the selected area + Way* theArea = NULL; + Node* theNode = NULL; + for (int i = 0; i < theDock->selectionSize(); ++i) + if ((theDock->selection(i)->getClass() == "Way") && !theArea) { + theArea = CAST_WAY(theDock->selection(i)); + } else if (startNode && theDock->selection(i)->getClass() == "Node") { + theNode = CAST_NODE(theDock->selection(i)); + } + if (!theArea || !theArea->isClosed()) + return false; + + if (startNode) { + if (theNode) + *startNode = theArea->find(theNode); + else + *startNode = -1; + } + + // Only work with 4 edges for now + if (theArea->size() != 5) + return false; + + if (outTheArea) + *outTheArea = theArea; + + return true; +} + +void terraceArea(Document* theDocument, CommandList* theList, PropertiesDock* theDock, unsigned int divisions) +{ + Way* theArea; + int startNode; + if (!canTerraceArea(theDock, &theArea, &startNode)) + return; + + qreal longestLen = 0.0f; + unsigned int sides[2]; + sides[0] = 0; + for (int i = 0; i < theArea->size()-1; ++i) { + const Coord p1(theArea->getNode(i)->position()); + const Coord p2(theArea->getNode(i+1)->position()); + const qreal len = p1.distanceFrom(p2); + if (len > longestLen) { + longestLen = len; + sides[0] = i; + } + } + sides[1] = (sides[0] + 2) % (theArea->size() - 1); + + QList<Feature*> areas; + terraceArea(theDocument, theList, theArea, sides, divisions, startNode, &areas); + + theDock->setSelection(areas); +} + +// Remove repeated (adjacent) nodes in ways. +static void removeRepeatsInRoads(Document* theDocument, CommandList* theList, PropertiesDock* theDock) +{ + for (int i = 0; i < theDock->selectionSize(); ++i) { + if (theDock->selection(i)->getClass() == "Way") { + Way *way = CAST_WAY(theDock->selection(i)); + Node *last = 0; + for (int j = 0; j < way->size();) { + Node *node = way->getNode(j); + if (node == last) { + theList->add(new WayRemoveNodeCommand(way, j, theDocument->getDirtyOrOriginLayer(way->layer()))); + continue; + } + last = node; + ++j; + } + } + } +} + +// Align a set of midpoints in a specific direction +static void axisAlignAlignMidpoints(QVector<QPointF> &midpoints, const QVector<qreal> weights, const QPointF &dir, int begin, int end) +{ + // get weighted average midpoint + const int n = midpoints.size(); + QPointF avg(0.0, 0.0); + qreal total_weight = 0.0; + for (int j = begin; j < end; ++j) { + int i = j % n; + avg += weights[i]*midpoints[i]; + total_weight += weights[i]; + } + avg /= total_weight; + + // project midpoints onto dir line through avg + for (int j = begin; j < end; ++j) { + int i = j % n; + QPointF rel_mid = midpoints[i] - avg; + qreal dot = dir.x()*rel_mid.x() + dir.y()*rel_mid.y(); + // assumes dir is normalised + midpoints[i] = avg + dir*dot; + } +} + +// Axis align uses binary fixed point for angles +static const int angle_shift = 20; + +// returns true on success +static bool axisAlignGetWays(/* in */ PropertiesDock *theDock, + /* out */ QList<Way *> &theWays) +{ + QList<Feature *> selection = theDock->selection(); + // we can't use foreach since we append to selection inside the loop + for (; !selection.empty(); selection.pop_front()) { + Feature *F = selection.first(); + if (F->getClass() == "Way") + theWays << CAST_WAY(F); + else if (F->getClass() == "Relation") + // expand relation members onto the end of the selection list + for (int i = 0; i < F->size(); ++i) + selection << F->get(i); + } + return !theWays.empty(); +} + +// base the decision purely on what types of features are selected +bool canAxisAlignRoads(PropertiesDock* theDock) +{ + QList<Way *> theWays; + return axisAlignGetWays(theDock, theWays); +} + +// returns true on success +static bool axisAlignPreprocess(/* in */ PropertiesDock *theDock, const Projection &proj, int axes, + /* out */ QList<Way *> &theWays, QVector<int> &edge_angles, QVector<int> &edge_axis, + QVector<qreal> &edge_weight, qreal &total_weight, QVector<QPointF> &midpoints) +{ + if (!axisAlignGetWays(theDock, theWays)) + return false; + + // manipulate angles as fixed point values with a unit of the angle between axes + int nedges = 0; + foreach (Way *theWay, theWays) + nedges += theWay->size()-1; + edge_angles.resize(nedges); + edge_axis.resize(nedges); + edge_weight.resize(nedges); + midpoints.resize(nedges); + total_weight = 0.0; + + // Look at nodes and find angles etc + int i = 0; + foreach (Way *theWay, theWays) { + Node *n1; + Node *n2 = theWay->getNode(0); + QPointF p1; + QPointF p2 = proj.project(n2->position()); + for (int j = 0; j < theWay->size()-1; ++j, ++i) { + n1 = n2; + n2 = theWay->getNode(j + 1); + p1 = p2; + p2 = proj.project(n2->position()); + if (n1 == n2 || p1 == p2) { + qWarning() << "ERROR: duplicate nodes found during axis align in" << theWay->id().numId; + return false; + } + midpoints[i] = (p1 + p2) * 0.5; + // weight towards longer edges rather than lots of smaller edges + edge_weight[i] = n1->position().distanceFrom(n2->position()); + edge_weight[i] *= edge_weight[i]; + total_weight += edge_weight[i]; + // calculate angle of edge + qreal ang = QLineF(p1, p2).angle(); + edge_angles[i] = ang * ((axes << angle_shift) / 360.0); + if (edge_angles[i] < 0) { + edge_angles[i] += axes<<angle_shift; + } + edge_axis[i] = -1; + } + } + return true; +} + +// QVectors must be same size +// return true on success +static bool axisAlignCluster(/* in */ const QVector<int> &edge_angles, const QVector<qreal> &edge_weight, + qreal total_weight, unsigned int axes, + /* out */ int &theta, QVector<int> &edge_axis) +{ + // Use a variant of K-Means Clustering with regular spaced clusters to find + // the best angle for the first axis. + const int nedges = edge_angles.size(); + bool changed; + theta = 0; + // This should always terminate pretty quickly, but for robustness it's better to warn than hang. + unsigned int safety = 100; + while (--safety) { + // reassign edges to axes, stopping when nothing changes + changed = false; + for (int i = 0; i < nedges; ++i) { + int angle = edge_angles[i] - theta; + int new_axis = ((angle >> (angle_shift - 1)) + 1) >> 1; + if (new_axis >= (int)axes) + new_axis -= axes; + else if (new_axis < 0) + new_axis += axes; + if (new_axis != edge_axis[i]) { + edge_axis[i] = new_axis; + changed = true; + } + } + if (!changed) + break; + // adjust angle of first axis by weighted mean of angles between edges and their assigned axes + qreal dtheta = 0; + for (int i = 0; i < nedges; ++i) { + int diff = (edge_angles[i] - theta - (edge_axis[i] << angle_shift)) % (1 << angle_shift); + if (diff > ((1<<angle_shift)>>1)) + diff -= (1<<angle_shift); + else if (diff < -((1<<angle_shift)>>1)) + diff += (1<<angle_shift); + dtheta += edge_weight[i]*diff; + } + dtheta /= total_weight; + theta += dtheta; + } + if (!safety) + qWarning() << "WARNING: align axes clustering loop exceeded safety limit"; + + return safety; +} + +// QVectors must be same size +static qreal axisAlignCalcVariance(const QVector<int> &edge_angles, const QVector<int> &edge_axis, int theta) +{ + const int nedges = edge_angles.size(); + qreal variance = 0.0; + + for (int i = 0; i < nedges; ++i) { + int diff = (edge_angles[i] - theta - (edge_axis[i] << angle_shift)) % (1 << angle_shift); + if (diff > ((1<<angle_shift)>>1)) + diff -= (1<<angle_shift); + else if (diff < -((1<<angle_shift)>>1)) + diff += (1<<angle_shift); + qreal diff_f = (double)diff / ((1<<angle_shift)>>1); + variance += diff_f*diff_f; + } + variance /= nedges; + return variance; +} + +// Guesses the number of axes in a shape. +// returns 0 on failure. +unsigned int axisAlignGuessAxes(PropertiesDock* theDock, const Projection &proj, unsigned int max_axes) +{ + QList<Way *> theWays; + QVector<int> edge_angles; + QVector<int> edge_axis; + QVector<qreal> edge_weight; + QVector<QPointF> midpoints; + qreal total_weight; + qreal min_var; + int min_var_axes = 0; + for (unsigned int axes = 3; axes <= max_axes; ++axes) { + if (!axisAlignPreprocess(theDock, proj, axes, + theWays, edge_angles, edge_axis, edge_weight, total_weight, midpoints)) + return 0; + int theta; + axisAlignCluster(edge_angles, edge_weight, total_weight, axes, theta, edge_axis); + qreal var = axisAlignCalcVariance(edge_angles, edge_axis, theta); + // prefer a lower number of axes + var *= sqrt((float)axes); + // we want the number of axes with the lowest weighted variance + if (!min_var_axes || var < min_var) { + min_var = var; + min_var_axes = axes; + } + } + + return min_var_axes; +} + +// maximum number of iterations +#define AXIS_ALIGN_MAX_ITS 10000 +// threshold of (node movement/distance from midpoint)^2 +#define AXIS_ALIGN_FAR_THRESHOLD (1e-6) // 1/1000th ^2 + +// don't add theList to history if result isn't success +AxisAlignResult axisAlignRoads(Document* theDocument, CommandList* theList, PropertiesDock* theDock, const Projection &proj, unsigned int axes) +{ + // Make sure nodes aren't pointlessly repeated or angles would be undefined + removeRepeatsInRoads(theDocument, theList, theDock); + + // manipulate angles as fixed point values with a unit of the angle between axes + QList<Way *> theWays; + QVector<int> edge_angles; + QVector<int> edge_axis; + QVector<qreal> edge_weight; + QVector<QPointF> midpoints; + qreal total_weight; + if (!axisAlignPreprocess(theDock, proj, axes, + theWays, edge_angles, edge_axis, edge_weight, total_weight, midpoints)) { + // should never happen, repeated nodes already removed + Q_ASSERT(0); + theList->undo(); + return AxisAlignFail; + } + + int theta; + axisAlignCluster(edge_angles, edge_weight, total_weight, axes, theta, edge_axis); + + // Calculate axis direction vectors + QVector<QPointF> axis_vectors(axes); + for (unsigned int i = 0; i < axes; ++i) { + int angle = theta + (i<<angle_shift); + axis_vectors[i].setX(cos(M_PI*2/(axes<<angle_shift)*angle)); + axis_vectors[i].setY(-sin(M_PI*2/(axes<<angle_shift)*angle)); + } + + // If adjacent edges are in the same axis we can't intersect them to find + // where the node should go. Align midpoints of adjacent edges on the same + // axis so that we can just project the nodes onto the axis and make the + // result axis aligned. Note that this does not handle adjacent edges which + // have opposite axes and are therefore parallel (when axes is even). + int i = 0; + foreach (Way *theWay, theWays) { + int start = i; + int n = theWay->size()-1; + int last_axis = -1; + int first_in_seq = -1; + int excess = 0; + for (; i < start + n; ++i) { + int axis = edge_axis[i]; + if (axis != last_axis) { + if (first_in_seq == -1) { + // If edges sharing axis cross the join between ends, we'll + // come back to it anyway. + excess = i; + if (i != 0 || !theWay->isClosed() || edge_axis[start+n-1] != axis) + first_in_seq = i; + } else { + if (i - first_in_seq > 1) { + axisAlignAlignMidpoints(midpoints, edge_weight, axis_vectors[last_axis], first_in_seq, i); + } + first_in_seq = i; + } + last_axis = axis; + } + } + if (n + excess - first_in_seq > 1) + axisAlignAlignMidpoints(midpoints, edge_weight, axis_vectors[last_axis], first_in_seq, n+excess); + } + + // Get the positions of each unique node + QHash<Node *, QPointF> node_pos; + bool dups = false; + foreach (Way *theWay, theWays) { + for (int i = 0; i < theWay->size(); ++i) { + Node *N = theWay->getNode(i); + if (!dups && node_pos.contains(N) && !(theWay->isClosed() && i == theWay->size()-1)) + dups = true; + node_pos[N] = proj.project(N->position()); + } + } + + // If nodes are repeated then they will be moved more than once, so we + // iterate and allow the nodes to converge to a point. + qreal last_movement = -1.0; + qreal movement = 0.0; + for (int it = 0; ; ++it) { + i = 0; + bool moved_far = false; + // Move nodes (only in node_pos) onto the intersection of the neighbouring + // edge's axes through their midpoints. Where neighbouring edges are on the + // same axis (and so there is no intersection), project directly onto the + // axis through the mean midpoint. + foreach (Way *theWay, theWays) { + int index0, index1, max; + int start = i; + int n = theWay->size()-1; + if (theWay->isClosed()) { + index1 = start+n-1; + max = n; + } else { + index1 = -1; + max = theWay->size(); + } + for (int j = 0; j < max; ++j) { + index0 = index1; + index1 = ((j < n) ? i++ : -1); + Node *N = theWay->getNode(j); + QPointF old_pos = node_pos[N]; + QPointF new_pos; + QPointF mid; + if (index0 >= 0 && index1 >= 0 && edge_axis[index0] != edge_axis[index1]) { + // axes different, so probably safe to intersect + QLineF l0(midpoints[index0], midpoints[index0] + axis_vectors[edge_axis[index0]]); + QLineF l1(midpoints[index1], midpoints[index1] + axis_vectors[edge_axis[index1]]); + if (l0.intersect(l1, &new_pos) == QLineF::NoIntersection) { + theList->undo(); + return AxisAlignSharpAngles; + } + + if (dups && !moved_far) + mid = midpoints[index0]; + } else { + // Axes are the same so there's no intersection point. Just + // project onto axis through average midpoint. + int index = ((index0 >= 0) ? index0 : index1); + QPointF midpoint = midpoints[index]; + if (index != index1 && index1 >= 0) + midpoint = (midpoint + midpoints[index1]) / 2; + QPointF rel_pos = old_pos - midpoint; + QPointF dir = axis_vectors[edge_axis[index]]; + qreal dot = dir.x()*rel_pos.x() + dir.y()*rel_pos.y(); + new_pos = midpoint + dir*dot; + + if (dups && !moved_far) + mid = midpoints[index]; + } + if (dups) { + // If we're iterating, only move the node half the distance + // towards the new position, so that different edges can + // compete with one another to move the node. + new_pos = (new_pos + old_pos) / 2; + + // find how far the node has moved (squared to avoid a sqrt) + QPointF delta = new_pos - old_pos; + qreal moved_sq = delta.x()*delta.x() + delta.y()*delta.y(); + movement += moved_sq; + + // has the node moved "far"? + if (!moved_far) { + delta = new_pos - mid; + qreal size_sq = delta.x()*delta.x() + delta.y()*delta.y(); + if (moved_sq > size_sq * AXIS_ALIGN_FAR_THRESHOLD) + moved_far = true; + } + } + node_pos[N] = new_pos; + } + } + + // We're done when no nodes have moved very far. + if (!moved_far) + dups = false; + if (!dups || it >= AXIS_ALIGN_MAX_ITS) + break; + // Every so often check that the movement has decreased since last + // time. If it hasn't then it's likely that the ways are impossible to + // align. + if ((it & 0xf) == 0xf) { + if (last_movement >= 0.0 && movement >= last_movement) + break; + last_movement = movement; + movement = 0.0; + } + + // tweak midpoints + i = 0; + foreach (Way *theWay, theWays) { + Node *n2 = theWay->getNode(0); + QPointF p1; + QPointF p2 = node_pos[n2]; + for (int j = 0; j < theWay->size()-1; ++j, ++i) { + n2 = theWay->getNode(j + 1); + p1 = p2; + p2 = node_pos[n2]; + midpoints[i] = (p1 + p2) * 0.5; + } + } + } + // dups is set to false when converged + if (dups) { + theList->undo(); + return AxisAlignFail; + } + // Commit the changes + foreach (Way *theWay, theWays) { + for (int i = 0; i < theWay->size(); ++i) { + Node *N = theWay->getNode(i); + theList->add(new MoveNodeCommand(N, proj.inverse(node_pos[N]), theDocument->getDirtyOrOriginLayer(N->layer()))); + } + } + return AxisAlignSuccess; +} diff --git a/src/common/FeatureManipulations.h b/src/common/FeatureManipulations.h new file mode 100644 index 0000000..f9f260c --- /dev/null +++ b/src/common/FeatureManipulations.h @@ -0,0 +1,56 @@ +#ifndef MERKAARTOR_FEATUREMANIPULATIONS_H_ +#define MERKAARTOR_FEATUREMANIPULATIONS_H_ + +class CommandList; +class Document; +class Layer; +class PropertiesDock; +class Way; +class Projection; + +#include <QList> +#include "Coord.h" +#include "Node.h" + +void joinRoads(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +void splitRoads(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +Way *cutoutRoad(Document* theDocument, CommandList* theList, PropertiesDock* thedock, Node *N1, Node *N2); +void breakRoads(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +bool canCreateJunction(PropertiesDock* theDock); +int createJunction(Document* theDocument, CommandList* theList, PropertiesDock* theDock, bool doIt=true); +void addStreetNumbers(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +void reversePoints(Document* theDocument, CommandList* theList, Way* R); +void simplifyRoads(Document* theDocument, CommandList* theList, PropertiesDock* theDock, qreal threshold); +void alignNodes(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +void bingExtract(Document* theDocument, CommandList* theList, PropertiesDock* theDock, CoordBox vp); +void spreadNodes(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +void mergeNodes(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +void detachNode(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +void commitFeatures(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +bool canJoinRoads(PropertiesDock* theDock); +bool canBreakRoads(PropertiesDock* theDock); +bool canDetachNodes(PropertiesDock* theDock); +void addRelationMember(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +void removeRelationMember(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +void addToMultipolygon(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +bool canSubdivideRoad(PropertiesDock* theDock, Way** theRoad = 0, unsigned int* edge = 0); +void subdivideRoad(Document* theDocument, CommandList* theList, PropertiesDock* theDock, unsigned int divisions); +void joinAreas(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +bool canSplitArea(PropertiesDock* theDock, Way** outTheArea = 0, unsigned int outNodes[2] = 0); +void splitArea(Document* theDocument, CommandList* theList, PropertiesDock* theDock); +bool canTerraceArea(PropertiesDock* theDock, Way** outTheArea = 0, int* startNode = 0); +void terraceArea(Document* theDocument, CommandList* theList, PropertiesDock* theDock, unsigned int divisions); + +enum AxisAlignResult { + AxisAlignSuccess, + // failures: + AxisAlignSharpAngles, + AxisAlignFail // no convergence +}; +bool canAxisAlignRoads(PropertiesDock* theDock); +unsigned int axisAlignGuessAxes(PropertiesDock* theDock, const Projection &proj, unsigned int max_axes); +AxisAlignResult axisAlignRoads(Document* theDocument, CommandList* theList, PropertiesDock* theDock, const Projection &proj, unsigned int axes); + + +#endif + diff --git a/src/common/Global.cpp b/src/common/Global.cpp new file mode 100644 index 0000000..cda7146 --- /dev/null +++ b/src/common/Global.cpp @@ -0,0 +1,147 @@ +// +// C++ Implementation: Global +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "Global.h" +#include "MainWindow.h" +#include "SlippyMapWidget.h" + +#ifdef PORTABLE_BUILD +bool g_Merk_Portable = true; +#else +bool g_Merk_Portable = false; +#endif +bool g_Merk_Frisius = true; +bool g_Merk_NoGuardedTagsImport = false; +bool g_Merk_Segment_Mode = false; +bool g_Merk_Ignore_Preferences = false; +bool g_Merk_Reset_Preferences = false; +bool g_Merk_IgnoreStartupTemplate = false; +#if QT_VERSION < 0x040700 || defined(FORCE_46) +bool g_Merk_SelfClip = true; +#else +bool g_Merk_SelfClip = false; +#endif + +MainWindow* g_Merk_MainWindow = NULL; +MemoryBackend g_backend; +SlippyMapCache* SlippyMapWidget::theSlippyCache = 0; + +QStringList tagKeys; +QHash<QString, quint32> tagKeysHash; +QStringList tagValues; +QHash<QString, quint32> tagValuesHash; +QHash< quint32, QList<quint32> > tagList; +QStringList userList; +QString noUser; + +QPair<quint32, quint32> g_addToTagList(QString k, QString v) +{ + qint32 ik, iv; + + if (!tagKeysHash.contains(k)) { + tagKeys.append(k); + ik = tagKeys.size()-1; + tagKeysHash[k] = ik; + } else + ik = tagKeysHash.value(k); + + if (!tagValuesHash.contains(v)) { + tagValues.append(v); + iv = tagValues.size()-1; + tagValuesHash[v] = iv; + } else + iv = tagValuesHash.value(v); + + if (!k.isEmpty() && !v.isEmpty()) + tagList[ik].append(iv); + + return qMakePair((quint32)ik, (quint32)iv); +} + +void g_removeFromTagList(quint32 k, quint32 v) +{ + tagList[k].removeOne(v); + if (tagList[k].isEmpty()) + tagList.remove(k); +} + +QStringList g_getTagKeys() +{ + return tagKeys; +} + +QStringList g_getTagValues() +{ + return tagValues; +} + +QStringList g_getTagValueList(QString k) +{ + QSet<quint32> retList; + if (k == "*") { + foreach (QList<quint32> list, tagList) + retList.unite(list.toSet()); + } else + retList = tagList[tagKeys.indexOf(k)].toSet(); + + QStringList res; + foreach (quint32 i, retList) + res << g_getTagValue(i); + + return res; +} + +const QString& g_getTagKey(int idx) +{ + return tagKeys.at(idx); +} + +quint32 g_getTagKeyIndex(const QString& s) +{ + return tagKeys.indexOf(s); +} + +QStringList g_getTagKeyList() +{ + return tagKeys.toSet().toList(); +} + +QString g_getTagValue(int idx) +{ + return tagValues.at(idx); +} + +quint32 g_getTagValueIndex(const QString& s) +{ + return tagValues.indexOf(s); +} + +quint32 g_setUser(const QString& u) +{ + if (u.isEmpty()) + return 0xffffffff; + + qint32 ret = userList.indexOf(u); + if (ret == -1) { + userList.append(u); + return userList.size()-1; + } + return ret; +} + +const QString& g_getUser(quint32 idx) +{ + if (idx != 0xffffffff) + return userList[idx]; + else + return noUser; +} diff --git a/src/common/Global.h b/src/common/Global.h new file mode 100644 index 0000000..89ecfe3 --- /dev/null +++ b/src/common/Global.h @@ -0,0 +1,58 @@ +// +// C++ Interface: Global +// +// Description: +// +// +// Author: cbro <cbro@semperpax.com>, (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef MERKAARTOR_GLOBAL_H +#define MERKAARTOR_GLOBAL_H + +#include <QList> +#include <QPair> +#include <QtGlobal> + +#include "MemoryBackend.h" + +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) +#define QT5 +#else +#define QT4 +#endif + +class MainWindow; +class IBackend; + +extern bool g_Merk_Portable; +extern bool g_Merk_Frisius; +extern bool g_Merk_NoGuardedTagsImport; +extern bool g_Merk_Segment_Mode; +extern bool g_Merk_Ignore_Preferences; +extern bool g_Merk_Reset_Preferences; +extern bool g_Merk_IgnoreStartupTemplate; +extern bool g_Merk_SelfClip; + +extern MainWindow* g_Merk_MainWindow; + +extern QPair<quint32, quint32> g_addToTagList(QString k, QString v); +extern void g_removeFromTagList(quint32 k, quint32 v); +extern QStringList g_getTagKeys(); +extern QStringList g_getTagValues(); +extern const QString& g_getTagKey(int idx); +extern quint32 g_getTagKeyIndex(const QString& s); +extern QStringList g_getTagKeyList(); +extern QString g_getTagValue(int idx); +extern quint32 g_getTagValueIndex(const QString& s); +extern QStringList g_getTagValueList(QString k) ; + +extern quint32 g_setUser(const QString& u); +extern const QString& g_getUser(quint32 idx); + +extern MemoryBackend g_backend; + +#endif + diff --git a/src/common/GotoDialog.cpp b/src/common/GotoDialog.cpp new file mode 100644 index 0000000..7fd03d7 --- /dev/null +++ b/src/common/GotoDialog.cpp @@ -0,0 +1,214 @@ +// +// C++ Implementation: GotoDialog +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "GotoDialog.h" + +#include <QMessageBox> + +#include "MerkaartorPreferences.h" +#include "namefinderwidget.h" +#include "OsmLink.h" + +GotoDialog::GotoDialog(MapView* aView, QWidget *parent) + :QDialog(parent) +{ + setupUi(this); + + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint); + + theViewport = aView->viewport(); + theProjection = &aView->projection(); + theRect = aView->rect(); + + theCenter = theViewport.center(); + int OsmZoom = int((log((360.0 / theViewport.latDiff())) / log(2.0)) + 1); + OsmZoom = qMin(OsmZoom, 18); + OsmZoom = qMax(OsmZoom, 1); + + int idx = 0; + int selIdx = -1; + qreal dist = 6372.795; + qreal d; + BookmarkList* Bookmarks = M_PREFS->getBookmarks(); + BookmarkListIterator i(*Bookmarks); + while (i.hasNext()) { + i.next(); + + if (i.value().deleted == false) { + coordBookmark->addItem(i.key()); + CoordBox C = i.value().Coordinates; + if ((d = C.center().distanceFrom(theViewport.center())) < dist) { + dist = d; + selIdx = idx; + } + } + ++idx; + } + coordBookmark->setCurrentIndex(selIdx); + + connect(cbCoordShowProjected, SIGNAL(toggled(bool)), SLOT(fillCoordinates())); + + searchWidget = new NameFinder::NameFinderWidget(this); + connect(searchWidget, SIGNAL(selectionChanged()), this, SLOT(searchWidget_selectionChanged())); + connect(searchWidget, SIGNAL(doubleClicked()), this, SLOT(searchWidget_doubleClicked())); + connect(searchWidget, SIGNAL(done()), this, SLOT(searchWidget_done())); + verticalLayout_4->addWidget(searchWidget); + + coordLink->setText( QString("https://www.openstreetmap.org/#map=%3/%1/%2") + .arg(COORD2STRING(theViewport.center().y())) + .arg(COORD2STRING(theViewport.center().x())) + .arg(QString::number(OsmZoom)) + ); + coordOsmApi->setText( QString("%1/map?bbox=%2,%3,%4,%5") + .arg(M_PREFS->getOsmApiUrl()) + .arg(COORD2STRING(theViewport.bottomLeft().x())) + .arg(COORD2STRING(theViewport.bottomLeft().y())) + .arg(COORD2STRING(theViewport.topRight().x())) + .arg(COORD2STRING(theViewport.topRight().y())) + ); + coordOsmXApi->setText( QString("%1*[bbox=%2,%3,%4,%5]") + .arg(M_PREFS->getXapiUrl().endsWith("/") ? M_PREFS->getXapiUrl() : M_PREFS->getXapiUrl() + "/") + .arg(COORD2STRING(theViewport.bottomLeft().x())) + .arg(COORD2STRING(theViewport.bottomLeft().y())) + .arg(COORD2STRING(theViewport.topRight().x())) + .arg(COORD2STRING(theViewport.topRight().y())) + ); + fillCoordinates(); +} + +void GotoDialog::on_buttonBox_clicked(QAbstractButton * button) +{ + if (buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) { + if (rbBookmark->isChecked()) { + theNewViewport = M_PREFS->getBookmarks()->value(coordBookmark->currentText()).Coordinates; + } else + if (rbLink->isChecked()) { + OsmLink ol(coordLink->text()); + if (!ol.isValid()) { + QMessageBox::warning(this, QApplication::translate("GotoDialog", "Invalid OSM url"), + QApplication::translate("GotoDialog", "The specified url is invalid!")); + return; + } + theNewViewport = ol.getCoordBox(); + } else + if (rbCoord->isChecked()) { + QStringList tokens = coordCoord->text().split(","); + if (tokens.size() < 4) { + QMessageBox::warning(this, QApplication::translate("GotoDialog", "Invalid Coordinates format"), + QApplication::translate("GotoDialog", "Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'")); + return; + } + theNewViewport = CoordBox(Coord(tokens[0].toDouble(), tokens[1].toDouble()), Coord(tokens[2].toDouble(), tokens[3].toDouble())); + if (cbCoordShowProjected->isChecked()) + theNewViewport = theProjection->fromProjectedRectF(theNewViewport); + } else + if (rbSpan->isChecked()) { + QStringList tokens = coordSpan->text().split(","); + if (tokens.size() < 4) { + QMessageBox::warning(this, QApplication::translate("GotoDialog", "Invalid Coordinates format"), + QApplication::translate("GotoDialog", "Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'")); + return; + } + theNewViewport = CoordBox( + Coord( + tokens[1].toDouble() - tokens[3].toDouble() / 2, + tokens[0].toDouble() - tokens[2].toDouble() / 2), + Coord( + tokens[1].toDouble() + tokens[3].toDouble() / 2, + tokens[0].toDouble() + tokens[2].toDouble() / 2) + ); + if (cbCoordShowProjected->isChecked()) + theNewViewport = theProjection->fromProjectedRectF(theNewViewport); + } + accept(); + } +} + +void GotoDialog::searchWidget_selectionChanged() +{ +// QPointF centerPoint = searchWidget->selectedCoords(); +// int zoom = searchWidget->selectedZoom(); +// // The API doesn't like request for too large bounding boxes so reset to a default +// if (zoom < 15) +// zoom = 15; +// coordLink->setText( QString("http://www.openstreetmap.org/?lat=%1&lon=%2&zoom=%3") +// .arg(QString::number(centerPoint.x(), 'f', 4)) +// .arg(QString::number(centerPoint.y(), 'f', 4)) +// .arg(QString::number(zoom)) +// ); +// rbLink->setChecked(true); + + rbCoord->setChecked(true); + coordCoord->setText(QString("%1, %2, %3, %4") + .arg(searchWidget->selectedBbox().left()) + .arg(searchWidget->selectedBbox().top()) + .arg(searchWidget->selectedBbox().right()) + .arg(searchWidget->selectedBbox().bottom()) + ); + +} + +void GotoDialog::on_NameFinderEdit_textChanged(const QString & text) +{ + if (!text.isEmpty()) { + searchButton->setDefault(true); + } else { + searchButton->setDefault(false); + buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); + } +} + +void GotoDialog::on_searchButton_clicked() +{ + QString searchString = NameFinderEdit->text(); + QPointF C = theCenter; + + searchWidget->search(searchString, C); + searchButton->setEnabled(false); +} + +void GotoDialog::searchWidget_doubleClicked() +{ + buttonBox->button(QDialogButtonBox::Ok)->click(); +} + +void GotoDialog::searchWidget_done() +{ + searchButton->setEnabled(true); +} + +void GotoDialog::changeEvent(QEvent * event) +{ + if (event->type() == QEvent::LanguageChange) + retranslateUi(this); +} + +void GotoDialog::fillCoordinates() +{ + CoordBox bbox = theViewport; + if (cbCoordShowProjected->isChecked()) + bbox = theProjection->toProjectedRectF(theViewport, theRect); + + coordCoord->setText( QString("%1, %2, %3, %4") + .arg(COORD2STRING(bbox.bottomLeft().x())) + .arg(COORD2STRING(bbox.bottomLeft().y())) + .arg(COORD2STRING(bbox.topRight().x())) + .arg(COORD2STRING(bbox.topRight().y())) + ); + coordSpan->setText( QString("%1, %2, %3, %4") + .arg(COORD2STRING(bbox.center().y())) + .arg(COORD2STRING(bbox.center().x())) + .arg(COORD2STRING(bbox.latDiff())) + .arg(COORD2STRING(bbox.lonDiff())) + ); +} + diff --git a/src/common/GotoDialog.h b/src/common/GotoDialog.h new file mode 100644 index 0000000..61f20b2 --- /dev/null +++ b/src/common/GotoDialog.h @@ -0,0 +1,63 @@ +// +// C++ Interface: GotoDialog +// +// Description: +// +// +// Author: Chris Browet <cbro@semperpax.com>, (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef GOTODIALOG_H +#define GOTODIALOG_H + +#include <QWidget> + +#include "MapView.h" +#include "Coord.h" +#include "Projection.h" + +#include <ui_GotoDialog.h> + +class CoordBox; +class QItemSelection; +namespace NameFinder +{ + class NameFinderWidget; +} + +class GotoDialog: public QDialog , public Ui::GotoDialog +{ + Q_OBJECT + +public: + GotoDialog(MapView* aView, QWidget *parent = 0); + + const CoordBox& newViewport() const { return theNewViewport; }; + NameFinder::NameFinderWidget *searchWidget; + +public slots: + void on_buttonBox_clicked(QAbstractButton * button); + void on_searchButton_clicked(); + void searchWidget_selectionChanged(); + void on_NameFinderEdit_textChanged(const QString & text); + void searchWidget_doubleClicked (); + void searchWidget_done (); + +protected slots: + void fillCoordinates(); + +private: + Coord theCenter; + CoordBox theViewport; + Projection* theProjection; + QRect theRect; + + CoordBox theNewViewport; + + void changeEvent(QEvent*); + +}; + +#endif diff --git a/src/common/GotoDialog.ui b/src/common/GotoDialog.ui new file mode 100644 index 0000000..001ecf3 --- /dev/null +++ b/src/common/GotoDialog.ui @@ -0,0 +1,381 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>GotoDialog</class> + <widget class="QDialog" name="GotoDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>600</width> + <height>328</height> + </rect> + </property> + <property name="windowTitle"> + <string>Go To</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QRadioButton" name="rbBookmark"> + <property name="minimumSize"> + <size> + <width>200</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>Bookmark</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="coordBookmark"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>200</width> + <height>0</height> + </size> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QRadioButton" name="rbLink"> + <property name="minimumSize"> + <size> + <width>200</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>WWW link (OSM/Google maps)</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="coordLink"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Coordinates</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <widget class="QCheckBox" name="cbCoordShowProjected"> + <property name="text"> + <string>Show projected</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QRadioButton" name="rbCoord"> + <property name="minimumSize"> + <size> + <width>200</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>lonMin, latMin, lonMax, latMax</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="coordCoord"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QRadioButton" name="rbSpan"> + <property name="minimumSize"> + <size> + <width>200</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>latCent, lonCent, latSpan, lonSpan</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="coordSpan"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Info</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_5"> + <item> + <widget class="QLabel" name="label"> + <property name="minimumSize"> + <size> + <width>75</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>OSM API Url</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="coordOsmApi"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_6"> + <item> + <widget class="QLabel" name="label_2"> + <property name="minimumSize"> + <size> + <width>75</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>OSM XAPI url</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="coordOsmXApi"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="searchBox"> + <property name="title"> + <string>Search</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <property name="spacing"> + <number>4</number> + </property> + <property name="margin"> + <number>4</number> + </property> + <item> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <item> + <widget class="QLineEdit" name="NameFinderEdit"/> + </item> + <item> + <widget class="QPushButton" name="searchButton"> + <property name="text"> + <string>Search</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>coordBookmark</tabstop> + <tabstop>coordLink</tabstop> + <tabstop>coordCoord</tabstop> + <tabstop>coordSpan</tabstop> + <tabstop>coordOsmApi</tabstop> + <tabstop>coordOsmXApi</tabstop> + <tabstop>NameFinderEdit</tabstop> + <tabstop>searchButton</tabstop> + <tabstop>buttonBox</tabstop> + <tabstop>rbBookmark</tabstop> + <tabstop>rbLink</tabstop> + <tabstop>rbCoord</tabstop> + <tabstop>rbSpan</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>GotoDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>223</x> + <y>151</y> + </hint> + <hint type="destinationlabel"> + <x>266</x> + <y>108</y> + </hint> + </hints> + </connection> + <connection> + <sender>coordSpan</sender> + <signal>textEdited(QString)</signal> + <receiver>rbSpan</receiver> + <slot>toggle()</slot> + <hints> + <hint type="sourcelabel"> + <x>240</x> + <y>98</y> + </hint> + <hint type="destinationlabel"> + <x>101</x> + <y>106</y> + </hint> + </hints> + </connection> + <connection> + <sender>coordCoord</sender> + <signal>textEdited(QString)</signal> + <receiver>rbCoord</receiver> + <slot>toggle()</slot> + <hints> + <hint type="sourcelabel"> + <x>259</x> + <y>72</y> + </hint> + <hint type="destinationlabel"> + <x>117</x> + <y>79</y> + </hint> + </hints> + </connection> + <connection> + <sender>coordLink</sender> + <signal>textEdited(QString)</signal> + <receiver>rbLink</receiver> + <slot>toggle()</slot> + <hints> + <hint type="sourcelabel"> + <x>238</x> + <y>44</y> + </hint> + <hint type="destinationlabel"> + <x>111</x> + <y>48</y> + </hint> + </hints> + </connection> + <connection> + <sender>coordBookmark</sender> + <signal>activated(int)</signal> + <receiver>rbBookmark</receiver> + <slot>toggle()</slot> + <hints> + <hint type="sourcelabel"> + <x>263</x> + <y>21</y> + </hint> + <hint type="destinationlabel"> + <x>89</x> + <y>23</y> + </hint> + </hints> + </connection> + <connection> + <sender>coordBookmark</sender> + <signal>highlighted(int)</signal> + <receiver>rbBookmark</receiver> + <slot>toggle()</slot> + <hints> + <hint type="sourcelabel"> + <x>290</x> + <y>14</y> + </hint> + <hint type="destinationlabel"> + <x>137</x> + <y>19</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/common/MapTypedef.h b/src/common/MapTypedef.h new file mode 100644 index 0000000..5663196 --- /dev/null +++ b/src/common/MapTypedef.h @@ -0,0 +1,27 @@ +#ifndef MERKAARTOR_MAPTYPEDEF_H +#define MERKAARTOR_MAPTYPEDEF_H + +//#include <QPointer> + +class Feature; +//typedef QPointer<MapFeature> MapFeaturePtr; +typedef Feature* MapFeaturePtr; + +class Node; +//typedef QPointer<TrackPoint> TrackPointPtr; +typedef Node* NodePtr; + +class Way; +//typedef QPointer<Road> RoadPtr; +typedef Way* WayPtr; + +class Relation; +//typedef QPointer<Relation> RelationPtr; +typedef Relation* RelationPtr; + +class TrackSegment; +//typedef QPointer<TrackSegment> TrackSegmentPtr; +typedef TrackSegment* TrackSegmentPtr; + +#endif // MERKAARTOR_MAPTYPEDEF_H + diff --git a/src/common/MapView.cpp b/src/common/MapView.cpp new file mode 100644 index 0000000..fcea8d6 --- /dev/null +++ b/src/common/MapView.cpp @@ -0,0 +1,1178 @@ +#include "Global.h" + +#include <errno.h> + +#include "MapView.h" +#include "MainWindow.h" +#include "PropertiesDock.h" +#include "Document.h" +#include "ILayer.h" +#include "LayerIterator.h" +#include "ImageMapLayer.h" +#include "IMapAdapter.h" +#include "IMapWatermark.h" +#include "Feature.h" +#include "Interaction.h" +#include "IPaintStyle.h" +#include "Projection.h" +#include "qgps.h" +#include "qgpsdevice.h" + +#include "OsmRenderLayer.h" + +#ifdef USE_WEBKIT + #include "browserimagemanager.h" +#endif +#include "MerkaartorPreferences.h" +#include "SvgCache.h" + +#include <QTime> +#include <QMainWindow> +#include <QMouseEvent> +#include <QPainter> +#include <QStatusBar> +#include <QToolTip> +#include <QMap> +#include <QSet> +#include <QtConcurrentMap> + +// from wikipedia +#define EQUATORIALRADIUS 6378137.0 +#define LAT_ANG_PER_M 1.0 / EQUATORIALRADIUS +#define TEST_RFLAGS(x) p->ROptions.options.testFlag(x) + +class MapViewPrivate +{ +public: + QTransform theTransform; + QTransform theInvertedTransform; + qreal PixelPerM; + qreal NodeWidth; + int ZoomLevel; + CoordBox Viewport; + QList<CoordBox> invalidRects; + QPoint theVectorPanDelta; + qreal theVectorRotation; + QList<Node*> theVirtualNodes; + RendererOptions ROptions; + + Projection theProjection; + Document* theDocument; + Interaction* theInteraction; + + bool BackgroundOnlyPanZoom; + QTransform BackgroundOnlyVpTransform; + + QLabel *TL, *TR, *BL, *BR; + + OsmRenderLayer* osmLayer; + + MapViewPrivate() + : PixelPerM(0.0), Viewport(WORLD_COORDBOX), theVectorRotation(0.0) + , BackgroundOnlyPanZoom(false) + , theDocument(0) + , theInteraction(0) + {} +}; + +/*********************/ + +MapView::MapView(QWidget* parent) : + QWidget(parent), Main(dynamic_cast<MainWindow*>(parent)), StaticBackground(0) + , StaticWireframe(0), StaticTouchup(0) + , SelectionLocked(false),lockIcon(0) + , p(new MapViewPrivate) +{ + installEventFilter(Main); + + setMouseTracking(true); + setAttribute(Qt::WA_NoSystemBackground); + setContextMenuPolicy(Qt::CustomContextMenu); + setFocusPolicy(Qt::ClickFocus); + setAcceptDrops(true); + + MoveRightShortcut = new QShortcut(QKeySequence(Qt::Key_Right), this); + connect(MoveRightShortcut, SIGNAL(activated()), this, SLOT(on_MoveRight_activated())); + MoveLeftShortcut = new QShortcut(QKeySequence(Qt::Key_Left), this); + connect(MoveLeftShortcut, SIGNAL(activated()), this, SLOT(on_MoveLeft_activated())); + MoveUpShortcut = new QShortcut(QKeySequence(Qt::Key_Up), this); + connect(MoveUpShortcut, SIGNAL(activated()), this, SLOT(on_MoveUp_activated())); + MoveDownShortcut = new QShortcut(QKeySequence(Qt::Key_Down), this); + connect(MoveDownShortcut, SIGNAL(activated()), this, SLOT(on_MoveDown_activated())); + ZoomInShortcut = new QShortcut(QKeySequence(Qt::Key_PageUp), this); + ZoomInShortcut->setContext(Qt::WidgetShortcut); + connect(ZoomInShortcut, SIGNAL(activated()), this, SLOT(zoomIn())); + ZoomOutShortcut = new QShortcut(QKeySequence(Qt::Key_PageDown), this); + ZoomOutShortcut->setContext(Qt::WidgetShortcut); + connect(ZoomOutShortcut, SIGNAL(activated()), this, SLOT(zoomOut())); + + QVBoxLayout* vlay = new QVBoxLayout(this); + + QHBoxLayout* hlay1 = new QHBoxLayout(); + p->TL = new QLabel(this); + hlay1->addWidget(p->TL); + QSpacerItem* horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + hlay1->addItem(horizontalSpacer); + p->TR = new QLabel(this); + hlay1->addWidget(p->TR); + vlay->addLayout(hlay1); + + QSpacerItem* verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); + vlay->addItem(verticalSpacer); + + QHBoxLayout* hlay2 = new QHBoxLayout(); + p->BL = new QLabel(this); + hlay2->addWidget(p->BL); + QSpacerItem* horizontalSpacer2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + hlay2->addItem(horizontalSpacer2); + p->BR = new QLabel(this); + hlay2->addWidget(p->BR); + vlay->addLayout(hlay2); + + p->TL->setVisible(false); + p->TR->setVisible(false); + p->BL->setVisible(false); + p->BR->setVisible(false); + + + p->osmLayer = new OsmRenderLayer(this); + connect(p->osmLayer, SIGNAL(renderingDone()), SLOT(renderingDone())); +} + +MapView::~MapView() +{ + delete StaticBackground; + delete StaticWireframe; + delete StaticTouchup; + delete p; +} + +MainWindow *MapView::main() +{ + return Main; +} + +void MapView::setDocument(Document* aDoc) +{ + p->theDocument = aDoc; + p->osmLayer->setDocument(aDoc); + + setViewport(viewport(), rect()); +} + +Document *MapView::document() +{ + return p->theDocument; +} + +void MapView::invalidate(bool updateWireframe, bool updateOsmMap, bool updateBgMap) +{ + if (updateOsmMap) { + if (!M_PREFS->getWireframeView()) { + if (!TEST_RFLAGS(RendererOptions::Interacting)) + p->osmLayer->forceRedraw(p->theProjection, p->theTransform, rect(), p->PixelPerM, p->ROptions); + else if (M_PREFS->getEditRendering() == 2) + p->osmLayer->forceRedraw(p->theProjection, p->theTransform, rect(), p->PixelPerM, p->ROptions); + } + } + if (updateWireframe) { + p->invalidRects.clear(); + p->invalidRects.push_back(p->Viewport); + + p->theVectorPanDelta = QPoint(0, 0); + SAFE_DELETE(StaticBackground) + } + if (p->theDocument && updateBgMap) { + IMapWatermark* WatermarkAdapter = NULL; + for (LayerIterator<ImageMapLayer*> ImgIt(p->theDocument); !ImgIt.isEnd(); ++ImgIt) { + if (ImgIt.get()->isVisible()) { + ImgIt.get()->forceRedraw(*this, p->BackgroundOnlyVpTransform, rect()); + WatermarkAdapter = qobject_cast<IMapWatermark*>(ImgIt.get()->getMapAdapter()); + } + } + p->BackgroundOnlyVpTransform = QTransform(); + + if (WatermarkAdapter) { + p->TL->setAttribute(Qt::WA_NoMousePropagation); + p->TL->setOpenExternalLinks(true); + p->TL->setText(WatermarkAdapter->getLogoHtml()); + // p->lblLogo->move(10, 10); + p->TL->show(); + + p->BR->setAttribute(Qt::WA_NoMousePropagation); + p->BR->setOpenExternalLinks(true); + p->BR->setWordWrap(true); + p->BR->setText(WatermarkAdapter->getAttributionsHtml(p->Viewport, rect())); + p->BR->setMinimumWidth(150); + p->BR->setMaximumWidth(200); + p->BR->setMaximumHeight(50); + p->BR->show(); + } else { + p->TL->setVisible(false); + p->BR->setVisible(false); + } + } + update(); +} + +void MapView::panScreen(QPoint delta) +{ + Coord cDelta = fromView(delta) - fromView(QPoint(0, 0)); + if (p->BackgroundOnlyPanZoom) { + p->BackgroundOnlyVpTransform.translate(-cDelta.x(), -cDelta.y()); + } else { + p->theVectorPanDelta += delta; + + CoordBox r1, r2; + if (delta.x()) { + if (delta.x() < 0) + r1 = CoordBox(p->Viewport.bottomRight(), Coord(p->Viewport.topRight().x() - cDelta.x(), p->Viewport.topRight().y())); // OK + else + r1 = CoordBox(Coord(p->Viewport.bottomLeft().x() - cDelta.x(), p->Viewport.bottomLeft().y()), p->Viewport.topLeft()); // OK + p->invalidRects.push_back(r1); + } + if (delta.y()) { + if (delta.y() < 0) + r2 = CoordBox(Coord(p->Viewport.bottomLeft().x(), p->Viewport.bottomLeft().y() - cDelta.y()), p->Viewport.bottomRight()); // OK + else + r2 = CoordBox(p->Viewport.topLeft(), Coord( p->Viewport.bottomRight().x(), p->Viewport.topRight().y() - cDelta.y())); //NOK + p->invalidRects.push_back(r2); + } + + p->theTransform.translate((qreal)(delta.x())/p->theTransform.m11(), (qreal)(delta.y())/p->theTransform.m22()); + p->theInvertedTransform = p->theTransform.inverted(); + viewportRecalc(rect()); + if (!M_PREFS->getWireframeView() && p->theDocument) { + p->osmLayer->pan(delta); + } + } + + for (LayerIterator<ImageMapLayer*> ImgIt(p->theDocument); !ImgIt.isEnd(); ++ImgIt) + ImgIt.get()->pan(delta); + update(); +} + +void MapView::rotateScreen(QPoint /* center */, qreal angle) +{ + p->theVectorRotation += angle; + + transformCalc(p->theTransform, p->theProjection, p->theVectorRotation, p->Viewport, rect()); + p->theInvertedTransform = p->theTransform.inverted(); + viewportRecalc(rect()); +// p->invalidRects.clear(); +// p->invalidRects.push_back(p->Viewport); + +// for (LayerIterator<ImageMapLayer*> ImgIt(p->theDocument); !ImgIt.isEnd(); ++ImgIt) +// ImgIt.get()->pan(delta); + update(); +} + +void MapView::paintEvent(QPaintEvent * anEvent) +{ + if (!p->theDocument) + return; + +#ifndef NDEBUG + QTime Start(QTime::currentTime()); +#endif + + QPainter P; + P.begin(this); + + updateStaticBackground(); + + P.drawPixmap(p->theVectorPanDelta, *StaticBackground); + P.save(); + QTransform AlignTransform; + for (LayerIterator<ImageMapLayer*> ImgIt(p->theDocument); !ImgIt.isEnd(); ++ImgIt) { + if (ImgIt.get()->isVisible()) { + ImgIt.get()->drawImage(&P); + AlignTransform = ImgIt.get()->getCurrentAlignmentTransform(); + } + } + P.restore(); + + if (!p->invalidRects.isEmpty()) { + updateWireframe(); + } + if (M_PREFS->getWireframeView() || !p->osmLayer->isRenderingDone() || M_PREFS->getEditRendering() == 1) + P.drawPixmap(p->theVectorPanDelta, *StaticWireframe); + if (!M_PREFS->getWireframeView()) + if (!(TEST_RFLAGS(RendererOptions::Interacting) && M_PREFS->getEditRendering() == 1)) + drawFeatures(P); + P.drawPixmap(p->theVectorPanDelta, *StaticTouchup); + + + drawLatLonGrid(P); + drawDownloadAreas(P); + drawScale(P); + + if (p->theInteraction) { + P.setRenderHint(QPainter::Antialiasing); + p->theInteraction->paintEvent(anEvent, P); + } + + if (Main) + drawGPS(P); + + P.end(); + +#ifndef _MOBILE + if (Main) { + QString vpLabel = QString("%1,%2,%3,%4") + .arg(viewport().bottomLeft().x(),0,'f',4) + .arg(viewport().bottomLeft().y(),0, 'f',4) + .arg(viewport().topRight().x(),0, 'f',4) + .arg(viewport().topRight().y(),0,'f',4) + ; + if (!p->theProjection.projIsLatLong()) { + QRectF pVp = p->theProjection.toProjectedRectF(viewport(), rect()); + vpLabel += " / " + QString("%1,%2,%3,%4") + .arg(pVp.bottomLeft().x(),0,'f',4) + .arg(pVp.bottomLeft().y(),0, 'f',4) + .arg(pVp.topRight().x(),0, 'f',4) + .arg(pVp.topRight().y(),0,'f',4) + ; + } + Main->ViewportStatusLabel->setText(vpLabel); + + Main->MeterPerPixelLabel->setText(tr("%1 m/pixel").arg(1/p->PixelPerM, 0, 'f', 2)); + if (!AlignTransform.isIdentity()) { + QLineF l(0, 0, AlignTransform.dx(), AlignTransform.dy()); + l.translate(viewport().center()); + Main->AdjusmentMeterLabel->setVisible(true); + qreal distance = Coord(l.p2()).distanceFrom(Coord(l.p1()))*1000; + Main->AdjusmentMeterLabel->setText(tr("Align: %1m @ %2").arg(distance, 0, 'f', 2).arg(l.angle(), 0, 'f', 2) + QString::fromUtf8("°")); + } else { + Main->AdjusmentMeterLabel->setVisible(false); + } +#ifndef NDEBUG + QTime Stop(QTime::currentTime()); + Main->PaintTimeLabel->setText(tr("%1ms").arg(Start.msecsTo(Stop))); +#endif + } +#endif +} + +void MapView::drawScale(QPainter & P) +{ + + if (!TEST_RFLAGS(RendererOptions::ScaleVisible)) + return; + + errno = 0; + qreal Log = log10(200./p->PixelPerM); + if (errno != 0) + return; + + qreal RestLog = Log-floor(Log); + if (RestLog < log10(2.)) + Log = floor(Log); + else if (RestLog < log10(5.)) + Log = floor(Log)+log10(2.); + else + Log = floor(Log)+log10(5.); + + qreal Length = pow(10.,Log); + QPointF P1(20,height()-20); + QPointF P2(20+Length*p->PixelPerM,height()-20); + P.fillRect(P1.x()-4, P1.y()-20-4, P2.x() - P1.x() + 4, 33, QColor(255, 255, 255, 128)); + P.setPen(QPen(QColor(0,0,0),2)); + P.drawLine(P1-QPointF(0,5),P1+QPointF(0,5)); + P.drawLine(P1,P2); + if (Length < 1000) + P.drawText(QRectF(P2-QPoint(200,40),QSize(200,30)),Qt::AlignRight | Qt::AlignBottom, QString(tr("%1 m")).arg(Length, 0, 'f', 0)); + else + P.drawText(QRectF(P2-QPoint(200,40),QSize(200,30)),Qt::AlignRight | Qt::AlignBottom, QString(tr("%1 km")).arg(Length/1000, 0, 'f', 0)); + + P.drawLine(P2-QPointF(0,5),P2+QPointF(0,5)); +} + +void MapView::drawGPS(QPainter & P) +{ + if (Main->gps() && Main->gps()->getGpsDevice()) { + if (Main->gps()->getGpsDevice()->fixStatus() == QGPSDevice::StatusActive) { + Coord vp(Main->gps()->getGpsDevice()->longitude(), Main->gps()->getGpsDevice()->latitude()); + QPoint g = toView(vp); + QImage* pm = getSVGImageFromFile(":/Gps/Gps_Marker.svg", 32); + P.drawImage(g - QPoint(16, 16), *pm); + } + } +} + +bool testColor(const QImage& theImage, const QPoint& P, const QRgb& targetColor) +{ + if (!theImage.rect().contains(P)) return false; + return (theImage.pixel(P) == targetColor); +} + +void floodFill(QImage& theImage, const QPoint& P, const QRgb& targetColor, const QRgb& replaceColor) +{ + if (!testColor(theImage, P, targetColor)) return; + + QStack<QPoint> theStack; + QPoint aP; + QPainter theP(&theImage); + theP.setPen(QPen(QColor::fromRgb(replaceColor), 1)); + theP.setBrush(Qt::NoBrush); + + theStack.push(P); + while (!theStack.isEmpty()) { + aP = theStack.pop(); + QPoint W = aP; + QPoint E = aP; + if (testColor(theImage, aP + QPoint(0, 1), targetColor)) + theStack.push(aP + QPoint(0, 1)); + if (testColor(theImage, aP + QPoint(0, -1), targetColor)) + theStack.push(aP + QPoint(0, -1)); + while (testColor(theImage, W + QPoint(-1, 0),targetColor) && W.x() > 0) { + W += QPoint(-1, 0); + if (testColor(theImage, W + QPoint(0, 1), targetColor)) + theStack.push(W + QPoint(0, 1)); + if (testColor(theImage, W + QPoint(0, -1), targetColor)) + theStack.push(W + QPoint(0, -1)); + } + while (testColor(theImage, E + QPoint(1, 0), targetColor) && E.x() < theImage.width()-1) { + E += QPoint(1, 0); + if (testColor(theImage, E + QPoint(0, 1), targetColor)) + theStack.push(E + QPoint(0, 1)); + if (testColor(theImage, E + QPoint(0, -1), targetColor)) + theStack.push(E + QPoint(0, -1)); + } + theP.drawLine(W, E); + } +} + +void MapView::drawLatLonGrid(QPainter & P) +{ + if (!TEST_RFLAGS(RendererOptions::LatLonGridVisible)) + return; + + QPointF origin(0., 0.); + QPoint p1 = toView(origin); + QPointF p2 = fromView(QPoint(p1.x()+width(), p1.y()-height())); + CoordBox adjViewport(origin, p2); + qreal lonInterval = adjViewport.lonDiff() / 4; + qreal latInterval = adjViewport.latDiff() / 4; + + int prec = log10(lonInterval); + if (!lonInterval || !latInterval) return; // avoid divide-by-zero + qreal lonStart = qMax(int((p->Viewport.bottomLeft().x() - origin.x()) / lonInterval) * lonInterval, -COORD_MAX); + if (lonStart != -COORD_MAX) { + lonStart -= origin.x(); + if (lonStart<1) + lonStart -= lonInterval; + } + qreal latStart = qMax(int(p->Viewport.bottomLeft().y() / latInterval) * latInterval, -COORD_MAX/2); + if (latStart != -COORD_MAX/2) { + latStart -= origin.y(); + if (latStart<1) + latStart -= lonInterval; + } + + QList<QPolygonF> medianLines; + QList<QPolygonF> parallelLines; + + for (qreal y=latStart; y<=p->Viewport.topLeft().y()+latInterval; y+=latInterval) { + QPolygonF l; + for (qreal x=lonStart; x<=p->Viewport.bottomRight().x()+lonInterval; x+=lonInterval) { + QPointF pt = p->theProjection.project(Coord(qMin(x, COORD_MAX), qMin(y, COORD_MAX/2))); + l << pt; + } + parallelLines << l; + } + for (qreal x=lonStart; x<=p->Viewport.bottomRight().x()+lonInterval; x+=lonInterval) { + QPolygonF l; + for (qreal y=latStart; y<=p->Viewport.topLeft().y()+latInterval; y+=latInterval) { + QPointF pt = p->theProjection.project(Coord(qMin(x, COORD_MAX), qMin(y, COORD_MAX/2))); + l << pt; + } + medianLines << l; + } + + P.save(); + P.setRenderHint(QPainter::Antialiasing); + P.setPen(QColor(180, 217, 255)); + QLineF lb = QLineF(rect().topLeft(), rect().bottomLeft()); + QLineF lt = QLineF(rect().topLeft(), rect().topRight()); + QLineF l; + for (int i=0; i<parallelLines.size(); ++i) { + + if (parallelLines[i].size() == 0) + continue; + + P.drawPolyline(p->theTransform.map(parallelLines[i])); + int k=0; + QPointF pt; + while (k < parallelLines.at(i).size()-2) { + l = QLineF(p->theTransform.map(parallelLines.at(i).at(k)), p->theTransform.map(parallelLines.at(i).at(k+1))); + if (l.intersect(lb, &pt) == QLineF::BoundedIntersection) + break; + ++k; + } + if (pt.isNull()) + continue; +// QPoint pt = QPoint(0, p->theTransform.map(parallelLines.at(i).at(0)).y()); + QPoint ptt = pt.toPoint() + QPoint(5, -5); + P.drawText(ptt, QString("%1").arg(p->theProjection.inverse(parallelLines.at(i).at(0)).y(), 0, 'f', 2-prec)); + } + for (int i=0; i<medianLines.size(); ++i) { + + if (medianLines[i].size() == 0) + continue; + + P.drawPolyline(p->theTransform.map(medianLines[i])); + int k=0; + QPointF pt; + while (k < medianLines.at(i).size()-2) { + l = QLineF(p->theTransform.map(medianLines.at(i).at(k)), p->theTransform.map(medianLines.at(i).at(k+1))); + if (l.intersect(lt, &pt) == QLineF::BoundedIntersection) + break; + ++k; + } + if (pt.isNull()) + continue; +// QPoint pt = QPoint(p->theTransform.map(medianLines.at(i).at(0)).x(), 0); + QPoint ptt = pt.toPoint() + QPoint(5, 10); + P.drawText(ptt, QString("%1").arg(p->theProjection.inverse(medianLines.at(i).at(0)).x(), 0, 'f', 2-prec)); + } + + P.restore(); +} + +void MapView::drawFeaturesSync(QPainter & P) { + while (!p->osmLayer->isRenderingDone()); + p->osmLayer->drawImage(&P); +} + +void MapView::drawFeatures(QPainter & P) +{ + p->osmLayer->drawImage(&P); +} + +void MapView::drawDownloadAreas(QPainter & P) +{ + if (!TEST_RFLAGS(RendererOptions::DownloadedVisible)) + return; + + P.save(); + QRegion r(0, 0, width(), height()); + + + //QBrush b(Qt::red, Qt::DiagCrossPattern); + QBrush b(Qt::red, Qt::Dense7Pattern); + + QList<CoordBox> db = p->theDocument->getDownloadBoxes(); + QList<CoordBox>::const_iterator bb; + for (bb = db.constBegin(); bb != db.constEnd(); ++bb) { + if (viewport().disjunctFrom(*bb)) continue; + QPolygonF poly; + poly << projection().project((*bb).topLeft()); + poly << projection().project((*bb).bottomLeft()); + poly << projection().project((*bb).bottomRight()); + poly << projection().project((*bb).topRight()); + poly << projection().project((*bb).topLeft()); + + r -= QRegion(p->theTransform.map(poly.toPolygon())); + } + + P.setClipRegion(r); + P.setClipping(true); + P.fillRect(rect(), b); + + P.restore(); +} + +void MapView::updateStaticBackground() +{ + if (!StaticBackground || (StaticBackground->size() != size())) + { + delete StaticBackground; + StaticBackground = new QPixmap(size()); + + if (M_PREFS->getUseShapefileForBackground()) + StaticBackground->fill(M_PREFS->getWaterColor()); + else if (M_PREFS->getBackgroundOverwriteStyle()) + StaticBackground->fill(M_PREFS->getBgColor()); + else if (M_STYLE->getGlobalPainter().getDrawBackground()) + StaticBackground->fill(M_STYLE->getGlobalPainter().getBackgroundColor()); + else + StaticBackground->fill(M_PREFS->getBgColor()); + } +} + +void MapView::updateWireframe() +{ + QMap<RenderPriority, QSet <Feature*> > theFeatures; + QMap<RenderPriority, QSet<Feature*> >::const_iterator itm; + QSet<Feature*>::const_iterator it; + + QPainter P; + + for (int i=0; i<p->theDocument->layerSize(); ++i) + g_backend.getFeatureSet(p->theDocument->getLayer(i), theFeatures, p->invalidRects, p->theProjection); + + if (!p->theVectorPanDelta.isNull()) { + QRegion exposed; + StaticWireframe->scroll(p->theVectorPanDelta.x(), p->theVectorPanDelta.y(), StaticWireframe->rect(), &exposed); + P.begin(StaticWireframe); + P.setClipping(true); + P.setClipRegion(exposed); + P.setCompositionMode(QPainter::CompositionMode_Source); + P.fillRect(StaticWireframe->rect(), Qt::transparent); + } else { + StaticWireframe->fill(Qt::transparent); + P.begin(StaticWireframe); + P.setClipping(true); + P.setClipRegion(rect()); + } + + if (M_PREFS->getWireframeView() || !p->osmLayer->isRenderingDone() || M_PREFS->getEditRendering() == 1) { + if (M_PREFS->getWireframeView() && M_PREFS->getUseAntiAlias()) + P.setRenderHint(QPainter::Antialiasing); + else if (M_PREFS->getEditRendering() == 1) + P.setRenderHint(QPainter::Antialiasing); + for (itm = theFeatures.constBegin() ;itm != theFeatures.constEnd(); ++itm) + { + for (it = itm.value().constBegin() ;it != itm.value().constEnd(); ++it) + { + qreal alpha = (*it)->getAlpha(); + P.setOpacity(alpha); + + (*it)->drawSimple(P, this); + } + } + } + P.end(); + + if (!p->theVectorPanDelta.isNull()) { + QRegion exposed; + StaticTouchup->scroll(p->theVectorPanDelta.x(), p->theVectorPanDelta.y(), StaticTouchup->rect(), &exposed); + P.begin(StaticTouchup); + P.setClipping(true); + P.setClipRegion(exposed); + P.setCompositionMode(QPainter::CompositionMode_Source); + P.fillRect(StaticTouchup->rect(), Qt::transparent); + } else { + StaticTouchup->fill(Qt::transparent); + P.begin(StaticTouchup); + P.setClipping(true); + P.setClipRegion(rect()); + } + + P.setRenderHint(QPainter::Antialiasing); + + for (itm = theFeatures.constBegin() ;itm != theFeatures.constEnd(); ++itm) + { + for (it = itm.value().constBegin() ;it != itm.value().constEnd(); ++it) + { + qreal alpha = (*it)->getAlpha(); + P.setOpacity(alpha); + + (*it)->drawTouchup(P, this); + } + } + P.end(); + + p->invalidRects.clear(); + p->theVectorPanDelta = QPoint(0, 0); + + +// QPainter P; + +// StaticBuffer->fill(Qt::transparent); +// P.begin(StaticBuffer); +// P.setCompositionMode(QPainter::CompositionMode_Source); +// P.setClipping(true); +// P.setClipRegion(rect()); +//// if (M_PREFS->getUseAntiAlias()) +//// P.setRenderHint(QPainter::Antialiasing); +// drawFeatures(P); +// P.end(); +} + +void MapView::mousePressEvent(QMouseEvent* anEvent) +{ + if (p->theInteraction) + if (anEvent->button()) + p->theInteraction->mousePressEvent(anEvent); +} + +void MapView::mouseReleaseEvent(QMouseEvent* anEvent) +{ + if (p->theInteraction) + p->theInteraction->mouseReleaseEvent(anEvent); + +} + +void MapView::mouseMoveEvent(QMouseEvent* anEvent) +{ + if (p->theInteraction) + p->theInteraction->mouseMoveEvent(anEvent); +} + +void MapView::mouseDoubleClickEvent(QMouseEvent* anEvent) +{ + if (p->theInteraction) + p->theInteraction->mouseDoubleClickEvent(anEvent); +} + +void MapView::wheelEvent(QWheelEvent* anEvent) +{ + if (p->theInteraction) + p->theInteraction->wheelEvent(anEvent); +} + +Interaction *MapView::interaction() +{ + return p->theInteraction; +} + +void MapView::setInteraction(Interaction *anInteraction) +{ + p->theInteraction = anInteraction; +} + +Projection& MapView::projection() +{ + return p->theProjection; +} + +QTransform& MapView::transform() +{ + return p->theTransform; +} + +QTransform& MapView::invertedTransform() +{ + return p->theInvertedTransform; +} + +QPoint MapView::toView(const Coord& aCoord) const +{ + return p->theTransform.map(p->theProjection.project(aCoord)).toPoint(); +} + +QPoint MapView::toView(Node* aPt) const +{ + return p->theTransform.map(aPt->projected()).toPoint(); +} + +Coord MapView::fromView(const QPoint& aPt) const +{ + return p->theProjection.inverse(p->theInvertedTransform.map(QPointF(aPt))); +} + + +void MapView::on_imageReceived(ImageMapLayer* aLayer) +{ + aLayer->forceRedraw(*this, p->BackgroundOnlyVpTransform, rect()); + p->BackgroundOnlyVpTransform = QTransform(); + update(); +} + +void MapView::resizeEvent(QResizeEvent * ev) +{ + viewportRecalc(QRect(QPoint(0,0), ev->size())); + + QWidget::resizeEvent(ev); + + if (!StaticWireframe || (StaticWireframe->size() != size())) + { + delete StaticWireframe; + StaticWireframe = new QPixmap(size()); + StaticWireframe->fill(Qt::transparent); + } + if (!StaticTouchup || (StaticTouchup->size() != size())) + { + delete StaticTouchup; + StaticTouchup = new QPixmap(size()); + } + + invalidate(true, true, true); +} + +void MapView::dragEnterEvent(QDragEnterEvent *event) +{ + if (!Main) { + event->ignore(); + return; + } +} + +void MapView::dragMoveEvent(QDragMoveEvent *event) +{ + if (!Main) { + event->ignore(); + return; + } +} + +void MapView::dropEvent(QDropEvent *event) +{ + if (!Main) { + event->ignore(); + return; + } +} + +bool MapView::toXML(QXmlStreamWriter& stream) +{ + bool OK = true; + + stream.writeStartElement("MapView"); + viewport().toXML("Viewport", stream); + p->theProjection.toXML(stream); + stream.writeEndElement(); + + return OK; +} + +void MapView::fromXML(QXmlStreamReader& stream) +{ + CoordBox cb; + stream.readNext(); + while(!stream.atEnd() && !stream.isEndElement()) { + if (stream.name() == "Viewport") { + cb = CoordBox::fromXML(stream); + } else if (stream.name() == "Projection") { + p->theProjection.fromXML(stream); + } + stream.readNext(); + } + + if (!cb.isNull()) + setViewport(cb, rect()); +} + +void MapView::on_MoveLeft_activated() +{ + QPoint p(rect().width()/4,0); + panScreen(p); + + invalidate(true, true, true); +} +void MapView::on_MoveRight_activated() +{ + QPoint p(-rect().width()/4,0); + panScreen(p); + + invalidate(true, true, true); +} + +void MapView::on_MoveUp_activated() +{ + QPoint p(0,rect().height()/4); + panScreen(p); + + invalidate(true, true, true); +} + +void MapView::on_MoveDown_activated() +{ + QPoint p(0,-rect().height()/4); + panScreen(p); + + invalidate(true, true, true); +} + +void MapView::zoomIn() +{ + zoom(M_PREFS->getZoomIn()/100., rect().center()); +} + +void MapView::zoomOut() +{ + zoom(M_PREFS->getZoomOut()/100., rect().center()); +} + +void MapView::renderingDone() { + update(); +} + +bool MapView::isSelectionLocked() +{ + return SelectionLocked; +} + +void MapView::lockSelection() +{ + if (!Main) + return; + + if (!SelectionLocked && Main->properties()->selection().size()) { +#ifndef _MOBILE + lockIcon = new QLabel(this); + lockIcon->setPixmap(QPixmap(":/Icons/emblem-readonly.png")); + Main->statusBar()->clearMessage(); + Main->statusBar()->addWidget(lockIcon); +#endif + SelectionLocked = true; + } +} + +void MapView::unlockSelection() +{ + if (!Main) + return; + + if (SelectionLocked) { +#ifndef _MOBILE + Main->statusBar()->removeWidget(lockIcon); + SAFE_DELETE(lockIcon) +#endif + SelectionLocked = false; + } +} + +const CoordBox& MapView::viewport() const +{ + return p->Viewport; +} + +void MapView::viewportRecalc(const QRect & Screen) +{ + Coord br = fromView(Screen.bottomRight()); + Coord tl = fromView(Screen.topLeft()); + p->Viewport = CoordBox(tl, br); + + // measure geographical distance between mid left and mid right of the screen + int mid = (Screen.topLeft().y() + Screen.bottomLeft().y()) / 2; + Coord left = fromView(QPoint(Screen.left(), mid)); + Coord right = fromView(QPoint(Screen.right(), mid)); + p->PixelPerM = Screen.width() / (left.distanceFrom(right)*1000); + p->NodeWidth = p->PixelPerM * M_PREFS->getNodeSize(); + if (p->NodeWidth > M_PREFS->getNodeSize()) + p->NodeWidth = M_PREFS->getNodeSize(); + + emit viewportChanged(); +} + +void MapView::transformCalc(QTransform& theTransform, const Projection& theProjection, const qreal& /* theRotation */, const CoordBox& TargetMap, const QRect& screen) +{ + QRectF pViewport = theProjection.toProjectedRectF(TargetMap, screen); +// QPointF pCenter(pViewport.center()); + + qreal Aspect = (double)screen.width() / screen.height(); + qreal pAspect = fabs(pViewport.width() / pViewport.height()); + + qreal wv, hv; + if (pAspect > Aspect) { + wv = fabs(pViewport.width()); + hv = fabs(pViewport.height() * pAspect / Aspect); + } else { + wv = fabs(pViewport.width() * Aspect / pAspect); + hv = fabs(pViewport.height()); + } + + qreal ScaleLon = screen.width() / wv; + qreal ScaleLat = screen.height() / hv; + +// qreal PLon = pCenter.x() /* * ScaleLon*/; +// qreal PLat = pCenter.y() /* * ScaleLat*/; +// qreal DeltaLon = Screen.width() / 2 - PLon; +// qreal DeltaLat = Screen.height() - (Screen.height() / 2 - PLat); + +// theTransform.setMatrix(ScaleLon, 0, 0, 0, -ScaleLat, 0, DeltaLon, DeltaLat, 1); + theTransform.reset(); + theTransform.scale(ScaleLon, -ScaleLat); +// theTransform.rotate(theRotation, Qt::ZAxis); + theTransform.translate(-pViewport.topLeft().x(), -pViewport.topLeft().y()); +// theTransform.translate(-pCenter.x(), -pCenter.y()); +// QLineF l(QPointF(0, 0), pCenter); +// l.setAngle(l.angle()+theRotation); +// qDebug() << "p2:" << l.p2(); +// theTransform.translate(l.p2().x(), l.p2().y()); +// theTransform.translate(Screen.width()/2, -Screen.height()/2); +// theTransform.rotateRadians(theRotation); +} + +void MapView::setViewport(const CoordBox & TargetMap, + const QRect & Screen) +{ + CoordBox targetVp; + if (TargetMap.latDiff() == 0 || TargetMap.lonDiff() == 0) + targetVp = CoordBox (TargetMap.center()-COORD_ENLARGE*10, TargetMap.center()+COORD_ENLARGE*10); + else + targetVp = TargetMap; + transformCalc(p->theTransform, p->theProjection, p->theVectorRotation, targetVp, Screen); + p->theInvertedTransform = p->theTransform.inverted(); + viewportRecalc(Screen); + + p->ZoomLevel = p->theTransform.m11(); + + if (TEST_RFLAGS(RendererOptions::LockZoom) && p->theDocument) { + ImageMapLayer* l = NULL; + for (LayerIterator<ImageMapLayer*> ImgIt(p->theDocument); !ImgIt.isEnd(); ++ImgIt) { + l = ImgIt.get(); + break; + } + if (l && l->isTiled()) { + l->setCurrentZoom(*this, p->Viewport, rect()); + qreal pixpercoord = width() / p->Viewport.lonDiff(); + qreal z = l->pixelPerCoord() / pixpercoord; + zoom(z, Screen.center(), Screen); + } + } + invalidate(true, true, true); +} + +void MapView::zoom(qreal d, const QPoint & Around) +{ + // Sensible limits on zoom range (circular scroll on touchpads can scroll + // very fast). + if (p->PixelPerM * d > 100 && d > 1.0) + return; + if (p->PixelPerM * d < 1e-5 && d < 1.0) + return; + + qreal z = d; + if (TEST_RFLAGS(RendererOptions::LockZoom)) { + ImageMapLayer* l = NULL; + for (LayerIterator<ImageMapLayer*> ImgIt(p->theDocument); !ImgIt.isEnd(); ++ImgIt) { + l = ImgIt.get(); + break; + } + if (l && l->isTiled()) { + if (d > 1.0) { + l->zoom_in(); + } else { + l->zoom_out(); + } + qreal pixpercoord = width() / p->Viewport.lonDiff(); + z = l->pixelPerCoord() / pixpercoord; + } + } + + zoom(z, Around, rect()); + if (!M_PREFS->getWireframeView()) + p->osmLayer->forceRedraw(p->theProjection, p->theTransform, rect(), p->PixelPerM, p->ROptions); + invalidate(true, false, true); +} + +void MapView::zoom(qreal d, const QPoint & Around, + const QRect & Screen) +{ + QPointF pBefore = p->theInvertedTransform.map(QPointF(Around)); + + qreal ScaleLon = p->theTransform.m11() * d; + qreal ScaleLat = p->theTransform.m22() * d; + qreal DeltaLat = (Around.y() - pBefore.y() * ScaleLat); + qreal DeltaLon = (Around.x() - pBefore.x() * ScaleLon); + +// p->theTransform.setMatrix(ScaleLon*cos(p->theVectorRotation), 0, 0, 0, ScaleLat*cos(p->theVectorRotation), 0, DeltaLon, DeltaLat, 1); + p->theTransform.reset(); + p->theTransform.scale(ScaleLon, ScaleLat); +// p->theTransform.rotate(p->theVectorRotation, Qt::ZAxis); + p->theTransform.translate(DeltaLon/ScaleLon, DeltaLat/ScaleLat); + + p->theInvertedTransform = p->theTransform.inverted(); + viewportRecalc(Screen); + + for (LayerIterator<ImageMapLayer*> ImgIt(p->theDocument); !ImgIt.isEnd(); ++ImgIt) + ImgIt.get()->zoom(d, Around, Screen); + + p->ZoomLevel = ScaleLon; + +// QPointF pt = p->theProjection.project(Coord(0, angToInt(180))); +// qreal earthWidth = pt.x() * 2; +// qreal zoomPixPerMat0 = 512. / earthWidth; +// qreal z = 0; +// p->AbstractZoomLevel = 0; +// for (;z<p->theTransform.m11(); ++p->AbstractZoomLevel) { +// qreal zoomPixPerMatCur = zoomPixPerMat0 * pow(2., p->AbstractZoomLevel); +// z = zoomPixPerMatCur / p->PixelPerM; +// } +} + +void MapView::adjustZoomToBoris() +{ + if (TEST_RFLAGS(RendererOptions::LockZoom)) { + ImageMapLayer* l = NULL; + for (LayerIterator<ImageMapLayer*> ImgIt(p->theDocument); !ImgIt.isEnd(); ++ImgIt) { + l = ImgIt.get(); + break; + } + if (l && l->isTiled()) { + qreal pixpercoord = width() / p->Viewport.lonDiff(); + qreal z = l->pixelPerCoord() / pixpercoord; + zoom(z, rect().center(), rect()); + } + } +} + +void MapView::setCenter(Coord & Center, const QRect & /*Screen*/) +{ + Coord curCenter(p->Viewport.center()); + QPoint curCenterScreen = toView(curCenter); + QPoint newCenterScreen = toView(Center); + + QPoint panDelta = (curCenterScreen - newCenterScreen); + panScreen(panDelta); +} + +void MapView::setInteracting(bool val) +{ + if (val) + p->ROptions.options |= RendererOptions::Interacting; + else + p->ROptions.options &= ~RendererOptions::Interacting; +// invalidate(true, true, false); +} + +qreal MapView::pixelPerM() const +{ + return p->PixelPerM; +} + +void MapView::setBackgroundOnlyPanZoom(bool val) +{ + p->BackgroundOnlyPanZoom = val; +} + +RendererOptions MapView::renderOptions() +{ + return p->ROptions; +} + +void MapView::setRenderOptions(const RendererOptions &opt) +{ + p->ROptions = opt; +} + +void MapView::stopRendering() { + p->osmLayer->stopRendering(); +} + +void MapView::resumeRendering() { + p->osmLayer->resumeRendering(); +} + +qreal MapView::nodeWidth() +{ + return p->NodeWidth; +} + +QString MapView::toPropertiesHtml() +{ + QString h; + + h += "<big><strong>" + tr("View") + "</strong></big><hr/>"; + h += "<u>" + tr("Bounding Box") + "</u><br/>"; + h += QString("%1, %2, %3, %4 (%5, %6, %7, %8)") + .arg(QString::number(viewport().bottomLeft().x(),'f',4)) + .arg(QString::number(viewport().bottomLeft().y(),'f',4)) + .arg(QString::number(viewport().topRight().x(),'f',4)) + .arg(QString::number(viewport().topRight().y(),'f',4)) + .arg(Coord2Sexa(viewport().bottomLeft().x())) + .arg(Coord2Sexa(viewport().bottomLeft().y())) + .arg(Coord2Sexa(viewport().topRight().x())) + .arg(Coord2Sexa(viewport().topRight().y())) + ; + h += "<br/>"; + h += "<u>" + tr("Projection") + "</u><br/>"; + h += p->theProjection.getProjectionType(); + h += ""; + + return h; +} diff --git a/src/common/MapView.h b/src/common/MapView.h new file mode 100644 index 0000000..a3e84e5 --- /dev/null +++ b/src/common/MapView.h @@ -0,0 +1,140 @@ +#ifndef MERKATOR_MAPVIEW_H_ +#define MERKATOR_MAPVIEW_H_ + +#include "Projection.h" +#include "IRenderer.h" + +#include <QPixmap> +#include <QWidget> +#include <QShortcut> +#include <QLabel> + +class MainWindow; +class Feature; +class Way; +class Document; +class MapAdapter; +class Interaction; +class ImageMapLayer; + +class MapViewPrivate; + +class MapView : public QWidget +{ + Q_OBJECT + friend class RenderTile; + +public: + MapView(QWidget* parent); +public: + ~MapView(); + + MainWindow* main(); + virtual void setDocument(Document* aDoc); + Document* document(); + Interaction* interaction(); + void setInteraction(Interaction* anInteraction); + + void drawFeatures(QPainter & painter); + void drawFeaturesSync(QPainter & P); + void drawLatLonGrid(QPainter & painter); + void drawDownloadAreas(QPainter & painter); + void drawScale(QPainter & painter); + + void panScreen(QPoint delta) ; + void rotateScreen(QPoint center, qreal angle); + void invalidate(bool updateWireframe, bool updateOsmMap, bool updateBgMap); + + virtual void paintEvent(QPaintEvent* anEvent); + virtual void mousePressEvent(QMouseEvent * event); + virtual void mouseReleaseEvent(QMouseEvent * event); + virtual void mouseMoveEvent(QMouseEvent* event); + virtual void mouseDoubleClickEvent(QMouseEvent* event); + virtual void wheelEvent(QWheelEvent* ev); + virtual void resizeEvent(QResizeEvent *event); + virtual void dragEnterEvent(QDragEnterEvent *event); + virtual void dragMoveEvent(QDragMoveEvent *event); + virtual void dropEvent(QDropEvent *event); + + Projection& projection(); + QTransform& transform(); + QTransform& invertedTransform(); + QPoint toView(const Coord& aCoord) const; + QPoint toView(Node* aPt) const; + Coord fromView(const QPoint& aPt) const; + + bool isSelectionLocked(); + void lockSelection(); + void unlockSelection(); + + void setViewport(const CoordBox& Map, const QRect& Screen); + const CoordBox& viewport() const; + static void transformCalc(QTransform& theTransform, const Projection& theProjection, const qreal& theRotation, const CoordBox& TargetMap, const QRect& Screen); + qreal pixelPerM() const; + + void setBackgroundOnlyPanZoom(bool val); + + void zoom(qreal d, const QPoint& Around); + void zoom(qreal d, const QPoint& Around, const QRect& Screen); + void adjustZoomToBoris(); + void setCenter(Coord& Center, const QRect& Screen); + + void setInteracting(bool val); + + bool toXML(QXmlStreamWriter& stream); + void fromXML(QXmlStreamReader& stream); + + RendererOptions renderOptions(); + void setRenderOptions(const RendererOptions& opt); + + void stopRendering(); + void resumeRendering(); + + qreal nodeWidth(); + + QString toPropertiesHtml(); + + void on_imageReceived(ImageMapLayer *aLayer); + +private: + void drawGPS(QPainter & painter); + void updateStaticBackground(); + void updateWireframe(); + + MainWindow* Main; + QPixmap* StaticBackground; + QPixmap* StaticWireframe; + QPixmap* StaticTouchup; + bool StaticMapUpToDate; + bool SelectionLocked; + QLabel* lockIcon; + + void viewportRecalc(const QRect& Screen); + + QShortcut* MoveLeftShortcut; + QShortcut* MoveRightShortcut; + QShortcut* MoveUpShortcut; + QShortcut* MoveDownShortcut; + QShortcut* ZoomInShortcut; + QShortcut* ZoomOutShortcut; + +public slots: + virtual void on_MoveLeft_activated(); + virtual void on_MoveRight_activated(); + virtual void on_MoveUp_activated(); + virtual void on_MoveDown_activated(); + virtual void zoomIn(); + virtual void zoomOut(); + + virtual void renderingDone(); + +signals: + void viewportChanged(); + +protected: + MapViewPrivate* p; +}; + +#endif + + diff --git a/src/common/MultiProperties.ui b/src/common/MultiProperties.ui new file mode 100644 index 0000000..54ec14a --- /dev/null +++ b/src/common/MultiProperties.ui @@ -0,0 +1,90 @@ +<ui version="4.0" > + <class>MultiProperties</class> + <widget class="QWidget" name="MultiProperties" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>207</width> + <height>349</height> + </rect> + </property> + <property name="windowTitle" > + <string>Form</string> + </property> + <layout class="QVBoxLayout" > + <property name="spacing" > + <number>3</number> + </property> + <property name="margin" > + <number>4</number> + </property> + <item> + <layout class="QHBoxLayout" > + <property name="spacing" > + <number>6</number> + </property> + <property name="margin" > + <number>0</number> + </property> + <item> + <widget class="QLabel" name="label_4" > + <property name="text" > + <string>Tags</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation" > + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0" > + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QToolButton" name="RemoveTagButton" > + <property name="text" > + <string>...</string> + </property> + <property name="icon" > + <iconset resource="Icons/AllIcons.qrc" > + <normaloff>:/Icons/small-remove.xpm</normaloff>:/Icons/small-remove.xpm</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QTableView" name="TagView" > + <property name="tabKeyNavigation" > + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="lbStatus" > + <property name="text" > + <string>Selected items</string> + </property> + </widget> + </item> + <item> + <widget class="QListWidget" name="SelectionList" > + <property name="selectionMode" > + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + </widget> + </item> + </layout> + </widget> + <resources> + <include location="Icons/AllIcons.qrc" /> + </resources> + <connections/> +</ui> diff --git a/src/common/Painting.cpp b/src/common/Painting.cpp new file mode 100644 index 0000000..62ea9ff --- /dev/null +++ b/src/common/Painting.cpp @@ -0,0 +1,226 @@ +#include "Painting.h" +#include "Projection.h" +#include "Features.h" +#include "LineF.h" + +#include <QtGui/QPainter> +#include <QtGui/QPainterPath> +#include <QLineF> + +#include <utility> + +#if 0 +static void buildCubicPath(QPainterPath& Path, const QPointF& P1, const QPointF& P2, const QPointF& P3, const QPointF& P4) +{ + LineF L(P1,P4); + qreal D2 = L.distance(P2); + qreal D3 = L.distance(P3); + if ( (D2 < 0.5) && (D3<0.5) ) + Path.lineTo(P4); + else + { + QPointF H = (P2+P3)/(qreal)2.0; + QPointF L2 = (P1+P2)/(qreal)2.0; + QPointF R3 = (P3+P4)/(qreal)2.0; + QPointF L3 = (L2+H)/(qreal)2.0; + QPointF R2 = (H+R3)/(qreal)2.0; + QPointF L4 = (L3+R2)/(qreal)2.0; + buildCubicPath(Path,P1,L2,L3,L4); + buildCubicPath(Path,L4,R2,R3,P4); + + } +} +#endif + +//bool QRectInterstects(const QRect& r, const QLine& l, QPoint& a, QPoint& b) +//{ +// QLineF lF = QLineF(l); +// QPointF pF; +// bool hasP1 = false; +// bool hasP2 = false; +// +// if (QLineF(r.topLeft(), r.bottomLeft()).intersect(lF, &pF) == QLineF::BoundedIntersection) { +// a = pF.toPoint(); +// hasP1 = true; +// } +// if (QLineF(r.bottomLeft(), r.bottomRight()).intersect(lF, &pF) == QLineF::BoundedIntersection) { +// if (hasP1) { +// b = pF.toPoint(); +// hasP2 = true; +// } else { +// a = pF.toPoint(); +// hasP1 = true; +// } +// } +// if (QLineF(r.bottomRight(), r.topRight()).intersect(lF, &pF) == QLineF::BoundedIntersection) { +// if (hasP1) { +// b = pF.toPoint(); +// hasP2 = true; +// } else { +// a = pF.toPoint(); +// hasP1 = true; +// } +// } +// if (QLineF(r.topRight(), r.topLeft()).intersect(lF, &pF) == QLineF::BoundedIntersection) { +// if (hasP1) { +// b = pF.toPoint(); +// hasP2 = true; +// } else { +// a = pF.toPoint(); +// hasP1 = true; +// } +// } +// +// if (hasP1 && hasP2) { +// if (QLineF(a,b).angleTo(lF) > 15.0) { +// QPoint t = b; +// b = a; +// a = t; +// } +// } +// if (hasP1) +// return true; +// else +// return false; +//} +// +//void buildPathFromRoad(Road *R, Projection const &theProjection, QPainterPath &Path, const QRect& clipRect) +//{ +// int first=0, last=R->size(); +// //if (!theProjection.viewport().contains(R->boundingBox())) { +// // for (int i=0; i<R->size(); ++i) { +// // if (theProjection.viewport().contains(R->get(i)->boundingBox())) { +// // if (!first) +// // first=i; +// // last=i; +// // } +// // } +// // if (first) first--; +// // last=qMin(last+2, R->size()); +// //} +// +// bool lastPointVisible = true; +// QPoint lastPoint = theProjection.project(R->get(first)->position()); +// QPoint p = lastPoint; +// +// if (!clipRect.contains(p)) { +// p.setX(qMax(clipRect.left(), p.x())); +// p.setX(qMin(clipRect.right(), p.x())); +// p.setY(qMax(clipRect.top(), p.y())); +// p.setY(qMin(clipRect.bottom(), p.y())); +// lastPointVisible = false; +// } +// Path.moveTo(p); +// if (R->smoothed().size()) +// { +// for (int i=3; i<R->smoothed().size(); i+=3) +// Path.cubicTo( +// theProjection.project(R->smoothed()[i-2]), +// theProjection.project(R->smoothed()[i-1]), +// theProjection.project(R->smoothed()[i])); +// } +// else +// for (int j=first+1; j<last; ++j) { +// p = theProjection.project(R->get(j)->position()); +// if (!clipRect.contains(p)) { +// if (!lastPointVisible) { +// QPoint a, b; +// if (QRectInterstects(clipRect, QLine(lastPoint, p), a, b)) { +// Path.lineTo(a); +// lastPoint = p; +// p = b; +// } else { +// lastPoint = p; +// p.setX(qMax(clipRect.left(), p.x())); +// p.setX(qMin(clipRect.right(), p.x())); +// p.setY(qMax(clipRect.top(), p.y())); +// p.setY(qMin(clipRect.bottom(), p.y())); +// } +// } else { +// QPoint a, b; +// QRectInterstects(clipRect, QLine(lastPoint, p), a, b); +// lastPoint = p; +// p = a; +// } +// lastPointVisible = false; +// } else { +// if (!lastPointVisible) { +// QPoint a, b; +// QRectInterstects(clipRect, QLine(lastPoint, p), a, b); +// Path.lineTo(a); +// } +// lastPoint = p; +// lastPointVisible = true; +// } +// Path.lineTo(p); +// } +//} +// +void buildPolygonFromRoad(Way *R, Projection const &theProjection, QPolygonF &Polygon) +{ + for (int i=0; i<R->size(); ++i) + if (R->getNode(i)->isVisible() && !R->getNode(i)->isVirtual()) + Polygon.append(theProjection.project(R->getNode(i)->position())); +} + +/// draws way with oneway markers +void draw(QPainter& thePainter, QPen& thePen, Feature::TrafficDirectionType TT, const QPointF& FromF, const QPointF& ToF, qreal theWidth, const Projection&) +{ + QPainterPath Path; + Path.moveTo(FromF); + Path.lineTo(ToF); + qreal DistFromCenter = theWidth*2; + if (distance(FromF,ToF) > qMax((qreal)40.0,DistFromCenter*2+4)) + { + QPointF H(FromF+ToF); + H *= 0.5; + qreal A = angle(FromF-ToF); + QPointF T(DistFromCenter*cos(A),DistFromCenter*sin(A)); + QPointF V1(theWidth*cos(A+M_PI/6),theWidth*sin(A+M_PI/6)); + QPointF V2(theWidth*cos(A-M_PI/6),theWidth*sin(A-M_PI/6)); +// MapFeature::TrafficDirectionType TT = W->trafficDirection(); + if ( (TT == Feature::OtherWay) || (TT == Feature::BothWays) ) + { + thePainter.setPen(QPen(QColor(0,0,255), 2)); + thePainter.drawLine(H+T,H+T-V1); + thePainter.drawLine(H+T,H+T-V2); + } + if ( (TT == Feature::OneWay) || (TT == Feature::BothWays) ) + { + thePainter.setPen(QPen(QColor(0,0,255), 2)); + thePainter.drawLine(H-T,H-T+V1); + thePainter.drawLine(H-T,H-T+V2); + } + else + { + if ( M_PREFS->getDirectionalArrowsVisible() == RendererOptions::ArrowsAlways ) + { + thePainter.setPen(QPen(QColor(255,0,0), 2)); + thePainter.drawLine(H-T,H-T+V1); + thePainter.drawLine(H-T,H-T+V2); + } + } + } + thePainter.strokePath(Path,thePen); +} + +void draw(QPainter& thePainter, QPen& thePen, Feature::TrafficDirectionType TT, const Coord& From, const Coord& To, qreal theWidth, const Projection& theProjection) +{ + QPointF FromF(theProjection.project(From)); + QPointF ToF(theProjection.project(To)); + draw(thePainter,thePen,TT,FromF,ToF,theWidth,theProjection); +} + + +/* void draw(QPainter& thePainter, QPen& thePen, Way* W, const Projection& theProjection) +{ + QPainterPath Path; + QPointF FromF(theProjection.project(W->from())); + QPointF ToF(theProjection.project(W->to())); + Path.moveTo(FromF); + Path.lineTo(ToF); + thePainter.strokePath(Path,thePen); +} */ + + + diff --git a/src/common/Painting.h b/src/common/Painting.h new file mode 100644 index 0000000..049492e --- /dev/null +++ b/src/common/Painting.h @@ -0,0 +1,29 @@ +#ifndef MERKAARTOR_PAINTING_H_ +#define MERKAARTOR_PAINTING_H_ + +#include "Feature.h" + +class Coord; +class Projection; +class Way; +class Way; + +class QPainter; +class QPainterPath; +class QPolygonF; +class QPen; + +//void buildPathFromRoad(Road *R, Projection const &theProjection, QPainterPath &Path, const QRect& clipRect); +void buildPolygonFromRoad(Way *R, Projection const &theProjection, QPolygonF &Polygon); + +/// draws way with oneway markers +void draw(QPainter& thePainter, QPen& thePen, Feature::TrafficDirectionType Dir, const QPointF& FromF, const QPointF& ToF, qreal theWidth, const Projection& theProjection); +void draw(QPainter& thePainter, QPen& thePen, Feature::TrafficDirectionType Dir, const Coord& From, const Coord& To, qreal theWidth, const Projection& theProjection); +/// draws way with oneway markers +void draw(QPainter& thePainter, QPen& thePen, Way* W, qreal theWidth, const Projection& theProjection); +/// draw way without oneway markers (as in focus) +void draw(QPainter& thePainter, QPen& thePen, Way* W, const Projection& theProjection); + +#endif + + diff --git a/src/common/Projection.cpp b/src/common/Projection.cpp new file mode 100644 index 0000000..06ccce3 --- /dev/null +++ b/src/common/Projection.cpp @@ -0,0 +1,258 @@ +#include "Projection.h" + +#include <QRect> +#include <QRectF> + +#include <math.h> + +// from wikipedia +#define EQUATORIALRADIUS 6378137.0 +#define POLARRADIUS 6356752.0 +#define EQUATORIALMETERCIRCUMFERENCE 40075016.68 +#define EQUATORIALMETERHALFCIRCUMFERENCE 20037508.34 +#define EQUATORIALMETERPERDEGREE 222638.981555556 + +ProjectionBackend::ProjectionBackend(QString initProjection, std::function<QString(QString)> mapProjectionName) + : ProjectionRevision(0) + , IsMercator(false) + , IsLatLong(false) + , mapProjectionName(mapProjectionName) +{ + + + projCtx = std::shared_ptr<PJ_CONTEXT>(proj_context_create(), proj_context_destroy); +#if defined(Q_OS_WIN) + ProjDirs dirs; + proj_context_set_search_paths(projCtx.get(), dirs.count, dirs.dirs); +#endif // Q_OS_WIN + projTransform = std::shared_ptr<PJ>(nullptr); + projMutex = std::shared_ptr<QMutex>(new QMutex()); + setProjectionType(initProjection); +} + +QPointF ProjectionBackend::project(const QPointF & Map) const +{ + if (IsMercator) + return mercatorProject(Map); + if (IsLatLong) + return latlonProject(Map); + return projProject(Map); +} + +QLineF ProjectionBackend::project(const QLineF & Map) const +{ + return QLineF(project(Map.p1()), project(Map.p2())); +} + + +QPointF ProjectionBackend::inverse(const QPointF & projPoint) const +{ + if (IsLatLong) + return latlonInverse(projPoint); + if (IsMercator) + return mercatorInverse(projPoint); + return projInverse(projPoint); +} + +QRectF ProjectionBackend::toProjectedRectF(const QRectF& Viewport, const QRect& screen) const +{ + QPointF tl, br; + QRectF pViewport; + + tl = project(Viewport.topLeft()); + br = project(Viewport.bottomRight()); + pViewport = QRectF(tl, br); + + QPointF pCenter(pViewport.center()); + + qreal wv, hv; + //wv = (pViewport.width() / Viewport.londiff()) * ((double)screen.width() / Viewport.londiff()); + //hv = (pViewport.height() / Viewport.latdiff()) * ((double)screen.height() / Viewport.latdiff()); + + qreal Aspect = (double)screen.width() / screen.height(); + qreal pAspect = fabs(pViewport.width() / pViewport.height()); + + if (pAspect > Aspect) { + wv = fabs(pViewport.width()); + hv = fabs(pViewport.height() * pAspect / Aspect); + } else { + wv = fabs(pViewport.width() * Aspect / pAspect); + hv = fabs(pViewport.height()); + } + + pViewport = QRectF((pCenter.x() - wv/2), (pCenter.y() + hv/2), wv, -hv); + + return pViewport; +} + +CoordBox ProjectionBackend::fromProjectedRectF(const QRectF& Viewport) const +{ + Coord tl, br; + CoordBox bbox; + + tl = inverse(Viewport.topLeft()); + br = inverse(Viewport.bottomRight()); + bbox = CoordBox(tl, br); + + return bbox; +} + +QPointF ProjectionBackend::projProject(const QPointF & Map) const +{ + QMutexLocker locker(projMutex.get()); + auto trans = proj_trans(projTransform.get(), PJ_DIRECTION::PJ_FWD, {{Map.x(), Map.y(), 0}}); + //qDebug() << "Project(fromWSG84, " << getProjectionType() << "): " << Map << " -> " << qSetRealNumberPrecision(20) << x << "," << y; + return QPointF(trans.xy.x, trans.xy.y); +} + +Coord ProjectionBackend::projInverse(const QPointF & pProj) const +{ + QMutexLocker locker(projMutex.get()); + auto trans = proj_trans(projTransform.get(), PJ_DIRECTION::PJ_INV, {{pProj.x(), pProj.y(), 0}}); + return Coord(trans.xy.x, trans.xy.y); +} + +bool ProjectionBackend::projIsLatLong() const +{ + return IsLatLong; +} + +PJ* ProjectionBackend::getProjection(QString projString) +{ + QString WGS84("+proj=longlat +ellps=WGS84 +datum=WGS84 +xy_in=deg"); + PJ* proj = proj_create_crs_to_crs(projCtx.get(), WGS84.toLatin1(), projString.toLatin1(), 0); + if (!proj) { + qDebug() << "Failed to initialize projection" << WGS84 << "to" << projString << "with error:" << proj_errno_string(proj_errno(nullptr)); + } + return proj; +} + +bool ProjectionBackend::setProjectionType(QString aProjectionType) +{ + QMutexLocker locker(projMutex.get()); + if (aProjectionType == projType) + return true; + + projTransform = nullptr; + + ProjectionRevision++; + projType = aProjectionType; + projProj4 = QString(); + IsLatLong = false; + IsMercator = false; + + // Hardcode "Google " projection + if ( + projType.isEmpty() || + projType.toUpper().contains("OSGEO:41001") || + projType.toUpper().contains("EPSG:3785") || + projType.toUpper().contains("EPSG:900913") || + projType.toUpper().contains("EPSG:3857") + ) + { + IsMercator = true; + projType = "EPSG:3857"; + return true; + } + // Hardcode "lat/long " projection + if ( projType.toUpper() == "EPSG:4326" ) + { + IsLatLong = true; + projType = "EPSG:4326"; + return true; + } + + projProj4 = mapProjectionName(aProjectionType); + projTransform = std::shared_ptr<PJ>(getProjection(projProj4), proj_destroy); + if (!projTransform) { + // Fall back to the EPSG:3857 and return false. getProjection already logged the error into qDebug(). + projType = "EPSG:3857"; + IsMercator = true; + return false; + } + return (projTransform != NULL || IsLatLong || IsMercator); +} + +QString ProjectionBackend::getProjectionType() const +{ + return projType; +} + +QString ProjectionBackend::getProjectionProj4() const +{ + QMutexLocker locker(projMutex.get()); + if (IsLatLong) + return "+init=EPSG:4326"; + if (IsMercator) + return "+init=EPSG:3857"; + return QString(proj_pj_info(projTransform.get()).definition); +} + +int ProjectionBackend::projectionRevision() const +{ + return ProjectionRevision; +} + +// Common routines + +qreal ProjectionBackend::latAnglePerM() const +{ + qreal LengthOfOneDegreeLat = EQUATORIALRADIUS * M_PI / 180; + return 1 / LengthOfOneDegreeLat; +} + +qreal ProjectionBackend::lonAnglePerM(qreal Lat) const +{ + qreal LengthOfOneDegreeLat = EQUATORIALRADIUS * M_PI / 180; + qreal LengthOfOneDegreeLon = LengthOfOneDegreeLat * fabs(cos(Lat)); + return 1 / LengthOfOneDegreeLon; +} + +bool ProjectionBackend::toXML(QXmlStreamWriter& stream) +{ + bool OK = true; + + stream.writeStartElement("Projection"); + stream.writeAttribute("type", projType); + if (!IsLatLong && !IsMercator && !projProj4.isEmpty()) { + stream.writeCharacters(projProj4); + } + stream.writeEndElement(); + + + return OK; +} + +void ProjectionBackend::fromXML(QXmlStreamReader& stream) +{ + if (stream.name() == "Projection") { + QString proj; + if (stream.attributes().hasAttribute("type")) + proj = stream.attributes().value("type").toString(); + else + proj = QCoreApplication::translate("Projection", "Document"); + stream.readNext(); + if (stream.tokenType() == QXmlStreamReader::Characters) { + setProjectionType(stream.text().toString()); + projType = proj; + stream.readNext(); + } else + setProjectionType(proj); + } +} + +QPointF ProjectionBackend::mercatorProject(const QPointF& c) const +{ + qreal x = c.x() / 180. * EQUATORIALMETERHALFCIRCUMFERENCE; + qreal y = log(tan(angToRad(c.y())) + 1/cos(angToRad(c.y()))) / M_PI * (EQUATORIALMETERHALFCIRCUMFERENCE); + + return QPointF(x, y); +} + +Coord ProjectionBackend::mercatorInverse(const QPointF& point) const +{ + qreal longitude = point.x()*180.0/EQUATORIALMETERHALFCIRCUMFERENCE; + qreal latitude = radToAng(atan(sinh(point.y()/EQUATORIALMETERHALFCIRCUMFERENCE*M_PI))); + + return Coord(longitude, latitude); +} diff --git a/src/common/Projection.h b/src/common/Projection.h new file mode 100644 index 0000000..e2a196d --- /dev/null +++ b/src/common/Projection.h @@ -0,0 +1,121 @@ +#ifndef MERKATOR_PROJECTION_H_ +#define MERKATOR_PROJECTION_H_ + +#include "IProjection.h" +#include "Coord.h" + +#include "MerkaartorPreferences.h" + + +#include <QPointF> +#include <proj.h> +#include <functional> +#include <memory> + +class QRect; +class Node; + +class ProjectionBackend : public IProjection +{ +public: + ProjectionBackend(QString initProjection, std::function<QString(QString)> mapProjectionName); + + qreal latAnglePerM() const; + qreal lonAnglePerM(qreal Lat) const; + QLineF project(const QLineF & Map) const; + QPointF project(const QPointF& Map) const; + QPointF inverse(const QPointF& Map) const; + + bool setProjectionType(QString aProjectionType); + QString getProjectionType() const; + bool projIsLatLong() const; + + QRectF toProjectedRectF(const QRectF& Viewport, const QRect& screen) const; + CoordBox fromProjectedRectF(const QRectF& Viewport) const; + + int projectionRevision() const; + QString getProjectionProj4() const; + + bool toXML(QXmlStreamWriter& stream); + void fromXML(QXmlStreamReader& stream); + +protected: + PJ* getProjection(QString projString); + QPointF projProject(const QPointF& Map) const; + Coord projInverse(const QPointF& Screen) const; + + QString projType; + QString projProj4; + QRectF ProjectedViewport; + int ProjectionRevision; + bool IsMercator; + bool IsLatLong; + std::function<QString(QString)> mapProjectionName; +protected: + QPointF mercatorProject(const QPointF& c) const; + Coord mercatorInverse(const QPointF& point) const; + + inline QPointF latlonProject(const QPointF& c) const + { + return QPointF(c.x()/**EQUATORIALMETERPERDEGREE*/, c.y()/**EQUATORIALMETERPERDEGREE*/); + } + + inline Coord latlonInverse(const QPointF& point) const + { + return Coord(point.x()/*/EQUATORIALMETERPERDEGREE*/, point.y()/*/EQUATORIALMETERPERDEGREE*/); + } +private: + // Note: keep the order of projCtx and projTransform, as projTransform depends on projCtx. + std::shared_ptr<PJ_CONTEXT> projCtx; + std::shared_ptr<PJ> projTransform; + std::shared_ptr<QMutex> projMutex; + // TODO: projTransform is not thread-safe by itself, so we need to protect + // it by a mutex. In theory, each thread could have it's own projection + // object, but currently the object is copied around. Until this changes, + // the mutex stays here. +}; + +/** + * Proxy class to inject M_PREFS externally and allow unit testing of ProjectionBackend itself. + */ +class Projection : public ProjectionBackend { + public: + static QString mapProjectionName(QString projName) { + return M_PREFS->getProjection(projName).projection; + } + + Projection(void) : + ProjectionBackend(M_PREFS->getProjectionType(), mapProjectionName) + { + } +}; + +/** + * This is a helper class that composes the proj search path. It is shared between this module and GDAL code. + * + * Note: qApp must be called after QApplication is instanciated - this must not be static, as that would call that earlier. + */ +struct ProjDirs { + private: + /* FIXME: Proj >= 7.0 supports relative path lookup natively, we can remove + * the relative path here once that gets into msys2. */ + QString projDirRelative = QDir::toNativeSeparators(qApp->applicationDirPath() + "/../share/proj"); + /* The following are hardcoded paths, as if search paths are set, proj no longer searches the default. Can be safely removed with proj7.*/ + QString projDirMingwStd = QDir::toNativeSeparators("c:/msys64/mingw64/share/proj"); // Standard msys2 path + QString projDirMingwTravis = QDir::toNativeSeparators("c:/tools/msys64/mingw64/share/proj"); // Travis-CI msys2 installation + QString projDirMingwGithub = QDir::toNativeSeparators("D:/a/_temp/msys/msys64/mingw64/share/proj"); // Github Actions msys2 installation + public: + const char* const dirs[5] = { + projDirRelative.toUtf8().constData(), + projDirMingwStd.toUtf8().constData(), + projDirMingwTravis.toUtf8().constData(), + projDirMingwGithub.toUtf8().constData(), + NULL + }; + static const int count = 4; +}; + + +#endif + + diff --git a/src/common/PropertiesDialog.ui b/src/common/PropertiesDialog.ui new file mode 100644 index 0000000..1699489 --- /dev/null +++ b/src/common/PropertiesDialog.ui @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PropertiesDialog</class> + <widget class="QDialog" name="PropertiesDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>495</width> + <height>371</height> + </rect> + </property> + <property name="windowTitle"> + <string>Properties</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QTextBrowser" name="textBrowser"/> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Close</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>PropertiesDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>PropertiesDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/common/RelationProperties.ui b/src/common/RelationProperties.ui new file mode 100644 index 0000000..8ec102e --- /dev/null +++ b/src/common/RelationProperties.ui @@ -0,0 +1,111 @@ +<ui version="4.0" > + <class>RelationProperties</class> + <widget class="QWidget" name="RelationProperties" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>222</width> + <height>495</height> + </rect> + </property> + <property name="windowTitle" > + <string>Form</string> + </property> + <layout class="QVBoxLayout" > + <property name="spacing" > + <number>4</number> + </property> + <property name="margin" > + <number>4</number> + </property> + <item> + <layout class="QGridLayout" > + <item row="0" column="0" > + <widget class="QLabel" name="label" > + <property name="text" > + <string>Landuse</string> + </property> + </widget> + </item> + <item row="0" column="1" > + <widget class="QComboBox" name="LandUse" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Expanding" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QLabel" name="MembersLabel" > + <property name="text" > + <string>Members</string> + </property> + </widget> + </item> + <item> + <widget class="QTableView" name="MembersView" > + <property name="tabKeyNavigation" > + <bool>false</bool> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" > + <property name="spacing" > + <number>6</number> + </property> + <property name="margin" > + <number>0</number> + </property> + <item> + <widget class="QLabel" name="label_4" > + <property name="text" > + <string>Tags</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation" > + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0" > + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QToolButton" name="RemoveTagButton" > + <property name="text" > + <string>...</string> + </property> + <property name="icon" > + <iconset resource="Icons/AllIcons.qrc" > + <normaloff>:/Icons/small-remove.xpm</normaloff>:/Icons/small-remove.xpm</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QTableView" name="TagView" > + <property name="tabKeyNavigation" > + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </widget> + <resources> + <include location="Icons/AllIcons.qrc" /> + </resources> + <connections/> +</ui> diff --git a/src/common/TagModel.cpp b/src/common/TagModel.cpp new file mode 100644 index 0000000..63cdb3d --- /dev/null +++ b/src/common/TagModel.cpp @@ -0,0 +1,198 @@ +#include <algorithm> +#include "TagModel.h" +#include "MainWindow.h" +#include "DocumentCommands.h" +#include "FeatureCommands.h" +#include "Document.h" +#include "Feature.h" +#include "Layer.h" +#include <QMessageBox> + +TagModel::TagModel(MainWindow* aMain) +: Main(aMain) +{ +} + +TagModel::~TagModel(void) +{ +} + +void TagModel::setFeature(const QList<Feature*> Features) +{ + if (theFeatures.size()) + { + beginRemoveRows(QModelIndex(),0,Tags.size()); + Tags.clear(); + endRemoveRows(); + } + theFeatures = Features; + if (theFeatures.size()) + { + Feature* F = theFeatures[0]; + for (int i=0; i<F->tagSize(); ++i) + { + int j=0; + for (j=1; j<theFeatures.size(); ++j) + if (F->tagValue(i) != theFeatures[j]->tagValue(F->tagKey(i),"")) + break; + if (j == theFeatures.size()) + if (!F->tagKey(i).startsWith("%kml:")) + Tags.push_back(qMakePair(F->tagKey(i),F->tagValue(i))); + } + std::sort(Tags.begin(), Tags.end()); + beginInsertRows(QModelIndex(),0,Tags.size()); + endInsertRows(); + } +} + +int TagModel::rowCount(const QModelIndex &) const +{ + if (!theFeatures.size()) return 0; + return Tags.size()+1; +} + +int TagModel::columnCount(const QModelIndex &) const +{ + return 2; +} + +QVariant TagModel::data(const QModelIndex &index, int role) const +{ + if (!theFeatures.size()) + return QVariant(); + if (!index.isValid()) + return QVariant(); + if (index.row() > Tags.size()) + return QVariant(); + if (role == Qt::DisplayRole) + { + if (index.row() >= Tags.size()) + { + if (index.column() == 0) + return newKeyText(); + else + return QString(); + } + else + { + if (index.column() == 0) + return Tags[index.row()].first; + else + return Tags[index.row()].second; + } + } + else if (role == Qt::EditRole) + { + if (index.row() >= Tags.size()) + return QString(); + else + { + if (index.column() == 0) + return Tags[index.row()].first; + else + return Tags[index.row()].second; + } + } + return QVariant(); +} + +QVariant TagModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (role != Qt::DisplayRole) + return QVariant(); + if (orientation == Qt::Horizontal) + { + if (section == 0) + return tr("Key"); + else + return tr("Value"); + } + return QVariant(); +} + +Qt::ItemFlags TagModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return Qt::ItemIsEnabled; + return QAbstractTableModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} + +bool TagModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (!theFeatures.size()) return false; + if (index.isValid() && role == Qt::EditRole) + { + /* Check if one of the same name already exists */ + if (index.column() == 0) { + for (int i = 0; i < Tags.size(); i++) { + if ((i != index.row()) && (Tags[i].first == value.toString())) { + QMessageBox::warning(NULL, tr("Tag editor"), tr("Tag with this name already exists.")); + return false; + } + } + } + + if ((int)index.row() == Tags.size()) + { + if (index.column() == 0) + { + beginInsertRows(QModelIndex(), Tags.size()+1, Tags.size()+1); + CommandList* L; + if (theFeatures.size() > 1) + L = new CommandList(MainWindow::tr("Set tags on multiple features"), NULL); + else + L = new CommandList(MainWindow::tr("Set tag '%1=' on %2").arg(value.toString()).arg(theFeatures[0]->description()), theFeatures[0]); + for (int i=0; i<theFeatures.size(); ++i) + { + if (theFeatures[i]->isVirtual()) + continue; + + if (!theFeatures[i]->isDirty() && !theFeatures[i]->hasOSMId() && theFeatures[i]->isUploadable()) { + bool userAdded = !(theFeatures[i]->id().type & IFeature::Conflict); + L->add(new AddFeatureCommand(Main->document()->getDirtyOrOriginLayer(),theFeatures[i],userAdded)); + } + L->add(new SetTagCommand(theFeatures[i],value.toString(),"", Main->document()->getDirtyOrOriginLayer(theFeatures[i]->layer()))); + theFeatures[i]->setLastUpdated(Feature::User); + } + Tags.push_back(qMakePair(value.toString(),QString(""))); + Main->document()->addHistory(L); + endInsertRows(); + } + else + return false; + } + else + { + QString Original(Tags[index.row()].first); + if (index.column() == 0) + Tags[index.row()].first = value.toString(); + else + Tags[index.row()].second = value.toString(); + CommandList* L; + if (theFeatures.size() > 1) + L = new CommandList(MainWindow::tr("Set tags on multiple features"), NULL); + else + L = new CommandList(MainWindow::tr("Set tag '%1=%2' on %3").arg(Tags[index.row()].first).arg(Tags[index.row()].second).arg(theFeatures[0]->description()), theFeatures[0]); + for (int i=0; i<theFeatures.size(); ++i) + { + if (theFeatures[i]->isVirtual()) + continue; + + int j = theFeatures[i]->findKey(Original); + if (j != -1) { + if (!theFeatures[i]->isDirty() && !theFeatures[i]->hasOSMId() && theFeatures[i]->isUploadable()) { + bool userAdded = !(theFeatures[i]->id().type & IFeature::Conflict); + L->add(new AddFeatureCommand(Main->document()->getDirtyOrOriginLayer(),theFeatures[i],userAdded)); + } + L->add(new SetTagCommand(theFeatures[i],j , Tags[index.row()].first, Tags[index.row()].second, Main->document()->getDirtyOrOriginLayer(theFeatures[i]->layer()))); + } + theFeatures[i]->setLastUpdated(Feature::User); + } + Main->document()->addHistory(L); + Main->invalidateView(false); + } + emit dataChanged(index, index); + return true; + } + return false; +} diff --git a/src/common/TagModel.h b/src/common/TagModel.h new file mode 100644 index 0000000..42f4e18 --- /dev/null +++ b/src/common/TagModel.h @@ -0,0 +1,39 @@ +#ifndef MERKAARTOR_TAGMODEL_H_ +#define MERKAARTOR_TAGMODEL_H_ + +#include <QtCore/QAbstractTableModel> +#include <QtCore/QString> + +#include <utility> +#include <QList> +#include <QPair> + +class MainWindow; +class Feature; + +class TagModel : public QAbstractTableModel +{ +Q_OBJECT + public: + TagModel(MainWindow* aMain); + ~TagModel(); + + inline static const QString newKeyText(void) + { return tr("Edit this to add..."); } + + void setFeature(const QList<Feature*> Features); + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role) const; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + Qt::ItemFlags flags(const QModelIndex &index) const; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + private: + MainWindow* Main; + QList<Feature*> theFeatures; + QList<QPair<QString, QString> > Tags; +}; + +#endif + + diff --git a/src/common/TerraceDialog.cpp b/src/common/TerraceDialog.cpp new file mode 100644 index 0000000..397f00c --- /dev/null +++ b/src/common/TerraceDialog.cpp @@ -0,0 +1,126 @@ +// +// C++ Implementation: TerraceDialog +// +// Description: +// +// +// Author: James Hogan <james@albanarts.com>, (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "TerraceDialog.h" + +TerraceDialog::TerraceDialog(QWidget *parent) + :QDialog(parent) +{ + setupUi(this); + + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint); + + resize(1,1); +} + +unsigned int TerraceDialog::numHouses() const +{ + return spinHouses->value(); +} + +unsigned int TerraceDialog::maxHouses() const +{ + return spinHouses->maximum(); +} + +bool TerraceDialog::hasHouseNumbers() const +{ + return radioNumbering->isChecked(); +} + +QStringList TerraceDialog::houseNumbers() const +{ + QStringList numbers; + calcNumbering(comboNumberingPattern->currentIndex(), lineNumberingRanges->text(), &numbers); + return numbers; +} + +unsigned int TerraceDialog::calcNumbering(int type, const QString& ranges, QStringList* outNumbers) const +{ + unsigned int num = 0; + unsigned int maxNum = maxHouses(); + const QStringList items = ranges.split(";"); + foreach (const QString& item, items) { + const QStringList endsStr = item.split("-"); + if (endsStr.size() == 2) { + bool valid[2]; + int ends[2] = { endsStr[0].toInt(&valid[0]), endsStr[1].toInt(&valid[1]) }; + if (valid[0] && valid[1]) { + int step = ((ends[0] <= ends[1]) ? 1 : -1); + if (type) { + // singular range, skip if not in type + if (ends[0] == ends[1] && ((ends[0] ^ type) & 1)) + continue; + // move ends inwards + if ((ends[0] ^ type) & 1) + ends[0] += step; + if ((ends[1] ^ type) & 1) + ends[1] -= step; + step *= 2; + } + int count = abs(ends[0] - ends[1]); + if (type) + count /= 2; + ++count; + num += count; + if (outNumbers) { + if (num > maxNum) + count -= maxNum - num; + int cur = ends[0]; + for (int i = 0; i < count; i++, cur += step) + *outNumbers << QString::fromLatin1("%1").arg(cur); + } + if (num >= maxNum) + return maxNum; + continue; + } + } else if (type && endsStr.size() == 1) { + // single number, skip if not in type + bool valid; + int num = endsStr[0].toInt(&valid); + if (valid && ((num ^ type) & 1)) + continue; + } + ++num; + if (outNumbers) + *outNumbers << item; + if (num >= maxNum) + return num; + } + return num; +} + +void TerraceDialog::updateNumbering(int type, const QString& ranges) +{ + spinHouses->setValue(calcNumbering(type, ranges)); +} + +void TerraceDialog::numberingTypeChanged(int type) +{ + updateNumbering(type, lineNumberingRanges->text()); +} + +void TerraceDialog::numberingRangeChanged(const QString& ranges) +{ + updateNumbering(comboNumberingPattern->currentIndex(), ranges); +} + +void TerraceDialog::updateNumbering() +{ + updateNumbering(comboNumberingPattern->currentIndex(), lineNumberingRanges->text()); +} + +void TerraceDialog::changeEvent(QEvent * event) +{ + if (event->type() == QEvent::LanguageChange) + retranslateUi(this); +} diff --git a/src/common/TerraceDialog.h b/src/common/TerraceDialog.h new file mode 100644 index 0000000..4b28d26 --- /dev/null +++ b/src/common/TerraceDialog.h @@ -0,0 +1,43 @@ +// +// C++ Interface: TerraceDialog +// +// Description: +// +// +// Author: James Hogan <james@albanarts.com>, (C) 2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef TERRACEDIALOG_H +#define TERRACEDIALOG_H + +#include <QWidget> + +#include <ui_TerraceDialog.h> + +class TerraceDialog: public QDialog , public Ui::TerraceDialog +{ + Q_OBJECT + +public: + TerraceDialog(QWidget *parent = 0); + + unsigned int numHouses() const; + unsigned int maxHouses() const; + bool hasHouseNumbers() const; + QStringList houseNumbers() const; + + unsigned int calcNumbering(int type, const QString& ranges, QStringList* outNumbers = 0) const; + void updateNumbering(int type, const QString& ranges); + +public slots: + void numberingTypeChanged(int type); + void numberingRangeChanged(const QString& ranges); + void updateNumbering(); + +private: + void changeEvent(QEvent*); +}; + +#endif diff --git a/src/common/TerraceDialog.ui b/src/common/TerraceDialog.ui new file mode 100644 index 0000000..3120a46 --- /dev/null +++ b/src/common/TerraceDialog.ui @@ -0,0 +1,289 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>TerraceDialog</class> + <widget class="QDialog" name="TerraceDialog"> + <property name="windowTitle"> + <string>Terrace</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="sizeConstraint"> + <enum>QLayout::SetMinimumSize</enum> + </property> + <item> + <widget class="QRadioButton" name="radioNoNumbering"> + <property name="text"> + <string>No House Numbering</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <layout class="QFormLayout" name="formLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Number of houses</string> + </property> + <property name="buddy"> + <cstring>spinHouses</cstring> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QSpinBox" name="spinHouses"> + <property name="minimum"> + <number>2</number> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QRadioButton" name="radioNumbering"> + <property name="text"> + <string>Add House Numbering (Karlsruhe scheme)</string> + </property> + </widget> + </item> + <item> + <widget class="QFrame" name="frame"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QFormLayout" name="formLayout_2"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::ExpandingFieldsGrow</enum> + </property> + <item row="1" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Ranges</string> + </property> + <property name="buddy"> + <cstring>lineNumberingRanges</cstring> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="lineNumberingRanges"/> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>For example "1-9;15-17;19,19A"</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Pattern</string> + </property> + <property name="buddy"> + <cstring>comboNumberingPattern</cstring> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QComboBox" name="comboNumberingPattern"> + <item> + <property name="text"> + <string>All numbers</string> + </property> + </item> + <item> + <property name="text"> + <string>Odd numbers</string> + </property> + </item> + <item> + <property name="text"> + <string>Even numbers</string> + </property> + </item> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="label_5"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Optionally you can also select a node in the area and house numbering will start at that end.</string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>radioNoNumbering</tabstop> + <tabstop>spinHouses</tabstop> + <tabstop>radioNumbering</tabstop> + <tabstop>lineNumberingRanges</tabstop> + <tabstop>comboNumberingPattern</tabstop> + <tabstop>buttonBox</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>TerraceDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>222</x> + <y>204</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>218</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>TerraceDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>290</x> + <y>210</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>218</y> + </hint> + </hints> + </connection> + <connection> + <sender>radioNumbering</sender> + <signal>toggled(bool)</signal> + <receiver>frame</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>51</x> + <y>62</y> + </hint> + <hint type="destinationlabel"> + <x>21</x> + <y>91</y> + </hint> + </hints> + </connection> + <connection> + <sender>radioNoNumbering</sender> + <signal>toggled(bool)</signal> + <receiver>label</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>78</x> + <y>14</y> + </hint> + <hint type="destinationlabel"> + <x>74</x> + <y>36</y> + </hint> + </hints> + </connection> + <connection> + <sender>radioNoNumbering</sender> + <signal>toggled(bool)</signal> + <receiver>spinHouses</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>111</x> + <y>11</y> + </hint> + <hint type="destinationlabel"> + <x>109</x> + <y>42</y> + </hint> + </hints> + </connection> + <connection> + <sender>comboNumberingPattern</sender> + <signal>currentIndexChanged(int)</signal> + <receiver>TerraceDialog</receiver> + <slot>numberingTypeChanged(int)</slot> + <hints> + <hint type="sourcelabel"> + <x>75</x> + <y>162</y> + </hint> + <hint type="destinationlabel"> + <x>166</x> + <y>35</y> + </hint> + </hints> + </connection> + <connection> + <sender>lineNumberingRanges</sender> + <signal>textEdited(QString)</signal> + <receiver>TerraceDialog</receiver> + <slot>numberingRangeChanged(QString)</slot> + <hints> + <hint type="sourcelabel"> + <x>331</x> + <y>118</y> + </hint> + <hint type="destinationlabel"> + <x>364</x> + <y>37</y> + </hint> + </hints> + </connection> + <connection> + <sender>radioNumbering</sender> + <signal>clicked()</signal> + <receiver>TerraceDialog</receiver> + <slot>updateNumbering()</slot> + <hints> + <hint type="sourcelabel"> + <x>206</x> + <y>70</y> + </hint> + <hint type="destinationlabel"> + <x>248</x> + <y>46</y> + </hint> + </hints> + </connection> + </connections> + <slots> + <slot>numberingTypeChanged(int)</slot> + <slot>numberingRangeChanged(QString)</slot> + <slot>updateNumbering()</slot> + </slots> +</ui> diff --git a/src/common/UploadMapDialog.ui b/src/common/UploadMapDialog.ui new file mode 100644 index 0000000..37ea77f --- /dev/null +++ b/src/common/UploadMapDialog.ui @@ -0,0 +1,174 @@ +<ui version="4.0" > + <class>UploadMapDialog</class> + <widget class="QDialog" name="UploadMapDialog" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>416</width> + <height>162</height> + </rect> + </property> + <property name="windowTitle" > + <string>Dialog</string> + </property> + <layout class="QVBoxLayout" > + <property name="spacing" > + <number>4</number> + </property> + <property name="margin" > + <number>4</number> + </property> + <item> + <layout class="QGridLayout" > + <property name="margin" > + <number>0</number> + </property> + <property name="spacing" > + <number>6</number> + </property> + <item row="0" column="1" > + <widget class="QLineEdit" name="Website" /> + </item> + <item row="0" column="0" > + <widget class="QLabel" name="label" > + <property name="text" > + <string>Website</string> + </property> + </widget> + </item> + <item row="1" column="1" > + <widget class="QLineEdit" name="Username" /> + </item> + <item row="2" column="1" > + <widget class="QLineEdit" name="Password" /> + </item> + <item row="2" column="0" > + <widget class="QLabel" name="label_3" > + <property name="text" > + <string>Password</string> + </property> + </widget> + </item> + <item row="1" column="0" > + <widget class="QLabel" name="label_2" > + <property name="text" > + <string>Username</string> + </property> + </widget> + </item> + <item row="3" column="0" > + <widget class="QCheckBox" name="UseProxy" > + <property name="text" > + <string>Use proxy</string> + </property> + </widget> + </item> + <item row="3" column="1" > + <layout class="QHBoxLayout" > + <property name="spacing" > + <number>6</number> + </property> + <property name="margin" > + <number>0</number> + </property> + <item> + <widget class="QLineEdit" name="ProxyHost" > + <property name="enabled" > + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_4" > + <property name="enabled" > + <bool>false</bool> + </property> + <property name="text" > + <string>Port</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="ProxyPort" > + <property name="enabled" > + <bool>false</bool> + </property> + <property name="maximumSize" > + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <property name="inputMask" > + <string>99999; </string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item> + <spacer> + <property name="orientation" > + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0" > + <size> + <width>382</width> + <height>16</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox" > + <property name="orientation" > + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons" > + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <layoutdefault spacing="4" margin="4" /> + <includes/> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>UploadMapDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel" > + <x>268</x> + <y>109</y> + </hint> + <hint type="destinationlabel" > + <x>-1</x> + <y>12</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>UploadMapDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel" > + <x>361</x> + <y>110</y> + </hint> + <hint type="destinationlabel" > + <x>399</x> + <y>93</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/common/common.pri b/src/common/common.pri new file mode 100644 index 0000000..02ea492 --- /dev/null +++ b/src/common/common.pri @@ -0,0 +1,41 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/common +DEPENDPATH += $$MERKAARTOR_SRC_DIR/common + +# Header files +HEADERS += Global.h \ + Coord.h \ + Document.h \ + MapTypedef.h \ + Painting.h \ + Projection.h \ + FeatureManipulations.h \ + MapView.h \ + TagModel.h \ + GotoDialog.h \ + TerraceDialog.h + +# Source files +SOURCES += Global.cpp \ + Coord.cpp \ + Document.cpp \ + Painting.cpp \ + Projection.cpp \ + FeatureManipulations.cpp \ + MapView.cpp \ + TagModel.cpp \ + GotoDialog.cpp \ + TerraceDialog.cpp + +# Forms +FORMS += AboutDialog.ui \ + DownloadMapDialog.ui \ + UploadMapDialog.ui \ + GotoDialog.ui \ + TerraceDialog.ui \ + MultiProperties.ui \ + PropertiesDialog.ui + +# Resource file(s) +RESOURCES += $$MERKAARTOR_SRC_DIR/../Icons/AllIcons.qrc \ + $$MERKAARTOR_SRC_DIR/../share/share.qrc \ + $$MERKAARTOR_SRC_DIR/../Styles/Styles.qrc diff --git a/src/org.merkaartor.merkaartor.appdata.xml b/src/org.merkaartor.merkaartor.appdata.xml new file mode 100644 index 0000000..83e51f8 --- /dev/null +++ b/src/org.merkaartor.merkaartor.appdata.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<component type="desktop-application"> + <id>org.merkaartor.merkaartor</id> + <launchable type="desktop-id">org.merkaartor.merkaartor.desktop</launchable> + <name>Merkaartor</name> + <summary>OpenStreetMap editor</summary> + <metadata_license>CC0-1.0</metadata_license> + <project_license>GPL-2.0</project_license> + <description> + <p>Merkaartor is a map editor for OpenStreetMap.org, the free editable map of the whole world. Features:</p> + <ul> + <li>Download from and upload to the OpenStreetMap server</li> + <li>Open .osm and .gpx files</li> + <li>Create and move trackpoints, ways, and areas</li> + <li>Add tags, delete features</li> + <li>Reverse, split and join ways</li> + <li>Visualize some leisure/landuse areas and road types</li> + <li>Displaying GPS information</li> + </ul> + </description> + <screenshots> + <screenshot type="default"> + <caption>Merkaartor 0.15.3 with Mapnik style</caption> +​ <image>https://wiki.openstreetmap.org/w/images/0/04/Merkaartor_0.15.3.png</image> + </screenshot> + <screenshot> + <caption>Merkaartor 0.15.3 with Maxspeed style</caption> +​ <image>https://wiki.openstreetmap.org/w/images/b/b4/Merkaartor_0.15.3_maxspeed.png</image> + </screenshot> + <screenshot> + <caption>Merkaartor 0.15.3 showing the fully localized GUI</caption> +​ <image>https://wiki.openstreetmap.org/w/images/4/48/Merkaartor_0.15.3_i18n.png</image> + </screenshot> + <screenshot> + <caption>Merkaartor 0.15.3 with WMS background and semi-transparent map layer</caption> +​ <image>https://wiki.openstreetmap.org/w/images/c/c9/Merkaartor_0.15.3_wms.png</image> + </screenshot> + </screenshots> + <url type="bugtracker">https://github.com/openstreetmap/merkaartor/issues</url> + <url type="homepage">http://merkaartor.be/</url> + <update_contact>merkaartor@openstreetmap.org</update_contact> + <translation type="qt">merkaartor</translation> +</component> diff --git a/src/org.merkaartor.merkaartor.desktop b/src/org.merkaartor.merkaartor.desktop new file mode 100644 index 0000000..ecc40a8 --- /dev/null +++ b/src/org.merkaartor.merkaartor.desktop @@ -0,0 +1,13 @@ +[Desktop Entry] +Type=Application +Version=1.0 +Name=Merkaartor +GenericName=OpenStreetMap Editor +GenericName[fr]=Un éditeur pour OpenStreetMap +GenericName[tr]=Açık Sokak Haritası Düzenleyicisi +Icon=merkaartor +Exec=merkaartor +Terminal=false +StartupNotify=false +Categories=Education;Geography;Network;Qt; +Keywords=OSM;GIS;Map;Geo; diff --git a/src/qextserialport/posix_qextserialport.cpp b/src/qextserialport/posix_qextserialport.cpp new file mode 100644 index 0000000..989ee7d --- /dev/null +++ b/src/qextserialport/posix_qextserialport.cpp @@ -0,0 +1,1117 @@ + +/*! +\class Posix_QextSerialPort +\version 1.0.0 +\author Stefan Sander + +A cross-platform serial port class. +This class encapsulates the POSIX portion of QextSerialPort. The user will be notified of errors +and possible portability conflicts at run-time by default - this behavior can be turned off by +defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn off portability +warnings) in the project. Note that _TTY_NOWARN_ will also turn off portability warnings. +*/ + +#include <stdio.h> +#include "posix_qextserialport.h" + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort() +Default constructor. Note that the name of the device used by a QextSerialPort constructed with +this constructor will be determined by #defined constants, or lack thereof - the default behavior +is the same as _TTY_LINUX_. Possible naming conventions and their associated constants are: + +\verbatim + +Constant Used By Naming Convention +---------- ------------- ------------------------ +_TTY_WIN_ Windows COM1, COM2 +_TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2 +_TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0 +_TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb +_TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02 +_TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1 +_TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1 +<none> Linux /dev/ttyS0, /dev/ttyS1 +\endverbatim + +This constructor assigns the device name to the name of the first port on the specified system. +See the other constructors if you need to open a different port. +*/ +Posix_QextSerialPort::Posix_QextSerialPort() +: QextSerialBase() +{ + Posix_File=new QFile(); +} + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort&) +Copy constructor. +*/ +Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort& s) + : QextSerialBase(s.port) +{ + setOpenMode(s.openMode()); + port = s.port; + Settings.BaudRate=s.Settings.BaudRate; + Settings.DataBits=s.Settings.DataBits; + Settings.Parity=s.Settings.Parity; + Settings.StopBits=s.Settings.StopBits; + Settings.FlowControl=s.Settings.FlowControl; + lastErr=s.lastErr; + + Posix_File=new QFile(); + Posix_File=s.Posix_File; + memcpy(&Posix_Timeout, &s.Posix_Timeout, sizeof(struct timeval)); + memcpy(&Posix_Copy_Timeout, &s.Posix_Copy_Timeout, sizeof(struct timeval)); + memcpy(&Posix_CommConfig, &s.Posix_CommConfig, sizeof(struct termios)); +} + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort(const QString & name) +Constructs a serial port attached to the port specified by name. +name is the name of the device, which is windowsystem-specific, +e.g."COM1" or "/dev/ttyS0". +*/ +Posix_QextSerialPort::Posix_QextSerialPort(const QString & name) + : QextSerialBase(name) +{ + Posix_File=new QFile(); +} + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings) +Constructs a port with default name and specified settings. +*/ +Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings) + : QextSerialBase() +{ + setBaudRate(settings.BaudRate); + setDataBits(settings.DataBits); + setParity(settings.Parity); + setStopBits(settings.StopBits); + setFlowControl(settings.FlowControl); + + Posix_File=new QFile(); + setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec); +} + +/*! +\fn Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings) +Constructs a port with specified name and settings. +*/ +Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings) + : QextSerialBase(name) +{ + setBaudRate(settings.BaudRate); + setDataBits(settings.DataBits); + setParity(settings.Parity); + setStopBits(settings.StopBits); + setFlowControl(settings.FlowControl); + + Posix_File=new QFile(); + setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec); +} + +/*! +\fn Posix_QextSerialPort& Posix_QextSerialPort::operator=(const Posix_QextSerialPort& s) +Override the = operator. +*/ +Posix_QextSerialPort& Posix_QextSerialPort::operator=(const Posix_QextSerialPort& s) +{ + setOpenMode(s.openMode()); + port = s.port; + Settings.BaudRate=s.Settings.BaudRate; + Settings.DataBits=s.Settings.DataBits; + Settings.Parity=s.Settings.Parity; + Settings.StopBits=s.Settings.StopBits; + Settings.FlowControl=s.Settings.FlowControl; + lastErr=s.lastErr; + + Posix_File=s.Posix_File; + memcpy(&Posix_Timeout, &(s.Posix_Timeout), sizeof(struct timeval)); + memcpy(&Posix_Copy_Timeout, &(s.Posix_Copy_Timeout), sizeof(struct timeval)); + memcpy(&Posix_CommConfig, &(s.Posix_CommConfig), sizeof(struct termios)); + return *this; +} + +/*! +\fn Posix_QextSerialPort::~Posix_QextSerialPort() +Standard destructor. +*/ +Posix_QextSerialPort::~Posix_QextSerialPort() +{ + if (isOpen()) { + close(); + } + Posix_File->close(); + delete Posix_File; +} + +/*! +\fn void Posix_QextSerialPort::setBaudRate(BaudRateType baudRate) +Sets the baud rate of the serial port. Note that not all rates are applicable on +all platforms. The following table shows translations of the various baud rate +constants on Windows(including NT/2000) and POSIX platforms. Speeds marked with an * +are speeds that are usable on both Windows and POSIX. + +\note +BAUD76800 may not be supported on all POSIX systems. SGI/IRIX systems do not support +BAUD1800. + +\verbatim + + RATE Windows Speed POSIX Speed + ----------- ------------- ----------- + BAUD50 110 50 + BAUD75 110 75 + *BAUD110 110 110 + BAUD134 110 134.5 + BAUD150 110 150 + BAUD200 110 200 + *BAUD300 300 300 + *BAUD600 600 600 + *BAUD1200 1200 1200 + BAUD1800 1200 1800 + *BAUD2400 2400 2400 + *BAUD4800 4800 4800 + *BAUD9600 9600 9600 + BAUD14400 14400 9600 + *BAUD19200 19200 19200 + *BAUD38400 38400 38400 + BAUD56000 56000 38400 + *BAUD57600 57600 57600 + BAUD76800 57600 76800 + *BAUD115200 115200 115200 + BAUD128000 128000 115200 + BAUD256000 256000 115200 +\endverbatim +*/ +void Posix_QextSerialPort::setBaudRate(BaudRateType baudRate) +{ + LOCK_MUTEX(); + if (Settings.BaudRate!=baudRate) { + switch (baudRate) { + case BAUD14400: + Settings.BaudRate=BAUD9600; + break; + + case BAUD56000: + Settings.BaudRate=BAUD38400; + break; + + case BAUD76800: + +#ifndef B76800 + Settings.BaudRate=BAUD57600; +#else + Settings.BaudRate=baudRate; +#endif + break; + + case BAUD128000: + case BAUD256000: + Settings.BaudRate=BAUD115200; + break; + + default: + Settings.BaudRate=baudRate; + break; + } + } + if (isOpen()) { + switch (baudRate) { + + /*50 baud*/ + case BAUD50: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 50 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B50; +#else + cfsetispeed(&Posix_CommConfig, B50); + cfsetospeed(&Posix_CommConfig, B50); +#endif + break; + + /*75 baud*/ + case BAUD75: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 75 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B75; +#else + cfsetispeed(&Posix_CommConfig, B75); + cfsetospeed(&Posix_CommConfig, B75); +#endif + break; + + /*110 baud*/ + case BAUD110: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B110; +#else + cfsetispeed(&Posix_CommConfig, B110); + cfsetospeed(&Posix_CommConfig, B110); +#endif + break; + + /*134.5 baud*/ + case BAUD134: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 134.5 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B134; +#else + cfsetispeed(&Posix_CommConfig, B134); + cfsetospeed(&Posix_CommConfig, B134); +#endif + break; + + /*150 baud*/ + case BAUD150: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 150 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B150; +#else + cfsetispeed(&Posix_CommConfig, B150); + cfsetospeed(&Posix_CommConfig, B150); +#endif + break; + + /*200 baud*/ + case BAUD200: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 200 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B200; +#else + cfsetispeed(&Posix_CommConfig, B200); + cfsetospeed(&Posix_CommConfig, B200); +#endif + break; + + /*300 baud*/ + case BAUD300: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B300; +#else + cfsetispeed(&Posix_CommConfig, B300); + cfsetospeed(&Posix_CommConfig, B300); +#endif + break; + + /*600 baud*/ + case BAUD600: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B600; +#else + cfsetispeed(&Posix_CommConfig, B600); + cfsetospeed(&Posix_CommConfig, B600); +#endif + break; + + /*1200 baud*/ + case BAUD1200: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B1200; +#else + cfsetispeed(&Posix_CommConfig, B1200); + cfsetospeed(&Posix_CommConfig, B1200); +#endif + break; + + /*1800 baud*/ + case BAUD1800: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows and IRIX do not support 1800 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B1800; +#else + cfsetispeed(&Posix_CommConfig, B1800); + cfsetospeed(&Posix_CommConfig, B1800); +#endif + break; + + /*2400 baud*/ + case BAUD2400: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B2400; +#else + cfsetispeed(&Posix_CommConfig, B2400); + cfsetospeed(&Posix_CommConfig, B2400); +#endif + break; + + /*4800 baud*/ + case BAUD4800: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B4800; +#else + cfsetispeed(&Posix_CommConfig, B4800); + cfsetospeed(&Posix_CommConfig, B4800); +#endif + break; + + /*9600 baud*/ + case BAUD9600: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B9600; +#else + cfsetispeed(&Posix_CommConfig, B9600); + cfsetospeed(&Posix_CommConfig, B9600); +#endif + break; + + /*14400 baud*/ + case BAUD14400: + TTY_WARNING("Posix_QextSerialPort: POSIX does not support 14400 baud operation. Switching to 9600 baud."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B9600; +#else + cfsetispeed(&Posix_CommConfig, B9600); + cfsetospeed(&Posix_CommConfig, B9600); +#endif + break; + + /*19200 baud*/ + case BAUD19200: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B19200; +#else + cfsetispeed(&Posix_CommConfig, B19200); + cfsetospeed(&Posix_CommConfig, B19200); +#endif + break; + + /*38400 baud*/ + case BAUD38400: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B38400; +#else + cfsetispeed(&Posix_CommConfig, B38400); + cfsetospeed(&Posix_CommConfig, B38400); +#endif + break; + + /*56000 baud*/ + case BAUD56000: + TTY_WARNING("Posix_QextSerialPort: POSIX does not support 56000 baud operation. Switching to 38400 baud."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B38400; +#else + cfsetispeed(&Posix_CommConfig, B38400); + cfsetospeed(&Posix_CommConfig, B38400); +#endif + break; + + /*57600 baud*/ + case BAUD57600: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B57600; +#else + cfsetispeed(&Posix_CommConfig, B57600); + cfsetospeed(&Posix_CommConfig, B57600); +#endif + break; + + /*76800 baud*/ + case BAUD76800: + TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows and some POSIX systems do not support 76800 baud operation."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + +#ifdef B76800 + Posix_CommConfig.c_cflag|=B76800; +#else + TTY_WARNING("Posix_QextSerialPort: Posix_QextSerialPort was compiled without 76800 baud support. Switching to 57600 baud."); + Posix_CommConfig.c_cflag|=B57600; +#endif //B76800 +#else //CBAUD +#ifdef B76800 + cfsetispeed(&Posix_CommConfig, B76800); + cfsetospeed(&Posix_CommConfig, B76800); +#else + TTY_WARNING("Posix_QextSerialPort: Posix_QextSerialPort was compiled without 76800 baud support. Switching to 57600 baud."); + cfsetispeed(&Posix_CommConfig, B57600); + cfsetospeed(&Posix_CommConfig, B57600); +#endif //B76800 +#endif //CBAUD + break; + + /*115200 baud*/ + case BAUD115200: +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B115200; +#else + cfsetispeed(&Posix_CommConfig, B115200); + cfsetospeed(&Posix_CommConfig, B115200); +#endif + break; + + /*128000 baud*/ + case BAUD128000: + TTY_WARNING("Posix_QextSerialPort: POSIX does not support 128000 baud operation. Switching to 115200 baud."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B115200; +#else + cfsetispeed(&Posix_CommConfig, B115200); + cfsetospeed(&Posix_CommConfig, B115200); +#endif + break; + + /*256000 baud*/ + case BAUD256000: + TTY_WARNING("Posix_QextSerialPort: POSIX does not support 256000 baud operation. Switching to 115200 baud."); +#ifdef CBAUD + Posix_CommConfig.c_cflag&=(~CBAUD); + Posix_CommConfig.c_cflag|=B115200; +#else + cfsetispeed(&Posix_CommConfig, B115200); + cfsetospeed(&Posix_CommConfig, B115200); +#endif + break; + } + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::setDataBits(DataBitsType dataBits) +Sets the number of data bits used by the serial port. Possible values of dataBits are: +\verbatim + DATA_5 5 data bits + DATA_6 6 data bits + DATA_7 7 data bits + DATA_8 8 data bits +\endverbatim + +\note +This function is subject to the following restrictions: +\par + 5 data bits cannot be used with 2 stop bits. +\par + 8 data bits cannot be used with space parity on POSIX systems. + +*/ +void Posix_QextSerialPort::setDataBits(DataBitsType dataBits) +{ + LOCK_MUTEX(); + if (Settings.DataBits!=dataBits) { + if ((Settings.StopBits==STOP_2 && dataBits==DATA_5) || + (Settings.StopBits==STOP_1_5 && dataBits!=DATA_5) || + (Settings.Parity==PAR_SPACE && dataBits==DATA_8)) { + } + else { + Settings.DataBits=dataBits; + } + } + if (isOpen()) { + switch(dataBits) { + + /*5 data bits*/ + case DATA_5: + if (Settings.StopBits==STOP_2) { + TTY_WARNING("Posix_QextSerialPort: 5 Data bits cannot be used with 2 stop bits."); + } + else { + Settings.DataBits=dataBits; + Posix_CommConfig.c_cflag&=(~CSIZE); + Posix_CommConfig.c_cflag|=CS5; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + + /*6 data bits*/ + case DATA_6: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Posix_QextSerialPort: 6 Data bits cannot be used with 1.5 stop bits."); + } + else { + Settings.DataBits=dataBits; + Posix_CommConfig.c_cflag&=(~CSIZE); + Posix_CommConfig.c_cflag|=CS6; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + + /*7 data bits*/ + case DATA_7: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Posix_QextSerialPort: 7 Data bits cannot be used with 1.5 stop bits."); + } + else { + Settings.DataBits=dataBits; + Posix_CommConfig.c_cflag&=(~CSIZE); + Posix_CommConfig.c_cflag|=CS7; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + + /*8 data bits*/ + case DATA_8: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Posix_QextSerialPort: 8 Data bits cannot be used with 1.5 stop bits."); + } + else { + Settings.DataBits=dataBits; + Posix_CommConfig.c_cflag&=(~CSIZE); + Posix_CommConfig.c_cflag|=CS8; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::setParity(ParityType parity) +Sets the parity associated with the serial port. The possible values of parity are: +\verbatim + PAR_SPACE Space Parity + PAR_MARK Mark Parity + PAR_NONE No Parity + PAR_EVEN Even Parity + PAR_ODD Odd Parity +\endverbatim + +\note +This function is subject to the following limitations: +\par +POSIX systems do not support mark parity. +\par +POSIX systems support space parity only if tricked into doing so, and only with + fewer than 8 data bits. Use space parity very carefully with POSIX systems. + +*/ +void Posix_QextSerialPort::setParity(ParityType parity) +{ + LOCK_MUTEX(); + if (Settings.Parity!=parity) { + if (parity==PAR_MARK || (parity==PAR_SPACE && Settings.DataBits==DATA_8)) { + } + else { + Settings.Parity=parity; + } + } + if (isOpen()) { + switch (parity) { + + /*space parity*/ + case PAR_SPACE: + if (Settings.DataBits==DATA_8) { + TTY_PORTABILITY_WARNING("Posix_QextSerialPort: Space parity is only supported in POSIX with 7 or fewer data bits"); + } + else { + + /*space parity not directly supported - add an extra data bit to simulate it*/ + Posix_CommConfig.c_cflag&=~(PARENB|CSIZE); + switch(Settings.DataBits) { + case DATA_5: + Settings.DataBits=DATA_6; + Posix_CommConfig.c_cflag|=CS6; + break; + + case DATA_6: + Settings.DataBits=DATA_7; + Posix_CommConfig.c_cflag|=CS7; + break; + + case DATA_7: + Settings.DataBits=DATA_8; + Posix_CommConfig.c_cflag|=CS8; + break; + + case DATA_8: + break; + } + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + + /*mark parity - WINDOWS ONLY*/ + case PAR_MARK: + TTY_WARNING("Posix_QextSerialPort: Mark parity is not supported by POSIX."); + break; + + /*no parity*/ + case PAR_NONE: + Posix_CommConfig.c_cflag&=(~PARENB); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + /*even parity*/ + case PAR_EVEN: + Posix_CommConfig.c_cflag&=(~PARODD); + Posix_CommConfig.c_cflag|=PARENB; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + /*odd parity*/ + case PAR_ODD: + Posix_CommConfig.c_cflag|=(PARENB|PARODD); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::setStopBits(StopBitsType stopBits) +Sets the number of stop bits used by the serial port. Possible values of stopBits are: +\verbatim + STOP_1 1 stop bit + STOP_1_5 1.5 stop bits + STOP_2 2 stop bits +\endverbatim +\note +This function is subject to the following restrictions: +\par + 2 stop bits cannot be used with 5 data bits. +\par + POSIX does not support 1.5 stop bits. + +*/ +void Posix_QextSerialPort::setStopBits(StopBitsType stopBits) +{ + LOCK_MUTEX(); + if (Settings.StopBits!=stopBits) { + if ((Settings.DataBits==DATA_5 && stopBits==STOP_2) || stopBits==STOP_1_5) {} + else { + Settings.StopBits=stopBits; + } + } + if (isOpen()) { + switch (stopBits) { + + /*one stop bit*/ + case STOP_1: + Settings.StopBits=stopBits; + Posix_CommConfig.c_cflag&=(~CSTOPB); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + /*1.5 stop bits*/ + case STOP_1_5: + TTY_WARNING("Posix_QextSerialPort: 1.5 stop bit operation is not supported by POSIX."); + break; + + /*two stop bits*/ + case STOP_2: + if (Settings.DataBits==DATA_5) { + TTY_WARNING("Posix_QextSerialPort: 2 stop bits cannot be used with 5 data bits"); + } + else { + Settings.StopBits=stopBits; + Posix_CommConfig.c_cflag|=CSTOPB; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::setFlowControl(FlowType flow) +Sets the flow control used by the port. Possible values of flow are: +\verbatim + FLOW_OFF No flow control + FLOW_HARDWARE Hardware (RTS/CTS) flow control + FLOW_XONXOFF Software (XON/XOFF) flow control +\endverbatim +\note +FLOW_HARDWARE may not be supported on all versions of UNIX. In cases where it is +unsupported, FLOW_HARDWARE is the same as FLOW_OFF. + +*/ +void Posix_QextSerialPort::setFlowControl(FlowType flow) +{ + LOCK_MUTEX(); + if (Settings.FlowControl!=flow) { + Settings.FlowControl=flow; + } + if (isOpen()) { + switch(flow) { + + /*no flow control*/ + case FLOW_OFF: + Posix_CommConfig.c_cflag&=(~CRTSCTS); + Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + /*software (XON/XOFF) flow control*/ + case FLOW_XONXOFF: + Posix_CommConfig.c_cflag&=(~CRTSCTS); + Posix_CommConfig.c_iflag|=(IXON|IXOFF|IXANY); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + + case FLOW_HARDWARE: + Posix_CommConfig.c_cflag|=CRTSCTS; + Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::setTimeout(ulong sec, ulong millisec); +Sets the read and write timeouts for the port to sec seconds and millisec milliseconds. +Note that this is a per-character timeout, i.e. the port will wait this long for each +individual character, not for the whole read operation. This timeout also applies to the +bytesWaiting() function. + +\note +POSIX does not support millisecond-level control for I/O timeout values. Any +timeout set using this function will be set to the next lowest tenth of a second for +the purposes of detecting read or write timeouts. For example a timeout of 550 milliseconds +will be seen by the class as a timeout of 500 milliseconds for the purposes of reading and +writing the port. However millisecond-level control is allowed by the select() system call, +so for example a 550-millisecond timeout will be seen as 550 milliseconds on POSIX systems for +the purpose of detecting available bytes in the read buffer. + +*/ +void Posix_QextSerialPort::setTimeout(ulong sec, ulong millisec) +{ + LOCK_MUTEX(); + Settings.Timeout_Sec=sec; + Settings.Timeout_Millisec=millisec; + Posix_Copy_Timeout.tv_sec=sec; + Posix_Copy_Timeout.tv_usec=millisec; + if (isOpen()) { + tcgetattr(Posix_File->handle(), &Posix_CommConfig); + Posix_CommConfig.c_cc[VTIME]=sec*10+millisec/100; + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } + UNLOCK_MUTEX(); +} + +/*! +\fn bool Posix_QextSerialPort::open(OpenMode mode) +Opens the serial port associated to this class. +This function has no effect if the port associated with the class is already open. +The port is also configured to the current settings, as stored in the Settings structure. +*/ +bool Posix_QextSerialPort::open(OpenMode mode) +{ + LOCK_MUTEX(); + if (mode == QIODevice::NotOpen) + return isOpen(); + if (!isOpen()) { + /*open the port*/ + Posix_File->setFileName(port); + qDebug("Trying to open File"); + if (Posix_File->open(QIODevice::ReadWrite|QIODevice::Unbuffered)) { + qDebug("Opened File successfully"); + /*set open mode*/ + QIODevice::open(mode); + + /*configure port settings*/ + tcgetattr(Posix_File->handle(), &Posix_CommConfig); + + /*set up other port settings*/ + Posix_CommConfig.c_cflag|=CREAD|CLOCAL; + Posix_CommConfig.c_lflag&=(~(ICANON|ECHO|ECHOE|ECHOK|ECHONL|ISIG)); + Posix_CommConfig.c_iflag&=(~(INPCK|IGNPAR|PARMRK|ISTRIP|ICRNL|IXANY)); + Posix_CommConfig.c_oflag&=(~OPOST); + Posix_CommConfig.c_cc[VMIN]=0; + Posix_CommConfig.c_cc[VINTR] = _POSIX_VDISABLE; + Posix_CommConfig.c_cc[VQUIT] = _POSIX_VDISABLE; + Posix_CommConfig.c_cc[VSTART] = _POSIX_VDISABLE; + Posix_CommConfig.c_cc[VSTOP] = _POSIX_VDISABLE; + Posix_CommConfig.c_cc[VSUSP] = _POSIX_VDISABLE; + setBaudRate(Settings.BaudRate); + setDataBits(Settings.DataBits); + setParity(Settings.Parity); + setStopBits(Settings.StopBits); + setFlowControl(Settings.FlowControl); + setTimeout(Settings.Timeout_Sec, Settings.Timeout_Millisec); + tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); + } else { + qDebug("Could not open File! Error code : %d", Posix_File->error()); + } + } + UNLOCK_MUTEX(); + return isOpen(); +} + +/*! +\fn void Posix_QextSerialPort::close() +Closes a serial port. This function has no effect if the serial port associated with the class +is not currently open. +*/ +void Posix_QextSerialPort::close() +{ + LOCK_MUTEX(); + Posix_File->close(); + QIODevice::close(); + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::flush() +Flushes all pending I/O to the serial port. This function has no effect if the serial port +associated with the class is not currently open. +*/ +void Posix_QextSerialPort::flush() +{ + LOCK_MUTEX(); + if (isOpen()) { + Posix_File->flush(); + } + UNLOCK_MUTEX(); +} + +/*! +\fn qint64 Posix_QextSerialPort::size() const +This function will return the number of bytes waiting in the receive queue of the serial port. +It is included primarily to provide a complete QIODevice interface, and will not record errors +in the lastErr member (because it is const). This function is also not thread-safe - in +multithreading situations, use Posix_QextSerialPort::bytesWaiting() instead. +*/ +qint64 Posix_QextSerialPort::size() const +{ + int numBytes; + if (ioctl(Posix_File->handle(), FIONREAD, &numBytes)<0) { + numBytes=0; + } + return (qint64)numBytes; +} + +/*! +\fn qint64 Posix_QextSerialPort::bytesAvailable() +Returns the number of bytes waiting in the port's receive queue. This function will return 0 if +the port is not currently open, or -1 on error. Error information can be retrieved by calling +Posix_QextSerialPort::getLastError(). +*/ +qint64 Posix_QextSerialPort::bytesAvailable() +{ + LOCK_MUTEX(); + if (isOpen()) { + int bytesQueued; + fd_set fileSet; + FD_ZERO(&fileSet); + FD_SET(Posix_File->handle(), &fileSet); + + /*on Linux systems the Posix_Timeout structure will be altered by the select() call. + Make sure we use the right timeout values*/ + //memcpy(&Posix_Timeout, &Posix_Copy_Timeout, sizeof(struct timeval)); + Posix_Timeout = Posix_Copy_Timeout; + int n=select(Posix_File->handle()+1, &fileSet, NULL, &fileSet, &Posix_Timeout); + if (!n) { + lastErr=E_PORT_TIMEOUT; + UNLOCK_MUTEX(); + return -1; + } + if (n==-1 || ioctl(Posix_File->handle(), FIONREAD, &bytesQueued)==-1) { + translateError(errno); + UNLOCK_MUTEX(); + return -1; + } + lastErr=E_NO_ERROR; + UNLOCK_MUTEX(); + return bytesQueued + QIODevice::bytesAvailable(); + } + UNLOCK_MUTEX(); + return 0; +} + +/*! +\fn void Posix_QextSerialPort::ungetChar(char) +This function is included to implement the full QIODevice interface, and currently has no +purpose within this class. This function is meaningless on an unbuffered device and currently +only prints a warning message to that effect. +*/ +void Posix_QextSerialPort::ungetChar(char) +{ + /*meaningless on unbuffered sequential device - return error and print a warning*/ + TTY_WARNING("Posix_QextSerialPort: ungetChar() called on an unbuffered sequential device - operation is meaningless"); +} + +/*! +\fn void Posix_QextSerialPort::translateError(ulong error) +Translates a system-specific error code to a QextSerialPort error code. Used internally. +*/ +void Posix_QextSerialPort::translateError(ulong error) +{ + switch (error) { + case EBADF: + case ENOTTY: + lastErr=E_INVALID_FD; + break; + + case EINTR: + lastErr=E_CAUGHT_NON_BLOCKED_SIGNAL; + break; + + case ENOMEM: + lastErr=E_NO_MEMORY; + break; + } +} + +/*! +\fn void Posix_QextSerialPort::setDtr(bool set) +Sets DTR line to the requested state (high by default). This function will have no effect if +the port associated with the class is not currently open. +*/ +void Posix_QextSerialPort::setDtr(bool set) +{ + LOCK_MUTEX(); + if (isOpen()) { + int status; + ioctl(Posix_File->handle(), TIOCMGET, &status); + if (set) { + status|=TIOCM_DTR; + } + else { + status&=~TIOCM_DTR; + } + ioctl(Posix_File->handle(), TIOCMSET, &status); + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Posix_QextSerialPort::setRts(bool set) +Sets RTS line to the requested state (high by default). This function will have no effect if +the port associated with the class is not currently open. +*/ +void Posix_QextSerialPort::setRts(bool set) +{ + LOCK_MUTEX(); + if (isOpen()) { + int status; + ioctl(Posix_File->handle(), TIOCMGET, &status); + if (set) { + status|=TIOCM_RTS; + } + else { + status&=~TIOCM_RTS; + } + ioctl(Posix_File->handle(), TIOCMSET, &status); + } + UNLOCK_MUTEX(); +} + +/*! +\fn unsigned long Posix_QextSerialPort::lineStatus() +returns the line status as stored by the port function. This function will retrieve the states +of the following lines: DCD, CTS, DSR, and RI. On POSIX systems, the following additional lines +can be monitored: DTR, RTS, Secondary TXD, and Secondary RXD. The value returned is an unsigned +long with specific bits indicating which lines are high. The following constants should be used +to examine the states of individual lines: + +\verbatim +Mask Line +------ ---- +LS_CTS CTS +LS_DSR DSR +LS_DCD DCD +LS_RI RI +LS_RTS RTS (POSIX only) +LS_DTR DTR (POSIX only) +LS_ST Secondary TXD (POSIX only) +LS_SR Secondary RXD (POSIX only) +\endverbatim + +This function will return 0 if the port associated with the class is not currently open. +*/ +unsigned long Posix_QextSerialPort::lineStatus() +{ + unsigned long Status=0, Temp=0; + LOCK_MUTEX(); + if (isOpen()) { + ioctl(Posix_File->handle(), TIOCMGET, &Temp); + if (Temp&TIOCM_CTS) { + Status|=LS_CTS; + } + if (Temp&TIOCM_DSR) { + Status|=LS_DSR; + } + if (Temp&TIOCM_RI) { + Status|=LS_RI; + } + if (Temp&TIOCM_CD) { + Status|=LS_DCD; + } + if (Temp&TIOCM_DTR) { + Status|=LS_DTR; + } + if (Temp&TIOCM_RTS) { + Status|=LS_RTS; + } + if (Temp&TIOCM_ST) { + Status|=LS_ST; + } + if (Temp&TIOCM_SR) { + Status|=LS_SR; + } + } + UNLOCK_MUTEX(); + return Status; +} + +/*! +\fn qint64 Posix_QextSerialPort::readData(char * data, qint64 maxSize) +Reads a block of data from the serial port. This function will read at most maxSize bytes from +the serial port and place them in the buffer pointed to by data. Return value is the number of +bytes actually read, or -1 on error. + +\warning before calling this function ensure that serial port associated with this class +is currently open (use isOpen() function to check if port is open). +*/ +qint64 Posix_QextSerialPort::readData(char * data, qint64 maxSize) +{ + LOCK_MUTEX(); + int retVal=0; + retVal=Posix_File->read(data, maxSize); + if (retVal==-1) + lastErr=E_READ_FAILED; + UNLOCK_MUTEX(); + + return retVal; +} + +/*! +\fn qint64 Posix_QextSerialPort::writeData(const char * data, qint64 maxSize) +Writes a block of data to the serial port. This function will write maxSize bytes +from the buffer pointed to by data to the serial port. Return value is the number +of bytes actually written, or -1 on error. + +\warning before calling this function ensure that serial port associated with this class +is currently open (use isOpen() function to check if port is open). +*/ +qint64 Posix_QextSerialPort::writeData(const char * data, qint64 maxSize) +{ + LOCK_MUTEX(); + int retVal=0; + retVal=Posix_File->write(data, maxSize); + if (retVal==-1) + lastErr=E_WRITE_FAILED; + UNLOCK_MUTEX(); + + flush(); + return retVal; +} diff --git a/src/qextserialport/posix_qextserialport.h b/src/qextserialport/posix_qextserialport.h new file mode 100644 index 0000000..45cd3a6 --- /dev/null +++ b/src/qextserialport/posix_qextserialport.h @@ -0,0 +1,56 @@ + +#ifndef _POSIX_QEXTSERIALPORT_H_ +#define _POSIX_QEXTSERIALPORT_H_ + +#include <stdio.h> +#include <termios.h> +#include <errno.h> +#include <unistd.h> +#include <sys/time.h> +#include <sys/ioctl.h> +#include <sys/select.h> +#include "qextserialbase.h" + +class Posix_QextSerialPort:public QextSerialBase { +public: + Posix_QextSerialPort(); + Posix_QextSerialPort(const Posix_QextSerialPort& s); + Posix_QextSerialPort(const QString & name); + Posix_QextSerialPort(const PortSettings& settings); + Posix_QextSerialPort(const QString & name, const PortSettings& settings); + Posix_QextSerialPort& operator=(const Posix_QextSerialPort& s); + virtual ~Posix_QextSerialPort(); + + virtual void setBaudRate(BaudRateType); + virtual void setDataBits(DataBitsType); + virtual void setParity(ParityType); + virtual void setStopBits(StopBitsType); + virtual void setFlowControl(FlowType); + virtual void setTimeout(ulong, ulong); + + virtual bool open(OpenMode mode=0); + virtual void close(); + virtual void flush(); + + virtual qint64 size() const; + virtual qint64 bytesAvailable(); + + virtual void ungetChar(char c); + + virtual void translateError(ulong error); + + virtual void setDtr(bool set=true); + virtual void setRts(bool set=true); + virtual ulong lineStatus(); + +protected: + QFile* Posix_File; + struct termios Posix_CommConfig; + struct timeval Posix_Timeout; + struct timeval Posix_Copy_Timeout; + + virtual qint64 readData(char * data, qint64 maxSize); + virtual qint64 writeData(const char * data, qint64 maxSize); +}; + +#endif diff --git a/src/qextserialport/qextserialbase.cpp b/src/qextserialport/qextserialbase.cpp new file mode 100644 index 0000000..027913d --- /dev/null +++ b/src/qextserialport/qextserialbase.cpp @@ -0,0 +1,250 @@ + +#include "qextserialbase.h" + +/*! +\class QextSerialBase +\version 1.0.0 +\author Stefan Sander + +A common base class for Win_QextSerialBase, Posix_QextSerialBase and QextSerialPort. +*/ +#ifdef QT_THREAD_SUPPORT +QMutex* QextSerialBase::mutex=NULL; +unsigned long QextSerialBase::refCount=0; +#endif + +/*! +\fn QextSerialBase::QextSerialBase() +Default constructor. +*/ +QextSerialBase::QextSerialBase() + : QIODevice() +{ + +#ifdef _TTY_WIN_ + setPortName("COM1"); + +#elif defined(_TTY_IRIX_) + setPortName("/dev/ttyf1"); + +#elif defined(_TTY_HPUX_) + setPortName("/dev/tty1p0"); + +#elif defined(_TTY_SUN_) + setPortName("/dev/ttya"); + +#elif defined(_TTY_DIGITAL_) + setPortName("/dev/tty01"); + +#elif defined(_TTY_FREEBSD_) + setPortName("/dev/ttyd1"); + +#else + setPortName("/dev/ttyS0"); +#endif + + construct(); +} + +/*! +\fn QextSerialBase::QextSerialBase(const QString & name) +Construct a port and assign it to the device specified by the name parameter. +*/ +QextSerialBase::QextSerialBase(const QString & name) + : QIODevice() +{ + setPortName(name); + construct(); +} + +/*! +\fn QextSerialBase::~QextSerialBase() +Standard destructor. +*/ +QextSerialBase::~QextSerialBase() +{ + +#ifdef QT_THREAD_SUPPORT + refCount--; + if (mutex && refCount==0) { + delete mutex; + mutex=NULL; + } +#endif + +} + +/*! +\fn void QextSerialBase::construct() +Common constructor function for setting up default port settings. +(115200 Baud, 8N1, Hardware flow control where supported, otherwise no flow control, and 500 ms timeout). +*/ +void QextSerialBase::construct() +{ + Settings.BaudRate=BAUD115200; + Settings.DataBits=DATA_8; + Settings.Parity=PAR_NONE; + Settings.StopBits=STOP_1; + Settings.FlowControl=FLOW_HARDWARE; + Settings.Timeout_Sec=0; + Settings.Timeout_Millisec=500; + +#ifdef QT_THREAD_SUPPORT + if (!mutex) { + mutex=new QMutex( QMutex::Recursive ); + } + refCount++; +#endif + + setOpenMode(QIODevice::NotOpen); +} + +/*! +\fn void QextSerialBase::setPortName(const QString & name) +Sets the name of the device associated with the object, e.g. "COM1", or "/dev/ttyS0". +*/ +void QextSerialBase::setPortName(const QString & name) +{ + port = name; +} + +/*! +\fn QString QextSerialBase::portName() const +Returns the name set by setPortName(). +*/ +QString QextSerialBase::portName() const +{ + return port; +} + +/*! +\fn BaudRateType QextSerialBase::baudRate(void) const +Returns the baud rate of the serial port. For a list of possible return values see +the definition of the enum BaudRateType. +*/ +BaudRateType QextSerialBase::baudRate(void) const +{ + return Settings.BaudRate; +} + +/*! +\fn DataBitsType QextSerialBase::dataBits() const +Returns the number of data bits used by the port. For a list of possible values returned by +this function, see the definition of the enum DataBitsType. +*/ +DataBitsType QextSerialBase::dataBits() const +{ + return Settings.DataBits; +} + +/*! +\fn ParityType QextSerialBase::parity() const +Returns the type of parity used by the port. For a list of possible values returned by +this function, see the definition of the enum ParityType. +*/ +ParityType QextSerialBase::parity() const +{ + return Settings.Parity; +} + +/*! +\fn StopBitsType QextSerialBase::stopBits() const +Returns the number of stop bits used by the port. For a list of possible return values, see +the definition of the enum StopBitsType. +*/ +StopBitsType QextSerialBase::stopBits() const +{ + return Settings.StopBits; +} + +/*! +\fn FlowType QextSerialBase::flowControl() const +Returns the type of flow control used by the port. For a list of possible values returned +by this function, see the definition of the enum FlowType. +*/ +FlowType QextSerialBase::flowControl() const +{ + return Settings.FlowControl; +} + +/*! +\fn bool QextSerialBase::isSequential() const +Returns true if device is sequential, otherwise returns false. Serial port is sequential device +so this function always returns true. Check QIODevice::isSequential() documentation for more +information. +*/ +bool QextSerialBase::isSequential() const +{ + return true; +} + +/*! +\fn bool QextSerialBase::atEnd() const +This function will return true if the input buffer is empty (or on error), and false otherwise. +Call QextSerialBase::lastError() for error information. +*/ +bool QextSerialBase::atEnd() const +{ + if (size()) { + return true; + } + return false; +} + +/*! +\fn qint64 QextSerialBase::readLine(char * data, qint64 maxSize) +This function will read a line of buffered input from the port, stopping when either maxSize bytes +have been read, the port has no more data available, or a newline is encountered. +The value returned is the length of the string that was read. +*/ +qint64 QextSerialBase::readLine(char * data, qint64 maxSize) +{ + qint64 numBytes = bytesAvailable(); + char* pData = data; + + if (maxSize < 2) //maxSize must be larger than 1 + return -1; + + /*read a byte at a time for MIN(bytesAvail, maxSize - 1) iterations, or until a newline*/ + while (pData<(data+numBytes) && --maxSize) { + readData(pData, 1); + if (*pData++ == '\n') { + break; + } + } + *pData='\0'; + + /*return size of data read*/ + return (pData-data); +} + +/*! +\fn ulong QextSerialBase::lastError() const +Returns the code for the last error encountered by the port, or E_NO_ERROR if the last port +operation was successful. Possible error codes are: + +\verbatim +Error Explanation +--------------------------- ------------------------------------------------------------- +E_NO_ERROR No Error has occured +E_INVALID_FD Invalid file descriptor (port was not opened correctly) +E_NO_MEMORY Unable to allocate memory tables (POSIX) +E_CAUGHT_NON_BLOCKED_SIGNAL Caught a non-blocked signal (POSIX) +E_PORT_TIMEOUT Operation timed out (POSIX) +E_INVALID_DEVICE The file opened by the port is not a character device (POSIX) +E_BREAK_CONDITION The port detected a break condition +E_FRAMING_ERROR The port detected a framing error + (usually caused by incorrect baud rate settings) +E_IO_ERROR There was an I/O error while communicating with the port +E_BUFFER_OVERRUN Character buffer overrun +E_RECEIVE_OVERFLOW Receive buffer overflow +E_RECEIVE_PARITY_ERROR The port detected a parity error in the received data +E_TRANSMIT_OVERFLOW Transmit buffer overflow +E_READ_FAILED General read operation failure +E_WRITE_FAILED General write operation failure +\endverbatim +*/ +ulong QextSerialBase::lastError() const +{ + return lastErr; +} diff --git a/src/qextserialport/qextserialbase.h b/src/qextserialport/qextserialbase.h new file mode 100644 index 0000000..3f0beec --- /dev/null +++ b/src/qextserialport/qextserialbase.h @@ -0,0 +1,196 @@ + +#ifndef _QEXTSERIALBASE_H_ +#define _QEXTSERIALBASE_H_ + +#include <QIODevice> +#include <QFile> + +#ifdef QT_THREAD_SUPPORT +#include <QThread> +#include <QMutex> +#endif + +/*if all warning messages are turned off, flag portability warnings to be turned off as well*/ +#ifdef _TTY_NOWARN_ +#define _TTY_NOWARN_PORT_ +#endif + +/*macros for thread support*/ +#ifdef QT_THREAD_SUPPORT +#define LOCK_MUTEX() mutex->lock() +#define UNLOCK_MUTEX() mutex->unlock() +#else +#define LOCK_MUTEX() +#define UNLOCK_MUTEX() +#endif + +/*macros for warning messages*/ +#ifdef _TTY_NOWARN_PORT_ +#define TTY_PORTABILITY_WARNING(s) +#else +#define TTY_PORTABILITY_WARNING(s) qWarning(s) +#endif +#ifdef _TTY_NOWARN_ +#define TTY_WARNING(s) +#else +#define TTY_WARNING(s) qWarning(s) +#endif + + +/*line status constants*/ +#define LS_CTS 0x01 +#define LS_DSR 0x02 +#define LS_DCD 0x04 +#define LS_RI 0x08 +#define LS_RTS 0x10 +#define LS_DTR 0x20 +#define LS_ST 0x40 +#define LS_SR 0x80 + +/*error constants*/ +#define E_NO_ERROR 0 +#define E_INVALID_FD 1 +#define E_NO_MEMORY 2 +#define E_CAUGHT_NON_BLOCKED_SIGNAL 3 +#define E_PORT_TIMEOUT 4 +#define E_INVALID_DEVICE 5 +#define E_BREAK_CONDITION 6 +#define E_FRAMING_ERROR 7 +#define E_IO_ERROR 8 +#define E_BUFFER_OVERRUN 9 +#define E_RECEIVE_OVERFLOW 10 +#define E_RECEIVE_PARITY_ERROR 11 +#define E_TRANSMIT_OVERFLOW 12 +#define E_READ_FAILED 13 +#define E_WRITE_FAILED 14 + +/*enums for port settings*/ +enum NamingConvention { + WIN_NAMES, + IRIX_NAMES, + HPUX_NAMES, + SUN_NAMES, + DIGITAL_NAMES, + FREEBSD_NAMES, + LINUX_NAMES +}; + +enum BaudRateType { + BAUD50, //POSIX ONLY + BAUD75, //POSIX ONLY + BAUD110, + BAUD134, //POSIX ONLY + BAUD150, //POSIX ONLY + BAUD200, //POSIX ONLY + BAUD300, + BAUD600, + BAUD1200, + BAUD1800, //POSIX ONLY + BAUD2400, + BAUD4800, + BAUD9600, + BAUD14400, //WINDOWS ONLY + BAUD19200, + BAUD38400, + BAUD56000, //WINDOWS ONLY + BAUD57600, + BAUD76800, //POSIX ONLY + BAUD115200, + BAUD128000, //WINDOWS ONLY + BAUD256000 //WINDOWS ONLY +}; + +enum DataBitsType { + DATA_5, + DATA_6, + DATA_7, + DATA_8 +}; + +enum ParityType { + PAR_NONE, + PAR_ODD, + PAR_EVEN, + PAR_MARK, //WINDOWS ONLY + PAR_SPACE +}; + +enum StopBitsType { + STOP_1, + STOP_1_5, //WINDOWS ONLY + STOP_2 +}; + +enum FlowType { + FLOW_OFF, + FLOW_HARDWARE, + FLOW_XONXOFF +}; + +/*structure to contain port settings*/ +struct PortSettings { + BaudRateType BaudRate; + DataBitsType DataBits; + ParityType Parity; + StopBitsType StopBits; + FlowType FlowControl; + ulong Timeout_Sec; + ulong Timeout_Millisec; +}; + +class QextSerialBase : public QIODevice { +public: + QextSerialBase(); + QextSerialBase(const QString & name); + virtual ~QextSerialBase(); + virtual void construct(); + virtual void setPortName(const QString & name); + virtual QString portName() const; + + virtual void setBaudRate(BaudRateType)=0; + virtual BaudRateType baudRate() const; + virtual void setDataBits(DataBitsType)=0; + virtual DataBitsType dataBits() const; + virtual void setParity(ParityType)=0; + virtual ParityType parity() const; + virtual void setStopBits(StopBitsType)=0; + virtual StopBitsType stopBits() const; + virtual void setFlowControl(FlowType)=0; + virtual FlowType flowControl() const; + virtual void setTimeout(ulong, ulong)=0; + + virtual bool open(OpenMode mode=0)=0; + virtual bool isSequential() const; + virtual void close()=0; + virtual void flush()=0; + + virtual qint64 size() const=0; + virtual qint64 bytesAvailable() =0; + virtual bool atEnd() const; + + virtual void ungetChar(char c)=0; + virtual qint64 readLine(char * data, qint64 maxSize); + + virtual ulong lastError() const; + virtual void translateError(ulong error)=0; + + virtual void setDtr(bool set=true)=0; + virtual void setRts(bool set=true)=0; + virtual ulong lineStatus()=0; + +protected: + QString port; + PortSettings Settings; + ulong lastErr; + +#ifdef QT_THREAD_SUPPORT + static QMutex* mutex; + static ulong refCount; +#endif + + virtual qint64 readData(char * data, qint64 maxSize)=0; + virtual qint64 writeData(const char * data, qint64 maxSize)=0; + +}; + +#endif diff --git a/src/qextserialport/qextserialport.cpp b/src/qextserialport/qextserialport.cpp new file mode 100644 index 0000000..1c0d9bf --- /dev/null +++ b/src/qextserialport/qextserialport.cpp @@ -0,0 +1,98 @@ + +/*! +\class QextSerialPort +\version 1.0.0 +\author Stefan Sander + +A cross-platform serial port class. +This class encapsulates a serial port on both POSIX and Windows systems. The user will be +notified of errors and possible portability conflicts at run-time by default - this behavior can +be turned off by defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn +off portability warnings) in the project. + +\note +On Windows NT/2000/XP this class uses Win32 serial port functions by default. The user may +select POSIX behavior under NT, 2000, or XP ONLY by defining _TTY_POSIX_ in the project. I can +make no guarantees as to the quality of POSIX support under NT/2000 however. + +*/ + +#include <stdio.h> +#include "qextserialport.h" + +/*! +\fn QextSerialPort::QextSerialPort() +Default constructor. Note that the naming convention used by a QextSerialPort constructed with +this constructor will be determined by #defined constants, or lack thereof - the default behavior +is the same as _TTY_LINUX_. Possible naming conventions and their associated constants are: + +\verbatim + +Constant Used By Naming Convention +---------- ------------- ------------------------ +_TTY_WIN_ Windows COM1, COM2 +_TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2 +_TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0 +_TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb +_TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02 +_TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1 +_TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1 +<none> Linux /dev/ttyS0, /dev/ttyS1 +\endverbatim + +The object will be associated with the first port in the system, e.g. COM1 on Windows systems. +See the other constructors if you need to use a port other than the first. +*/ +QextSerialPort::QextSerialPort() + : QextBaseType() +{} + +/*! +\fn QextSerialPort::QextSerialPort(const QString & name) +Constructs a serial port attached to the port specified by name. +name is the name of the device, which is windowsystem-specific, +e.g."COM1" or "/dev/ttyS0". +*/ +QextSerialPort::QextSerialPort(const QString & name) + : QextBaseType(name) +{} + +/*! +\fn QextSerialPort::QextSerialPort(PortSettings const& settings) +Constructs a port with default name and settings specified by the settings parameter. +*/ +QextSerialPort::QextSerialPort(PortSettings const& settings) + : QextBaseType(settings) +{} + +/*! +\fn QextSerialPort::QextSerialPort(const QString & name, PortSettings const& settings) +Constructs a port with the name and settings specified. +*/ +QextSerialPort::QextSerialPort(const QString & name, PortSettings const& settings) + : QextBaseType(name, settings) +{} + +/*! +\fn QextSerialPort::QextSerialPort(const QextSerialPort& s) +Copy constructor. +*/ +QextSerialPort::QextSerialPort(const QextSerialPort& s) + : QextBaseType(s) +{} + +/*! +\fn QextSerialPort& QextSerialPort::operator=(const QextSerialPort& s) +Overrides the = operator. +*/ +QextSerialPort& QextSerialPort::operator=(const QextSerialPort& s) +{ + return (QextSerialPort&)QextBaseType::operator=(s); +} + +/*! +\fn QextSerialPort::~QextSerialPort() +Standard destructor. +*/ +QextSerialPort::~QextSerialPort() +{} diff --git a/src/qextserialport/qextserialport.h b/src/qextserialport/qextserialport.h new file mode 100644 index 0000000..4978774 --- /dev/null +++ b/src/qextserialport/qextserialport.h @@ -0,0 +1,29 @@ + +#ifndef _QEXTSERIALPORT_H_ +#define _QEXTSERIALPORT_H_ + +#include <QtGlobal> + +/*POSIX CODE*/ +#ifdef Q_OS_UNIX +#include "posix_qextserialport.h" +#define QextBaseType Posix_QextSerialPort + +/*MS WINDOWS CODE*/ +#else +#include "win_qextserialport.h" +#define QextBaseType Win_QextSerialPort +#endif + +class QextSerialPort: public QextBaseType { +public: + QextSerialPort(); + QextSerialPort(const QString & name); + QextSerialPort(PortSettings const& s); + QextSerialPort(const QString & name, PortSettings const& s); + QextSerialPort(const QextSerialPort& s); + QextSerialPort& operator=(const QextSerialPort&); + virtual ~QextSerialPort(); +}; + +#endif diff --git a/src/qextserialport/qextserialport.pri b/src/qextserialport/qextserialport.pri new file mode 100644 index 0000000..6f1a94d --- /dev/null +++ b/src/qextserialport/qextserialport.pri @@ -0,0 +1,17 @@ +INCLUDEPATH += $$MERKAARTOR_SRC_DIR/qextserialport +DEPENDPATH += $$MERKAARTOR_SRC_DIR/qextserialport + +HEADERS += qextserialbase.h \ + qextserialport.h + +SOURCES += qextserialbase.cpp \ + qextserialport.cpp + +unix:HEADERS += posix_qextserialport.h +unix:SOURCES += posix_qextserialport.cpp +unix:DEFINES += _TTY_POSIX_ + +win32:HEADERS += win_qextserialport.h +win32:SOURCES += win_qextserialport.cpp +win32:DEFINES += _TTY_WIN_ + diff --git a/src/qextserialport/win_qextserialport.cpp b/src/qextserialport/win_qextserialport.cpp new file mode 100644 index 0000000..5577ac6 --- /dev/null +++ b/src/qextserialport/win_qextserialport.cpp @@ -0,0 +1,880 @@ +/*! +\class Win_QextSerialPort +\version 1.0.0 +\author Stefan Sander + +A cross-platform serial port class. +This class encapsulates the Windows portion of QextSerialPort. The user will be notified of +errors and possible portability conflicts at run-time by default - this behavior can be turned +off by defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn off +portability warnings) in the project. Note that defining _TTY_NOWARN_ also defines +_TTY_NOWARN_PORT_. + +\note +On Windows NT/2000/XP this class uses Win32 serial port functions by default. The user may +select POSIX behavior under NT, 2000, or XP ONLY by defining _TTY_POSIX_ in the project. I can +make no guarantees as to the quality of POSIX support under NT/2000 however. + +*/ + +#include <stdio.h> +#include "win_qextserialport.h" + +/*! +\fn Win_QextSerialPort::Win_QextSerialPort() +Default constructor. Note that the name of the device used by a Win_QextSerialPort constructed +with this constructor will be determined by #defined constants, or lack thereof - the default +behavior is the same as _TTY_LINUX_. Possible naming conventions and their associated constants +are: + +\verbatim + +Constant Used By Naming Convention +---------- ------------- ------------------------ +_TTY_WIN_ Windows COM1, COM2 +_TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2 +_TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0 +_TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb +_TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02 +_TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1 +_TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1 +<none> Linux /dev/ttyS0, /dev/ttyS1 +\endverbatim + +This constructor associates the object with the first port on the system, e.g. COM1 for Windows +platforms. See the other constructor if you need a port other than the first. +*/ +Win_QextSerialPort::Win_QextSerialPort():QextSerialBase() { + Win_Handle=INVALID_HANDLE_VALUE; +} + +/*!Win_QextSerialPort::Win_QextSerialPort(const Win_QextSerialPort&) +Copy constructor. +*/ +Win_QextSerialPort::Win_QextSerialPort(const Win_QextSerialPort& s):QextSerialBase(s.port) { + Win_Handle=INVALID_HANDLE_VALUE; + setOpenMode(s.openMode()); + lastErr=s.lastErr; + port = s.port; + Settings.FlowControl=s.Settings.FlowControl; + Settings.Parity=s.Settings.Parity; + Settings.DataBits=s.Settings.DataBits; + Settings.StopBits=s.Settings.StopBits; + Settings.BaudRate=s.Settings.BaudRate; + Win_Handle=s.Win_Handle; + memcpy(&Win_CommConfig, &s.Win_CommConfig, sizeof(COMMCONFIG)); + memcpy(&Win_CommTimeouts, &s.Win_CommTimeouts, sizeof(COMMTIMEOUTS)); +} + +/*! +\fn Win_QextSerialPort::Win_QextSerialPort(const QString & name) +Constructs a serial port attached to the port specified by devName. +devName is the name of the device, which is windowsystem-specific, +e.g."COM2" or "/dev/ttyS0". +*/ +Win_QextSerialPort::Win_QextSerialPort(const QString & name):QextSerialBase(name) { + Win_Handle=INVALID_HANDLE_VALUE; +} + +/*! +\fn Win_QextSerialPort::Win_QextSerialPort(const PortSettings& settings) +Constructs a port with default name and specified settings. +*/ +Win_QextSerialPort::Win_QextSerialPort(const PortSettings& settings) { + Win_Handle=INVALID_HANDLE_VALUE; + setBaudRate(settings.BaudRate); + setDataBits(settings.DataBits); + setStopBits(settings.StopBits); + setParity(settings.Parity); + setFlowControl(settings.FlowControl); + setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec); +} + +/*! +\fn Win_QextSerialPort::Win_QextSerialPort(const QString & name, const PortSettings& settings) +Constructs a port with specified name and settings. +*/ +Win_QextSerialPort::Win_QextSerialPort(const QString & name, const PortSettings& settings) { + Win_Handle=INVALID_HANDLE_VALUE; + setPortName(name); + setBaudRate(settings.BaudRate); + setDataBits(settings.DataBits); + setStopBits(settings.StopBits); + setParity(settings.Parity); + setFlowControl(settings.FlowControl); + setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec); +} + +/*! +\fn Win_QextSerialPort::~Win_QextSerialPort() +Standard destructor. +*/ +Win_QextSerialPort::~Win_QextSerialPort() { + if (isOpen()) { + close(); + } +} + +/*! +\fn Win_QextSerialPort& Win_QextSerialPort::operator=(const Win_QextSerialPort& s) +overrides the = operator +*/ +Win_QextSerialPort& Win_QextSerialPort::operator=(const Win_QextSerialPort& s) { + setOpenMode(s.openMode()); + lastErr=s.lastErr; + port = s.port; + Settings.FlowControl=s.Settings.FlowControl; + Settings.Parity=s.Settings.Parity; + Settings.DataBits=s.Settings.DataBits; + Settings.StopBits=s.Settings.StopBits; + Settings.BaudRate=s.Settings.BaudRate; + Win_Handle=s.Win_Handle; + memcpy(&Win_CommConfig, &s.Win_CommConfig, sizeof(COMMCONFIG)); + memcpy(&Win_CommTimeouts, &s.Win_CommTimeouts, sizeof(COMMTIMEOUTS)); + return *this; +} + +/*! +\fn bool Win_QextSerialPort::open(OpenMode mode) +Opens a serial port. Note that this function does not specify which device to open. If you need +to open a device by name, see Win_QextSerialPort::open(const char*). This function has no effect +if the port associated with the class is already open. The port is also configured to the current +settings, as stored in the Settings structure. +*/ +bool Win_QextSerialPort::open(OpenMode mode) { + //unsigned long confSize = sizeof(COMMCONFIG); + //Win_CommConfig.dwSize = confSize; + + LOCK_MUTEX(); + if (mode == QIODevice::NotOpen) + return isOpen(); + if (!isOpen()) { + /*open the port*/ + Win_Handle=CreateFileW((LPCWSTR)port.utf16(), GENERIC_READ|GENERIC_WRITE, + 0, NULL, OPEN_EXISTING, 0, NULL); + if (Win_Handle!=INVALID_HANDLE_VALUE) { + /*set open mode*/ + QIODevice::open(mode); + + /*configure port settings*/ + //GetCommConfig(Win_Handle, &Win_CommConfig, &confSize); + GetCommState(Win_Handle, &(Win_CommConfig)); + + /*set up parameters*/ + Win_CommConfig.fBinary=TRUE; + Win_CommConfig.fInX=FALSE; + Win_CommConfig.fOutX=FALSE; + Win_CommConfig.fAbortOnError=FALSE; + Win_CommConfig.fNull=FALSE; + setBaudRate(Settings.BaudRate); + setDataBits(Settings.DataBits); + setStopBits(Settings.StopBits); + setParity(Settings.Parity); + setFlowControl(Settings.FlowControl); + setTimeout(Settings.Timeout_Sec, Settings.Timeout_Millisec); + //SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); + SetCommState(Win_Handle, &Win_CommConfig); + } else { + qDebug("Device handle failed with error : %d\n", (int)GetLastError()); + } + } + UNLOCK_MUTEX(); + return isOpen(); +} + +/*! +\fn void Win_QextSerialPort::close() +Closes a serial port. This function has no effect if the serial port associated with the class +is not currently open. +*/ +void Win_QextSerialPort::close() { + LOCK_MUTEX(); + CloseHandle(Win_Handle); + QIODevice::close(); + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::flush() +Flushes all pending I/O to the serial port. This function has no effect if the serial port +associated with the class is not currently open. +*/ +void Win_QextSerialPort::flush() { + LOCK_MUTEX(); + if (isOpen()) { + FlushFileBuffers(Win_Handle); + } + UNLOCK_MUTEX(); +} + +/*! +\fn qint64 Win_QextSerialPort::size() const +This function will return the number of bytes waiting in the receive queue of the serial port. +It is included primarily to provide a complete QIODevice interface, and will not record errors +in the lastErr member (because it is const). This function is also not thread-safe - in +multithreading situations, use Win_QextSerialPort::bytesAvailable() instead. +*/ +qint64 Win_QextSerialPort::size() const { + int availBytes; + COMSTAT Win_ComStat; + DWORD Win_ErrorMask=0; + ClearCommError(Win_Handle, &Win_ErrorMask, &Win_ComStat); + availBytes = Win_ComStat.cbInQue; + return (qint64)availBytes; +} + +/*! +\fn qint64 Win_QextSerialPort::bytesAvailable() +Returns the number of bytes waiting in the port's receive queue. This function will return 0 if +the port is not currently open, or -1 on error. Error information can be retrieved by calling +Win_QextSerialPort::getLastError(). +*/ +qint64 Win_QextSerialPort::bytesAvailable() { + LOCK_MUTEX(); + if (isOpen()) { + DWORD Errors; + COMSTAT Status; + bool success=ClearCommError(Win_Handle, &Errors, &Status); + translateError(Errors); + if (success) { + lastErr=E_NO_ERROR; + UNLOCK_MUTEX(); + return Status.cbInQue + QIODevice::bytesAvailable(); + } + UNLOCK_MUTEX(); + return (int)-1; + } + UNLOCK_MUTEX(); + return 0; +} + +/*! +\fn void Win_QextSerialPort::translateError(ulong error) +Translates a system-specific error code to a QextSerialPort error code. Used internally. +*/ +void Win_QextSerialPort::translateError(ulong error) { + if (error&CE_BREAK) { + lastErr=E_BREAK_CONDITION; + } + else if (error&CE_FRAME) { + lastErr=E_FRAMING_ERROR; + } + else if (error&CE_IOE) { + lastErr=E_IO_ERROR; + } + else if (error&CE_MODE) { + lastErr=E_INVALID_FD; + } + else if (error&CE_OVERRUN) { + lastErr=E_BUFFER_OVERRUN; + } + else if (error&CE_RXPARITY) { + lastErr=E_RECEIVE_PARITY_ERROR; + } + else if (error&CE_RXOVER) { + lastErr=E_RECEIVE_OVERFLOW; + } + else if (error&CE_TXFULL) { + lastErr=E_TRANSMIT_OVERFLOW; + } +} + +/*! +\fn qint64 Win_QextSerialPort::readData(char *data, qint64 maxSize) +Reads a block of data from the serial port. This function will read at most maxlen bytes from +the serial port and place them in the buffer pointed to by data. Return value is the number of +bytes actually read, or -1 on error. + +\warning before calling this function ensure that serial port associated with this class +is currently open (use isOpen() function to check if port is open). +*/ +qint64 Win_QextSerialPort::readData(char *data, qint64 maxSize) +{ + LOCK_MUTEX(); + int retVal=0; + COMSTAT Win_ComStat; + DWORD Win_BytesRead=0; + DWORD Win_ErrorMask=0; + ClearCommError(Win_Handle, &Win_ErrorMask, &Win_ComStat); + if (Win_ComStat.cbInQue && + (!ReadFile(Win_Handle, (void*)data, (DWORD)maxSize, &Win_BytesRead, NULL) + || Win_BytesRead==0)) { + lastErr=E_READ_FAILED; + retVal=-1; + } + else { + retVal=((int)Win_BytesRead); + } + UNLOCK_MUTEX(); + + return retVal; +} + +/*! +\fn qint64 Win_QextSerialPort::writeData(const char *data, qint64 maxSize) +Writes a block of data to the serial port. This function will write len bytes +from the buffer pointed to by data to the serial port. Return value is the number +of bytes actually written, or -1 on error. + +\warning before calling this function ensure that serial port associated with this class +is currently open (use isOpen() function to check if port is open). +*/ +qint64 Win_QextSerialPort::writeData(const char *data, qint64 maxSize) +{ + LOCK_MUTEX(); + int retVal=0; + DWORD Win_BytesWritten; + if (!WriteFile(Win_Handle, (void*)data, (DWORD)maxSize, &Win_BytesWritten, NULL)) { + lastErr=E_WRITE_FAILED; + retVal=-1; + } + else { + retVal=((int)Win_BytesWritten); + } + UNLOCK_MUTEX(); + + flush(); + return retVal; +} + +/*! +\fn void Win_QextSerialPort::ungetChar(char c) +This function is included to implement the full QIODevice interface, and currently has no +purpose within this class. This function is meaningless on an unbuffered device and currently +only prints a warning message to that effect. +*/ +void Win_QextSerialPort::ungetChar(char c) { + Q_UNUSED(c); + /*meaningless on unbuffered sequential device - return error and print a warning*/ + TTY_WARNING("Win_QextSerialPort: ungetChar() called on an unbuffered sequential device - operation is meaningless"); +} + +/*! +\fn void Win_QextSerialPort::setFlowControl(FlowType flow) +Sets the flow control used by the port. Possible values of flow are: +\verbatim + FLOW_OFF No flow control + FLOW_HARDWARE Hardware (RTS/CTS) flow control + FLOW_XONXOFF Software (XON/XOFF) flow control +\endverbatim +*/ +void Win_QextSerialPort::setFlowControl(FlowType flow) { + LOCK_MUTEX(); + if (Settings.FlowControl!=flow) { + Settings.FlowControl=flow; + } + if (isOpen()) { + switch(flow) { + + /*no flow control*/ + case FLOW_OFF: + Win_CommConfig.fOutxCtsFlow=FALSE; + Win_CommConfig.fRtsControl=RTS_CONTROL_DISABLE; + Win_CommConfig.fInX=FALSE; + Win_CommConfig.fOutX=FALSE; + SetCommState(Win_Handle, &Win_CommConfig); + break; + + /*software (XON/XOFF) flow control*/ + case FLOW_XONXOFF: + Win_CommConfig.fOutxCtsFlow=FALSE; + Win_CommConfig.fRtsControl=RTS_CONTROL_DISABLE; + Win_CommConfig.fInX=TRUE; + Win_CommConfig.fOutX=TRUE; + SetCommState(Win_Handle, &Win_CommConfig); + break; + + case FLOW_HARDWARE: + Win_CommConfig.fOutxCtsFlow=TRUE; + Win_CommConfig.fRtsControl=RTS_CONTROL_HANDSHAKE; + Win_CommConfig.fInX=FALSE; + Win_CommConfig.fOutX=FALSE; + SetCommState(Win_Handle, &Win_CommConfig); + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::setParity(ParityType parity) +Sets the parity associated with the serial port. The possible values of parity are: +\verbatim + PAR_SPACE Space Parity + PAR_MARK Mark Parity + PAR_NONE No Parity + PAR_EVEN Even Parity + PAR_ODD Odd Parity +\endverbatim +*/ +void Win_QextSerialPort::setParity(ParityType parity) { + LOCK_MUTEX(); + if (Settings.Parity!=parity) { + Settings.Parity=parity; + } + if (isOpen()) { + Win_CommConfig.Parity=(unsigned char)parity; + switch (parity) { + + /*space parity*/ + case PAR_SPACE: + if (Settings.DataBits==DATA_8) { + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: Space parity with 8 data bits is not supported by POSIX systems."); + } + Win_CommConfig.fParity=TRUE; + break; + + /*mark parity - WINDOWS ONLY*/ + case PAR_MARK: + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: Mark parity is not supported by POSIX systems"); + Win_CommConfig.fParity=TRUE; + break; + + /*no parity*/ + case PAR_NONE: + Win_CommConfig.fParity=FALSE; + break; + + /*even parity*/ + case PAR_EVEN: + Win_CommConfig.fParity=TRUE; + break; + + /*odd parity*/ + case PAR_ODD: + Win_CommConfig.fParity=TRUE; + break; + } + SetCommState(Win_Handle, &Win_CommConfig); + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::setDataBits(DataBitsType dataBits) +Sets the number of data bits used by the serial port. Possible values of dataBits are: +\verbatim + DATA_5 5 data bits + DATA_6 6 data bits + DATA_7 7 data bits + DATA_8 8 data bits +\endverbatim + +\note +This function is subject to the following restrictions: +\par + 5 data bits cannot be used with 2 stop bits. +\par + 1.5 stop bits can only be used with 5 data bits. +\par + 8 data bits cannot be used with space parity on POSIX systems. + +*/ +void Win_QextSerialPort::setDataBits(DataBitsType dataBits) { + LOCK_MUTEX(); + if (Settings.DataBits!=dataBits) { + if ((Settings.StopBits==STOP_2 && dataBits==DATA_5) || + (Settings.StopBits==STOP_1_5 && dataBits!=DATA_5)) { + } + else { + Settings.DataBits=dataBits; + } + } + if (isOpen()) { + switch(dataBits) { + + /*5 data bits*/ + case DATA_5: + if (Settings.StopBits==STOP_2) { + TTY_WARNING("Win_QextSerialPort: 5 Data bits cannot be used with 2 stop bits."); + } + else { + Win_CommConfig.ByteSize=5; + SetCommState(Win_Handle, &Win_CommConfig); + } + break; + + /*6 data bits*/ + case DATA_6: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Win_QextSerialPort: 6 Data bits cannot be used with 1.5 stop bits."); + } + else { + Win_CommConfig.ByteSize=6; + SetCommState(Win_Handle, &Win_CommConfig); + } + break; + + /*7 data bits*/ + case DATA_7: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Win_QextSerialPort: 7 Data bits cannot be used with 1.5 stop bits."); + } + else { + Win_CommConfig.ByteSize=7; + SetCommState(Win_Handle, &Win_CommConfig); + } + break; + + /*8 data bits*/ + case DATA_8: + if (Settings.StopBits==STOP_1_5) { + TTY_WARNING("Win_QextSerialPort: 8 Data bits cannot be used with 1.5 stop bits."); + } + else { + Win_CommConfig.ByteSize=8; + SetCommState(Win_Handle, &Win_CommConfig); + } + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::setStopBits(StopBitsType stopBits) +Sets the number of stop bits used by the serial port. Possible values of stopBits are: +\verbatim + STOP_1 1 stop bit + STOP_1_5 1.5 stop bits + STOP_2 2 stop bits +\endverbatim + +\note +This function is subject to the following restrictions: +\par + 2 stop bits cannot be used with 5 data bits. +\par + 1.5 stop bits cannot be used with 6 or more data bits. +\par + POSIX does not support 1.5 stop bits. +*/ +void Win_QextSerialPort::setStopBits(StopBitsType stopBits) { + LOCK_MUTEX(); + if (Settings.StopBits!=stopBits) { + if ((Settings.DataBits==DATA_5 && stopBits==STOP_2) || + (stopBits==STOP_1_5 && Settings.DataBits!=DATA_5)) { + } + else { + Settings.StopBits=stopBits; + } + } + if (isOpen()) { + switch (stopBits) { + + /*one stop bit*/ + case STOP_1: + Win_CommConfig.StopBits=ONESTOPBIT; + SetCommState(Win_Handle, &Win_CommConfig); + break; + + /*1.5 stop bits*/ + case STOP_1_5: + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: 1.5 stop bit operation is not supported by POSIX."); + if (Settings.DataBits!=DATA_5) { + TTY_WARNING("Win_QextSerialPort: 1.5 stop bits can only be used with 5 data bits"); + } + else { + Win_CommConfig.StopBits=ONE5STOPBITS; + SetCommState(Win_Handle, &Win_CommConfig); + } + break; + + /*two stop bits*/ + case STOP_2: + if (Settings.DataBits==DATA_5) { + TTY_WARNING("Win_QextSerialPort: 2 stop bits cannot be used with 5 data bits"); + } + else { + Win_CommConfig.StopBits=TWOSTOPBITS; + SetCommState(Win_Handle, &Win_CommConfig); + } + break; + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::setBaudRate(BaudRateType baudRate) +Sets the baud rate of the serial port. Note that not all rates are applicable on +all platforms. The following table shows translations of the various baud rate +constants on Windows(including NT/2000) and POSIX platforms. Speeds marked with an * +are speeds that are usable on both Windows and POSIX. +\verbatim + + RATE Windows Speed POSIX Speed + ----------- ------------- ----------- + BAUD50 110 50 + BAUD75 110 75 + *BAUD110 110 110 + BAUD134 110 134.5 + BAUD150 110 150 + BAUD200 110 200 + *BAUD300 300 300 + *BAUD600 600 600 + *BAUD1200 1200 1200 + BAUD1800 1200 1800 + *BAUD2400 2400 2400 + *BAUD4800 4800 4800 + *BAUD9600 9600 9600 + BAUD14400 14400 9600 + *BAUD19200 19200 19200 + *BAUD38400 38400 38400 + BAUD56000 56000 38400 + *BAUD57600 57600 57600 + BAUD76800 57600 76800 + *BAUD115200 115200 115200 + BAUD128000 128000 115200 + BAUD256000 256000 115200 +\endverbatim +*/ +void Win_QextSerialPort::setBaudRate(BaudRateType baudRate) { + LOCK_MUTEX(); + if (Settings.BaudRate!=baudRate) { + switch (baudRate) { + case BAUD50: + case BAUD75: + case BAUD134: + case BAUD150: + case BAUD200: + Settings.BaudRate=BAUD110; + break; + + case BAUD1800: + Settings.BaudRate=BAUD1200; + break; + + case BAUD76800: + Settings.BaudRate=BAUD57600; + break; + + default: + Settings.BaudRate=baudRate; + break; + } + } + if (isOpen()) { + switch (baudRate) { + + /*50 baud*/ + case BAUD50: + TTY_WARNING("Win_QextSerialPort: Windows does not support 50 baud operation. Switching to 110 baud."); + Win_CommConfig.BaudRate=CBR_110; + break; + + /*75 baud*/ + case BAUD75: + TTY_WARNING("Win_QextSerialPort: Windows does not support 75 baud operation. Switching to 110 baud."); + Win_CommConfig.BaudRate=CBR_110; + break; + + /*110 baud*/ + case BAUD110: + Win_CommConfig.BaudRate=CBR_110; + break; + + /*134.5 baud*/ + case BAUD134: + TTY_WARNING("Win_QextSerialPort: Windows does not support 134.5 baud operation. Switching to 110 baud."); + Win_CommConfig.BaudRate=CBR_110; + break; + + /*150 baud*/ + case BAUD150: + TTY_WARNING("Win_QextSerialPort: Windows does not support 150 baud operation. Switching to 110 baud."); + Win_CommConfig.BaudRate=CBR_110; + break; + + /*200 baud*/ + case BAUD200: + TTY_WARNING("Win_QextSerialPort: Windows does not support 200 baud operation. Switching to 110 baud."); + Win_CommConfig.BaudRate=CBR_110; + break; + + /*300 baud*/ + case BAUD300: + Win_CommConfig.BaudRate=CBR_300; + break; + + /*600 baud*/ + case BAUD600: + Win_CommConfig.BaudRate=CBR_600; + break; + + /*1200 baud*/ + case BAUD1200: + Win_CommConfig.BaudRate=CBR_1200; + break; + + /*1800 baud*/ + case BAUD1800: + TTY_WARNING("Win_QextSerialPort: Windows does not support 1800 baud operation. Switching to 1200 baud."); + Win_CommConfig.BaudRate=CBR_1200; + break; + + /*2400 baud*/ + case BAUD2400: + Win_CommConfig.BaudRate=CBR_2400; + break; + + /*4800 baud*/ + case BAUD4800: + Win_CommConfig.BaudRate=CBR_4800; + break; + + /*9600 baud*/ + case BAUD9600: + Win_CommConfig.BaudRate=CBR_9600; + break; + + /*14400 baud*/ + case BAUD14400: + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 14400 baud operation."); + Win_CommConfig.BaudRate=CBR_14400; + break; + + /*19200 baud*/ + case BAUD19200: + Win_CommConfig.BaudRate=CBR_19200; + break; + + /*38400 baud*/ + case BAUD38400: + Win_CommConfig.BaudRate=CBR_38400; + break; + + /*56000 baud*/ + case BAUD56000: + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 56000 baud operation."); + Win_CommConfig.BaudRate=CBR_56000; + break; + + /*57600 baud*/ + case BAUD57600: + Win_CommConfig.BaudRate=CBR_57600; + break; + + /*76800 baud*/ + case BAUD76800: + TTY_WARNING("Win_QextSerialPort: Windows does not support 76800 baud operation. Switching to 57600 baud."); + Win_CommConfig.BaudRate=CBR_57600; + break; + + /*115200 baud*/ + case BAUD115200: + Win_CommConfig.BaudRate=CBR_115200; + break; + + /*128000 baud*/ + case BAUD128000: + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 128000 baud operation."); + Win_CommConfig.BaudRate=CBR_128000; + break; + + /*256000 baud*/ + case BAUD256000: + TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 256000 baud operation."); + Win_CommConfig.BaudRate=CBR_256000; + break; + } + SetCommState(Win_Handle, &Win_CommConfig); + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::setDtr(bool set) +Sets DTR line to the requested state (high by default). This function will have no effect if +the port associated with the class is not currently open. +*/ +void Win_QextSerialPort::setDtr(bool set) { + LOCK_MUTEX(); + if (isOpen()) { + if (set) { + EscapeCommFunction(Win_Handle, SETDTR); + } + else { + EscapeCommFunction(Win_Handle, CLRDTR); + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn void Win_QextSerialPort::setRts(bool set) +Sets RTS line to the requested state (high by default). This function will have no effect if +the port associated with the class is not currently open. +*/ +void Win_QextSerialPort::setRts(bool set) { + LOCK_MUTEX(); + if (isOpen()) { + if (set) { + EscapeCommFunction(Win_Handle, SETRTS); + } + else { + EscapeCommFunction(Win_Handle, CLRRTS); + } + } + UNLOCK_MUTEX(); +} + +/*! +\fn ulong Win_QextSerialPort::lineStatus(void) +returns the line status as stored by the port function. This function will retrieve the states +of the following lines: DCD, CTS, DSR, and RI. On POSIX systems, the following additional lines +can be monitored: DTR, RTS, Secondary TXD, and Secondary RXD. The value returned is an unsigned +long with specific bits indicating which lines are high. The following constants should be used +to examine the states of individual lines: + +\verbatim +Mask Line +------ ---- +LS_CTS CTS +LS_DSR DSR +LS_DCD DCD +LS_RI RI +\endverbatim + +This function will return 0 if the port associated with the class is not currently open. +*/ +ulong Win_QextSerialPort::lineStatus(void) { + unsigned long Status=0, Temp=0; + LOCK_MUTEX(); + if (isOpen()) { + GetCommModemStatus(Win_Handle, &Temp); + if (Temp&MS_CTS_ON) { + Status|=LS_CTS; + } + if (Temp&MS_DSR_ON) { + Status|=LS_DSR; + } + if (Temp&MS_RING_ON) { + Status|=LS_RI; + } + if (Temp&MS_RLSD_ON) { + Status|=LS_DCD; + } + } + UNLOCK_MUTEX(); + return Status; +} + +/*! +\fn void Win_QextSerialPort::setTimeout(ulong sec, ulong millisec); +Sets the read and write timeouts for the port to sec seconds and millisec milliseconds. +*/ +void Win_QextSerialPort::setTimeout(ulong sec, ulong millisec) { + LOCK_MUTEX(); + Settings.Timeout_Sec=sec; + Settings.Timeout_Millisec=millisec; + if(isOpen()) { + Win_CommTimeouts.ReadIntervalTimeout = sec*1000+millisec; + Win_CommTimeouts.ReadTotalTimeoutMultiplier = sec*1000+millisec; + Win_CommTimeouts.ReadTotalTimeoutConstant = 0; + Win_CommTimeouts.WriteTotalTimeoutMultiplier = sec*1000+millisec; + Win_CommTimeouts.WriteTotalTimeoutConstant = 0; + SetCommTimeouts(Win_Handle, &Win_CommTimeouts); + } + UNLOCK_MUTEX(); +} diff --git a/src/qextserialport/win_qextserialport.h b/src/qextserialport/win_qextserialport.h new file mode 100644 index 0000000..54db2b6 --- /dev/null +++ b/src/qextserialport/win_qextserialport.h @@ -0,0 +1,49 @@ +#ifndef _WIN_QEXTSERIALPORT_H_ +#define _WIN_QEXTSERIALPORT_H_ + +#include "qextserialbase.h" + +/*if all warning messages are turned off, flag portability warnings to be turned off as well*/ +#ifdef _TTY_NOWARN_ +#define _TTY_NOWARN_PORT_ +#endif + +#include <windows.h> + +class Win_QextSerialPort:public QextSerialBase { +public: + Win_QextSerialPort(); + Win_QextSerialPort(Win_QextSerialPort const& s); + Win_QextSerialPort(const QString & name); + Win_QextSerialPort(const PortSettings& settings); + Win_QextSerialPort(const QString & name, const PortSettings& settings); + Win_QextSerialPort& operator=(const Win_QextSerialPort& s); + virtual ~Win_QextSerialPort(); + virtual bool open(OpenMode mode=0); + virtual void close(); + virtual void flush(); + virtual qint64 size() const; + virtual void ungetChar(char c); + virtual void setFlowControl(FlowType); + virtual void setParity(ParityType); + virtual void setDataBits(DataBitsType); + virtual void setStopBits(StopBitsType); + virtual void setBaudRate(BaudRateType); + virtual void setDtr(bool set=true); + virtual void setRts(bool set=true); + virtual ulong lineStatus(void); + virtual qint64 bytesAvailable(); + virtual void translateError(ulong); + virtual void setTimeout(ulong, ulong); + +protected: + HANDLE Win_Handle; + //COMMCONFIG Win_CommConfig; + DCB Win_CommConfig; + COMMTIMEOUTS Win_CommTimeouts; + + virtual qint64 readData(char *data, qint64 maxSize); + virtual qint64 writeData(const char *data, qint64 maxSize); +}; + +#endif diff --git a/src/src.pro b/src/src.pro new file mode 100644 index 0000000..d04e197 --- /dev/null +++ b/src/src.pro @@ -0,0 +1,342 @@ +# see http://merkaartor.be/wiki/merkaartor/Compiling + +#Static config +include (Config.pri) + +#Custom config +include(Custom.pri) + +CONFIG += debug_and_release c++11 +# avoid deprecation warnings which 5.15 introduced. +DEFINES += QT_NO_DEPRECATED_WARNINGS + +# This is a workaround to get qDebug() to stdout on Windows. Uncomment if needed. +win32 { +# CONFIG += console +} + +isEmpty(SYSTEM_QTSA) { + include(../3rdparty/qtsingleapplication-2.6_1-opensource/src/qtsingleapplication.pri) +} else { + CONFIG += qtsingleapplication +} + +#Qt Version +QT_VERSION = $$[QT_VERSION] +QT_VERSION = $$split(QT_VERSION, ".") +QT_VER_MAJ = $$member(QT_VERSION, 0) +QT_VER_MIN = $$member(QT_VERSION, 1) + +DEFINES += VERSION=$$VERSION +DEFINES += REVISION=$$REVISION + +contains(PORTABLE,1): DEFINES += PORTABLE_BUILD + +TEMPLATE = app + +CONFIG += rtti stl exceptions +#CONFIG -= exceptions +QT += svg network xml core gui concurrent printsupport +win32-msvc* { + LIBS += -lzlib +} else { + LIBS += -lz +} + +contains(FRISIUS,1) { + TARGET = frisius + DEFINES += FRISIUS_BUILD + DEFINES += PRODUCT=Frisius + win32 { + RC_FILE = $$PWD/../Icons/frisius-win32.rc + } +} else { + TARGET = merkaartor + DEFINES += PRODUCT=Merkaartor + win32 { + RC_FILE = $$PWD/../Icons/merkaartor-win32.rc + } +} + +MERKAARTOR_SRC_DIR = $$PWD +COMMON_DIR = $$OUT_PWD/../binaries +OUTPUT_DIR = $$OUT_PWD/../binaries +DESTDIR = $$OUTPUT_DIR/bin + +#UI_DIR += $$PWD/../tmp/$$(QMAKESPEC) +#MOC_DIR += $$PWD/../tmp/$$(QMAKESPEC) +#RCC_DIR += $$PWD/../tmp/$$(QMAKESPEC) + +INCLUDEPATH += $$PWD $$PWD/../include $$PWD/../interfaces $$MOC_DIR +DEPENDPATH += $$PWD $$PWD/../interfaces + +win32 { + INCLUDEPATH += $$COMMON_DIR/include + LIBS += -L$$COMMON_DIR/lib +} + +macx { + RC_FILE = $$PWD/../Icons/merkaartor.icns + QMAKE_INFO_PLIST = $$PWD/../macos/Info.plist + # This is where we get the the ports from + INCLUDEPATH += /opt/local/include + # Stuff from homebrew comes from here + INCLUDEPATH += /usr/local/include + LIBS += -L/usr/local/lib +} + +contains(NVIDIA_HACK,1) { + DEFINES += ENABLE_NVIDIA_HACK +} + +#Include file(s) +include(common/common.pri) +include(Backend/Backend.pri) +include(../interfaces/Interfaces.pri) +include(PaintStyle/PaintStyle.pri) +include(PaintStyle/PaintStyleEditor.pri) +include(Features/Features.pri) +include(Layers/Layers.pri) +include(Preferences/Preferences.pri) +include(Sync/Sync.pri) +include(Commands/Commands.pri) +include(Interactions/Interactions.pri) +include (Docks/Docks.pri) +include(QMapControl.pri) +include(ImportExport/ImportExport.pri) +include(Render/Render.pri) +!symbian:include(qextserialport/qextserialport.pri) +include(GPS/GPS.pri) +include(Tools/Tools.pri) +include(TagTemplate/TagTemplate.pri) +include(NameFinder/NameFinder.pri) +include(Utils/Utils.pri) +include(QToolBarDialog/QToolBarDialog.pri) + +VPATH += $$INCLUDEPATH + +# Header files +HEADERS += \ + MainWindow.h + +SOURCES += \ + Main.cpp \ + MainWindow.cpp + +# Forms +FORMS += \ + MainWindow.ui + +OTHER_FILES += ../CHANGELOG ../LICENSE + +macx { + # Prefix: base instalation directory (fixed for the mac) + PREFIX = /Applications + LIBDIR = $${PREFIX}/lib${LIB_SUFFIX} + DEFINES += PLUGINS_DIR=$${PREFIX}/merkaartor.app/Contents/plugins + target.path = $${PREFIX} + SHARE_DIR = $${PREFIX}/merkaartor.app/Contents/Resources + TRANSDIR_MERKAARTOR = $${SHARE_DIR}/ +} + +unix:!macx { + # Prefix: base instalation directory + isEmpty( PREFIX ) { + PREFIX = /usr/local + } + isEmpty( LIBDIR ) { + LIBDIR = $${PREFIX}/lib${LIB_SUFFIX} + } + + DEFINES += PLUGINS_DIR=$${LIBDIR}/merkaartor/plugins + + target.path = $${PREFIX}/bin + SHARE_DIR = $${PREFIX}/share/merkaartor + + isEmpty(TRANSDIR_MERKAARTOR) { + TRANSDIR_MERKAARTOR = $${SHARE_DIR}/translations + } +} + +win32 { + DEFINES += PLUGINS_DIR=plugins + SHARE_DIR = share + isEmpty(TRANSDIR_MERKAARTOR) { + TRANSDIR_MERKAARTOR = translations + } + isEmpty(TRANSDIR_SYSTEM) { + TRANSDIR_SYSTEM = translations + } +} + + + +DEFINES += SHARE_DIR=$${SHARE_DIR} +INSTALLS += target + +win32-msvc* { + DEFINES += _USE_MATH_DEFINES +} + +TRANSLATIONS += \ + ../translations/merkaartor_cs.ts \ + ../translations/merkaartor_de.ts \ + ../translations/merkaartor_en.ts \ + ../translations/merkaartor_es.ts \ + ../translations/merkaartor_fi.ts \ + ../translations/merkaartor_fr.ts \ + ../translations/merkaartor_hr.ts \ + ../translations/merkaartor_hu.ts \ + ../translations/merkaartor_id_ID.ts \ + ../translations/merkaartor_it.ts \ + ../translations/merkaartor_ja.ts \ + ../translations/merkaartor_nl.ts \ + ../translations/merkaartor_pl.ts \ + ../translations/merkaartor_pt_BR.ts \ + ../translations/merkaartor_ru.ts \ + ../translations/merkaartor_sv.ts \ + ../translations/merkaartor_uk.ts \ + ../translations/merkaartor_zh_TW.ts \ + + +BINTRANSLATIONS += \ + ../translations/merkaartor_cs.qm \ + ../translations/merkaartor_de.qm \ + ../translations/merkaartor_en.qm \ + ../translations/merkaartor_es.qm \ + ../translations/merkaartor_fi.qm \ + ../translations/merkaartor_fr.qm \ + ../translations/merkaartor_hr.qm \ + ../translations/merkaartor_hu.qm \ + ../translations/merkaartor_id_ID.qm \ + ../translations/merkaartor_it.qm \ + ../translations/merkaartor_ja.qm \ + ../translations/merkaartor_nl.qm \ + ../translations/merkaartor_pl.qm \ + ../translations/merkaartor_pt_BR.qm \ + ../translations/merkaartor_ru.qm \ + ../translations/merkaartor_sv.qm \ + ../translations/merkaartor_uk.qm \ + ../translations/merkaartor_zh_TW.qm \ + +translations.path = $${TRANSDIR_MERKAARTOR} +translations.files = $${BINTRANSLATIONS} +DEFINES += TRANSDIR_MERKAARTOR=$$translations.path +INSTALLS += translations + +count(TRANSDIR_SYSTEM, 1) { + DEFINES += TRANSDIR_SYSTEM=$${TRANSDIR_SYSTEM} +} + +contains(MOBILE,1) { + DEFINES += _MOBILE + win32-wince* { + DEFINES += _WINCE + } +} + +contains(GEOIMAGE, 1) { + include(Docks/GeoImage.pri) +} + +lists.path = $${SHARE_DIR} +lists.files = \ + $$PWD/../share/BookmarksList.xml \ + $$PWD/../share/Projections.xml \ + $$PWD/../share/WmsServersList.xml \ + $$PWD/../share/TmsServersList.xml +INSTALLS += lists + +win32 { + win32-msvc*:LIBS += -lgdal_i + win32-g++:LIBS += -lgdal +} +unix { + LIBS += $$system(gdal-config --libs) + QMAKE_CXXFLAGS += $$system(gdal-config --cflags) + QMAKE_CFLAGS += $$system(gdal-config --cflags) +} + +# Setup the PROJ.4 +LIBS += -lproj +PKGCONFIG += proj + +contains (PROTOBUF, 1) { + DEFINES += USE_PROTOBUF +} + +contains(SANITIZE, 1) { + SANITIZE=address,undefined +} + +contains(SANITIZE, 2) { + SANITIZE=thread +} + +!isEmpty(SANITIZE) { + QMAKE_CXXFLAGS+=-fsanitize=$${SANITIZE} -fno-omit-frame-pointer + QMAKE_CFLAGS+=-fsanitize=$${SANITIZE} -fno-omit-frame-pointer + QMAKE_LFLAGS+=-fsanitize=$${SANITIZE} +} + +unix:!macx { + appdata.path = $${PREFIX}/share/metainfo + appdata.files = org.merkaartor.merkaartor.appdata.xml + desktop.path = $${PREFIX}/share/applications + desktop.files = org.merkaartor.merkaartor.desktop + desktopicon8x8.path = $${PREFIX}/share/icons/hicolor/8x8/apps/ + desktopicon8x8.files = $$PWD/../Icons/8x8/merkaartor.png + desktopicon16x16.path = $${PREFIX}/share/icons/hicolor/16x16/apps/ + desktopicon16x16.files = $$PWD/../Icons/16x16/merkaartor.png + desktopicon22x22.path = $${PREFIX}/share/icons/hicolor/22x22/apps/ + desktopicon22x22.files = $$PWD/../Icons/22x22/merkaartor.png + desktopicon24x24.path = $${PREFIX}/share/icons/hicolor/24x24/apps/ + desktopicon24x24.files = $$PWD/../Icons/24x24/merkaartor.png + desktopicon32x32.path = $${PREFIX}/share/icons/hicolor/32x32/apps/ + desktopicon32x32.files = $$PWD/../Icons/32x32/merkaartor.png + desktopicon36x36.path = $${PREFIX}/share/icons/hicolor/36x36/apps/ + desktopicon36x36.files = $$PWD/../Icons/36x36/merkaartor.png + desktopicon40x40.path = $${PREFIX}/share/icons/hicolor/40x40/apps/ + desktopicon40x40.files = $$PWD/../Icons/40x40/merkaartor.png + desktopicon42x42.path = $${PREFIX}/share/icons/hicolor/42x42/apps/ + desktopicon42x42.files = $$PWD/../Icons/42x42/merkaartor.png + desktopicon48x48.path = $${PREFIX}/share/icons/hicolor/48x48/apps/ + desktopicon48x48.files = $$PWD/../Icons/48x48/merkaartor.png + desktopicon64x64.path = $${PREFIX}/share/icons/hicolor/64x64/apps/ + desktopicon64x64.files = $$PWD/../Icons/64x64/merkaartor.png + desktopicon72x72.path = $${PREFIX}/share/icons/hicolor/72x72/apps/ + desktopicon72x72.files = $$PWD/../Icons/72x72/merkaartor.png + desktopicon80x80.path = $${PREFIX}/share/icons/hicolor/80x80/apps/ + desktopicon80x80.files = $$PWD/../Icons/80x80/merkaartor.png + desktopicon96x96.path = $${PREFIX}/share/icons/hicolor/96x96/apps/ + desktopicon96x96.files = $$PWD/../Icons/96x96/merkaartor.png + desktopicon128x128.path = $${PREFIX}/share/icons/hicolor/128x128/apps/ + desktopicon128x128.files = $$PWD/../Icons/128x128/merkaartor.png + desktopicon192x192.path = $${PREFIX}/share/icons/hicolor/192x192/apps/ + desktopicon192x192.files = $$PWD/../Icons/192x192/merkaartor.png + desktopicon256x256.path = $${PREFIX}/share/icons/hicolor/256x256/apps/ + desktopicon256x256.files = $$PWD/../Icons/256x256/merkaartor.png + desktopicon512x512.path = $${PREFIX}/share/icons/hicolor/512x512/apps/ + desktopicon512x512.files = $$PWD/../Icons/512x512/merkaartor.png + INSTALLS += appdata \ + desktop \ + desktopicon8x8 \ + desktopicon16x16 \ + desktopicon22x22 \ + desktopicon24x24 \ + desktopicon32x32 \ + desktopicon36x36 \ + desktopicon40x40 \ + desktopicon42x42 \ + desktopicon48x48 \ + desktopicon64x64 \ + desktopicon72x72 \ + desktopicon80x80 \ + desktopicon96x96 \ + desktopicon128x128 \ + desktopicon192x192 \ + desktopicon256x256 \ + desktopicon512x512 +} + + diff --git a/tests/data/sample-shapefile/POINT.dbf b/tests/data/sample-shapefile/POINT.dbf new file mode 100644 index 0000000000000000000000000000000000000000..c7496ea7f2ea8f43ace4a7b664e49ec3e3a97c24 GIT binary patch literal 37 Zcmd<BWaegJU|>*WU<8s_fP#X86aX530W|;s literal 0 HcmV?d00001 diff --git a/tests/data/sample-shapefile/POINT.prj b/tests/data/sample-shapefile/POINT.prj new file mode 100644 index 0000000..a30c00a --- /dev/null +++ b/tests/data/sample-shapefile/POINT.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/tests/data/sample-shapefile/POINT.shp b/tests/data/sample-shapefile/POINT.shp new file mode 100644 index 0000000000000000000000000000000000000000..8f990c4065c3d19e4c1b7df3784919801c203fa8 GIT binary patch literal 212 zcmZQzQ0HR64zgY_GcYhh<xV6CIxr>#gyd&?I)H>Ux&$4zo?Mn9Q2^mXmEohfkj*MC nb#krE0qX?`qsSqd%Y-ZkvePlXhiPUWSRc@J2z@*q2=@U1%0C*n literal 0 HcmV?d00001 diff --git a/tests/data/sample-shapefile/POINT.shx b/tests/data/sample-shapefile/POINT.shx new file mode 100644 index 0000000000000000000000000000000000000000..7042b0b77a013c60b5f75b04c70163d785b24436 GIT binary patch literal 132 zcmZQzQ0HR64xC;vGcYhh<xV6CIxr>#gyd&?I)H>Ux&$4zo?Mn9Q2^mXmEod{fD#~k M9H6uxl#T(>06okLBLDyZ literal 0 HcmV?d00001 diff --git a/tests/data/sample-shapefile/POLYGON.dbf b/tests/data/sample-shapefile/POLYGON.dbf new file mode 100644 index 0000000000000000000000000000000000000000..be9c4e7396d9b77d82d95283cbf1ee5b71783098 GIT binary patch literal 35 Xcmd<BWaegKU|>*WU<8s_fPxeN7wZ7? literal 0 HcmV?d00001 diff --git a/tests/data/sample-shapefile/POLYGON.prj b/tests/data/sample-shapefile/POLYGON.prj new file mode 100644 index 0000000..a30c00a --- /dev/null +++ b/tests/data/sample-shapefile/POLYGON.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/tests/data/sample-shapefile/POLYGON.shp b/tests/data/sample-shapefile/POLYGON.shp new file mode 100644 index 0000000000000000000000000000000000000000..ca4c4caf3f3777d16c0d1255b119d899245a58d5 GIT binary patch literal 404 zcmZQzQ0HR64o<ybW?*22%I)bDa9AO1P!gQ%=>QTs@<-6Y)bh`!mt_z>R2eRc5hxJ= zGi%C6+-89kvLl%iA}r_-y{Oo@su*GqNUz~`lW+Oy5WYaEAcngR<i=iI0h0&1Gk(&m zqtyiv^%5&l-Hm2G6VPf0m^(p!{&c9#=S>krZ_OP6hkk$c+%}+}LGFa9134F)T3mWz L>S1QV_%QVV+u>eI literal 0 HcmV?d00001 diff --git a/tests/data/sample-shapefile/POLYGON.shx b/tests/data/sample-shapefile/POLYGON.shx new file mode 100644 index 0000000000000000000000000000000000000000..a3b90e40de247a10c3f669d04eadd75144bd0552 GIT binary patch literal 116 zcmZQzQ0HR64y;}<Gcd41<@WRnIIIvhC<#vXbN~q*`6K9HYWZi=%Q6Tbstgxp1e6E> J;x-_50091D4DbK| literal 0 HcmV?d00001 diff --git a/tests/data/sample-shapefile/POLYLINE.dbf b/tests/data/sample-shapefile/POLYLINE.dbf new file mode 100644 index 0000000000000000000000000000000000000000..be9c4e7396d9b77d82d95283cbf1ee5b71783098 GIT binary patch literal 35 Xcmd<BWaegKU|>*WU<8s_fPxeN7wZ7? literal 0 HcmV?d00001 diff --git a/tests/data/sample-shapefile/POLYLINE.prj b/tests/data/sample-shapefile/POLYLINE.prj new file mode 100644 index 0000000..a30c00a --- /dev/null +++ b/tests/data/sample-shapefile/POLYLINE.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/tests/data/sample-shapefile/POLYLINE.shp b/tests/data/sample-shapefile/POLYLINE.shp new file mode 100644 index 0000000000000000000000000000000000000000..87e3d00df8e613d69f8a87b4b8d35de0b1a46184 GIT binary patch literal 308 zcmZQzQ0HR64raYzW?%p!FbH`j;BdgVnAxb*(*Y!)(Ix2cq+(y-w+aX!tOz&32$V8_ znI-T}z@ek(;GDfsy~t*P6vEVjj034fw#UK_)n1TZB(s>1?Ll{Qg^Zv>)0=gc8_GQ$ c(Cq=Kg~@^J1*wghzH)slP%Vg`@&)0406&R7fB*mh literal 0 HcmV?d00001 diff --git a/tests/data/sample-shapefile/POLYLINE.shx b/tests/data/sample-shapefile/POLYLINE.shx new file mode 100644 index 0000000000000000000000000000000000000000..dbaa639033ede9cd55829f301a1aef4ee8699abe GIT binary patch literal 116 zcmZQzQ0HR64y;}<GcW)V7=%0%a5&&w%xqNZ=>QVY=n`~zQn4@aTLpv<R)m`{0!kSG IaT<sQ0Mwrg^Z)<= literal 0 HcmV?d00001 diff --git a/tests/data/sample.geojson b/tests/data/sample.geojson new file mode 100644 index 0000000..cbd6912 --- /dev/null +++ b/tests/data/sample.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[4.2688751220703125,50.90216677805139],[4.2359161376953125,50.808104301204715],[4.36431884765625,50.77598430964946],[4.4968414306640625,50.80983988820981],[4.49615478515625,50.878777255570405],[4.415130615234375,50.92900693240737],[4.2688751220703125,50.90216677805139]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[4.346466064453125,50.84757295365389]}},{"type":"Feature","properties":{},"geometry":{"type":"LineString","coordinates":[[4.23248291015625,50.94501706886675],[4.310760498046875,50.94501706886675],[4.384918212890625,50.94328650904305]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[4.1384124755859375,50.89783627109672],[4.2153167724609375,50.89783627109672],[4.2153167724609375,50.92597736758682],[4.1384124755859375,50.92597736758682],[4.1384124755859375,50.89783627109672]]]}},{"type":"Feature","properties":{},"geometry":{"type":"LineString","coordinates":[[4.2249298095703125,50.935065470134774],[4.277801513671875,50.933767278488375],[4.2386627197265625,50.91558879022659]]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[4.346466064453125,50.87574442047063]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[4.384918212890625,50.86404449323755]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[4.3828582763671875,50.83933500217973]}}]} \ No newline at end of file diff --git a/tests/test-projection.cpp b/tests/test-projection.cpp new file mode 100644 index 0000000..d08c49c --- /dev/null +++ b/tests/test-projection.cpp @@ -0,0 +1,85 @@ +#include <QtTest/QtTest> + +#include "common/Projection.h" + +class TestProjection: public QObject +{ + Q_OBJECT + private slots: + + + void projectionInit() { + ProjectionBackend proj("EPSG:3857", [](QString x) {return x;}); + qDebug() << proj.getProjectionType(); + qDebug() << proj.getProjectionProj4(); + QCOMPARE(proj.getProjectionType(), "EPSG:3857"); // Would not be set if init failed. + } + + /** + * This test verifies the Proj4 library is loaded and correctly identifies non-standard projection. + */ + void projectionInitProj4() { + ProjectionBackend proj("EPSG:5514", [](QString x) {return x;}); + qDebug() << proj.getProjectionType(); + QCOMPARE(proj.getProjectionType(), "EPSG:5514"); + } + + + void projectionWGS84toEPSG3031() { + ProjectionBackend proj("EPSG:3031", [](QString x) {return x;}); + qDebug() << proj.getProjectionProj4(); + } + + /** + * This test verifies proj4 library is able to project correctly from WGS84 to a non-standard projection. + */ + void projectionWGS84toEPSG5514() { + ProjectionBackend proj("+proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813972222222 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +pm=greenwich +units=m +no_defs +towgs84=570.8,85.7,462.8,4.998,1.587,5.261,3.56", [](QString x) {return x;}); + QList<QPair<QPointF,QPointF>> list = { + {{14.4157,50.1038},{-742955.5923625092255,-1041158.8852684112499}}, + {{18.9816,50.1259},{-418013.62494312302442,-1073425.9725897577591}} + }; + for(auto& pair : list) { + QCOMPARE(proj.project(pair.first), pair.second); + //QCOMPARE(proj.inverse(pair.second), pair.first); // TODO: This projection does not seem to converge very well. + } + QBENCHMARK(proj.project(QPointF(14.4157,50.1038))); + } + + /** + * Use default "LatLong" projection, which is in fact identity. + */ + void projectionWGS84toLatLong() { + ProjectionBackend proj("EPSG:4326", [](QString x) {return x;}); + QPointF point(14.4157,50.1038); + QCOMPARE(proj.project(point), point); + QCOMPARE(proj.inverse(point), point); + QBENCHMARK(proj.project(point)); + } + + /** + * This test uses proj4 to do the identity projection. In process, it converts to radians from decimal degrees. + */ + void projectionWGS84toWGS84() { + ProjectionBackend proj("+proj=longlat +datum=WGS84", [](QString x) {return x;}); + QPointF point(14.4157,50.1038); + QCOMPARE(proj.project(point), point); + QCOMPARE(proj.inverse(point), point); + QBENCHMARK(proj.project(point)); + } + + /** + * Test the internal Mercator projection. + */ + void projectionWGS84toMercator() { + ProjectionBackend proj("EPSG:3857", [](QString x) {return x;}); + QPointF point(14.4157,50.1038); + QPointF projected(1604748.38320521079,6464271.615268512629); + QCOMPARE(proj.project(point), projected); + QCOMPARE(proj.inverse(projected), point); + QBENCHMARK(proj.project(point)); + } +}; + +QTEST_MAIN(TestProjection) +#include "test-projection.moc" diff --git a/translations/README.md b/translations/README.md new file mode 100644 index 0000000..00c8497 --- /dev/null +++ b/translations/README.md @@ -0,0 +1,30 @@ +Merkaartor currently uses Qt Linguist and Transifex to translate stuff. Although +you might be tempted to change translations in git repo directly, please don't. +Translation files are meant to be updated via Transifex.com only, and pulled +into the repository before version release. + +The regular workflow is: + +0) From time to time, update translation files on Transifex: + + $ lupdate src plugins -ts translations/*.ts + $ tx push -s + + This pushes the original english strings to Transifex, updating the database and + allowing new strings to be downloaded. + +1) Before release, Transifex data should be pulled and committed into the +repository. This is not necessary, but serves as a backup in case something +terrible happens to Transifex. + + $ tx pull + $ git commit translations/*.ts + +2) During release, the regular qt tools are used to bundle translations. Care +should be taken to include new translations in Merkaartor.pro, so the .qm files +get generated properly. A language list should be also updated in [1] to +reflect newly added language and translation status (poorly translated +languages are marked). + + +[1] src/Preferences/PreferencesDialog.cpp diff --git a/translations/i18n.pl b/translations/i18n.pl new file mode 100644 index 0000000..b7f4998 --- /dev/null +++ b/translations/i18n.pl @@ -0,0 +1,554 @@ +#!/usr/bin/env perl -w + +use utf8; +use encoding "utf8"; +use Term::ReadKey; + +my $nocontext = 1; +my $waswarn = 0; +my $mail = "Merkaartor <merkaartor\@openstreetmap.org>"; +my %pokeys = ( +); + +# don't copy these from files +my %defkeys = ( + "X-Generator" => "Merkaartor translation convert", + "MIME-Version" => "1.0", + "Content-Type" => "text/plain; charset=UTF-8", + "Content-Transfer-Encoding" => "8bit", + "Project-Id-Version" => "merkaartor_templates 1.0", + "Report-Msgid-Bugs-To" => $mail, + "POT-Creation-Date" => getdate(), + "PO-Revision-Date" => getdate(), +# "Last-Translator" => $mail, +# "Language-Team" => $mail, +# "X-Launchpad-Export-Date" => getdate(), +); + +main(); + +sub getdate +{ + my @t=gmtime(); + return sprintf("%04d-%02d-%02d %02d:%02d+0000", + 1900+$t[5],$t[4]+1,$t[3],$t[2],$t[1]); +} + +sub loadfiles($$@) +{ + my $desc; + my $all; + my ($lang,$keys,@files) = @_; + foreach my $file (@files) + { + die "Could not open file $file." if(!open FILE,"<:utf8",$file); + my $linenum = 0; + if($file =~ /\.mat$/) + { + while(my $line = <FILE>) + { + ++$linenum; + chomp $line; + if($line =~ /^ *<description +locale="([A-Za-z_]+)" *>(.*?)<\/description> *$/) + { + my $val = maketxt($2); + my $l = $1; + $desc{$l} = $val; + $desc{_file} = "$file:$linenum" if($l eq "en"); + } + elsif($line =~ /description/) + { + die "Can't handle line $linenum in $file: $line"; + } + elsif(%desc) + { + my $en = $desc{"en"}; + die "No english string found in previous block line $linenum in $file: $line" if(!$en); + delete $desc{"en"}; + foreach my $l (reverse sort keys %desc) + { + copystring(\%all, $en, $l, $desc{$l}, "line $linenum in $file", undef, 0); + ++$lang->{$l} if !($l =~ /^_/); + } + %desc = (); + } + } + } + elsif($file =~ /[-_](.._..)\.po$/ || $file =~ /^(?:.*\/)?(.._..)\.po$/ || + $file =~ /[-_](...?)\.po$/ || $file =~ /^(?:.*\/)?(..)\.po$/) + { + my $l = $1; + ++$lang->{$l}; + my %postate = (last => "", type => ""); + my $linenum = 0; + while(<FILE>) + { + ++$linenum; + my $fn = "$file:$linenum"; + chomp; + if($_ =~ /^#/ || !$_) + { + checkpo(\%postate, \%all, $l, "line $linenum in $file", $keys, 1); + $postate{fuzzy} = 1 if ($_ =~ /fuzzy/); + } + elsif($_ =~ /^"(.*)"$/) {$postate{last} .= $1;} + elsif($_ =~ /^(msg.+) "(.*)"$/) + { + my ($n, $d) = ($1, $2); + my $new = !${postate}{fuzzy} && (($n eq "msgid" && $postate{type} ne "msgctxt") || ($n eq "msgctxt")); + checkpo(\%postate, \%all, $l, "line $linenum in $file", $keys, $new); + $postate{last} = $d; + $postate{type} = $n; + $postate{src} = $fn if $new; + } + else + { + die "Strange line $linenum in $file: $_."; + } + } + checkpo(\%postate, \%all, $l, "line $linenum in $file", $keys, 1); + } + elsif($file =~ /\.ts$/) + { + my $linenum = 0; + my $l; + my $ctx; + my $loc; + my $issource; + my $istrans; + my $source; + my @trans; + my $fuzzy; + my $numerus; + while(<FILE>) + { + s/\r//g; + ++$linenum; + if(/<name>(.*)<\/name>/) { $ctx = $1; } + elsif(/<location filename="(.*?)" line="(.*?)"\/>/) { $loc = "$1:$2"; } + elsif(/context>/){$ctx = undef;} + elsif(/message( numerus="yes")?>/) + { + my $n = $1; + die "No language found in file $file." if !$l; + if($source) + { + $source = maketxt($source); + if(!$fuzzy) + { + my $txt = "line $linenum in $file"; + $txt .= ", $loc" if($loc); + for($i = 0; $i <= $#trans; ++$i) + { + copystring(\%all, $source, $i ? "$l.$i" : $l, maketxt($trans[$i]), $txt, $ctx, 0); + } + if(defined($numerus)) + { + copystring(\%all, $source, "en.1", $source, $txt, $ctx, 0); + } + } + copystring(\%all, $source, "_file", $loc, $txt, $ctx, 0) if $loc; + copystring(\%all, $source, "_src.$l", "$file:$linenum", $txt, $ctx, 0); + } + @trans = undef; + $loc = $issource = $istrans = $source = $numerus = $fuzzy = undef; + $numerus = 0 if $n; + } + elsif(/<TS .* language="(.*)">/) { $l = getlang($1); ++$lang->{$l}; } + elsif(/<TS version.*>/) {} + elsif(/<\?xml/ || /<!DOCTYPE/ || /<\/TS>/ || /<defaultcodec>/){} # ignore + elsif(/comment>(.*)<\/comment>/){} # ignore + # source + elsif(/<source>(.*)<\/source>/){$source = $1;} + elsif(/<source>(.*)/){$source = "$1\n"; $issource = 1;} + elsif($issource && /(.*)<\/source>/){$source .= $1; $issource = undef;} + elsif($issource){$source .= $_;} + # translation + elsif(defined($numerus) && /translation(?: type="(unfinished|obsolete)")?>/) {$fuzzy=$1;} + elsif(defined($numerus) && /<numerusform>(.*)<\/numerusform>/){$trans[$numerus++] = $1;} + elsif(defined($numerus) && /<numerusform>(.*)/){$trans[$numerus] = "$1\n"; $istrans = 1;} + elsif(defined($numerus) && $istrans && /(.*)<\/numerusform>/){$trans[$numerus++] .= $1; $istrans = undef;} + elsif(/<translation(?: type="(unfinished|obsolete)")?>(.*)<\/translation>/){$trans[0] = $2;$fuzzy=$1;} + elsif(/<translation(?: type="(unfinished|obsolete)")?>(.*)/){$trans[0] = "$2\n"; $istrans = 1;$fuzzy=$1;} + elsif($istrans && /(.*)<\/translation>/){$trans[0] .= $1; $istrans = undef;} + elsif($istrans){$trans[$numerus ? $numerus : 0] .= $_;} + else + { + die "Strange line $linenum in $file: $_."; + } + + } + } + else + { + die "File format not supported for file $file."; + } + close(FILE); + } + return %all; +} + +my $alwayspo = 0; +my $alwaysup = 0; +my $noask = 0; +my $conflicts; +sub copystring($$$$$$$) +{ + my ($data, $en, $l, $str, $txt, $context, $ispo) = @_; + + $en = "___${context}___$en" if $context && !$nocontext; + + if(exists($data->{$en}{$l}) && $data->{$en}{$l} ne $str) + { + return if !$str; + if($l =~ /^_/) + { + $data->{$en}{$l} .= ";$str" if !($data->{$en}{$l} =~ /$str/); + } + elsif(!$data->{$en}{$l}) + { + $data->{$en}{$l} = $str; + } + else + { + + my $f = $data->{$en}{_file} || ""; + $f = ($f ? "$f;".$data->{$en}{"_src.$l"} : $data->{$en}{"_src.$l"}) if $data->{$en}{"_src.$l"}; + my $isotherpo = ($f =~ /\.po\:/); + my $pomode = ($ispo && !$isotherpo) || (!$ispo && $isotherpo); + + my $mis = "String mismatch for '$en' **$str** ($txt) != **$data->{$en}{$l}** ($f)\n"; + my $replace = 0; + + if(($conflicts{$l}{$str} || "") eq $data->{$en}{$l}) {} + elsif($pomode && $alwaysup) { $replace=$isotherpo; } + elsif($pomode && $alwayspo) { $replace=$ispo; } + elsif($noask) { print $mis; ++$waswarn; } + else + { + ReadMode 4; # Turn off controls keys + my $arg = "(l)eft, (r)ight"; + $arg .= ", (p)o, (u)pstream[ts/mat], all p(o), all up(s)tream" if $pomode; + $arg .= ", e(x)it: "; + print "$mis$arg"; + while((my $c = getc())) + { + if($c eq "l") { $replace=1; } + elsif($c eq "r") {} + elsif($c eq "p" && $pomode) { $replace=$ispo; } + elsif($c eq "u" && $pomode) { $replace=$isotherpo; } + elsif($c eq "o" && $pomode) { $alwayspo = 1; $replace=$ispo; } + elsif($c eq "s" && $pomode) { $alwaysup = 1; $replace=$isotherpo; } + elsif($c eq "x") { $noask = 1; ++$waswarn; } + else { print "\n$arg"; next; } + last; + } + print("\n"); + ReadMode 0; # Turn on controls keys + } + if(!$noask) + { + if($replace) + { + $data->{$en}{$l} = $str; + $conflicts{$l}{$data->{$en}{$l}} = $str; + } + else + { + $conflicts{$l}{$str} = $data->{$en}{$l}; + } + } + } + } + else + { + $data->{$en}{$l} = $str; + } +} + +sub checkpo($$$$$$) +{ + my ($postate, $data, $l, $txt, $keys, $new) = @_; + + if($postate->{type} eq "msgid") {$postate->{msgid} = $postate->{last};} + elsif($postate->{type} eq "msgid_plural") {$postate->{msgid_1} = $postate->{last};} + elsif($postate->{type} =~ /^msgstr(\[0\])?$/) {$postate->{msgstr} = $postate->{last};} + elsif($postate->{type} =~ /^msgstr\[(.+)\]$/) {$postate->{"msgstr_$1"} = $postate->{last};} + elsif($postate->{type} eq "msgctxt") {$postate->{context} = $postate->{last};} + elsif($postate->{type}) { die "Strange type $postate->{type} found\n" } + + if($new) + { + if((!$postate->{fuzzy}) && $postate->{msgstr} && $postate->{msgid}) + { + copystring($data, $postate->{msgid}, $l, $postate->{msgstr},$txt,$postate->{context}, 1); + for($i = 1; exists($postate->{"msgstr_$i"}); ++$i) + { copystring($data, $postate->{msgid}, "$l.$i", $postate->{"msgstr_$i"},$txt,$postate->{context}, 1); } + if($postate->{msgid_1}) + { copystring($data, $postate->{msgid}, "en.1", $postate->{msgid_1},$txt,$postate->{context}, 1); } + copystring($data, $postate->{msgid}, "_src.$l", $postate->{src},$txt,$postate->{context}, 1); + } + elsif($postate->{msgstr} && !$postate->{msgid}) + { + my %k = ($postate->{msgstr} =~ /(.+?): +(.+?)\\n/g); + # take the first one! + for $a (sort keys %k) + { + $keys->{$l}{$a} = $k{$a} if !$keys->{$l}{$a}; + } + } + foreach my $k (keys %{$postate}) + { + delete $postate->{$k}; + } + $postate->{type} = $postate->{last} = ""; + } +} + +sub createpos($$@) +{ + my ($data, $keys, @files) = @_; + foreach my $file (@files) + { + my $head; + my $la; + if($file =~ /[-_](.._..)\.po$/ || $file =~ /^(?:.*\/)?(.._..)\.po$/ || + $file =~ /[-_](...?)\.po$/ || $file =~ /^(?:.*\/)?(..)\.po$/) + { + $la = $1; + $head = "# translation into language $la file $file\n"; + } + elsif($file =~ /\.pot$/) + { + $la = "en"; + $head = "# template file $file\n"; + } + else + { + die "Language for file $file unknown."; + } + die "Could not open outfile $file\n" if !open FILE,">:utf8",$file; + print FILE "${head}msgid \"\"\nmsgstr \"\"\n"; + my %k; + foreach my $k (keys %{$keys->{$la}}) { $k{$k} = $keys->{$la}{$k}; } + foreach my $k (keys %defkeys) { $k{$k} = $defkeys{$k}; } + foreach my $k (sort keys %k) + { + print FILE "\"$k: $k{$k}\\n\"\n"; + } + print FILE "\n"; + + foreach my $en (sort keys %{$data}) + { + my $ctx; + my $ennc = $en; + $ctx = $1 if $ennc =~ s/^___(.*)___//; + my $str = ($la ne "en" && exists($data->{$en}{$la})) ? $data->{$en}{$la} : ""; + if($data->{$en}{_file}) + { + foreach my $f (split ";",$data->{$en}{_file}) + { + print FILE "#: $f\n" + } + } + else + { + next; + # print FILE "#: unknown:0\n" + } + if($ennc =~ /\%[0-9n]/) + { print FILE "#, c-format, qt-format\n"; } + elsif($ennc =~ /\%[ds]/) + { print FILE "#, c-format\n"; } + print FILE "msgctxt \"$ctx\"\n" if $ctx; + print FILE "msgid \"$ennc\"\n"; + print FILE "msgid_plural \"$data->{$en}{\"en.1\"}\"\n" if $data->{$en}{"en.1"}; + if($la ne "en" && (exists($data->{$en}{"$la.1"}) || $data->{$en}{"en.1"})) + { + print FILE "msgstr[0] \"$str\"\n"; + for($i = 1; exists($data->{$en}{"$la.$i"}); ++$i) + { print FILE "msgstr[$i] \"$data->{$en}{\"$la.$i\"}\"\n"; } + } + else + { + print FILE "msgstr \"$str\"\n"; + } + print FILE "\n"; + } + close FILE; + } +} + +sub maketxt($) +{ + my ($str) = @_; + $str =~ s/>/>/g; + $str =~ s/</</g; + $str =~ s/"/\\"/g; + $str =~ s/"/\\"/g; + $str =~ s/'/'/g; + $str =~ s/&/&/g; + $str =~ s/\n/\\n/g; + return $str; +} + +sub makexml($) +{ + my ($str) = @_; + $str =~ s/&/&/g; + $str =~ s/</</g; + $str =~ s/>/>/g; + $str =~ s/\\"/"/g; + $str =~ s/'/'/g; + $str =~ s/\\n/\n/g; + return $str; +} + +sub getlang($) +{ + my ($l) = @_; + if($l eq "ru_RU") {$l = "ru";} + elsif($l eq "pl_PL") {$l = "pl";} + return $l; +} + +sub replacemat($$$$) +{ + my ($start,$en,$end,$data) = @_; + $en = maketxt($en); + my $repl = "$start<desCRIPtion locale=\"en\" >".makexml($en)."</desCRIPtion>$end"; + foreach my $l (sort keys %{$data->{$en}}) + { + next if $l =~ /[._]/; + $repl .= "$start<desCRIPtion locale=\"$l\" >".makexml($data->{$en}{$l})."</desCRIPtion>$end"; + } + return $repl; +} + +sub createmat($@) +{ + my ($data, @files) = @_; + + foreach my $file (@files) + { + my $x = $/; + undef $/; + die "Could not open $file\n" if !open FILE,"<:utf8",$file; + my $content = <FILE>; + close FILE; + foreach my $en (keys %{$data}) + { + my $ostr = qr/( *)<description +locale="en" *>(.*)<\/description>([\r\n]+)(?: *<description .*\/description>[\r\n]+)*/; + $content =~ s/$ostr/replacemat($1,$2,$3,$data)/eg; + } + if($content =~ /(<description .*)/) + { + die "Could not handle string $1."; + } + + $content =~ s/desCRIPtion/description/g; + + die "Could not open output $file\n" if !open FILE,">:utf8",$file; + print FILE $content; + close FILE; + } +} + +sub makenumerus($$$$) +{ + my ($data, $first, $last,$l) = @_; + my $repl = $first.makexml($data->{$l}).$last; + for($i = 1; exists($data->{"$l.$i"}); ++$i) + { + $repl .= "\n".$first.makexml($data->{"$l.$i"}).$last; + } + return $repl; +} + +sub convert_ts_message($$$$) +{ + my ($content,$data,$l,$ctx) = @_; + $content =~ /<source>(.*)<\/source>/s; + my $source = ($ctx ? "___${ctx}___" : "") .maketxt($1); + if(exists($data->{$source}{$l})) + { + if($content =~ /numerus="yes"/) + { + if(!($content =~ s/( +<numerusform>).*(<\/numerusform>)/makenumerus($data->{$source},$1,$2,$l)/se)) + { + die sprintf "Could not replace string '%.10s'",$source; + } + } + else + { + my $repl = makexml($data->{$source}{$l}); + if(!($content =~ s/(<translation).*(<\/translation>)/$1>$repl$2/s)) + { + die sprintf "Could not replace string '%.10s'",$source; + } + } + } + return $content; +} + +sub convert_ts_context($$$) +{ + my ($content,$data,$l) = @_; + my $ctx; + $ctx = $1 if(!$nocontext && $content =~ /<name>(.*)<\/name>/); + $content =~ s/(<message.*?>.*?<\/message>)/convert_ts_message($1,$data,$l,$ctx)/seg; + return $content; +} + +sub createts($@) +{ + my ($data, @files) = @_; + + foreach my $file (@files) + { + my $x = $/; + undef $/; + die "Could not open $file\n" if !open FILE,"<:utf8",$file; + my $content = <FILE>; + close FILE; + if(!($content =~ /<TS .* language="(.*)">/)) + { + die "Could not find language for $file."; + } + my $l = getlang($1); + $content =~ s/(<context>.*?<\/context>)/convert_ts_context($1,$data,$l)/seg; + + die "Could not open output $file\n" if !open FILE,">:utf8",$file; + print FILE $content; + close FILE; + } +} + +sub main +{ + my %lang; + my @mat; + my @po; + my @ts; + my $basename = shift @ARGV; + foreach my $f (@ARGV) + { + if($f =~ /\*/) { printf "Skipping $f\n"; } + elsif($f =~ /\.mat$/) { push(@mat, $f); } + elsif($f =~ /\.po$/) { push(@po, $f); } + elsif($f =~ /\.ts$/) { push(@ts, $f); } + else { die "unknown file extension."; } + } + my %data = loadfiles(\%lang,\%pokeys, @mat,@ts,@po); + my @cpo; + foreach my $la (sort keys %lang) + { + push(@cpo, "${basename}_$la.po"); + } + push(@cpo, "$basename.pot"); + die "There have been warning. No output.\n" if $waswarn; + createpos(\%data, \%pokeys, @cpo); + + createmat(\%data, @mat) if @mat; + createts(\%data, @ts) if @ts; +} diff --git a/translations/makefile b/translations/makefile new file mode 100644 index 0000000..9831bb6 --- /dev/null +++ b/translations/makefile @@ -0,0 +1,32 @@ +LUPDATE = lupdate +LRELEASE = lrelease + +TEMPLATES = ../Templates/*.mat +TEMPLATES_PO = templates_*.po +TEMPLATES_LAUNCHPAD_PO = templates-*.po templates/*.po +MAIN = *.ts +MAIN_PO = merkaartor_*.po +MAIN_LAUNCHPAD_PO = merkaartor-*.po merkaartor/*.po +CALL = perl i18n.pl +TARCALL = perl maketar.pl +CD = cd + +update: updatets template main release + +tar: + ${TARCALL} *_*.po *.pot + +template: + ${CALL} templates ${TEMPLATES} ${TEMPLATES_LAUNCHPAD_PO} ${TEMPLATES_PO} + +main: + ${CALL} merkaartor ${MAIN} ${MAIN_LAUNCHPAD_PO} ${MAIN_PO} + +updatets: + ${CD} .. && ${LUPDATE} -noobsolete Merkaartor.pro + +release: + ${CD} .. && ${LRELEASE} src/src.pro + +clean: + @-${RM} *.po *.pot *.qm *.tar.gz diff --git a/translations/maketar.pl b/translations/maketar.pl new file mode 100644 index 0000000..e76d7bf --- /dev/null +++ b/translations/maketar.pl @@ -0,0 +1,57 @@ +#!/usr/bin/env perl -w + +use utf8; +use encoding "utf8"; +use File::Copy; + +my %files = map {$_ => undef} ("merkaartor", "templates"); +my $templ = "(".join("|",keys %files).")"; +foreach my $f (@ARGV) +{ + if($f =~ /\*/) { printf "Skipping $f\n"; } + elsif($f =~ /${templ}_(.*)\.po$/) { $files{$1}{$2} = $f; } + elsif($f =~ /${templ}\.pot$/) { $files{$1}{pot} = $f; } + elsif($f =~ /^${templ}-/) { warn "Skip $f"; } + else { die "unknown file name $f."; } +} +mkdir "upl"; +foreach my $t (keys %files) +{ + mkdir "upl/$t" if $files{$t}; +} + +my $temp = "templates"; +if($files{$temp}) +{ + copy($files{$temp}{"pot"}, "upl/$temp/$temp.pot"); + foreach my $t (keys %{$files{$temp}}) + { + next if $t eq "pot"; + copy($files{$temp}{$t}, "upl/$temp/$t.po"); + } +} + +$temp = "merkaartor"; +if($files{$temp}) +{ + copy($files{$temp}{"pot"}, "upl/$temp/$temp.pot"); + foreach my $t (keys %{$files{$temp}}) + { + next if $t eq "pot"; + copy($files{$temp}{$t}, "upl/$temp/$t.po") if -f "${temp}_$t.ts"; + } +} + +chdir "upl"; +my @t=gmtime(); +my $date=sprintf("%04d-%02d-%02d_%02d_%02d", 1900+$t[5],$t[4]+1,$t[3],$t[2],$t[1]); + +system "tar -czf ../${date}_launchpad_upload.tgz *"; +chdir ".."; + +foreach my $t (keys %files) +{ + unlink glob("upl/$t/*"); + rmdir "upl/$t"; +} +rmdir "upl" diff --git a/translations/merkaartor_cs.ts b/translations/merkaartor_cs.ts new file mode 100644 index 0000000..11d8042 --- /dev/null +++ b/translations/merkaartor_cs.ts @@ -0,0 +1,7379 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="cs" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>O aplikaci Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation>Verze PROJ</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>Tento program je šířen pod licencí GNU General Public License v2</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>verze Merkaartoru</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>verze Qt</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>verze GDAL</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska a další, 2006-2021</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Seznam změn</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>OK</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Popis</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Zkratky</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Import</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Export</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>&Výchozí</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Zrušit</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Editor zkratek</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Nahrát schéma zkratek</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Merkaartor soubor zkratek (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Nemohu otevřít soubor</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 nemohl být otevřen.</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>Uložit soubor Zkratek</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>nepojmenovaný</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Všechny soubory (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Nemohu otevřít uložený soubor</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 nemůže být otevřen pro zápis.</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation>Stavitel mostů</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation>Bohužel, z tohoto neumím postavit most. Prosím, označ pouze dva body.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation>Přeměnit segment na most</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation>Zvolený úsek již je označen jako most/tunel.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation>Nepodporovaná akce: Most není složen pouze z jedné cesty.</translation> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation>CadastreBrowser</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation>Soubor</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation>Ukončit</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation>Nahrát...</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation>Nahrát město z CadastreFrance</translation> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation>Vybrat město...</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation>Dlaždicové</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation>Město se nepodařilo nahrát</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation>Tento plugin podporuje pouze vektorová data, zvolený vstup je dostupný pouze v rastrovém formátu.</translation> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation>Staženo: %1/%2 +Zbývající čas: %3:%4</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation>Staženo: %1/%2 +Zbývající čas: %3:%4:%5</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation>Staženo: %1/%2</translation> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Bez popisu</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation>Řízení na pravé straně</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation>Oddělující vzdálenost</translation> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation>Přesnost (v metrech na segment)</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation>Typ</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation>Kruhový objezd</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation>Obyčejný kruh</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation>Levá</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation>Pravá</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation>Strana provozu</translation> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation><b>Žádné</b> změněné objekty.</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation><b>Jeden</b> změněný objekt.</translation> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation><numerusform></b>%n</b> změněný objekt.</numerusform><numerusform><b>%n</b> změnené objekty</numerusform><numerusform><b>%n</b> změnených objektů</numerusform><numerusform><b>%n</b> změnených objektů</numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Historie změn</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Vystředit mapu</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>Vystředit && přiblížit mapu</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Historie změn</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation><b>Žádné</b> změněné objekty.</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Úklid</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>Přiblížení</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>Přidat cestu %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>Přidat traťový bod %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>Přidat relaci %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>Aktualizovat traťový bod %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>Upravit relaci %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>Aktualizovat cestu %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>Odebrat traťový bod %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>Odebrat cestu %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>Odebrat relaci %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Chyba při nahrávání</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Prosím zkontrolujte svoje uživatelské jméno a heslo v menu Předvolby</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Chyba při nahrávání požadavku (%1) +Hlášení serveru je '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +Hlášení API je '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Nahrávám změny...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>Otevřít soubor změn</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>Zavřít soubor změn</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Chyba při nahrávání</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Prosím zkontrolujte svoje uživatelské jméno a heslo v menu Předvolby</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Chyba při nahrávání požadavku (%1) +Hlášení serveru je '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +Hlášení API je '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation>Nastal konflikt při nahrávání na server (%1) +"%2" +Prosím, stáhněte aktuální verzi dotčených objektů a konflikt vyřešte ručně.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>Kontroluji změny...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>Otevřít soubor změn</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>Zavřít soubor změn</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation>Changeset nemohl být uzavřen.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation>Nastala neznámá chyba. K uzavření již došlo, nebo bude provedeno automaticky. Aktuální stav můžete ověřit na webu osm.org.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>Přidat relaci %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>Přidat cestu %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>Přidat traťový bod %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>Upravit relaci %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>Aktualizovat cestu %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>Aktualizovat traťový bod %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>Odebrat traťový bod %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>Odebrat cestu %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>Odebrat relaci %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>nepojmenovaný</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Pracovní</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Data odeslaná na server</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Zobrazování pozadí</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation>Vrstva kreslení #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation>Vrstva filtru #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>Export OSM</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>Exportuji OSM...</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>Dokument</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation>Obnovená historie: Vytvořit uzel %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation>Obnovená historie: Upravit uzel %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation>Obnovená historie: Smazat uzel %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation>Obnovená historie: Vytvořit cestu %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation>Obnovená historie: Upravit cestu %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation>Obnovená historie: Smazat cestu %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation>Obnovená historie: Vytvořit relaci %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation>Obnovená historie: Upravit relaci %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation>Obnovená historie: Smazat relaci %1</translation> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Stáhnout</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Umístění</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Oblíbené</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Aktuální pohled</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation>Z WWW adresy (OSM/GoogleMaps/Mapy.cz)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation>Xapi selektor</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>Z mapy (mapu poskytuje projekt OpenStreetMap)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Stáhnout také GPS logy</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>Stáhnout všechny prvky relací</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 staženo</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Stahování nevyřešených...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>Stáhnout nevyřešené %1 z %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>Analyzuji nevyřešené %1 z %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Zpracovávám...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Zpracovávám XML</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Konflikty s %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>Nalezeny prázdné cesty/relace</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Prázné cesty/relace jsou nejspíše chyba. +Chcete je označit pro smazání?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Odebrat prázné vlastnosti %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Byly nalezeny konflikty</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>Tím je míněno, že nějaká vámi modifikovaná vlastnost byla od posledního stažení změněna jiným uživatelem na serveru. +Vlastnost byla duplikovaná jako "conflict_..." ve vrstvě "Konflikty...". +Dříve než budete moci odeslat vaše změny, musíte ručně sloučit dvě verze a odebrat jednu z vrstvy "Konflikty...".</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Nahrávám...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Připravuji změny</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>Čekám na odpověď serveru</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation><numerusform>Stahování OSM (%n byt).</numerusform><numerusform>Stahování OSM (%n bytů).</numerusform><numerusform>Stahování OSM (%n bytů).</numerusform><numerusform>Stahování OSM (%n bytů).</numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation><numerusform>Stahování OSM (%n kByt).</numerusform><numerusform>Stahování OSM (%n kBytů).</numerusform><numerusform>Stahování OSM (%n kBytů).</numerusform><numerusform>Stahování OSM (%n kBytů).</numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Stahuji...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Stahuji z OSM (připojování)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>Neočekávaný http stavový kód (%1) +Hlášení serveru je '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +Hlášení API je '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Stahování selhalo</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Neplatné uživatelské jméno/heslo</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>Nevyřešené konflikty</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>Vyřešte prosím nejprve existující konflikty</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>Stahuji traťové body %1-%2</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation>MapDust</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Stahnuji body</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Stahuji %1,%2 (přiblížení %3)...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>Přiblížení</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Zavřít</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>Nelze smazat</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation>Označené objekty nelze smazat, protože jsou mimo staženou oblast.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>Nelze smazat vše</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation>Všechny označené objekty nelze smazat, protože jsou mimo staženou oblast. +Smazat vše, co smazat lze?</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation>Změnit směr cesty %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation>Změnit směr %1 cest</translation> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Export</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>Co chcete exportovat?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Vše viditelné (t.j. né skryté)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>Zobrazení</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Vybrané</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Objekty</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Vystředit mapu</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>Vystředit && přiblížit mapu</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Stáhnout chybějící objekty</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Přidat k výběru</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Odstranit</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Relace</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation>Cesty</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation>Uzly</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Vše</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Objekty</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>Pouze plně viditelné objekty</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation>Zobrazit pouze viditelné</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Najít...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation>Zobrazit pouze prvky s průnikem označeného</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation>Filtrovat podle výběru</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>Reset</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Jméno</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Filtr</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Zavřít</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>Nastavení filtru</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Filtry</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Seznam filtrů:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Jméno:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Filtr</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Použít</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Přidat</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Odstranit</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation>Načíst soubor(y)...</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation>Určit zdrojovou (source) značku (tag)</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation>Otevřít soubory pomocí GDAL</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation>Prosím určete hodnotu automatické značky zdroje (tag "source")</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation>Hodnota:</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation>Soubor(y)</translation> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation>Neplatný soubor</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation>Neplatný GDAL soubor.</translation> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>Vypršel časový limit.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>Nemohu načíst informace o fotografii ze serveru Walking Papers.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Prosím zadejte URL Walking Papers</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Geo obrázky</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Vystředit mapu</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation>c</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Odebrat obrázky</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Kopírovat název souboru do schránky</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Vyber další obrázek</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>PgDown</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Vyber předchozí obrázek</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>PgUp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>Uložit geotagovaný obrázek...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>Vrstva fotek</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Nahrát geotagovaný obrázek</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>Vyberte vrstvu ke které náleží obrázek:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation>Vrstva je pouze pro čtení</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation>Zvolená vrstva je pouze pro čtení. Mám změnit</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Nahrávám obrázek...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Zrušit nahrávání</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>Žádný takový soubor</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>Nemohu najít obrázek "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Chyba při otevírání "%2": +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Chyba při nahrávání EXIF-dat z "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>Zadejte offset</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>Pozice obrázku více k:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>konec tratě</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>začátek tratě</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>hh:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>Žádné body cesty</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>Žádné body cesty pro obrázek "%1"</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss 'sekund'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm 'minut a' ss 'sekund'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh 'hodin,' mm 'minut a' ss 'sekund'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>Špatný obrázek?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>Obrázek "%1" byl pořízen %2 dříve než byl zaznamenán další traťový bod. +Chcete ho ještě používat?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>Obrázek "%1" byl pořízen %2 až po zaznamenáni posledního traťového bodu. +Chcete ho ještě používat?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation>Zadejte cestu výstupního souboru</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>JPEG Obrázky (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Chyba při otvírání "%1": +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation>Nahrát obrázk(y)...</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation>Určete zdrojovou značku (tag "source")</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation>Otevřít soubory formátu GeoTIFF</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation>Prosím určete hodnotu automatické značky zdroje (tag "source")</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation>Hodnota:</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation>Soubor(y)</translation> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation>Neplatný soubor</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation>Neplatný GeoTIFF soubor.</translation> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>Jít na</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Záložka</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation>Z WWW adresy (OSM/GoogleMaps/Mapy.cz)</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation>Souřadnice</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation>Zobrazit promítnuté</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>délkaMin, šířkaMin, délkaMax, šířkaMax</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>šířkaCent, délkaCent, šířkaSpan, délkaSpan</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Informace</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>OSM API Url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>OSM XAPI url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Hledat</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>Neplatné OSM url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>Zadané url je neplatné!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Nesprávný formát souřadnic</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>Souřadnice musí být: '<levá délka>, <dolní šířka>, <pravá délka>, <horní šířka>'</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>Souřadnice musí být: '<střední šířka>, <střední délka>, <rozsah šířky>, <rozsah délky>'</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Žádný</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>[ Shape] adaptér</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>Přiblížení</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation>Nastavit projekci podle vrstvy</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation>Zrušit korekci zarovnání</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Zavřít</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>WMS adaptér</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>TMS adaptér</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>Pluginy</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Mapa - prázdná</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Mapa - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Mapa - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>Mapa - WMS-Dlaždice - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Mapa - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Mapa - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>Licenční podmínky: %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>Licenční podmínky nebyly přijaty</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation>Nezaškrtli jste souhlas s licenčními podmínkami. Bez tohoto souhlasu nemůžete tento podklad použít. Opravdu?</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Server</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Velikost dlaždice</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>Min/Max přiblížení</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Projekce</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>Vstup</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>OSM náhled</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Specifikace</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>První řádek obsahuje hlavičky</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Oddělovač</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation>Čárka (,)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Středník (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Tabulátor</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Jiný:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation>Text ohraničující uvozovky</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Žádný</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation>Jednoduchá uvozovka (')</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation>Dvojitá uvozovka (")</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>Projekce (ve formátu Proj.4; nechte prázdné pro šířka/délka)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Pole</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>Dostupná pole</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>Jméno klíče (= tag):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>Typ klíče:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Import</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>Importovat rozsah</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>Začátek (0 pro celý soubor):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>Konec (0 pro celý soubor):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>Načíst nastavení...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Uložit nastavení...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Text</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Celé číslo</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>Desetinné číslo</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Zeměpisná délka</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Zeměpisná šířka</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Neplatná projekce</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>Nepodařilo se nastavit projekci.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Nenalezeny souřadnice</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>Pole pro zeměpisnou šířku a délku (Latitude a Longitude) chybí. Soubor není možné importovat. +Ukončit import?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>Nastavení CSV importu</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Merkaartor - nastavení importu (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Neplatný soubor</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 nemohl být otevřen.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1 není CSV soubor s nastavením</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation>Uložit nastavení importu CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>nepojmenovaný</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Všechny soubory (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation>Uložení nastavení importu se nezdařilo</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 nemůže být otevřen pro zápis.</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation>Nepodařilo se najít zdrojovou projekci. Prosím, zvolte ji ručně.</translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation>Anonymizovat body</translation> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Informace</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Rozměr</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation>%n objektů</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Objekty</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Ukázat vše</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Skrýt vše</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Pouze pro čtení: vše</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Pouze pro čtení: nic</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Zavřít</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Vrstvy</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Vše</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>Podklad</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>Pracovní</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>Trasy</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation>Výchozí nastavení vrstev</translation> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Viditelná</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Pouze pro čtení</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>Nízké</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>Vysoké</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>Neprůhledné</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Krytí</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation>Zavřít vrstvu: nalezeny objekty s neuloženými změnami</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation>Tato vrstva obsahuje neuložené změny. +Opravu ji chcete zavřít? (tuto operaci nelze vzít zpět)</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>Licenční podmínky</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>Přečetl jsem a souhlasím s licenčními podmínkami</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Neptej se mne znovu</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation>%1 v%2 +Nahrávám pluginy...</translation> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation>%1 v%2 +Inicializuji...</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>&Nápověda</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Vytvořit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Upravit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>&Zobrazení</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Záložky</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Soubor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Export</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>&Nástroje</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>&Styl</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Uzel</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>&Okno</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Doky</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>&Vlastnosti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>&Vrstvy</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>&Relace</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>Hlavní lišta nástrojů</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>&Ukončit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>&O aplikaci</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>&Otevřít</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Vytvořit nový dokument a importovat soubor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>Zobrazit &vše</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>Zobrazit &výběr</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>Zobrazit výběr</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>&Oddálit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>&Přiblížit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Přiblížit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Křivky</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Zpět</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>&Vpřed</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>&Přesunout</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Import</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Importovat soubor do aktuálního dokumentu</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Stáhnout</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Stáhnout mapové data pro novou oblast</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Odkaz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Vytvořit odkaz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Vybrat</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>&Nahrát</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Nahrát změny na server</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>&Odebrat</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Vyjmout vybrané vlastnosti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Vytvořit nový uzel</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>&Změnit směr</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Vytvořit kruhový objezd</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Nový</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>&Rozdělit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>&Spojit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>R&ozpojit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Přerušit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>&Relace</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Vytvořit relaci</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>&Oblast</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Vytvořit novou oblast</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Exportovat všechny viditelné vrstvy do souboru</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Najít</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Najít a označit položky</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>Exportovat prvky ze zobrazení do souboru</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>&Spojit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Sloučení uzlů</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>Spojit vybrané uzly (první vybraný zůstane zachován)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Uložit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Stáhnout více</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Stáhnout více mapových dat pro stávající oblast</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Vlastnosti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>&Informace</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>&Zarovnat</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Zarovnat uzly</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>Zarovnat vybrané uzly. První dva vybrané definují dráhu.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>&Kopírovat</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>Kopírovat vybrané vlastnosti a klíče do schránky</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>Kopírovat vybrané značky vlastností do schránky; jestliže je vlastností traťový bod, zkopírovat taky jeho souřadnice.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Vložit klíč (&přepsat)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>Vložit (a přepsat) značky ve schránce na vybranou vlastnost.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>Vložit klíč (&sloučit)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Vložit klíče</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>Vložit klíče ze schránky (Sloučit s existujícími klíči)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>Sloučit značky ve schránce s jednou vybranou vlastností.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Vložit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Vložit vlastnosti ze schránky</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>Vložit vlastnosti do schránky; pokud je id vlastnosti již v dokumentu, přepsat jej.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Převést vlastnosti do pracovní vrstvy</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>&Obrázky</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>&Raster/SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>&Start</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>Spustit GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>Přehrát GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>S&top</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>Zastavit GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>&Vystředit podle GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>Zobraz dotyk</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Záznam</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>Nahrávat GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Pauza</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>Pozastavit GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>G&eoObrázky</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>&Přidat prvek</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>&Odebrat prvek</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>&Nikdy</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>&Vždy</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>O&dpojit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>&Styly</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation>Importovat soubor do aktuálního dokumentu přes GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Fotoaparát</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Otočit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Objekty</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>&Podrozdělit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>&Zamknout zvětšení k dlaždicím pozadí</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>Soubor změn OSM (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Zavřít</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>Žád&ný</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation>Rozdělit plochu podle dvou bodů</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>&Terasa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Vlastnosti...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>Měřítko</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation>GDAL SQLite/SpatiLite</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation>Obrys</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Stáhnout chybějící objekty</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation>Most</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>Zrušen klíč '%1' on %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>Smaž %1 tagů na %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Odebrat prvek '%1' z %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation>Přeuspořádat prvky v relaci %1</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>Změněna relace %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Vytvořena oblast %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Oblast: Vytvořena cesta %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Přidat otvor</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Přidat (další) otvor do této oblasti?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Oblast: Ukončena cesta %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Oblast: Přidán uzel %1 do cesty %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>Uzavřít plochu %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Vytvořen kruhový objezd %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation>Uzavřít cestu %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Vyjmuta značka %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>Smazat objekty</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Smazat potomky</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation>Smazat také náležící uzly? +Uzly mimo staženou oblast smazány nebudou.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation>Změnit směr %1 cest</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>Levý-clik pro výběr; Levý-drag pro posunutí</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>Nalezeny uzly na stejné pozici.</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>Chcete sloučit všechny uzly na [drop] pozici?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Sloučit Uzly do %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>Levý-click na první roh -> Levý-drag pro výběr oblasti -> Levý-clik pro zvětšení</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>GPS Exchange formát (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>OpenStreetMap formát (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Noni GPSPlot formát (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>NMEA GPS log formát (*.nmea *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>KML soubor (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>Oddělený čárkou (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Geotaggované obrázky (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>ESRI Shapefile (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Podporované formáty</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Merkaartor dokument (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Všechny soubory (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>dlaždice %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>Nízké</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>Vysoké</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>Neprůhledné</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Značky</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Uzel</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Relace</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Načíst obrázek</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>Přidat pozici uzlu do obrázku</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Zrušit</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>Soubor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Upravit</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>Zobrazení</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>Zobrazit</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>Znázornění směru</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Vrstvy</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Vytvořit</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Cesta</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Nástroje</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>Okna</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Nápověda</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation>Vyjmout objekty</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Špatný obsah schránky</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>Schránka neobsahuje platná data</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation>Varování o importu pomocí GDALu</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation>Chystáte se importovat soubor(y) pomocí GDALu, což je spíše experimentální funkce. Může ale také NEMUSÍ fungovat, navíc může způsobit pád programu. Ujistěte se, že nepřijdete o žádná data, pokud to nevyjde. +V případě, že k pádu dojde, prosím, nahlašte to jako bug. + +Pokračovat v importu? +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation>Importovat soubor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Neuložené změny</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>Aktuální mapa obsahuje neuložené změny, které budou ztraceny, pokud se otevře nová. +Chcete zrušit vytváření nové mapy nebo pokračovat a zahodit staré změny?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation>Neuložené změny stylu</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation>Používaný styl vykreslování byl změněn. +Chcete změny uložit?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Waypoint</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>Trať %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Big Fat Copyright Warning</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Pokoušíte se importovat KML soubor. Prosím uvědomte si že: +- Nemůžete importovat do OSM soubor KML vytvořený v Google Earth. +I když si myslíte, že uzly které jste vytvořili v GE jsou vaše, nejsou! +Je to pouze odvozené dílo z GE a jako takové nemůže být použité v OSM. + + - Pokud jste ho stáhli z internetu, je velká pravděpodobnost, že je zatížen copyrightem. +Prosím buďte si absolutně jisti, že použití těchto dat v OSM je povoleno autorem, +nebo že tyto data jsou public domain. + +Pokud si nejste jisti , prosím požádejte o radu v "legal" nebo "talk" openstreetmap mailing listu. Jste si opravdu absolutně jisti, že tento KLM může být legálně importován do OSM?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>Neplatný soubor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 nemohl být otevřen.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation>Příchozí požadavek dálkového ovládání</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation>Požádáno o nahrání objektu '%1', ale nevím, jak na to. Promiň.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>Detekována stará verze Qt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>Vaše nastavení používá Qt %1, které obsahuje různé známe chyby v odesílání dat do OpenStreetMap, vedoucích k chybovému hlášení serveru 401. Jste si jisti, že chcete pokračovat (což není doporučené). +Pro více informací navštivte http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>Odeslat OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Vypadá to, že jste ještě nezadali vaše +OpenStreetMap uživatelské jméno a heslo. +Chcete to udělat nyní?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Chyba stahování</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>Mapa nemohla být stáhnuta</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Vytvořit polygon</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>Uveďte počet stran</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Vynutit odeslání objektu</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Vytvořit křižovatku</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Vícenásobné křížení</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>Tyto cesty mají vícenásobné křížení. +Chcete pro každou vytvořit křižovatku (Nežádoucí křižovatky pak mohou být smazány ručně)?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Přidat číslování ulic</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Zarovnat Uzly</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>Odpojit uzel %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Přidat prvek do relace</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Odebrat prvek z relace</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Vytvořena relace %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Uložit mapový styl</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Merkaartor mapový styl (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Nahrát mapový styl</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>nepojmenovaný</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Uložit dokument Merkaartoru</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Soubory Merkaartor documents (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>Nemohu otevřít uložený soubor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 nemůže být otevřen pro zápis.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Neplatný soubor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 není platný dokument Merkaartoru.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>Exportovat OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>OSM Soubory (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Exportovat GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>GPX Soubory (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Exportovat KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>KML Soubory (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (int)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Přidat záložku</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Zadejte jméno záložky.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Neplatné jméno záložky</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>Záložka nemůže být prázdná.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Varování: Jméno záložky už existuje</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Vložte nové, ponechte stávající pro přepsání nebo zrušte akci.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Odebrat záložku</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Vyberte záložku k odebrání.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Neplatná projekce</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>Nemohu nastavit projekci "%1".</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>chyba GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>Nemohu otevřít GPS port.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>Otevřít NMEA log soubor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>Uložit šablonu značek</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Merkaartor šablona značek (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>Otevřít šablonu značek</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>Nevyřešené konflikty</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>Vyřešte prosím nejprve existující konflikty</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Je vřele doporučeno uložit změny do vašeho dokumentu po uploadu. +Chcete to udělat hned?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>poslední: </i><b>%1</b> by <b>%2</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>poslední: </i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Waypoint</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>Souřadnice</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>popis</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>komentář</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Uzel</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>elevace</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>rychlost</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>rozměr</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>Levý horní</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>Pravý dolní</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Relace</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Úloha</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Člen</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Délka</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Rozměr</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>%1 uzlů</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Oblast</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Cesta</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>Zobrazení</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Nová záložka</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>Upload předvoleb selhal</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Duplicitní klíč</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Více jak 150 předvoleb</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Nový server</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>Značky</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>Vybrané položky</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Jméno</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Neznámé pole</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Chyba!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>Jmenná vyhledávací služba vyžaduje ověření.</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>Název výstupního souboru</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>nepojmenovaný</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Všechny soubory (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Obrazkové soubory (*.png *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>SVG souboru (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>min šířka/délka</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>max šířka/délka</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>Zobraz měřítko</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation>300</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation>600</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation>1200</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation>dpi</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Uživatel:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Editor mapového stylu</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Globální</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Pozadí</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Proporcionální tloušťka</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>Pevná tloušťka</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Přidat</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Odstranit</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Duplikát</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>Výběr značky</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>metr/pixel</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>Viditelný do</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>Viditelný od zvětšení</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Kreslit s barvou</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Čárkovaná</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>vypnuto</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Vyplnit oblast</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Okraje</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>Zachytávání</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Kreslící krok</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Vykreslovat ikonu</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Label</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Font</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Label tag</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Text nad</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Oblast</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Kreslit s barvou pozadí</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Označit se značkou pozadí</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Vždy</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>Neplatný geotag</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>Nahrát bez přiřazených uzlů</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>Extrahovat informace z čárového kodu (Walking Papers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>Ignorovat</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>Proveď to pro všechny fotografie</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>Název výstupního souboru</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>nepojmenovaný</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>SVG souboru (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Všechny soubory (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Obrazkové soubory (*.png *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Předvolby</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>Zobrazení</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Obecné</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Průhlednost nízká/vysoká</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>Odezva jednotlačítkové myši</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>Použít uživatelský QT styl</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Barvy</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Pozadí</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>Přepsat styl</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>GPX trať</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>Pixelů</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Rozhraní</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Výběr</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Relace</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Zaměření</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Zvýraznění</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Poloha</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Použít jazyk</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>Překládat standardní značky</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Mapový styl</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Adresář uživatelských stylů</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Součastný styl</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Šablona</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>Šablona značek</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Vestavěný</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Uživatelský</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Data</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation>XAPI</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Dokumenty</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Automatické uložení dokumentu po odeslání</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>Tratě</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation>GDAL</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>GPS vstup</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>Seriový port</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Počítač</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>Uložit NMEA log</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>Nastavit systémový čas podle GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Síť</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Nastavení Proxy</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Heslo:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Uživatel:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Port:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Hostitel:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Mapový adaptér</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation>Automaticky přidávat tag "source" k novým objektům.</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Nástroje</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Jméno:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Cesta:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Použít</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Přidat</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Odstranit</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Angličtina</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Arabština</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Čeština</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Holandština</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Němčina</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Francouzština</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Italština</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Polština</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Ruština</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Španělština</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Švédština</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Ukrajinština</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Merkaartor šablona značek (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>Nástroj již existuje</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Nástroj s tímto jménem již existuje. +Prosím vyberte jiné jméno nebo použíjte <Apply> tlačítko, jetliže ho chcete změnit</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>Nemohu smazat nastavený nástroj</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>Nemohu smazat nastavený nástroj "%1"</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>Nemohu změnit nastavené jméno nástroje</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>Nemohu změnit nastavené jméno nástroje "%1"'</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>Vyberte spustitelný nástroj</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>Vyberte adresář pro Logy</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Jméno:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Použít</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Přidat</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Odstranit</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation>WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Vlastnosti</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 vybraných položek</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 vybraných položek</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Vybrané položky</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Vlastnosti - Vícenásobné prvky</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Vlastnosti - Uzel</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Vlastnosti - Vztahy</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Vlastnosti</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Vystředit mapu</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>Vystředit && přiblížit mapu</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Vybrat prvek</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Postupný úklid</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>Přesunut uzel %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Zrušit</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>Importovat NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>Importovat NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation>Komentář changesetu je prázdný. Považuje se za slušnost poskytnout v ostatním maperům komentář, co bylo změněno a případně za jakým účelem. +Opravdu chcete nechat komentář prázdný?</translation> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Neplatný</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>Metrů</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>Nedostupný</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>GPS chyba logování</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Nemohu vytvořit GPS log soubor: %1.</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>GPS chyba logování</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Nemohu vytvořit GPS log soubor: %1.</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Zeměpisná délka</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Nadm. výška</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 metrů</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation>Satelity</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Typ fixu</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Neplatný</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Rychlost</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Zeměpisná šířka</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>Není vyhovující výsledný tok!</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Odstranit</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Použít</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Zrušit</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation>< O D D Ě L O V A Č ></translation> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Členové</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>Značky</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>Značky</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Žádné satelity</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Výběr</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Klíč</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Hodnota</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Jméno</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Zavřít</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Styly</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Styly</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Zaslat do Openstreetmap</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Zrušit</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>Nastavení TMS serverů</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>TMS Servery</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Seznam serverů:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Jméno:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Server URL:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projekce:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Merkator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>Šířka/Délka (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation>Hodnota automatického tagu "source":</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>URL k licenci:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Použít</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Přidat</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Odstranit</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>Adresa a cesta nemůže být prázdná.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Klíč</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Hodnota</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>Editovat pro přidání...</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>A</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Nedefinováno</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Nedefinováno</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation>Žádné číslování domů</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>Počet domů</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>Přidat číslování ulice (Karlsruhe schéma)</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Všechna čísla</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>Lichá čísla</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>Sudá čísla</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Extrahovat - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation># traťových segmentů</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Celková vzdálenost</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Celkové trvání</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1h %2m</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Extrahovat kreslící vrstvu</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>Přiblížení</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Zavřít</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>Traťový bod</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Zeměpisná šířka</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Zeměpisná délka</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Značky</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Webová stránka</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Heslo</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Uživatelské jméno</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Použít Proxy</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>Přiblížení</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Smazat</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>Nastavení WMS serverů</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>WMS Servery</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Seznam serverů:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Jméno:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Server URL:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Vrstvy:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation>Název</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projekce:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation>Dlaždicovat</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>Úrovní příbližení</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>Formát obrázků</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Styly:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation>Hodnota automatického tagu "source":</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>URL k licenci:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Použít</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Přidat</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Odstranit</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: GetCapabilities</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>Adresa a cesta nemůže být prázdná.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_de.ts b/translations/merkaartor_de.ts new file mode 100644 index 0000000..f482821 --- /dev/null +++ b/translations/merkaartor_de.ts @@ -0,0 +1,7397 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="de" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>Über Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>Dieses Programm ist unter der GNU Public License v2 lizenziert</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Merkaartor-Version</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Qt version</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>GDAL version</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska und andere, 2006-2021</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Änderungsprotokoll</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>OK</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Beschreibung</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Tastenkürzel</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Importieren</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Exportieren</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>&Standard</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Abbrechen</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Tastenkürzeleditor</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Tastenkürzelschema laden</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Merkaartor-Tastenkürzelschema (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Datei kann nicht geöffnet werden</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 konnte nicht geöffnet werden.</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>Tastenkürzelschema speichern</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>unbenannt</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Alle Dateien (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Datei kann nicht gespeichert werden.</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 konnte nicht geschrieben werden.</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation>BrückenBauer</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation>Entschuldigen Sie, mit dem kann ich keine Brücke bauen. Bitte wählen Sie nur zwei Punkte aus.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation>Segment zu Brücke konvertieren</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation>Das gewählte Segment ist bereits als Brücke oder Tunnel markiert. Bitte vergewissern Sie sich, was Sie tun.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation>Aktion nicht unterstützt: Die Brücke schein kein einzelner Weg zu sein.</translation> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation>Datei</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation>Verlassen</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation>Laden</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation>Gekachelt</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation>Die Stadt kann nicht geladen werden</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Keine Beschreibung</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Formular</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Formular</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation>Genauigkeit (Meter/Segment)</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation>Typ</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation>Kreisverkehr</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation>ebener Kreis</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation>Links</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation>Rechts</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation>Rechts-/Linksverkehr</translation> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation>Es gibt <b>kein</b> ungespeichtertes Objekt</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation>Es gibt <b>ein</b> ungespeichtertes Objekt</translation> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Rückgängig</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Zentriere Karte</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>Zentriere && zoome Karte</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Rückgängig</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation>Es gibt <b>keine</b> ungespeichterten Objekte.</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Aufräumen</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>HINZUFÜGEN Linie %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>HINZUFÜGEN Punkt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>HINZUFÜGEN Relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>AKTUALISIEREN Punkt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>AKTUALISIEREN Relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>AKTUALISIEREN Linie %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>ENTFERNEN Punkt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>ENTFERNEN Linie %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>ENTFERNEN Relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Fehler beim Hochladen der Anforderung</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Bitte Benutzername und Kennwort in den Einstellungen überprüfen</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Fehler beim Hochladen der Anfrage (%1)! +Die Servernachricht ist '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +API-Meldung ist '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Änderungen hochladen...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>ÖFFNE Änderungssitzung</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>SCHLIESSE Änderungssitzung</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Fehler beim Hochladen der Anforderung</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Bitte Benutzername und Kennwort in den Einstellungen überprüfen</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Fehler beim Hochladen der Anfrage (%1)! +Die Servernachricht ist '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +API-Meldung ist '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation>Fehler beim Hochladen der Anfrage (%1)! +%2 +Bitte laden Sie die problematischen Daten nocheinmal, um den Konflikt zu lösen.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>Überprüfe Änderungen ...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>ÖFFNE Änderungssitzung</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>SCHLIESSE Änderungssitzung</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation>Änderungssatz konnte nicht geschlossen werden.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation>Ein unbekannter Fehler ist aufgetreten. Das Programm wurde bereits beendet oder wird gleich automatisch beendet. Um sicher zu sein, was noch gesihert werden konnte, überprüfen Sie bitte die eingegebenen Daten auf der osm.org-Webseite.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>HINZUFÜGEN Relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>HINZUFÜGEN Linie %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>HINZUFÜGEN Punkt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>AKTUALISIEREN Relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>AKTUALISIEREN Linie %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>AKTUALISIEREN Punkt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>ENTFERNEN Punkt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>ENTFERNEN Linie %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>ENTFERNEN Relation %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>unbenannt</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Arbeitsebene</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Hochgeladene Ebene</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Hintergrundbilder</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation>Zeichnungsebene #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation>Filterebene #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>OSM Export</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>Exportiere OSM...</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>Dokument</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation>Historie-Neu: Punkt %1 erstellen</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation>Historie-Neu: Punkt %1 ändern</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation>Historie-Neu: Punkt %1 löschen</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation>Historie-Neu: Linie %1 erstellen</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation>Historie-Neu: Linie %1 ändern</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation>Historie-Neu: Linie %1 löschen</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation>Historie-Neu: Relation %1 erstellen</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation>Historie-Neu: Relation %1 ändern</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation>Historie-Neu: Relation %1 löschen</translation> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Herunterladen</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Ort</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Lesezeichen</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Aktuelle Ansicht</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation>WWW Link (OSM/Google maps)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation>Xapi Auswahl</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>Von der Karte unten (Karte vom OpenStreetMap-Projekt bereitgestellt)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Auch GPS-Rohdaten herunterladen</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>Alle Relationen auflösen</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 heruntergeladen</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Nicht aufgelöste herunterladen...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>Lade fehlende Elemente %1 von %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>Überprüfe nicht aufgelöste Elemente %1 von %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Analysieren...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Werte XML aus</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Konflikte von %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>Leere Linien/Relationen erkannt</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Leere Linien/Relationen ergeben keinen Sinn. +Möchten Sie diese zur Löschung markieren?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Leeres Objekt %1 entfernen</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Es wurden Konflikte erkannt</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>Einige der geänderten Objekte wurden seit dem letzten Herunterladen von einer anderen Person bearbeitet. +Diese Objekte wurden als "conflict_..." in der "Konflikte ..." Ebene dupliziert. +Um diese hochladen zu können, müssen Sie ihre Änderungen mit denen der anderen Person vereinen und dann die Objekte aus der "Konflikte ..." Ebene entfernen.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Daten werden hochgeladen …</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Bereite Änderungen vor</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>Warte auf Antwort des Servers</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Herunterladen...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Herunterladen von OSM (verbinden)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>Unerwarteter HTTP-Status (%1) +Servernachricht ist '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +API-Meldung ist '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Herunterladen fehlgeschlagen</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Benutzername/Passwort ungültig</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>Unaufgelöste Konflikte</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>Bitte lösen Sie zuerst die vorhandenen Konflikte auf</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>Lade Punkt %1 von %2 herunter</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation>MapDust</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Lade Punkte herunter</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Herunterladen von %1,%2 (Zoom %3)...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Schließen</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>Löschen nicht möglich</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation>Kann die Auswahl nicht löschen, da sie sich außerhalb des heruntergeladenen Bereiches befindet.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>Kann nicht alles löschen</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation>Die Auswahl kann nicht vollständig gelöscht werden, da sie teilweise außerhalb des heruntergeladenen Bereichs liegt. +Soviel löschen wie möglich?</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation>Linie %1 umkehren</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation>%1 Linien umkehren</translation> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Exportieren</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>Was soll exportiert werden?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Alles Sichtbare (d.h. nicht ausgeblendet)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>Aktuelle Ansicht</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Ausgewählte</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Objekte</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Zentriere Karte</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>Zentriere && zoome Karte</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Herunterladen fehlender Abhängigkeiten</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Zur Auswahl hinzufügen</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Entfernen</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Relationen</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation>Wege</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation>Punkte</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Alle</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Objekte</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>Nur vollständig anzeigbare Objekte</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation>Nach Viewport filtern</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Suchen...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation>Nur Objekte anzeigen, die sich mit der aktuellen Auswahl schneiden.</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation>Nach Auswahlkriterien filtern</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>Zurücksetzen</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Name</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>…</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Schließen</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>Filtereinstellungen</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Filter Liste:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Name:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Anwenden</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Hinzufügen</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Entfernen</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation>Wert:</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation>Dateiname(n)</translation> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation>Ungültige Datei</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>Zeitüberschreitung im Netzwerk</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>Kann die Details zum Foto nicht vom Walking Papers Server lesen.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Bitte die Walking Papers URL angeben</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Bilder</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Zentriere Karte</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation>c</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Bilder entfernen</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Dateinamen in Zwischenablage kopieren</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Nächstes Bild wählen</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>BildRunter</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Vorheriges Bild wählen</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>BildHoch</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>Georeferenziertes Bild speichern...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>Foto-Ebene</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Lade georeferenzierte Bilder</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>Wählen Sie die Ebene aus, zu der die Bilder gehören:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation>Ebene ist schreibgeschützt</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation>Die verwendete Ebene ist schreibgeschützt. Soll der Schutz entfernt werden? +Anderenfalls können sie die dazugehörigen Bilder nicht laden.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Lade Bilder ...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Laden abbrechen</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>Datei nicht gefunden</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>Bild "%1" wurde nicht gefunden.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Fehler beim öffnen von "%2": +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Fehler beim Laden der EXIF-Daten aus "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>Geben Sie den Versatz an</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>Wohin sollen die Bilder versetzt werden?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>mehr zum Ende der Spur</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>mehr zum Anfang der Spur</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>hh:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>Keine Wegpunkte</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>Keine Wegpunkte für das Bild "%1" gefunden.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss 'Sekunden'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm 'Minuten und' ss 'Sekunden'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh 'Stunden,' mm 'Minuten und' ss 'Sekunden'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>Falsches Bild?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>Das Bild "%1" wurde %2 vor dem nächsten Wegpunkt aufgenommen. +Soll es trotzdem verwendet werden?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>Das Bild "%1" wurde %2 nach dem letzten aufgezeichneten Wegpunkt aufgenommen. +Soll es trotzdem verwendet werden?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation>Geben sie den Ausgabe-Dateinamen an</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>JPEG Bilder (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Fehler beim Öffnen von "%1": +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>Gehe zu</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Lesezeichen</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation>WWW Link (OSM/Google maps)</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation>Koordinaten</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation>Projiziert anzeigen</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>minLän, minBr, maxLän, maxBr</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>zentr. Breite, Länge, Weite Br., Län.</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Info</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>OSM API-URL</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>OSM XAPI-URL</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Suchen</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>Ungültige OSM-URL</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>The angegebene URL ist ungültig!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Ungültiges Koordinatenformat</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>Koordinatenformat: '<linke Länge>, <untere Breite>, <rechte Länge>, <obere Breite>'</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>Koordinatenformat: '<Zentrumsbreite>, <Zentrumslänge>,<Breitenbereich>,<Längenbereich>'</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Keine</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>Shape-Adapter</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation>Projektion auf die der Ebene umstellen</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation>Ausrichtungsanpassung zurücksetzen</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Schließen</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>WMS-Adapter</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>TMS-Adapter</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>Plugins</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Karte - Keine</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Karte - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Karte - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>Karte - WMS-Kacheln - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Karte - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Karte – %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>Lizenzbestimmungen: %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>Lizenzbedingungen nicht akzeptiert</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation>Sie haben das Kästchen, mit dem Sie die Lizenzbedingungen anerkennen, nicht angekreuzt. +Daher können sie diese Quelle nicht als Kartenebene verwenden. +Wollten sie das wirklich?</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Server</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Kachelgröße</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>Min/Max Zoom</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Projektion</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>Rohdaten</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>OSM Vorschau</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Spezifikationen</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>Erste Zeile enthält Überschriften</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Trennzeichen</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Semikolon (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Tab</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Andere:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation>Anführungszeichen bei Zeichenketten</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Keine</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation>einzelne (')</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation>doppelte (")</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>Projektion (im PROJ4 Format; freilassen für Breite/Länge)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Felder</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>Feldliste:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>Feldname (= Merkmalsname):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>Feldtyp:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Importieren</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>Bereich importieren</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>Von (0 = Anfang)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>Bis (0 = Ende)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>Lade Einstellungen...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Einstellungen speichern...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Zeichenkette</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Ganzzahl</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>Fließkommazahl</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Längengrad</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Breitengrad</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Ungültige Projektion</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>Projektion kann nicht eingestellt werden.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Keine Koordinaten</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>Breiten- oder Längenfeld fehlt. Diese Datei kann nicht importiert werden. +Wollen sie wirklich beenden?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>Lade CSV Importeinstellungen</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Merkaartor Importeinstellungen (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Ungültige Datei</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 konnte nicht geöffnet werden.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1 ist keine Datei für CSV-Importeinstellungen</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation>CSV Importeinstellungen speichern</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>unbenannt</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Alle Dateien (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation>Importeinstellungen könnten nicht gepeichert werden</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 konnte nicht geschrieben werden.</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation>Projektion kann nicht eingestellt werden, bitte geben Sie eine an</translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Info</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Größe</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation>% Eigenschaften</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Objekte</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Alle anzeigen</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Alle verstecken</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Alle schreibgeschützt</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Keine schreibgeschützt</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Schließen</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Ebenen</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Alle</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>Karte</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>Zeichnen</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>GPS-Spuren</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation>Ebenen auf Standard zurücksetzen</translation> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Formular</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Sichtbar</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Schreibgeschützt</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>Hoch</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>Niedrig</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>Undurchsichtig</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Durchsichtigkeit</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation>Layer schließen: Es sind ungespeicherte Objekte vorhanden</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation>Diese Ebene enthält ungespeicherte Objekte. +Wollen Sie sie wirklich schließen? (Kann nicht rückgängig gemacht werden!)</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation>Ebene schließen: Nicht leer</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation>Sind sie sicher, daß sie diese Ebene schließen möchten? (Wiederherstellen nicht möglich)</translation> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>Lizenzbestimmungen</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>Ich habe die Lizenz gelesen und stimme den Bestimmungen zu</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Nicht erneut nachfragen</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation>%1 v%2 +Lade plugins...</translation> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation>%1 v%2 +Initialisieren...</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>&Hilfe</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Erstellen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Bearbeiten</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>&Ansicht</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Lesezeichen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Datei</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Exportieren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>Werk&zeuge</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>&Stil</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation>Ta&gging Vorlagen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Punkt</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>&Fenster</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Unterfenster</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>&Objekt</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>Ebe&nen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>&Relation</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>De&tails</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>Haupt-Symbolleiste</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>&Beenden</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>&Über</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>&Öffnen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Ein neues Dokument erstellen und eine Datei importieren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>&Alles anzeigen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>Zoom auf &Rechteck</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>Auf Auswahlrechteck zoomen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>&Herauszoomen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>Hin&einzoomen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Hineinzoomen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Gekrümmte Verbindung</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Rückgängig</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>&Wiederherstellen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>&Verschieben</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation>Importieren mittels &GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Importieren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Eine Datei in das aktuelle Dokument importieren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Herunterladen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Lädt Kartendaten für ein neues Gebiet herunter</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Verbindung</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Verbindung erstellen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Auswählen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>Hoch&laden</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Änderungen zum Server hochladen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>&Entfernen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Ausgewählte Objekte entfernen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation>Wegrichtung umkehren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation>Parallelen Weg erzeugen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation>Verbundene Wege auftrennen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation>Als Datei speichern</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation>Ausgewählt ...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation>Alle verbergen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation>Alle anzeigen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation>GPS-Menü</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation>Vorschau drucken ...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation>Eigenschaften ...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Neuen Punkt erstellen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>Umkeh&ren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation>Kreis&verkehr</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Kreisverkehr erstellen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Neu</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>&Auftrennen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>&Verbinden</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>Auf&teilen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Trennen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>&Relation</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Relation erstellen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>&Fläche</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Neue Fläche erstellen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Alle sichtbaren Ebenen in eine Datei exportieren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Suchen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Suchen und Auswählen von Elementen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>Die Objekte im Bildausschnitt in eine Datei speichern</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>&Vereinigen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Punkte vereinigen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>Die gewählten Punkte vereinigen (der zuerst gewählte bleibt erhalten)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Speichern</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Mehr herunterladen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Lädt mehr Kartendaten für das aktuell sichtbare Gebiet herunter</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Eigenschaften</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>&Info</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>&Ausrichten</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Punkte ausrichten</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>Ausgewählte Punkte ausrichten. Die ersten zwei legen die Linie fest.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation>&Verteilen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation>Punkte verteilen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation>Ausgewählte Punkte ausrichten und gleichmäßig verteilen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>&Kopieren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>Ausgewählte Objekte und Merkmale in die Zwischenablage kopieren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>Die Merkmale der aktuellen Auswahl in die Zwischenablage kopieren. Zusätzliches Kopieren der Koordinaten, wenn die Auswahl ein Punkt ist.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Merkmale einfügen (Ü&berschreiben)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>Merkmale aus der Zwischenablage in aktuelle Auswahl einfügen (und überschreiben).</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>&Merkmale einfügen (Vereinen)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Merkmale einfügen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>Merkmale aus der Zwischenablage einfügen (mit existierenden Merkmalen vereinen)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>Merkmale aus der Zwischenablage mit denen der aktuellen Auswahl vereinigen.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Einfügen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Objekte aus der Zwischenablage einfügen.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>Objekte aus der Zwischenablage einfügen. Wenn diese schon vorhanden sind, werden sie überschrieben.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Objekt in die Arbeitsebene übertragen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>&Bilderebene</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>&Raster/SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>&Start</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>GPS starten</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>GPS erneut abspielen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>S&top</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>GPS beenden</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>Auf GPS-Position &zentrieren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>Details (Hervorhebungen) anzeigen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Aufzeichnen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>GPS aufzeichnen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Pause</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>GPS anhalten</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>G&eoreferenziertes Bild</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>Mitglied &hinzufügen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>Mitglied &entfernen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>&Niemals</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>&Immer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>&Loslösen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>&Stile</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation>Eine Datei ins aktuelle Dokument mit GDAL importieren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Kamera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>&Drehen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation>&Polygon</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Objekte</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>&Unterteilen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation>Segment gleichmäßig unterteilen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>Zoomstufen an &Kacheln anpassen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>OsmChange (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Schließen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>Vere&infachen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation>Linie(e) vereinfachen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation>Linie vereinfachen, indem unnötige Kind-Punkte entfernt werden</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>&Keiner</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation>Fläche entlang zweier Punkte teilen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>&Gebäudeteilung</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation>Fläche in Reihenhäuser unterteilen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation>Fläche in Reihenhäuser unterteilen.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation>A&chsenausrichtung</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation>Kanten an regelmäßigen Achsen ausrichten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Eigenschaften...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation>Ungespeicherte Objekte hervorheben</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation>A&usschneiden</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation>E&xtrudieren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation>Extrudier-Aktionen (wie bei JOSM)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation>Auswahl umkehren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation>Kind-Elemente in Auswahl aufnehmen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>&Skalieren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation>GDAL SQLite/SpatiLite</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation>Drahtgitter</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation>Elternelement(e) selektieren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Herunterladen fehlender Abhängigkeiten</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation>&Brücke</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation><html><head/><body><p>Weg in Brücke wandeln</p></body></html></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>%1 Merkmal von %2 löschen</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>%1 Merkmale von %2 löschen</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation>"source" Merkmal für %1 setzen</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Entferne Mitglied '%1' aus %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation>Mitglieder in Relation %1 ordnen</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>Relation %1 geändert</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Fläche %1 erzeugen</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Fläche: Linie %1 erstellen</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Loch hinzufügen.</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Möchten Sie ein (weiteres) Loch in die äußere Fläche einfügen?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Fläche: Linie %1 abschließen</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Fläche: Punkt %1 zu Linie %2 hinzufügen</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>Fläche schließen %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>LINKSKLICK: Starten;ZIEHEN: Skalieren;SHIFT+ZIEHEN: Drehen;LINKSKLICK: Beenden</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Kreisverkehr %1 erstellen</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation>Linie %1 schließen</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>LINKSKLICK: Auswählen;STRG+LINKSKLICK: Zur Auswahl hinzufügen;LINKS ZIEHEN: Auswahlrechteck;RECHTS ZIEHEN: Ebene verschieben;STRG+RECHTS ZIEHEN: Zoom;DOPPELKLICK: Neuer Punkt;DOPPELKLICK auf Punkt: Neue Linie</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>KLICK: auswählen/verschieben; \r +STRG+KLICK: Auswahl umkehren; \r +SHIFT+KLICK: zur Auswahl hinzufügen; \r +SHIFT+ZIEHEN: Flächenauswahl; \r +STRG+ZIEHEN: Zoom; \r +DOPPELKLICK: Neuer Punkt; \r +DOPPELKLICK auf Punkt: neue Linie</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Objekt %1 entfernen</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>Objekte entfernen</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Kind-Elemente löschen.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation>Wollen sie die enthaltenen Punkte auch löschen? +OSM-Punkte außerhalb des heruntergeladenen Bereiches bleiben erhalten.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation>%1 Linien umkehren</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>LINKSKLICK: auswählen;LINKS ZIEHEN: verschieben</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>Punkt an derselben Position gefunden.</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>Möchten Sie alle Punkte an der Zielstelle vereinigen?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Punkte vereinigen in %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation>DARÜBERHALTEN: Auswählen;ZIEHEN: Drehen</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation>Objekt drehen</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation>DARÜBERHALTEN: Auswählen;ZIEHEN: Skalieren</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation>Objekt skalieren</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>LINKSKLICK in erste Ecke -> LINKS ZIEHEN um Gebiet zu wählen -> LINKSKLICK zum zoomen</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>GPS Exchange-Format (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>OpenStreetMap-Format (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation>OSM Änderungsformat (*.osc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Noni GPSPlot-Format (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>NMEA GPS-Logformat (*.nmea *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>KML-Datei (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>Kommagetrenntes Format (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Georeferenzierte Bilder (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>ESRI Shapedatei (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation>Geography Markup Language (*.gml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation>Protobuf Binärformat +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Unterstützte Formate</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Merkaartor-Dokument (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Alle Dateien (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>Kachel %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>Hoch</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>Niedrig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>Undurchsichtig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Objekt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Punkt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Relation</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Lade Bild</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>Position des Punkts zu Bild hinzufügen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation>Bild mit dieser Position georeferenzieren</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Abbrechen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>Datei</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Bearbeiten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>Ansicht</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>Details</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>Richtungspfeile</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Ebenen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Erstellen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Linie</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Werkzeuge</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>Fenster</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Hilfe</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation>Objekte ausschneiden</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Zwischenablage ungültig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>Die Zwischenablage enthält keine gültigen Daten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation>GDAL-Importwarnung</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation>Sie versucehn eine oder mehrere Dateien mit GDAL zu importieren. Diese Funktion ist noch in der Versuchsphase und kann funktionieren oder auch nicht. Unter umständen stürzt das Programm ab. Bitte stellen Sie sicher, dass Sie keine Daten durch einen Absturz verlieren und sichern Sie vorher alles. +Bitte berichten Sie uns alle Fehler bei einem Absturz (Bug-Rapport) - aber seien Sie nicht überrascht, wenn es noch nicht klappt. + +Mit dem Import fortfahren? +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation>Datei importieren</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Ungespeicherte Änderungen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>Die aktuelle Karte enthält ungespeicherte Änderungen, die verlorengehen, wenn Sie eine neue beginnen. +Möchten Sie das Beginnen einer neuen Karte abbrechen, oder fortfahren und die alten Änderungen verwerfen?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation>Ungespeicherte Stil-Änderungen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation>Sie haben den aktiven Stil geändert. +Wollen Sie Ihre Änderungen speichern?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Punkte</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>GPS-Spur %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Urheberrechtswarnung</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Sie wollen eine KML-Datei importieren. Bitte beachten Sie: + + - Sie können keine mit Google Earth erstellten KML-Dateien in OSM importieren. Auch wenn + Sie denken die erzeugten Daten gehören nur Ihnen, stimmt das nicht! + Die Daten sind ein abgeleitetes Werk von GE und können deshalb in OSM nicht verwendet werden. + + - Falls Sie die Daten aus dem Internet heruntergeladen haben liegt höchstwahrscheinlich + ein Copyright darauf. Stellen Sie sicher, dass die Nutzung in OSM vom Autor genehmigt ist, + oder die Daten gemeinfrei sind. + +Falls Sie unsicher sind suchen Sie Hilfe auf den "legal", "talk" oder "talk-de" OpenstreetMap-Mailinglisten + +Sind Sie sicher, dass diese KML-Daten legal in OSM importiert werden dürfen?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>Keine gültige Datei</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 konnte nicht geöffnet werden.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation>Eingehende "Remote Control" Anfrage</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation>Entschuldigen Sie, ich versuchte das Objekt '%1' zu laden, weiss jedoch nicht wie.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation>Eingehender Fernsteuerungsbefehl</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation>Unbekannte Aktion url: %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>Alte Qt-Version entdeckt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>Ihr System nutzt Qt %1, welches verschiedene Fehler beim Hochladen von Daten zu OpenStreetMap verursacht. Diese können zu "401"-Fehlermeldungen führen. Möchten Sie fortfahren (nicht empfohlen)? +Für weitere Informationen lesen Sie http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor (englisch)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>OSM hochladen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Sie haben Ihren Benutzernamen und Kennwort +für OpenStreetMap noch nicht angegeben. +Möchten Sie dies nun tun?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Herunterladen fehlgeschlagen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>Die Karte konnte nicht heruntergeladen werden</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation>Fehler beim Herunterladen von MapDust</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation>Die MapDust bugs konnten nicht heruntergeladen werden</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Polygon erstellen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>Anzahl der Seiten angeben</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Hochladen des Objekts erzwingen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation>Datei öffnen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Kreuzung erstellen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Mehrfachkreuzung</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>Diese Linien schneiden sich mehrfach. +Möchten Sie trotzdem für jeden Schnittpunkt eine Kreuzung erstellen (ungewollte Kreuzungen können danach noch gelöscht werden)?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Hausnummern hinzufügen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation>in ... Segmente teilen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation>Geben sie die Zahl der Segmente an</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation>An Achse ausrichten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation>Geben Sie die Zahl der regelmäßigen Achsen an (z.B. 4 für rechteckig)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>dreieckig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>rechteckig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>fünfeckig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>sechseckig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation>siebeneckig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>achteckig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation>An %1 Achsen ausrichten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation>An %1 regelmäßigen Achsen ausrichten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation>Kann nicht an Achsen ausrichten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation>An Achsen ausrichten scheiterte. Bitte passen sie scharfe Ecken an und versuchen sie es noch ein Mal.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation>An Achsen ausrichten scheiterte oder konnte keine Näherungslösung finden.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation>Bing Auszug</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Punkte ausrichten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation>Punkte verteilen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>Punkt %1 lösen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Mitglied zu einer Relation hinzufügen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Ein Mitglied aus einer Relation entfernen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation>Zu Multi&polygon hinzufügen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation>Flächen vereinen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>Fläche aufteilen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation>Fläche in %1 Reihenhäuser unterteilen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Relation %1 erstellen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Karten-Stil speichern</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Merkaartor-Kartenstile (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Karten-Stil laden</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation>Merkaartor Karten-Stile (*.mas) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation>MapCSS stylesheet (*.css)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation>Historie neu erstellen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation>Es wird versucht, die Historie wiederherzustellen. +Aber keine Garantie und kein Rückgängigmachen. +Sind Sie sicher, dass Sie das ausprobieren wollen?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>unbenannt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Merkaartor-Dokument speichern</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Merkaartor-Dokumente (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation>Vorlage speichern</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>Datei kann nicht gespeichert werden.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 konnte nicht geschrieben werden.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation>Vorlage kann nicht gespeichert werden</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Ungültige Datei</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 ist kein gültiges Merkaartor-Dokument.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>OSM exportieren</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>OSM-Dateien (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>osmChange exportieren</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>osmChange Dateien (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>GPX exportieren</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>GPX-Dateien (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>KML exportieren</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>KML-Dateien (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation>Objektextrahierung</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation>Extrahiere Objekte....</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation>Werkzeugbeschriftung verbergen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (intern)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Lesezeichen hinzufügen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Geben Sie den Namen des Lesezeichens an.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Ungültiger Name für ein Lesezeichen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>Lesezeichenname darf nicht leer sein.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Achtung: Lesezeichen mit diesem Namen existiert bereits</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Geben Sie einen neuen Namen an, oder brechen Sie ab. Ansonsten wird das Lesezeichen überschrieben.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Lesezeichen entfernen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Wählen Sie das Lesezeichen, das Sie entfernen möchten.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Ungültige Projektion</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>Projektion "%1" kann nicht eingestellt werden.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>GPS-Fehler</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>Der GPS-Port kann nicht geöffnet werden.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>Öffne NMEA-Logdatei</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>Tagging-Vorlagen speichern</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Merkaartor-Taggingvorlagen (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>Tagging-Vorlagen öffnen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation>Achtung! Die Merkaartor-Übersetzung für "%1" konnte nicht geladen werden. Es wird Englisch verwendet.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>Unaufgelöste Konflikte</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>Bitte lösen Sie zuerst die vorhandenen Konflikte auf</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Ist es sehr empfehlenswert nach dem Hochladen die Änderungen in Ihrem Dokument zu speichern. +Wollen Sie dies jetzt erledigen?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b> </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>Stand: </i><b>%1</b&gt; von <b>%2</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>Stand: </i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>Ebene: </i><b>%1</b> </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation>Im Browser anzegen</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Punkt</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>Koordinate</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>Beschreibung</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>Kommentar</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Punkt</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>Höhe</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>Geschwindigkeit</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>Größe</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>Mitglieder</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>Oben Links</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>Unten rechts</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Relation</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Rolle</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Mitglied</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation>Geschlossene Linie</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Länge</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Größe</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>%1 Punkte</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Fläche</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Linie</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation>%1 m/Pixel</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation>Ausrichten: %1m @ %2</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation>%1ms</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>Ansicht</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation>Koordinatenbereich</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Projektion</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Neues Lesezeichen</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>Hochladen der Einstellungen fehlgeschlagen</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Schlüssel duplizieren</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Mehr als 150 Einstellungen</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation>Fehler beim Laden/Speichern der Voreinstellungen</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation>Kommunikationsfehler</translation> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Neuer Server</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation>Nutzungsbedingungen</translation> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Formular</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>Merkmale</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>Ausgewählte Elemente</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation>Klasse</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Name</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Unbekanntes Feld</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Fehler!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>Server für Namenssuche benötigt Beglaubigung.</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Formular</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>Ausgabedateiname</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>unbenannt</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation>PDF Dateien (*.pdf)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Alle Dateien (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Bilddateien (*.png *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>SVG-Dateien (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation>Raster/SVG Export</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation>Optionen</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>min. Breite/Länge</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>max. Breite/Länge</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation>Punkte anzeigen</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation>Relationen anzeigen</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>Maßstab anzeigen</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation>Koordinatengitter anzeigen</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation>Elemente ohne Stil anzeigen</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation>Druck-Auflösung</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation>300</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation>600</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation>1200</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation>dpi</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>Als PDF exportieren...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>Als SVG exportieren...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation>Als Rasterbild exportieren...</translation> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Formular</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Benutzer:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation>Passwort</translation> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Kartenstil-Editor</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Global</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Hintergrund</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation>Punkte</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Proportionale Breite</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>Feste Breite</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Hinzufügen</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Entfernen</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Duplizieren</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>Auswahlausdruck</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>Meter/Pixel</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>Sichtbar bis zu</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>Sichtbar ab Massstab</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Farbe</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Strichliert</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>von</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Fläche füllen</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation>Mit Symbolen füllen (definiert bei Details)</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Rand</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation>Innen</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation>Außen</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>Details</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Stufen zeichnen</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Symbol zeichnen</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation>Zeichne Fahrtrichtungsmarkierungen</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Beschriftung</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Schriftart</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Beschriftungsmerkmal</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Halo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Fläche</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Hintergrundfarbe</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Beschriftung mit Hintergrund-Merkmal</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Immer</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Farbe auswählen</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>Keine gültige Georefernzierung</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>Beschriftung</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation>Dieses Foto enthält keine geokodierten EXIF Daten. +Was wollen sie als nächstes tun?</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation>Übereinstimmung mit GPS-Punkten versuchen</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>Ohne dazugehörigem Punkt laden</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>Extrahiere Infos aus dem Barcode (Walking Papers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>Ignorieren</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>Auf alle aktuellen Fotos anwenden.</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>Ausgabedateiname</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>unbenannt</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>SVG-Dateien (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Alle Dateien (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Bilddateien (*.png *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Einstellungen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>Visuell</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Allgemein</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Durchsichtigkeit niedrig/hoch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>Bedienung mit einer Maustaste</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>Eigener Qt-Stil:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation>Erstellen neuer Punkte/Linien im Auswahlmodus zulassen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>Versteckte Relationen auswählbar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Farben</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Hintergrund</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>Stil ersetzen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>GPS-Spur</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>Pixel</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Schnittstelle</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Darüberhalten</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Relationen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Fokus</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Hervorheben</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation>Ungespeichert</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Sprache</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Sprache:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>Tagging-Vorlagen übersetzen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation>Darstellung</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation>Optionen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation>Nutze aktuellen Stil für Drahtmodell-Darstellung</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation>Bearbeitungmodus</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation>Schnell</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation>Drahtgitter</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation>Immer rendern</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Kartenstil</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Eigenes Verzeichnis für Stile</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Aktueller Stil</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Vorlage</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>Tagging-Vorlage</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Eingebaut</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Benutzerdefiniert</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Daten</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation>XAPI</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Dokumente</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation>Vorlage automatisch laden</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Dokumente nach dem Hochladen automatisch speichern</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>GPS-Spuren</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation>Kantenglättung</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation>GDAL</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation>Projektion bestätigen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>GPS-Input</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>GPSD</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>Seriell</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Server</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>NMEA-Log speichern</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>Computer-Uhr mit GPS sychronisieren</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Netzwerk</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Proxy-Einstellungen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation>Proxy-Server nutzen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation>Hintergrundbild</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Kennwort:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Benutzer:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Port:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Host:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Kartenadapter</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation>Beim Erstellen von Objekten vor einer Hintergrundkarte automatisch "source" Merkmal anfügen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Werkzeuge</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Name:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Pfad:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Anwenden</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Hinzufügen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Entfernen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Englisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Arabisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation>Chinesisch (Taiwan)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation>Kroatisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Tschechisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Niederländisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Deutsch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Französisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>Ungarisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation>Indonesisch (Indonesien)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Italienisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>Japanisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Polnisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Russisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation>Portugiesisch (Brasilien)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Spanisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Schwedisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Ukrainisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation>[weniger als 50% komplett] Chinesisch (China)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation>[weniger als 50% komplett] Estnisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation>[weniger als 50% komplett] Deutsch (Österreich)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation>[weniger als 50% komplett] Portugiesisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation>[weniger als 50% komplett] Slowakisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation>[weniger als 50% komplett] Vietnamesisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Merkaartor-Taggingvorlage (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Farbe auswählen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>Werkzeug existiert bereits</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Ein Werkzeug dieses Namens existiert bereits. +Wählen Sie einen anderen Namen oder klicken Sie auf <Übernehmen>, um das bestehende zu modifizieren</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>Kann Werkzeug nicht löschen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>Kann Werkzeug "%1" nicht löschen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>Kann den Namen des Werkzeugs nicht ändern</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>Kann den Namen von Werkzeug "%1" nicht ändern</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>Werkzeugprogramm wählen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation>Vorlage auswählen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation>Merkaartor Dokument (*.mdc)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>Log-Verzeichnis wählen</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation>Projektionen einrichten</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>Projektionen</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation>Liste der Projektionen</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Name:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>PROJ4-Optionen</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Anwenden</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Hinzufügen</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Entfernen</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation>Bitte geben Sie die Projektion an</translation> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation>Dokument</translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation>Vordefiniert</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation>Standard (EPSG:...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation>Eigene PROJ4 Def. (+proj=...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation>WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation>Fehler in der WKT Zeichenkette</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation>Kann nicht im PROJ4 format exportieren</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation>Ungültige WKT Zeichenkette</translation> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Eigenschaften</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 gewählte(n) Elemente(n)</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 gewählte(n) Elemente(n)</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Ausgewählte Elemente</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Eigenschaften - Mehrere Elemente</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Eigenschaften - Punkte</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Eigenschaften - Relation</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Eigenschaften</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation>Fehler beim Laden der Vorlage</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Zentriere Karte</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>Zentriere && zoome Karte</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Mitglied auswählen</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Kaskadiertes Aufräumen</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>Punkt %1 verschieben</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation>Exportiere GPX...</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Abbrechen</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation>Importieren…</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation>Importiert: %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>osmChange importieren</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>NGT importieren</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>NMEA importieren</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation>Bing Straßen-Erkennung</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation>Bekomme keine Ausgabe.</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation>keine gültigen Daten.</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation>Kann die Ausgabe nicht interpretieren.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation>Den leeren Änderungskommentar verwenden?</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation>Der Kommentar zum Änderungssatz ist leer. Es wird als eine Höflichkeit gegenüber Ihren Mitmappern angesehen, einen guten Kommentar abzugeben, so dass jeder weiß, was Ihre Änderung bewirkt und welche Absicht die Änderung hat. +Möchten Sie trotzdem leere Änderungssatzkommentare übertragen?</translation> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Ungültig</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation>Kein Fix</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation>Keine Zeitangabe</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>Meter</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>Nicht verfügbar</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation>Fix OK</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>Fehler in GPS-Aufzeichnung</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>GPS-Logdatei %1 kann nicht erstellt werden.</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation>Verbindung zu %1:%2 nicht möglich</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>Fehler in GPS-Aufzeichnung</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>GPS-Logdatei %1 kann nicht erstellt werden.</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>Beschriftung</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99° 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Längengrad</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Höhe</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 Meter</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation>Satellitenzahl</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Fix-Typ</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Ungültig</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Geschwindigkeit</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Breitengrad</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>Ungültiger Ergebnisdatenstrom!</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation>Symbolleisten anpassen</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation>Aktionen</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation>Symbolleisten</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>Neu</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Entfernen</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>Umbenennen</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation>Alles wiederherstellen</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Anwenden</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Abbrechen</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation>Hoch</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation>Herunter</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation>Aktuelle Aktionen</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation>< T R E N N E R ></translation> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation>Eigene Symbolleiste</translation> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Formular</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation>Landnutzung</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Mitglieder</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation>Ausgewählte Mitglieder entfernen</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>Merkmale</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation>"source" Merkmal hinzufügen</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation>Ausgewählte(s) Merkmal(e) löschen</translation> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Formular</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>ID</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>Merkmale</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation>"source" Merkmal hinzufügen</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation>Ausgewählte(s) Merkmal(e) löschen</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>…</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Keine Satelliten</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation>Ergebnis</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation>Kein Ergebnis</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Auswahl</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Schlüssel</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Wert</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Name</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>ID</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation>Abfrage</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation>Max. Resultate (0=Alle)</translation> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation>Ebene aktualisieren</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Schließen</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Stile</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Stile</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Zu Openstreetmap hochladen</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation>Kommentar</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation>Ein guter Kommentar sollte die Änderung prägnant und angemessen beschreiben.</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation>Folgende Änderungen sollen übermittelt werden:</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation>Hinzugefügt</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation>Aktualisiert</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation>Gelöscht</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation>Wege</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation>Punkte</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation>Relationen</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation>Insgesamt</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Abbrechen</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>TMS-Server einrichten</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>TMS-Server</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Serverliste:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Name:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Server-URL:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>Services abrufen</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>Services :</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation>Dies ist ein Standard-TMS-Server.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projektion:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Mercator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>Breite/Länge (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation>Ursprung ist unten links</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation>Kachelgröße:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation>Min. Zoom:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation>Max. Zoom:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation>Wert für "source" Merkmal:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>URL der Lizenz:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Anwenden</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Hinzufügen</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Entfernen</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation>Merkaartor: GetServices</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>Adresse und Pfad dürfen nicht leer sein.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation>Fehler beim laden des Dienstes. Der Server unterstützt diese Funktion vermutlich nicht. +</translation> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Schlüssel</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Wert</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation>Schlagwort-Editor</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation>Ein Schlagwort mit diesem Namen existiert bereits.</translation> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>Hinzufügen...</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Formular</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation>OR</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>AND</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation>NOT</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation>is</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation>isoneof</translation> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Undefiniert</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Undefiniert</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation>Gebäudeunterteilung</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation>Keine Hausnummern</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>Anzahl der Häuser</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>Hausnummern hinzufügen (Karlsruher Schema)</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation>Bereiche</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>Zum Beispiel "1-9;15-17;19,19A"</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation>Muster</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Alle Nummern</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>ungerade Nummern</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>gerade Nummern</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation>Zusätzlich können sie einen Punkt der Fläche auswählen. Die Haus-Nummerierung wird dort beginnen.</translation> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Auszug - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation>Anzahl GPS-Spur-Segmente</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Gesamtdistanz</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Gesamtdauer</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1h %2m</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Zeichnungsebene extrahieren</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Schließen</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>Punkt</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Breitengrad</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Längengrad</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>ID</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Merkmale</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation>"source" Merkmal hinzufügen</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation>Ausgewählte(s) Merkmal(e) löschen</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>…</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Website</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Kennwort</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Benutzername</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Proxy verwenden</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Löschen</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>WMS-Server einrichten</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>WMS-Server</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Serverliste:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Name:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Server-URL:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Ebenen:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation>Titel</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projektion:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation>Kacheln</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>Zoomstufen</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>Bildformat:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Stile:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation>Wert für "source" Merkmal:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>URL der Lizenz:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Anwenden</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Hinzufügen</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Entfernen</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: GetCapabilities</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>Adresse und Pfad dürfen nicht leer sein.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation>Unbenannte Ebene</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation>Ohne Titel</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation>Dies ist ein zwischenspeichernder WMS-Server.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation>Konnte keine Verbindung zum WMS-Server %1 herstellen.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation>Netzwerk-Timeout</translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_en.ts b/translations/merkaartor_en.ts new file mode 100644 index 0000000..b5bd223 --- /dev/null +++ b/translations/merkaartor_en.ts @@ -0,0 +1,7336 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="en"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/translations/merkaartor_es.ts b/translations/merkaartor_es.ts new file mode 100644 index 0000000..3cd4f0c --- /dev/null +++ b/translations/merkaartor_es.ts @@ -0,0 +1,7368 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="es" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>Acerca de Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>Este programa está licenciado bajo la Licencia Pública GNU v2</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Versión de Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Versión de Qt</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>Versión de GDAL</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Registro de cambios</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>Aceptar</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Descripción</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Atajo</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Importar</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Exportar</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>Pre&determinado</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&Aceptar</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Cancelar</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Editor de Atajos</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Cargar esquema de Atajo</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Esquema de atajos Merkaator (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Imposible abrir archivo</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 no pudo ser abierto</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>Guardar esquema de Atajos</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>sin nombre</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Todos los archivos (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>No se puede abrir el archivo</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 no pudo ser abierto para su escritura.</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation>Lo siento, no sé como construir un puente desde ESO. Por favor, dame solo dos nodos.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation>Convertir segmento a puente</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation>El segmento seleccionado ya está marcado como puente/túnel. Por favor, asegúrese que sabe lo que está haciendo.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Sin descripción</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Formulario</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Formulario</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation>Precisión (metros/segmento)</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation>Tipo</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation>Círculo plano</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation>Izquierda</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation>Derecha</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Deshacer</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Centrar mapa</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>Centrar mapa y hacer zoom</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Deshacer</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Limpieza</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>AÑADIR carretera %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>Añadir Puntodepista %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>AÑADIR relación %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>ACTUALIZAR punto de ruta %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>ACTUALIZAR relación %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>ACTUALIZAR ruta %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>REMOVER punto de vista %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>REMOVER ruta %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>ELIMINAR relación %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Error cargando la petición de subida</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Compruebe su nombre de usuario y contraseña en el menú Preferencias</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Hubo un error al subir ésta petición (%1) +El mensaje del servidor es '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +El mensaje de la API es '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Subiendo cambios...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>ABRIR cambios</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>CERRAR cambios</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Error cargando la petición de subida</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Compruebe su nombre de usuario y contraseña en el menú Preferencias</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Hubo un error al subir ésta petición (%1) +El mensaje del servidor es '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +El mensaje de la API es '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>Comprobando cambios...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>ABRIR cambios</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>CERRAR cambios</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation>Un error desconocido ha ocurrido. Puede que ya esté cerrado o se cerrará automáticamente. Si desea asegurarse, por favor, </translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>AÑADIR relación %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>AÑADIR carretera %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>Añadir Puntodepista %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>ACTUALIZAR relación %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>ACTUALIZAR ruta %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>ACTUALIZAR punto de ruta %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>REMOVER punto de vista %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>REMOVER ruta %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>ELIMINAR relación %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>sin nombre</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Capa sucia</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Capa actualizada</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Imágenes de Fondo</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation>Capa Dibujo #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation>Capa Filtro #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>Exportar OSM</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>Exportando OSM...</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>Documento</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Descargar</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Ubicación</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Marcador</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Vista actual</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>Del mapa abajo mostrado (mapa proporcionado por el proyecto OpenStreetMap)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Tambien descargar Pistas GPS</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>Resolver todas las relaciones</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 descarga</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Descargando no resueltos...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>Descargando 'no resueltos' %1 de %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>Analisis no resuelto %1 de %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Analizando...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Analizar XML</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Conflictos desde %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>caminos/relaciones vacios detectados</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Carreteras o relaciones vacías podrían significar errores. +¿Desea marcarlos para su borrado?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Remover caracteristica vacia %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Se han detectado conflictos</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>Esto significa que algunos de los atributos que ha modificado desde su ultima descarga han sido modificadas por alguien mas en el servidor.Los atributos han sido duplicados como "conflicto..." en las capas "conflictos. +Antes de que sea capaz de cargar sus cambios,tendra que combinar manualmente las dos versiones y quitar el primero de la capa "conflictos..."</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Subiendo...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Preparando cambios</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>Esperando respuesta del servidor</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Descargando...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Descargando desde OSM (conectando)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>Código de estado de http inesperado (%1) +El mensaje del servidor es '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +El mensaje de la API es '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Descarga fallida</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Nombre de usuario/contraseña inválido</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>Conflictos no resueltos</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>Resuelva primero los conflictos existentes</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>Descargando puntos de ruta %1-%2</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Descargando puntos</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Descargando %1,%2 (zoom %3)...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Cerrar</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>No se puede borrar</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation>No se puede eliminar la selección porque está fuera del area descargada</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>No se puede eliminar todo</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Exportar</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>¿Qué quieres exportar?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Todos los visibles (i.e. no ocultos)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>Visor</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Seleccionado</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Atributos</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Centrar mapa</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>Centrar mapa y hacer zoom</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Descargar hijos perdidos</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Agregar a seleccion</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Eliminar</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Relaciones</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Todo</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Atributos</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>Solo caracteristicas compatibles con el puerto de vista</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Buscar...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation>Filtro por selección</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>Restablecer</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Diálogo</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Nombre</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Filtro</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Cerrar</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>Configurar filtros</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Filtros</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Lista de filtros</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nombre:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Filtro</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Aplicar</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Añadir</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Eliminar</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>Tiempo de espera de red</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>No se puede leer los detalles de la foto desde el servidor Walking Papers.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Especifique el URL de Walking Papers</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Geo Imágenes</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Centrar mapa</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Eliminar Imágenes</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Copiar nombre de archivo al portapapeles</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Seleccionar siguiente imagen</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>AvPág</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Seleccionar imagen previa</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>RePág</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>Capa de Fotos</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Cargar imágenes geoetiquetadas</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>Elige la capa a la que corresponden las siguientes imágenes:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation>La capa es solo lectura</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Cargando imágenes ...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Abortar carga</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>No existe el fichero</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>No se puede encontrar la imagen «%1».</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Error al abrir "%2": +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Error en la carga de datos EXIF desde "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>Especificar desplazamiento</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>Imágenes en posición más a la:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>fin de la pista</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>Comienzo de la pista</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>hh:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>Sin puntos de ruta</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>Puntos de ruta no encontrados para la imagen "%1"</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss 'segundos'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm 'minutos y' ss 'segundos'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh 'horas,' mm 'minutos y' ss 'segundos'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>¿Imagen incorrecta?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>La imagen "%1" fue tomada %2 antes de que el siguiente punto de ruta fuera grabado. +¿Deseas seguir usándola?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>La imagen "%1" fué tomada %2 después de que el último punto de ruta fuera grabado. +¿Deseas seguir usándolo?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation>Especifique el nombre de archivo</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>Imágenes JPEG (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Error al abrir "%1": +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>Ir A</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Marcador</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation>Coordenadas</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>lonMin, latMin, lonMax, latMax</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>latCent, lonCent, latSpan, lonSpan</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Información</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>Dirección de API OSM</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>Dirección de XAPI OSM</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Buscar</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>Dirección</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>¡La dirección especificada no es válida!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Formato de Coordenadas inválido</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>Formato de las coordenadas: '<left lon>, <botton lat>, <right lon>, <top lat>'</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>Formato de las coordenadas: '<center lat>, <center lon>, <span lat>, <span lon>'</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Ninguno</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>Adaptar forma</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Cerrar</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>Adaptador WMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>Adaptador TMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>Complementos</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Mapa - Ninguno</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Mapa - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Mapa - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>Mapa - WMS-Tiled - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Mapa - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Mapa - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>Términos de Licencia: %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>Términos de Licencia no aceptados</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Servidor</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Tamaño de la tesela</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>Zoom Min/Max</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Proyección</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Diálogo</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>Entrada</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>Vista previa OSM</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Especificaciones</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>La primera linea contiene encabezado</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Delimitador</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Punto y coma (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Tab</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Otro:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Ninguno</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation>Comilla simple (')</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation>Comillas dobles (")</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Campos</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>Lista de Campos:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>Tipo de campo</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Importar</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>Importar rango</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>Desde (0 desde inicio):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>Hasta (0 para fin):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>Cargando opciones...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Guardando configuraciones...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Cadena</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Entero</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>Número Flotante</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Longitud</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Latitud</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Poyeccion invalida</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Sin coordenadas</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Archivo inválido</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 no pudo ser abierto</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1 no es un archivo de configuración de importación CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>sin nombre</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Todos los archivos (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 no pudo ser abierto para su escritura.</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Información</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Tamaño</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Atributos</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Mostrar Todos</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Ocultar Todo</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Todos Solo lectura</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Ninguno Solo lectura</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Cerrar</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Capas</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Todo</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>Mapa</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>Trazas</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Formulario</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Visible</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Sólo Lectura</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>Bajo</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>Alto</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>Opaco</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Opacidad</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>Términos de Licencia</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>He leído y acepto los términos de licencia</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>No me pregunte esto de nuevo</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation>%1 v%2 +Cargando plugins...</translation> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation>%1 v%2 +Iniciando...</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>Ay&uda</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Crear</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Editar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>&Ver</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Marcadores</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Archivo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Exportar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>H&erramientas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>E&stilo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Nodo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>&Ventana</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Puertos</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>Carac&terística</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>&Capas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>Rel&ación</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>&Mostrar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>Barra de herramientas principal</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>&Salir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>&Acerca de</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>&Abrir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Crear un documento nuevo e importar un archivo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>Zoom &todo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>Zoom &ventana</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>Hacer zoom a la ventana</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>A&lejar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>A&cercar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Acercar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Enlace curvo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Deshacer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>&Rehacer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>&Mover</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Importar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Importar un fichero en el documento actual</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Descargar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Descargar datos de mapa para un área nueva</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Enlace</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Crear enlace</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Seleccionar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>&Cargar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Subir cambios al servidor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>&Eliminar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Eliminar características seleccionadas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Crear nuevo nodo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>&Revertir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Crear rotonda</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Nuevo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>&Partir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>&Unir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>&Separar en dos partes</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Romper</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>Re&lación</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Crear relación</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>Áre&a</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Crear área nueva</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Exportar todas las capas visibles a un archivo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Encontrar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Encontrar y seleccionar elementos</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>Exportar las características en pantalla a un fichero</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>Co&mbinar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Combinacion de Nodo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>Combinar los nodos seleccionados (el primero permanecerá seleccionado)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Guardar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Descargar más</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Descargar más datos de mapa para el área catual</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Propiedades</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>&Información</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>&Alinear</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Alinear nodos</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>Alinear nodos seleccionados.Los dos primeros seleccionados dan la linea</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation>&Propagación</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>&Copiar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>Copiar las características seleccionadas y las etiquetas al portapapeles</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>Copiar las etiquetas de las características seleccionadas al portapapeles; si la característica es un señalizador, copiar también las coordenadas.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Pegar Etiquetas (&Reescribir)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>Pegar (y sobreescribir) las etiquetas en el portapapeles a la funcion seleccionada</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>Pegar Etiquetas (&Combinar)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Pegar Etiquetas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>Pegar etiquetas desde el portapapeles (Combinar con etiquetas existentes)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>Combinar las marcas en el portapapeles con las de la característica seleccionada.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Pegar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Pegar caracteristicas desde el portapapeles</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>Pegar las caracteristicas en el portapapeles; si las caracteristicas ya estan en el documento, reescribalas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Confirmar característica en la capa temporal</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>Capa de &imagen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>&Raster/SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>&Iniciar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>Iniciar GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>Reproducir GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>D&etener</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>Detener GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>&Centrar en GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>Mostrar retoque</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Grabar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>Grabar GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Pausar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>Pausar GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>G&eoImagen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>&Añadir miembro</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>Elimina&r miembro</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>&Nunca</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>&Siempre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>&Detalle</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>E&stilos</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation>Importar archivo en el documento actual usando GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Cámara</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Rotar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation>&Polígono</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Atributos</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>&Subdividir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation>Subdividir segmento de forma equitativa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>&Fijar zoom al mosaico del fondo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Cerrar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>S&implificar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>&Ninguno</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>&Terraza</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Propiedades...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation>Cor&tar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>Escalar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Descargar hijos perdidos</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation>&Puente</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>Borrar etiqueta «%1» en %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Eliminar miembro '%1' en %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>Relacion Modificada %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Crear área %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Area: Crear camino %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Añadir un agujero.</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>¿Desea añadir un agujero (u otro) a este área?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Area: Terminar Camino %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Area: Añadir nodo %1 a camino %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>Cerrar Área %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>CLICK IZQUIERDO para inciar;ARRASTRAR para escalar;SHIFT+ARRASTRE para rotar;CLICK IZQUIERDO para terminar</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Crear rotonda %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Eliminar característica %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>Eliminar características</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Eliminar Infantes.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>CLICK IZQUIERDO para seleccionar;ARRASTRE IZQUIERDO para mover</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>Encontrados varios nodos en la misma posición.</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>¿Desea combinar todos los nodos en el punto de reunión?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Combinar nodos en %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>Click-izquierdo a la primera esquina -> Arrastre-izquierdo al area especifica ->Click izquierdo para ampliar</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>Formato GPS Exchange (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>Formato OpenStreetMap (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Formato Noni GPSPlot (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>formato de registro NMEA GPS (*.nmea *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>Archivo KML (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>Formato separado por comas (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Imágenes geoetiquetadas (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>Archivo de forma ESRI (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Formatos soportados</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Documento Merkaartor (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Todos los archivos (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>mosaico %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>Bajo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>Alto</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>Opaco</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Característica</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Nodo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Relación</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Cargar imagen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>Agregar posicion del nodo a la imágen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Cancelar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>Archivo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Editar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>Vista</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>Mostrar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Capas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Crear</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Dirección</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Herramientas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>Ventanas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Ayuda</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Contenido inválido en el portapapeles</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>Portapapeles no contiene datos validos</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation>GDAL advertencia de importación</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation>Importar archivo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Cambios no guardados</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>El mapa actual contiene cambios no guardados que serán perdidos al empezar uno nuevo. +¿Deseas cancelar o quieres continuar y descartar los cambios?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation>Cambios de Estilos no guardados</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation>Se ha modificado el estilo actual +¿Desea guardar sus cambios?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Puntos de referencia</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>Traza %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Enorme advertencia de copyright</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Estás intentando importar un archivo KML. Ten en cuenta que: + + - No puedes importar a OSM un archivo KML creado por Google Earth. Aunque creas + que los nodos que has creado desde GE son tuyos, ¡no lo son! + Todavía hay trabajo derivado por parte de GE, y por lo tanto, no puede ser usado en OSM. + + - Si lo has descargado desde internet, hay posibilidades de que tenga copyright. + Tienes que estar absolutamente seguro de que usar esos datos en OSM está permitido por el autor, o + que los datos son de dominio público + +Si no estás seguro, deberías preguntar en las listas "legal" o "talk" de correo de openstreetmap. + +¿Estás absolutamente seguro de que este KML puede ser importado legalmente en OSM?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>Archivo no válido</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 no pudo ser abierto</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation>URL de acción desconocida: %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>Detectada versión antigua de Qt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>Tu configuración usa Qt %1, el que contiene varios errores conocidos en subidas de datos a OpenStreetMap que conducen a códigos 401 en las respuestas de los servidores.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>Subir OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Parece que no has especificado todavía tu +nombre de usuario y contraseña OpenStreetMap +¿Deseas hacerlo ahora?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Error descargando</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>El mapa no pudo ser descargado</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Crear polígono</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>Especificar el numero de lados</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Forzar descarga de características</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation>Abrir archivo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Crear Salida</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Intersección múltiple</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>Las vías tienen múltiples intersecciones. +¿Todavía desea crear una unión para cada uno (los cruces no deseados puede ser suprimidos después)?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Añadir números de calles</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>triangular</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>rectangular</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>pentagonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>hexagonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation>heptagonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>octagonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Alinear nodos</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>Separar nodo %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Añadir miembro a la relación</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Eliminar miembro de la relación</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation>Unir areas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>Separar areas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Crear relación %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Guardar estilo de mapa</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Estilo de mapa Merkaartor (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Cargar estilo de mapa</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation>Rehacer Historial</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>sin nombre</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Guardar documento Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Archivos de documentos Merkaartor (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>No se puede abrir el archivo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 no pudo ser abierto para su escritura.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Archivo inválido</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 no es un documento de Merkaartor válido</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>Export arOSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>Archivos OSM (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>Exportar osmChange</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>Archivos osmChange (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Exportar GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>Archivos GPX (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Exportar KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>Archivos KML (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (entero)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Añadir marcador</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Especificar el nombre del marcador</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Nombre de marcador inválido</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>El marcador no puede estar en blanco.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Aviso: El nombre del Marcador ya existe</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Introducir uno nuevo, mantener el mismo para sobreescribir o cancelar.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Eliminar Marcador</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Seleccionar el marcador a eliminar.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Poyeccion invalida</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>No se puede estabecler proyección "%1"</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>Error del GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>Incapaz de abrir el puerto GPS.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>Abrir archivo de registro NMEA</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>Guardar plantillas de etiquetado</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Plantillas de etiquetas Merkaartor (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>Plantillas de Etiqueta Abierta</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>Conflictos no resueltos</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>Resuelva primero los conflictos existentes</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Se recomienda encarecidamente guardar los cambios en el documento tras una carga. +¿Desea hacerlo ahora?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>Ultimo: </i><b>%1</b&gt; by <b>%2</b&gt;</translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>Ultimo: </i><b>%1</b&gt;</translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>layer: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation>Navegar</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Punta de referencia</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>coordenada</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>descripción</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>comentario</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Nodo</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>elevación</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>velocidad</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>tamaño</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>miembros</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>Arriba a la izquierda</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>Botright</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Relación</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Rol</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Miembro</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Longitud</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Tamaño</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>nodos %1</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Área</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Dirección</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation>Recuadro delimitador</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Proyección</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Nuevo marcador</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>Preferencias de carga</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Duplicar clave</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Más de 150 preferencias</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation>Error de comunicación</translation> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Nuevo Servidor</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Formulario</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>Etiquetas</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>Elementos seleccionados</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation>Clase</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Nombre</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Campo desconocido.</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>¡Error!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>Nombre del servicio de busqueda necesita autentifcacion</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Formulario</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>Nombre de archivo de salida</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>sin nombre</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation>Archivos PDF (*.pdf)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Todos los archivos (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Archivos de imagen (*.png *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>Archivos SVG (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation>Opciones</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>min lat/Lon</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>máx lat/Lon</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation>Mostrar Nodos</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation>Mostrar Relaciones</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>Mostrar Escala</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation>Mostrar Grilla Lat/Lon</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>Exportar a PDF...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>Exportar a SVG...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Formulario</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Usuario:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Editor de estilo de mapa</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Global</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Fondo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation>Nodos</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Espesor proporcional</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>Grosor fijo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>Filtro</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Añadir</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Eliminar</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Duplicar</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>Selección de etiqueta</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>metro/píxel</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>Visible desde arriba</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>Visible desde escala</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Dibujar con color</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Línea discontinua</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>off</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Rellenar área</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Borde</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation>Interior</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation>Exterior</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>Retocar</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Dibujar pasos</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Dibujar icono</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Etiqueta</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Tipografía</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Marcar etiqueta</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Halo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Área</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Dibujar con color de fondo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Etiqueta con marca de fondo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Siempre</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Seleccionar color</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>Etiqueta de texto</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>Obtener información desde código de barras (Walking Papers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>Ignorar</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>Hacerlo para todas las fotos actuales</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Diálogo</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>Nombre de archivo de salida</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>sin nombre</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>Archivos SVG (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Todos los archivos (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Archivos de imagen (*.png *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Preferencias</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>Visual</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>General</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Opacidad baja/alta</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>Interacción con un solo botón del ratón</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>Utilizar estylo Qt personalizado</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>relaciones seleccionables mientras esta oculto</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Colores</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Fondo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>Sobreescribir stilo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>pista GPX</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>Píxeles</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Interface</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Resaltado</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Relaciones</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Enfocar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Resaltar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation>Sucio</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Sitio</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Utilizar idioma</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>Traducir las etiquetas estándar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation>Opciones</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Estilo de mapa</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Directorio de estilos personalizados</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Estilo Actual</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Plantilla</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>Plantilla de etiqueta</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Predefinidos</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Personalizado</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Datos</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Documentos</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation>Documento de plantilla cargado automáticamente</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Guardar documentos automáticamente después de cargarlos</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>Trazas</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>Entrada GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>Serie</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Puerto</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Alojamiento (servidor)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>Guardar registro NMEA</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>Establecer el tiempo del sistema en el GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Red</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Ajustes de proxy</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Contraseña:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Usuario:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Puerto:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Host:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Adaptador de Mapa</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Herramientas</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Nombre:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Ruta:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Aplicar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Añadir</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Eliminar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Inglés</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Árabe</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation>Croata</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Checo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Holandés</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Alemán</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Francés</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>Húngaro</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Italiano</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>Japonés</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Polaco</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Ruso</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Español</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Sueco</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Ucraniano</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Merkaartor plantilla de etiqueta (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Seleccionar color</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>La herramienta ya existe</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Ya existe una herramienta con este nombre. +Por favor elija otro nombre o haga clic en el boton <Aplicar> si quiere modificar el existente</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>No se puede eliminar una herramienta preconfigurada</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>No se puede eliminar la herramienta preestablecida «%1»</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>No se puede modificar el nombre de una herramienta preconfigurada</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>No se puede modificar el nombre de la herramienta preconfigurada «%1»</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>Seleccionar herramienta ejecutable</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation>Seleccionar plantilla</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation>Documento Merkaartor (*.mdc)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>Seleccionar el directorio de registros</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>Proyecciones</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nombre:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>cadena PROJ4</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Aplicar</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Añadir</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Eliminar</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation>Documento</translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Diálogo</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation>Predefinido</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation>Cadena WKT inválida</translation> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Propiedades</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 elemento(s) seleccionado(s)</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 elemento(s) seleccionado(s)</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Elementos seleccionados</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Propiedades - elementos multiples</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Propiedades - Nodo</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Propiedades - Relacion</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Propiedades</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation>Error leyendo el archivo de plantilla</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Centrar mapa</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>Centrar mapa y hacer zoom</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Seleccionar miembro</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Limpieza en cascada</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>Mover nodo %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation>Exportando GPX...</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Cancelar</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation>Importando...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation>Importado: %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>Import osmChange</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>Importar NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>Importar NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation>No se puede obtener la salida.</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation>Datos inválidos</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation>No se puede parsear la salida.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Inválido</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>Metros</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>No disponible</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>Error de registro GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Incapaz de crear archivo de registro GPS: %1.</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>Error de registro GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Incapaz de crear archivo de registro GPS: %1.</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>Etiqueta de texto</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Longitud</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Altitud</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 metros</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation># Satélites</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Fijar tipo</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Inválido</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Velocidad</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Latitud</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>¡Flujo de resultados incorrecto!</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation>Personalizar Barra de Herramientas</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation>Acciones</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation>Barra de Herramientas</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>Nuevo</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Eliminar</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>Renombrar</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation>Restaurar todo</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>Aceptar</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Aplicar</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Cancelar</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation>Arriba</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation>Abajo</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation>< S E P A R A D O R ></translation> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Formulario</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Miembros</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>Etiquetas</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Formulario</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Identificador</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>Etiquetas</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Sin satélites</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Selección</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Clave</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Valor</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Nombre</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Identificador</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation>Consulta</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation>Actualizar capa</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Cerrar</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Estilos</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Estilos</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Subir a Openstreetmap</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation>Comentario</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation>Agregado</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation>Actualizado</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation>Eliminado</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation>Vías</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation>Nodos</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation>Relaciones</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation>Suma</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>Aceptar</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Cancelar</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>Configuración de los servidores TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>Servidores TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Lista de servidor:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nombre:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>URL del servidor:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>Obtener Servicios</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>Servicios :</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Proyección:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Mercator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>Lat/Lon (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation>Máximo zoom:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>URL de Licencia:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Aplicar</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Añadir</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Eliminar</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation>Merkaartor: Obtener Servicios</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>Dirección y ruta no pueden estar vacíos.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation>Error leyendo servicios. El servidor probablemente no soporta ésta función. +</translation> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Clave</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Valor</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>Editar esto para añadir...</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Formulario</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>AND</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Indefinido</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Indefinido</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>Número de casas</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>Añadir Casa de Numeración (régimen de Karlsruhe, Alemania)</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation>Rangos</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>Por ejemplo "1-9;15-17;19,19A"</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation>Patrón</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Todos los números</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>Números impares</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>Números pares</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Extraer - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation># de los segmentos de la pista</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Distancia total</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Duración total</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1h %2m</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Extraer capa de dibujo</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Cerrar</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>Punto de ruta</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Latitud</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Longitud</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Identificador</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Etiquetas</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Diálogo</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Sitio Web</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Contraseña</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Nombre de usuario</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Utilizar proxy</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Puerto</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Limpiar</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>Configurar servidores WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>Servidores WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Lista de servidor:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nombre:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>URL del servidor:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Capas:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation>Título</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Proyección:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>Niveles de Zoom</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>Formato de imagen:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Estilos:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>URL de Licencia:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Aplicar</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Añadir</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Eliminar</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: Tener Capacidades</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>Dirección y ruta no pueden estar vacíos.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation>Capa sin nombre</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation>Sin título</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_fi.ts b/translations/merkaartor_fi.ts new file mode 100644 index 0000000..c759cec --- /dev/null +++ b/translations/merkaartor_fi.ts @@ -0,0 +1,7368 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="fi" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>Tietoja Merkaartorista</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation>PROJ:n versio</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>Tämä ohjelmisto on GNU General Public License v2 -lisenssin alainen.</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Merkaartorin versio</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Qt:n versio</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>GDAL:n versio</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation>Tekijänoikeus Bart Vanhauwaert, Chris Browet, Ladislav Láska ja muut, 2006-2021</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Muutoshistoria</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>OK</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Kuvaus</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Pikanäppäin</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Vie</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Tuo</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>&Oletus</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Peruuta</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Merkaartor shortcut scheme (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Tiedostoa ei voi avata</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>nimetön</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Kaikki tiedostot (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Tallennetun tiedoston avaaminen epäonnistui</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation>Sillanrakentaja</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation>En tiedä miten tuosta rakennetaan silta. Määritä vain kaksi solmua.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation>CadastreBrowser</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation>Tiedosto</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation>Lopeta</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation>Ladattu: %1/%2 +Jäljellä oleva aika: %3:%4</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation>Ladattu: %1/%2 +Jäljellä oleva aika: %3:%4:%5</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation>Ladattu: %1/%2</translation> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Ei kuvausta</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation>Tarkkuus (metriä/segmentti)</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation>Tyyppi</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation>Liikenneympyrä</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Kumoa</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Keskitä kartta</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Kumoa</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>LISÄÄ tie %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>LISÄÄ piste %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>LISÄÄ relaatio %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>PÄIVITÄ piste %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>PÄIVITÄ relaatio %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>PÄIVITÄ tie %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>POISTA piste %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>POISTA tie %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>POISTA relaatio %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Virhe lähettäessä pyyntöä</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Pyynnön lähettämisessä tapahtui virhe (%1) +Palvelimen viesti on '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Lähetetään muutoksia…</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Virhe pyynnön lähettämisessä</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Pyynnön lähettämisessä tapahtui virhe (%1) +Palvelimen viesti on '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation>Pyynnön lähettämisessä tapahtui virhe (%1) +”%2” +Lataa ongelmallinen kohde uudelleen selvittääksesi konfliktin.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>LISÄÄ relaatio %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>LISÄÄ tie %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>LISÄÄ piste %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>PÄIVITÄ relaatio %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>PÄIVITÄ tie %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>PÄIVITÄ piste %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>POISTA piste %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>POISTA tie %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>POISTA relaatio %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>nimetön</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Lähetetty taso</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>OSM-vienti</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>Dokumentti</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Lataa</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Sijainti</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Kirjanmerkki</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Nykyinen näkymä</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation>WWWW-osoite (OSM/Google Maps)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation>Xapi-valitsin</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Lataa myös raa'at GPS-jäljet</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 lataus</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Jäsennetään…</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Jäsennetään XML:ää</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Poista tyhjä kohde %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Lähetetään…</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>Odotetaan palvelimen vastausta</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation><numerusform>Ladataan OSM:stä (%n tavu)</numerusform><numerusform>Ladataan OSM:stä (%n tavua)</numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation><numerusform>Ladataan OSM:stä (%n kt)</numerusform><numerusform>Ladataan OSM:stä (%n kt)</numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Ladataan…</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Ladataan OSM:stä (yhdistetään)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Lataaminen epäonnistui</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Virheellinen käyttäjätunnus/salasana</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>Ladataan pisteitä %1-%2</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation>MapDust</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Ladataan pisteitä</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Ladataan %1,%2 (laajuus %3)…</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Sulje</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation>Valittua ei voida poistaa, koska se on ladatun alueen ulkopuolella.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation>Koko valittua ei voida poistaa, koska osa siitä on ladatun alueen ulkopuolella. +Poistetaanko se, mitä voidaan?</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation>Käännä polku %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Vie</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>Mitä haluat viedä?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Valittu</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Kohteet</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Keskitä kartta</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Lataa puuttuvat lapset</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Poista</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Relaatiot</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation>Polut</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation>Pisteet</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Kaikki</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Kohteet</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Hae...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Nimi</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Suodata</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>…</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Sulje</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nimi:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Käytä</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Lisää</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Poista</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation>Arvo:</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation>Tiedostonimi</translation> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Määritä Walking Papersin URL-osoite</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>URL-osoite:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Paikkakuvat</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Keskitä kartta</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Poista kuvat</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Kopioi tiedostonimi leikepöydälle</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>Tallenna paikkamerkitty kuva…</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Lataa paikkamerkityt kuvat</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Keskeytä lataus</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>tt:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss 'sekuntia'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>Väärä kuva?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>JPEG-kuvat (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Virhe avattaessa "%1": +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation>Lataa kuva...</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation>Avaa GeoTIFF-tiedostot</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation>Arvo:</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation>Tiedostonimi</translation> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Kirjanmerkki</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation>WWW-linkki (OSM/ Google Maps)</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation>Koordinaatit</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>lonMin, latMin, lonMax, latMax</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>latCent, lonCent, latSpan, lonSpan</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>OSM API Url-osoite</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>OSM XAPI-URL-osoite</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>Virheellinen OSM-osoite</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>Määritetty osoite on virheellinen!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Virheellinen koordinaattimuoto</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Ei mitään</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Sulje</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>WMS-sovitin</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>TMS-sovitin</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>Liitännäiset</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Kartta – Ei mikään</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Kartta – WMS – %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Kartta – WMS-C – %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>Kartta – WMS-Tiled – %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Kartta – TMS – %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Kartta – %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>Lisenssiehdot: %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>Lisenssiehtoja ei hyväksytty</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation>Et ole hyväksynyt lisenssiehtoja valitsemalla valintalaatikon. +Tämän takia et voi käyttää tätä lähdettä karttatasona. +Onko tämä se, mitä halusit tehdä?</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Palvelin</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Palan koko</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>Vähimmäis-/enimmäissuurennos</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Projektio</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>OSM-esikatselu</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation>Pilkku (,)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Puolipiste (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Välilehti</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Muu:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Ei mitään</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation>Heittomerkki (')</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation>Lainausmerkki (")</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Kentät</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>Kenttälista:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>Kenttänimi (=tagin avain):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>Kenttätyyppi:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Tuo</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Tallenna asetukset…</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Merkkijono</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Kokonaisluku</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>Liukuluku</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Pituuspiiri</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Leveyspiiri</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Virheellinen projektio</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Ei koordinaatteja</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>Leveys- tai pituuspiirikenttä puuttuu. Tiedoston tuonti ei ole mahdollista. +Haluatko varmasti lopettaa?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>Lataa CSV-tuontiasetukset</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Merkaartorin tuontiasetukset (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Virheellinen tiedosto</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>nimetön</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Kaikki tiedostot (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation>Projektion asettaminen epäonnistui; määritä projektio</translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Koko</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation>%n kohdetta</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Kohteet</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Näytä kaikki</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Piilota kaikki</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Sulje</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Tasot</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Kaikki</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>Kartta</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>Piirrä</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>Jäljet</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation>Palauta tasot oletuksiksi</translation> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Näkyvä</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Vain luku</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>Alhainen</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>Korkea</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>Läpinäkymätön</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Peittävyys</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation>Tasolla on muutettuja kohteita. +Oletko varma että haluat sulkea sen? (Kumoaminen ei ole mahdollista.)</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>Lisenssiehdot</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>Olen lukenut ja hyväksyn lisenssiehdot</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Älä kysy tätä uudelleen</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation>%1 v%2 +Ladataan lisäosia…</translation> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation>%1 v%2 +Käynnistetään…</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>&Ohje</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Uusi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Muokkaa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>Nä&kymä</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Kirjanmerkki</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Tiedosto</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Vie</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>T&yökalut</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>&Tyyli</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Piste</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>I&kkuna</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Paneelit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>&Kohde</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>T&asot</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>&Relaatio</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>&Näytä</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation>&Projektio</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>Lopeta</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>&Tietoja</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>Avaa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Kumoa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>Tee &uudelleen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>&Siirrä</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Tuo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Lataa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Lataa karttatiedot uudelle alueelle</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Linkki</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Luo linkki</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Valitse</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>&Lähetä</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Lähetä muutokset palvelimelle</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>Poista</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Poista valitut kohteet</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation>Polku</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation>Luo uusi polku</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation>Uusi dokumentti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation>&Muokkaa…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation>Tallenna &nimellä…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation>&Asetukset…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation>&Kaikki…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation>&Etsi…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation>&Lisää…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation>&Poista…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation>&Ladatut alueet</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation>Valittu…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation>OSM (binaarinen)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation>Piilota/näytä työkalupalkki</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation>Piilota/näytä työkalupalkki</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation>Piilota kaikki</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation>Näytä kaikki</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation>&Pisteet</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation>Nimet</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation>&Relaatiot</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation>&Tallenna…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation>&Kuvat kartalla</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation>&Tulosta…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation>Tulostuksen esikatselu…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation>Tallenna mallinetiedostoksi…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Luo uusi piste</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation>&Liikenneympyrä</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Luo liikenneympyrä</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Uusi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>&Yhdistä</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>Relaatio</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Luo relaatio</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>&Alue</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Luo uusi alue</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Vie kaikki näkyvät tasot tiedostoon</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Tallenna</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Lataa lisää</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Lataa lisää karttatietoa tälle alueelle</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Ominaisuudet</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>&Kopioi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Liitä tageja (&korvaa)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>Liitä (ja ylikirjoita) leikepöydällä olevat tagit valittuun kohteeseen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>Liitä tageja (&yhdistä)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Liitä tageja</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>Liitä tagit leikepöydältä (yhdistä olemassaoleviin tageihin)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Liitä</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Liitä kohteita leikepöydältä</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>Liitä kohteita leikepöydältä; jos kohteet ovat jo kartalla, ylikirjoita ne.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>&Aloita</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>Aloita GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>Pysäytä GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>&Keskitä GPS-sijaintiin</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>Tallenna GPS-jälki</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>&Lisää jäsen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>&Poista jäsen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>Tyylit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Kamera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Käännä</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation>&Monikulmio</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Kohteet</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>OsmChange (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Sulje</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation>Erota alue kahden solmun väliltä</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Ominaisuudet…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>Skaalaa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation>GDAL SQLite/SpatiLite</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation>Valitse vanhemmat</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Lataa puuttuvat lapset</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation>&Silta</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Poista jäsen %1 kohteesta %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Luo alue %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Alue: Luo tie %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Haluatko lisätä alueeseen aukon?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>Sulje alue %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation>Luo monikulmio %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Luo liikenneympyrä %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation>Luo polku %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation>Luo piste: %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Poista kohde %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>Poista kohteet</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation>Haluatko poistaa myös lapsisolmut? +Huomaa, että ladatun alueen ulkopuolella olevat OSM-solmut säilyvät.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation>Käännä kohdetta</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>GPS Exchange -muoto (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>OpenStreetMap-muoto (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation>OpenStreetMap muutosmuoto (*.osc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Noni GPSPlot -muoto (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>NMEA GPS -logimuoto (*.nmea *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>KML-tiedostot (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>Pilkuilla erotettu (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Paikkamerkityt kuvat (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>ESRI Shapefile (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation>Geography Markup Language (*.gml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation>Protobuf Binary Format (*.pbf) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Tuetut muodot</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Merkaartor-tiedosto (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Kaikki tiedostot (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>Läpinäkymätön</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Kohde</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Piste</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Relaatio</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Lataa kuva</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Peruuta</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>Tiedosto</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Muokkaa</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>Näkymä</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>Näytä</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Tasot</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Luo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Polku</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Työkalut</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>Ikkunat</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Ohje</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>Leikepöytä ei sisällä kelvollista tietoa.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation>Tuo tiedosto</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Tallentamattomat muutokset</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>Nykyinen kartta sisältää tallentamattomia muutoksia, jotka häviävät uutta aloitettaessa. +Haluatko peruuttaa uuden kartan aloittamisen vai jatkaa ja hylätä aiemmat muutokset?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation>Tallentamattomat tyylimuutokset</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation>Olet muokannut nykyistä tyyliä. +Haluatko tallentaa muutokset?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Reittipisteet</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>Jälki %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Tosi iso tekijänoikeusvaroitus</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Yrität tuoda KML-tiedostoa. Huomaathan, että: + + - Et voi tuoda OSM:ään Google Earthista luotua KML-tiedostoa. Vaikka saatat kuvitella, että + GE:stä luomasi solmut olisivat sinun, ne eivät ole! + Ne ovat silti GE:n johdannaistöitä, eikä niitä voida käyttää OSM:ssä. + + - Jos latasit sen Internetistä, on mahdollista että se on tekijänoikeuden alainen. + Olethan ehdottoman varma että tiedon käyttämiseen OSM:ssä on tekijän lupa tai + että tieto on tekijänoikeudetonta. + +Jos olet epävarma, kysy neuvoa OpenStreetMapin legal- tai talk-postituslistoilta. + +Oletko ehdottoman varma, että tämä KML-tiedosto voidaan laillisesti tuoda OSM:ään?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>Lähetä OSM:ään</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Et ole syöttänyt OpenStreetMapin +käyttäjätunnustasi ja salasanaasi. +Haluatko tehdä tämän nyt?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Virhe ladattaessa</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>Kartan lataaminen epäonnistui</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation>MapDustin virheiden lataaminen epäonnistui</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Luo monikulmio</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation>Avaa tiedosto</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation>Yhdistä polut</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>kolmikulmainen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>suorakulmainen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>viisikulmainen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>kuusikulmainen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>kahdeksankulmainen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Poista jäsen relaatiosta</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation>Liitä alueita</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>Erota alue</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Luo relaatio %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Tallenna karttatyyli</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Merkaartorin karttatyyli (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Lataa karttatyyli</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation>Merkaartorin karttatyyli (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation>MapCSS-tyylitiedosto (*.css)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>nimetön</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Tallenna Merkaartor-tiedosto</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Merkaartor-tiedosto (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation>Tallenna Merkaartor-mallinetiedosto</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Virheellinen tiedosto</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>Vie OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>OSM-tiedostot (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>Vie osmChange</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>osmChange-tiedostot (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Vie GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>GPX-tiedostot (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Vie KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>KML-tiedostot (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Lisää kirjanmerkki</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Määritä kirjanmerkin nimi.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Virheellinen kirjanmerkin nimi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>Kirjanmerkki ei voi olla tyhjä.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Varoitus: Kirjanmerkin nimi on jo käytössä</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Poista kirjanmerkki</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Valitse poistettava kirjanmerkki</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Virheellinen projektio</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>GPS-virhe</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Merkaartor tag templates (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Tiedoston muutosten tallentaminen lähettämisen jälkeen on erittäin suositeltavaa. +Haluatko tehdä tämän nyt?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation>Luo piste %1</translation> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b> </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Reittipiste</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>kuvaus</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation>WGS84-koordinaatit</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>kommentti</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Piste</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>korkeus</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>koko</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>jäsenet</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Relaatio</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Rooli</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Jäsen</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Pituus</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Koko</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Alue</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Polku</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation>%1ms</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>Näytä</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Projektio</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Uusi kirjanmerkki</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Uusi palvelin</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation>Käyttöehdot</translation> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>Tagit</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Nimi</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Tuntematon kenttä</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Virhe!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>nimetön</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation>PDF-tiedostot (*.pdf)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Kaikki tiedostot (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Kuvatiedostot (*.png *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>SVG-tiedostot (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation>Näytä pisteet</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation>Näytä relaatiot</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation>Näytä leveys-/pituusruudukko</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation>300</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation>600</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation>1200</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation>dpi</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>Vie PDF-tiedostoon...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>Vie SVG-tiedostoon...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Käyttäjä:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Karttatyylin muokkain</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation>Pisteet</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Lisää</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Poista</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Monista</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Täytä alue</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Kirjasinlaji</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Alue</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Valitse väri</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>nimetön</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>SVG-tiedostot (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Kaikki tiedostot (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Kuvatiedostot (*.png *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Asetukset</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Yleinen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Värit</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>GPX-jälki</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Relaatiot</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Käytä kieli</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Karttatyyli</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Nykyinen tyyli</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Malli</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation>XAPI</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Tallenna tiedostot automaattisesti lähetyksen jälkeen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>Jäljet</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation>GDAL</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Portti</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>Tallenna NMEA-logi</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Verkko</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Välityspalvelimen asetukset</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation>Käytä välityspalvelinta</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Salasana:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Käyttäjä:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Portti:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Karttasovitin</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Työkalut</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Nimi:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Käytä</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Lisää</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Poista</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Englanti</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Arabia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation>Kiina (Taiwan)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation>Kroaatti</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Tšekki</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Hollanti</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Saksa</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Ranska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>Unkari</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation>Indonesia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Italia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>Japani</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Puola</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Venäjä</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation>Portugali (Brasilia)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Espanja</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Ruotsi</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Ukraina</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation>[less than 50% complete] Kiina</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation>[less than 50% complete] Viro</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation>[less than 50% complete] Suomi</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation>[less than 50% complete] Saksa (Itävalta)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation>[less than 50% complete] Portugali</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation>[less than 50% complete] Slovakki</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation>[less than 50% complete] Vietnami</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Merkaartor tag template (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Valitse väri</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation>Merkaartor-tiedosto (*.mdc)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>Projektiot</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nimi:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Käytä</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Lisää</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Poista</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation>Määritä projektio</translation> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation>WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation>Virheellinen WKT-merkkijono</translation> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Ominaisuudet</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Ominaisuudet – useita elementtejä</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Ominaisuudet – solmu</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Ominaisuudet – relaatio</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Ominaisuudet</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Keskitä kartta</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Valitse jäsen</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Peruuta</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>Tuo osmChange</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>Tuo NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>Tuo NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation>Käytetäänkö tyhjää muutosjoukon kommenttia?</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation>Muutosjoukon kommentti on tyhjä. Kommentin lisääminen on kohteliasta muita kartoittajia kohtaan, jotta muut tietävät mitä muutoksesi tekee ja miksi. +Haluatko silti tallentaa tyhjän muutosjoukon kommentin?</translation> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/t</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>GPS-logitiedoston luominen epäonnistui: %1.</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>GPS-logivirhe</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Pituuspiiri</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Korkeus</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/t</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Leveysaste</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation>Työkalurivit</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>Uusi</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Poista</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>Nimeä uudelleen</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation>Palauta kaikki</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Käytä</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Peruuta</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Jäsenet</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation>Poista valitut jäsenet</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>Tagit</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation>Lisää "source" -tagi</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation>Poista valitut tagi(t)</translation> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Tunniste</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>Tagit</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation>Lisää "source" -tagi</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation>Poista valitut tagi(t)</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation>Nimi</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Valinta</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Avain</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Arvo</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Nimi</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Tunniste</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Sulje</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Tyylit</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Tyylit</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Lähetä Openstreetmapiin</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation>Kommentti</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation>Hyvä kommentti kuvaa muutosta ytimekkäästi ja riittävästi.</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation>Lisätty</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation>Päivitetty</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation>Poistettu</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation>Polut</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation>Pisteet</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation>Relaatiot</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Peruuta</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>TMS-palvelimet</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nimi:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projektio:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Mercator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>Lisenssin URL-osoite:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Käytä</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Lisää</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Poista</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation>Merkaartor: GetServices</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Avain</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Arvo</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>Esimerkiksi "1-9;15-17;19,19A"</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Kaikki numerot</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>Parittomat luvut</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>Parilliset luvut</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation>Valinnaisesti voit valita solmun alueella, jolloin talojen numerointi alkaa valitusta päästä.</translation> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Kokonaiskesto</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1t %2m</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Sulje</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Leveysaste</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Pituusaste</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Tunniste</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Tagit</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation>Lisää "source" -tagi</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation>Poista valitut tagi(t)</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Salasana</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Käytä välityspalvelinta</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Portti</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Tyhjennä</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>WMS-palvelimet</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nimi:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Tasot:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation>Otsikko</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projektio:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Tyylit:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>Lisenssin URL-osoite:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Käytä</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Lisää</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Poista</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: GetCapabilities</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation>Lataa kuva...</translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation>Tiedostonimi</translation> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation>Tiedostoa ei voi ladata.</translation> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_fr.ts b/translations/merkaartor_fr.ts new file mode 100644 index 0000000..b32a5ad --- /dev/null +++ b/translations/merkaartor_fr.ts @@ -0,0 +1,7368 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="fr" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>A propos de Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>Ce programme est fourni sous licence GNU General Public License v2</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Version de Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Version de Qt</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Historique des changements</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>OK</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Description</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Raccourci clavier</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Importer</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Exporter</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>Par d&éfaut</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Annuler</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Editeur de raccourci</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Charger schéma de raccourcis</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Schéma de raccourci Merkaartor (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Impossible d'ouvrir le fichier</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 n'a pas pu être ouvert.</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>Sauvegarder schéma de raccourci</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>sans titre</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Tous les fichiers (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Impossible d'ouvrir le fichier de sauvegarde</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 n'a pas pu être ouvert en écriture.</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Pas de description</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Formulaire</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Formulaire</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation>Gauche</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation>Droite</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Annuler</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Centrer la carte</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>Centrer && Zoomer la carte</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Annuler</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Nettoyer</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>Faire un zoom</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>AJOUTER route %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>AJOUTER point %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>AJOUTER relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>MODIFIER point %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>RAFRAICHIR la relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>RAFRAICHIR la route %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>SUPPRIMER point %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>SUPPRIMER route %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>SUPPRIMER relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Erreur durant le téléversage de la requête</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Veuillez vérifier l'exactitude de vos Identifiant et mot-de-passe dans le menu Préférences</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Une erreur s'est produite durant le téléversage de cette requete (%1) +Le message du serveur est '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +Le message de l'API est le suivant '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Envoi des changements...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>OUVRIR changeset</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>FERMER changeset</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Erreur durant le téléversage de la requête</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Veuillez vérifier l'exactitude de vos Identifiant et mot-de-passe dans le menu Préférences</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Une erreur s'est produite durant le téléversage de cette requete (%1) +Le message du serveur est '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +Le message de l'API est le suivant '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation>Une erreur s'est produite lors du téléversement de cette requête (%1) +"%2" +Veuillez re-télécharger l'objet problématique pour gérer le conflit.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>Analyse des changements...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>OUVRIR changeset</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>FERMER changeset</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>AJOUTER relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>AJOUTER route %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>AJOUTER point %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>RAFRAICHIR la relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>RAFRAICHIR la route %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>MODIFIER point %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>SUPPRIMER point %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>SUPPRIMER route %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>SUPPRIMER relation %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>sans titre</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Calque des brouillons</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Couche Téléversé</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Imagerie d'arrière-plan</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>Export OSM</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>Exportation OSM...</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>Document</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Télécharger</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Place</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Marque-page</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Vue actuelle</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>D'après la carte ci-dessous (carte fournie par le projet OpenStreetMap)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Télécharger aussi les traces GPS brutes</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>Résoudre toutes les relations</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 téléchargement</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Chargement des non-résolus</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>Téléchargement de la non résolution %1 de %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>Analyse syntaxique de la non résolution %1 de %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Analyse...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Analyse XML</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Conflits de %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>Routes/Relations vides détéctées</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Des routes/relations vides sont probablement des erreurs. +Voulez-vous les marquer pour suppression ?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Supprimer l'objet vide %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Des conflits ont été détéctés</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>Ceci signifie que certains des objets que vous avez modifié depuis votre dernier téléchargement on été modifiés par quelqu'un d'autre sur le serveur. +Les objets ont été duplicié avec un identifiant "conflict_..." sur la couche "Conflits". +Avant de pouvoir téléverser vos changements, vous devrez manuellement fusionner les deux versions et supprimer celle de la couche "Conflits".</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Envoi en cours...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Préparation des changements</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>En attente de la réponse du serveur</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Téléchargement...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Téléchargement depuis OSM (connection)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>Code état inattendu du protocole http (%1) +Le serveur a répondu '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +Le message de l'API est le suivant '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Échec du téléchargement</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Nom d'utilisateur/mot de passe non valable</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>Conflits non-résolus</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>Veuillez d'abord résoudre les conflits existants</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>Téléchargement des noeuds %1-%2</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Téléchargement des points</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Téléchargement de %1,%2 (zoom %3)...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>Faire un zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Fermer</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>Suppression impossible</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>Suppression totale impossible</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Exporter</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>Que voulez-vous exporter ?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Tous les éléments visibles (c.à.d. non-cachés)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>Vue</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Sélectionné</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Objets</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Centrer la carte</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>Centrer && Zoomer la carte</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Charger les sous-éléments manquants</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Ajouter à la sélection</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Supprimer</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Relations</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Tous</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Objets</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>Uniquement les objets pleinement dans la vue</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Recherche...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Boîte de dialogue</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Nom</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Filtre</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Fermer</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Filtres</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Liste des filtres</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nom:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Filtre</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Appliquer</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Ajouter</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Supprimer</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>Dépassement de temps réseau</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>Impossible d'obtenir les détails de la photo depuis le serveur "Walking Papers".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Veuillez spécifier l'URL Walking Papers</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>URL :</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Images Géo.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Centrer la carte</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation>c</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Enlever les images</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Copie du nom de fichier dans le presse-papier</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Sélectionner l'image suivante</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>PgDown</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Sélectionner l'image précédente</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>PgUp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>Sauvergarder l'image géomarquée</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>Couche Photo</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Charger les images georeférencées</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>Séléctionnez le calque auquel l'image appartient:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Chargement des images...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Interrompre le chargement</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>Fichier inconnu</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>Impossible de trouver l'image "%1"</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Erreur lors du chargement de "%2". +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Erreur lors du chargement des données EXIF de "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>Spécifiez le décallage</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>Positionner les images plus vers:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>la fin de la trace</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>début de la trace</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>hh:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>Pas de points de trace</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>Pas de points de trace trouvé pour l'image "%1"</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss 'secondes'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm 'minutes et' ss 'secondes'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh 'heures,' mm 'minutes et' ss 'secondes'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>Pas la bonne image ?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>L'image "%1" a été prise %2 avant que le point de traçe suivant ne soit enregistré. +Voulez vous quand même l'utiliser ?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>L'image "%1" a été prise %2 après que le point de traçe suivant ne soit enregistré. +Voulez vous quand même l'utiliser ?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>Images JPEG (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Erreur à l'ouverture de "%1". +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>Aller à</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Marque-page</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>lonMin, latMin, lonMax, latMax</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>lat-Centre, lon-Centre, Intervalle-lat, Intervalle-lon</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Information</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>OSM API Url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>OSM XAPI url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Rechercher</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>url OSM invalide</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>L'url spécifiée est invalide!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Format de coordonnées non valable</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>Les coordonnées doivent être: '<lon gauche>, <lat bas>, <lon droite>, <lat haut>'</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>Les coordonnées doivent être: '<lat centre>, <lon centre>, <lat intervalle>, <lon intervalle>'</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Aucun</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>Adaptateur d'enveloppe</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>Faire un zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Fermer</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>Adapteur WMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>Adapteur TMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Carte - Aucune</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Carte - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Carte - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Carte - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Carte - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Serveur</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Taille de la tuile</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Projection</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Boîte de dialogue</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>Entrée</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>Prévisualisation OSM</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Spécifications</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>La première ligne contient les entêtes</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Séparateur</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Point-virgule (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Tabulation</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Autre :</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Aucun</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>Projection (en format PROJ4; laisser à blanc pour latitude/longitude)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Champs</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>Liste des champs :</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>Nom du champ (= clé d'étiquette) :</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>Type de champ :</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Importer</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>Importer une plage</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>A partir de (0 pour le départ) :</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>À (0 pour la fin) :</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>Charger une configuration...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Sauvergarder la configuration...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Chaîne de caractères</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Entier</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>Flottant</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Longitude</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Latitude</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Projection invalide</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>Impossible de spécifier la projection.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Pas de coordonnées</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>Le champ Latitude ou Longitude est manquant. Il sera impossible d'importer le fichier. +Désirez-vous réellement quitter?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>Charger une configuration d'import CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Configuration d'import Merkaartor (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Fichier invalide</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 n'a pas pu être ouvert.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1 n'est pas un fichier de configuration d'import CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation>Sauvegarder la configuration d'import CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>sans titre</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Tous les fichiers (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation>Impossible d'ouvrir la configuration d'import</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 n'a pas pu être ouvert en écriture.</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Information</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Taille</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Objets</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Afficher tout</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Cacher tout</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Tout en lecture seule</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Aucun en lecture seule</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Fermer</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Couches</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Tous</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>Dessiner</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>Pistes</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Formulaire</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Visible</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Lecture seule</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>Bas</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>Haut</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>Opaque</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Opacité</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>J'ai lu et approuvé les termes de la licence</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Ne plus me demander ceci</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>&Aide</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Créer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Editer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>&Vue</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Signets</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Fichier</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Exporter</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>&Outils</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>&Style</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Nœud</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>&Fenêtre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Encarts</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>Obje&t</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>&Calques</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>Rel&ation</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>&Quitter</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>&A propos</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>&Ouvrir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Crée un nouveau document et importe un fichier</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>Faire un zoom sur &tout</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>Faire un zoom sur la &fenêtre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>Zoomer la fenêtre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>Zoom a&rrière</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>Zoom &avant</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Zoom avant</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Liaison courbe</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Défaire</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>&Refaire</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>&Déplacer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Importer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Importe un fichier dans le document courant</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Télécharger</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Télécharger des données cartographique pour une nouvelle aire</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Lien</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Créer une liaison</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Sélectionner</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>&Envoyer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Téléverser les changements sur le serveur</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>&Supprimer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Enlever les objets sélectionnés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Créer un nouveau nœud</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>&Inverser le sens</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Créer un rond-point</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Nouveau</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>&Séparer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>&Joindre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>&Séparer à part</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Séparer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>Re&lation</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Crée une relation</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>&Surface</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Créer une nouvelle zone</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Exporte toutes les couches visibles vers un fichier</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Rechercher</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Recherche et sélectionne des éléments</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>Exporte les objets de la vue vers un fichier</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>&Fusionner</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Fusionner des Nœuds</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>Fusionne les nœuds sélectionnés (le premier sélectionné restera)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Sauvegarder</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Télécharger plus</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Télécharger des données cartographiques supplémentaires pour la zone actuelle</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Propriétés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>&Info</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>&Aligner</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Aligner les nœuds</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>Aligne les nœuds sélectionnés. Les deux premiers sélectionnés indiquent la ligne.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation>&Etendre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>&Copier</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>Copie les objets sélectionnés vers le presse-papier</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>Copie les étiquettes de l'objet sélectionné vers le clipboard; Si l'objet est un noeud, copie également les coordonnées.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Coller Étiquettes (&Écraser)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>Colle (et écrase) les étiquettes de l'objet sélectionné à partir du clipboard.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>Coller Étiquettes (&Fusionner)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Coller Étiquettes</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>Coller les tags du presse-papiers (Fusion avec les tags existants)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>Fusionne les étiquettes du clipboard avec celles de l'objet sélectionné.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Coller</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Coller les objets depuis le presse-papiers</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>Colle les objets du clipboard; Si les identificateurs des objets sont déjà dans le document, ces derniers seront écrasés.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Appliquer l'objet à la couche "Modifications"</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>Calque &image</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>Images mat&ricielles/SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>Démarrer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>Démarrer le GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>Rejouer GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>&Arrêter</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>Arreter le GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>&Centrer sur le point GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>Afficher le touchup</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Enregistrer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>Enregistrer le GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Pause</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>Mettre le GPS en pause</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>Image géoréférencée</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>&Ajouter un membre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>&Retirer le membre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>&Jamais</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>&Toujours</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>&Détacher</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>&Styles</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Appareil photo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Pivoter</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Objets</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>&Subdiviser</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>B&loquer le zoom en fonction de l'arrière-plan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>OsmChange (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Fermer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>S&implifier</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation>Simplifier la(les) route(s)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation>Simplifier la route en retirant les noeuds fils superflus</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>Aucu&n</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Propriétés...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>Mise à l'échelle</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Charger les sous-éléments manquants</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>Supprimer l'étiquette '%1' sur %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>Supprimer les étiquettes %1 de %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Retire le membre '%1' de %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation>Réordonner les membres dans la relation %1</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>Relation Modifiée %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Créer Surface %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Surface: Créer Route %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Ajouter un trou.</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Voulez-vous ajouter un (nouveau) trou à cette surface ?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Surface: Terminer Route %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Zone: Ajouter le nœud %1 à la route %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>Fermeture de l'aire %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>CLIC-GAUCHE pour démarrer; GLISSER pour échelonner; SHIFT-GLISSER pour pivoter; CLIC-GAUCHE pour terminer</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Créer le Rond-point %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation>Fermeture de la route %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Supprimer l'objet %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Supprimer l'enfant.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>CLIC-GAUCHE pour sélectionner; GLISSER-GAUCHE pour déplacer</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>Nœuds trouvés avec la même position</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>Voulez-vous fusionner tous les nœuds à la destination ?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Fusionner des Nœuds dans %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>CLIC-GAUCHE pour le premier coin -> GLISSER-GAUCHE pour spécifier la surface -> CLIC-GAUCHE pour zoomer</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>Fichier GPS Exchange (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>Fichier OpenStreetMap (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation>Format de changement OpenStreetMap (*.osc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Fichier Noni GPSPlot (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>Fichier journal NMEA GPS (*.nmea *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>Fichier KML (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>Format CSV (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Images géolocalisées (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>fichier d'enveloppe ESRI (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Formats pris en charge</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Fichier Merkaartor (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Tous les fichiers (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>tuile %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>Bas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>Haut</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>Opaque</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Objet</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Noeud</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Relation</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Charger une image</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>Ajouter la postion du noeud à l'image</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation>Géo-éttiquette l'image avec cette position</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Annuler</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>Fichier</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Edition</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>Flèches directionnelles</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Couches</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Création</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Route</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Outils</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Aide</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Presse-papiers non valable</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>Le presse-papier ne contient pas de données valide.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Changements non sauvegardés</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>Le document contient des changements non-sauvegardés qui seront perdus. +Voulez-vous annuler le chargement d'un nouveau document ou continuer et perdre les changements ?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Noeud intermédiaire</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>Trace %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Gros lourd avertissement de droits d'auteur</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Vous tentez d'importer un fichier KML. Veuillez noter que: + + - Vous ne pouvez pas importer dans OSM un fichier KML créé par vous dans Google Earth. Vous pourriez penser que les nœuds que vous avez créés sont votre propriété, il n'en est rien! +Ils sont un travail dérivé de GE et ne peuvent pour cela pas être importés dans OSM. + + - Si vous l'avez téléchargé de l'internet, il est probable qu'il soit sous copyright. +Veuillez vous assurer que l'utilisation de ces données dans OSM est permise par l'auteur ou que ces données soient dans le domaine public. + +En cas de doute, demandez un avis sur les listes de diffusion OSM "legal" et/ou "talk". + +Êtes-vous absolument certain que ce fichier KML peut être importé légalement dans OSM?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>Fichier invalide</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 n'a pas pu être ouvert.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>Version ancienne de Qt détectée</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>Votre configuration utilise Qt %1, qui contient un certain nombre d'erreurs connues lors du chargement vers OpenStreetMap, menant à des codes de réponse 401 du serveur. Etes-vous certain de vouloir continuer (ce qui n'est pas recommandé) ? +Pour plus d'information, voir http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor (en anglais)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>Téléverser OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Il semble que vous n'avez pas spécifié +vos identifiant et mot-de-passe OpenStreetMap. +Voulez-vous le faire maintenant ?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Erreur de téléchargement</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>La carte n'a pas pu être téléchargée</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Créer polygone</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>Précisez le nombre de côtés</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Forcer l'envoi de l'objet</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Créer Carrefour</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Intersections Multiples</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>Ces routes ont de multiples intersections. +Voulez-vous créer un carrefour pour chacune d'elles? (Les carrefours non désirées peuvent toujours être supprimées par après)?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Ajout de Numéros de rue</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>triangulaire</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>rectangulaire</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>pentagonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>hexagonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation>heptagonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>octogonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation>Aligne sur les %1 axes</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation>Aligne sur les %1 axes réguliers</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Aligner les nœuds</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>Détacher le nœud %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Ajouter le membre à la relation</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Enlever le membre de la relation</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Créer la Relation %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Sauvergarder le style de carte</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Style de carte Merkaartor (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Charger un Style de carte</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>sans titre</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Enregistrer un document Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Fichiers document Merkaartor (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>Impossible d'ouvrir le fichier de sauvegarde</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 n'a pas pu être ouvert en écriture.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Fichier invalide</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 n'est pas un document Merkaartor valide.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>Exporter OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>Fichiers OSM (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>Exporter osmChange</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>Fichiers osmChange (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Exporter GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>Fichiers GPX (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Exporter KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>Fichiers KML (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (int)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Ajouter un marque-page</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Spécifiez le nom du signet.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Nom de signet invalide</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>Un marque-page ne peut être vide.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Attention: le nom du marque-page existe déjà</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Entrez un nouveau nom, gardez le même pour remplacer ou annulez.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Supprimer le signet</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Sélectionnez le signet à supprimer.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Projection invalide</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>Impossible d'appliquer la projection "%1".</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>Erreur du GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>Impossible d'ouvrir le port de l'instrument GPS.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>Ouvrir un fichier de journalisation NMEA</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>Sauvergarder Template d'étiquette</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Template d'étiquette Merkaartor (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>Ouvrir Template d'étiquette</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>Conflits non-résolus</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>Veuillez d'abord résoudre les conflits existants</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Il est fortement recommandé de sauvegarder les changements de votre document après un télévesage. +Voulez-vous le faire maintenant ?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b> </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>dernier: </i><b>%1</b> par <b>%2</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>dernier: </i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>Calque: </i><b>%1</b> </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Noeud intermédiaire</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>coordonnées</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>description</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>commentaire</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Noeud</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>élévation</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>vitesse</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>taille</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>membres</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>En haut à gauche</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>BasDroit</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Relation</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Role</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Membre</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Longueur</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Taille</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>%1 nœuds</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Aire</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Route</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Projection</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Nouveau signet</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>Echec du chargement des préférences</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Dupliquer la clé</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Plus de 150 préférences</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Nouveau serveur</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Formulaire</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>Etiquettes</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>Eléments sélectionnés</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation>Classe</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Nom</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Champ inconnu</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Erreur!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>Le service de recherche de nom demande une authentification</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Formulaire</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>Nom du fichier de sortie</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>sans titre</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Tous les fichiers (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Fichiers images (*.png *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>Fichiers SVG (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation>Export Images matricielles/SVG</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>Lat/Lon min.</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>Lat/Lon max.</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>Afficher l'échelle</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>Exporter en PDF...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>Exporter en SVG...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Formulaire</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL :</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Utilisateur:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Editeur de Style de carte</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Global</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Arrière-plan</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Epaisseur proportionnelle</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>Epaisseur fixe</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>Filtre</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Ajouter</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Supprimer</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Dupliquer</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>Sélection d'étiquette</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>mètre/pixel</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>Visible jusqu'à</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>Visible à partie de l'échelle</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Dessiner avec la couleur</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Pointillé</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>désactivé</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Remplir la surface</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Bordure</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>Retoucher</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Dessiner les marches</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Dessiner l'icône</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Étiquette</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Police de caractère</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Marquage de l'étiquette</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Auréole</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Aire</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Dessiner avec la couleur d'arrière-plan</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Label avec l'étiquette de fond</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Toujours</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Choisir une couleur</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>Pas de géomarque valide</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation>Essayer de rapprocher d'un point de trace</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>Charger sans noeud associé</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>Extraction des infos depuis le code barre (Walking Papers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>L'ignorer</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>Effectuer cela pour toutes les photos courantes</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Boîte de dialogue</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>Nom du fichier de sortie</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>sans titre</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>Fichiers SVG (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Tous les fichiers (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Fichiers images (*.png *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Préférences</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>Visuel</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Général</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Opacité bas/haut</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>Interaction avec un seul bouton de souris</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>Utiliser un style Qt personnalisé</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>Relations sélectionnables quand cachées</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Couleurs</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Arrière-plan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>Ecraser le style</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>Trace GPX</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>Pixels</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Interface</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Survoler</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Relations</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Focalisation</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Surligner</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Locale</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Utiliser la langue</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>Traduire les marquages standards</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Style de carte</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Répertoire des styles personnalisés</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Style actuel</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Modèle</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>Modèkle de tag</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Inclus</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Personnalisé</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Données</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL :</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Documents</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Sauvegarder automatiquement les documents après téléversage</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>Pistes</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>Entrée GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>Série</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Hôte</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>Sauver les fichiers de journalisation NMEA</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>Mettre l'horloge système à celle du GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Réseau</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Configuration du Proxy</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Mot-de-passe:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Utilisateur:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Port:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Nom d'hôte:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Adapteur de carte</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Outils</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Nom:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Chemin:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Appliquer</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Ajouter</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Supprimer</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Anglais</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Arabe</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Tchèque</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Néérlandais</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Allemand</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Français</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>Hongrois</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Italien</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>Japonais</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Polonais</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Russe</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Espagnol</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Suédois</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Ukrainien</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Modèle de tag Merkaartor (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Choisir une couleur</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>L'outil existe déjà</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Un outil portant ce nom existe déjà. +Veuillez choisir un autre nom ou cliquer sur le boutton <Appliquer> si vous désirer modifier celui existant</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>Impossible de supprimer l'outil prédéfini</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>Impossible de supprimer l'outil prédéfini "%1"</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>Impossible de modifier le nom d'un outil prédéfini</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>Impossible de modifier le nom de l'outil prédéfini "%1"'</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>Séléctionnez l'exécutable de l'outil</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>Séléctionnez le dossier des fichiers de journalisation</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation>Configuration des projections</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>Projections</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation>Liste des projections :</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nom:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>Chaîne PROJ4</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Appliquer</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Ajouter</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Supprimer</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation>Document</translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Boîte de dialogue</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Propriétés</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 élément(s) sélectionné(s)</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 élément(s) sélectionné(s)</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Eléments sélectionnés</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Propriétés - Eléments multiples</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Propriétés - Nœuds</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Propriétés - Relation</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Propriétés</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Centrer la carte</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>Centrer && Zoomer la carte</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Selectionner le membre</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Nettoyage en cascade</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>Déplacer le nœud %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Annuler</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>Importer osmChange</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>Importer NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>Importer NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Non valide</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>Mètres</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>Non disponible</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>Erreur de journalisation GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Impossible de créer le fichier de journalisation GPS: %1.</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation>Impossible de se connecter à %1:%2</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>Erreur de journalisation GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Impossible de créer le fichier de journalisation GPS: %1.</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Longitude</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Altitude</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 mètres</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation>Nombre de satellites</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Type d'acquisition</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Non valide</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Vitesse</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Latitude</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>Flux de résultats impropre !</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation>Personalisation des barre d'outils</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation>Actions</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Supprimer</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Appliquer</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Annuler</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation>Barre d'outils personnalisée</translation> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Formulaire</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Membres</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>Etiquettes</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Formulaire</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>Etiquettes</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Pas de satelittes</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Sélection</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Clef</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Valeur</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Nom</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Fermer</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Styles</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Styles</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Envoi à Openstreetmap</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Annuler</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>Configuration des serveurs TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>Serveurs TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Liste des serveurs:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nom:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Url du serveur:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>Obtenir les Services</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>Services :</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projection:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Mercator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>Lat/Lon (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation>L'Origine est en bas à gauche</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Appliquer</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Ajouter</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Supprimer</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>L'adresse et le chemin ne peuvent pas être vides.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Clef</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Valeur</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>Editer ceci pour ajouter...</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Formulaire</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>ET</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Non défini</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Non défini</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>Par exemple "1-9;15-17;19,19A"</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Tous les nombres</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Extraction - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation>Nombre de Segments de trace</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Distance totale</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Durée totale</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1h %2m</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Extraire une couche de dessin</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>Faire un zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Fermer</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>Point</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Latitude</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Longitude</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Etiquettes</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Boîte de dialogue</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Site Internet</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Mot-de-passe</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Nom d’utilisateur</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Utiliser un serveur mandataire</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>Faire un zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Effacer</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>Configuration des serveurs WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>Serveurs WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Liste des serveurs:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nom:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Url du serveur:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Couches:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projection:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>Niveaux de zoom</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>Format de l'image :</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Styles:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Appliquer</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Ajouter</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Supprimer</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: Obtenir les capacités</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>L'adresse et le chemin ne peuvent pas être vides.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_hr.ts b/translations/merkaartor_hr.ts new file mode 100644 index 0000000..de38e22 --- /dev/null +++ b/translations/merkaartor_hr.ts @@ -0,0 +1,7347 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="hr" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>O Merkaartoru</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>Ovaj program je licenciran pod GNU General Public v2 licencom</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Merkaartor verzija</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Qt verzija</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>GDAL verzija</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Promjene</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>U redu</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Opis</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Prečac</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Uvoz</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Izvoz</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>Za&dana</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&U redu</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Odustani</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Urednik prečaca</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Učitaj sheme prečaca</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Merkaartor shema prečaca (*. MSS)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Ne mogu otvoriti datoteku</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 ne može biti otvoren</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>Snimi shemu prečaca</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>bez naslova</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Sve datoteke (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Ne mogu snimiti datoteku</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 ne može biti otvoren za zapisivanje.</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation>Kreator Mostova</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation>Izvinite, ne znam kako da kreiram most od TOGA. Molim vas, dajte mi samo dve točke.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation>Konvertujte segment u most</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation>Izabrani segment je već označen kao most/tunel. Molim vas, postarajte se da znate šta radite.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation>Nepodržana akcija: Ne izgleda da je most jedan put.</translation> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Bez opisa</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Oblik</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Oblik</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation>Preciznost (metri/segmenti)</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation>Tip</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Centriraj kartu</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Očisti</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>DODAJ cestu %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>DODAJ točku %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>DODAJ relaciju %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>UKLONI točku %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>UKLONI cestu %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>UKLONI relaciju %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Pogreška učitavanja zahtjeva</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +API poruka je '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>OTVORI skup promjena</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>ZATVORI skup promjena</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Pogreška učitavanja zahtjeva</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +API poruka je '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>Provjeravam promjene...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>OTVORI skup promjena</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>ZATVORI skup promjena</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>DODAJ relaciju %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>DODAJ cestu %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>DODAJ točku %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>UKLONI točku %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>UKLONI cestu %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>UKLONI relaciju %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>bez naslova</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Prljavi sloj</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Pozadinske slike</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation>Crtaj sloj #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation>Filtriraj sloj #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>OSM izvoz</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>Izvoz OSM ...</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>Dokument</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Preuzimanje</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Lokacija</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Oznaka</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Trenutni pogled</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>Iz karte ispod (karte pružena od OpenStreetMap projekta)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Dopusti preuzimanje sirovih GPS tragova</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 preuzimanje</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Preuzimanje neriješenih ...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>Preuzimanje neriješeni %1 od %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Parsiranje...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Parsiram XML</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Sukobi iz %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>Prazna cesta(e)/odnos(i) otkriven</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Prazna cesta / odnosi vjerojatno su pogreške. +Želite li ih označiti za brisanje?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Ukloni prazne značajke %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Primječeni su sukobi</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Pripremam promjene</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Preuzimam...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Preuzimam sa OSM-a (spajam se)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +API poruka je '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Preuzimanje neuspješno</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Korisničko ime/zaporka nevažeće</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Preuzimam točke</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Zatvori</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>Ne mogu obrisati</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation>Ne mogu obrisati odabir jer je izvan preuzetog područja</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>Ne mogu sve obrisati</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation>Preokreni put %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation>Preokreni %1 put</translation> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Izvoz</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Sve vidljivo (ne skriveno)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>Pogled</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Odabrano</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Značajke</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Centriraj kartu</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Preuzmi djecu koja nedostaju</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Dodaj u odabir</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Obriši</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Relacije</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Sve</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Značajke</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Traži...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>Resetiraj</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Dijalog</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Naziv</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Zatvori</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>Postava filtera</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Filteri:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Lista filtera:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Naziv:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Primjeni</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Dodaj</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Ukloni</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Geo slike</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Centriraj kartu</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Ukloni slike</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Kopiraj datoteke u međuspremnik</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Odaberi slijedeću sliku</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>PgDown</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Odaberi prethodnu sliku</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>PgUp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>Sloj fotografija</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Učitaj geo označene slike</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation>Sloj je samo čitljiv</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Učitaj slike...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Prekini učitavanje</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>Ne postoji datoteka</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>Ne mogu pronaći sliku "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Greška prilikom otvaranja "%2": +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Greška prilikom učitavanja EXIF podataka iz datoteke "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>kraj traga</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>početak traga</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>hh:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss 'sekundi'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm 'minuta i' ss 'sekundi'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh 'sati,' mm 'minuta and' ss 'sekundi'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>Slika "%1" je snimljena %2 prije što sljedeći TrackPoint zabilježen. +Da li je i dalje želite koristiti?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>Slika "%1" je snimljena %2 poslje što je zadnji TrackPoint zabilježen. +Da li je i dalje želite koristiti?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>JPEG slike (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Greška prilikom otvaranja "%1": +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>idi na</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Oznaka</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>lonMin, latMin, lonMax, latMax</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>latCent, lonCent, latSpan, lonSpan</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Informacije</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Traži</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>Nevažeći OSM url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Nevažeći format koordinata</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Nitijedan</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Zatvori</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>Dodatci</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Karta - nitijedna</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Karta - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Karta - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>Karta - WMS-Tiled - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Karta - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Karta - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>Uvjeti licenciranja: %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>Uvijeti licence nisu prihvačeni</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Poslužitelj</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Veličina pločice</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>Minmalno/maksimalno povećanje</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Projekcija</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Dijalog</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>Ulaz</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Značajke</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>Prvi redak sadrži zaglavlje</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Razdjelnik</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Točka-zarez (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Drugi;</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Nitijedan</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation>Dupli navodnik (")</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>Projekcija (u PROJ4 formatu; ostavite prazno za širina/dužina)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Polja</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>Lista polja:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>Ime polja (= ključ oznake)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>Tipo polja:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Uvoz</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>Uvezi raspon</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>Od (0 od početka):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>Do (0 do kraja):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>Učitaj postavke</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Snimi postavke</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Niz</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Cijeli broj</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>Plutajuće</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Dužina</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Širina</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Nevažeća projekcija</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>Ne mogu postaviti projekciju</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Bez koordinata</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>Polje dužina ili širine nedostaje. Biti će nemoguće uvesti datoteku. +Želite li zaista izaći?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>Učitaj CSV postavke uvoza</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Merkaartor postavke uvoza (*. MIS)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Nevažeća datoteka</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 ne može biti otvoren</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1 nije datoteka sa postavkama za uvoz CSV datoteke</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>bez naslova</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Sve datoteke (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 ne može biti otvoren za zapisivanje.</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation>Ne mogu postaviti projekciju; molim specificirajte</translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Informacije</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Veličina</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Značajke</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Sakrij sve</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Sve samo za čitanje</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Nijedan samo za čitanje</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Zatvori</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Slojevi</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Sve</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>Karta</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>Crtaj</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Oblik</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Vidljiv</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Samo za čitanje</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>Nisko</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>Visoko</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>Ne prozirno</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Prozirnost</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation>Zatvori sloj: Prčjavi objekti prisutni</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation>Zatvori sloj: nije prazan</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation>Da li ste sigurni da želite zatvoriti ovaj sloj? (nije moguće poništiti)</translation> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>Uvjeti licenciranja</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>Pročitao sam i slažem se s uvjetima licenciranja</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Nemoj me ponovo ovo pitati</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>&Pomoć</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Stvori</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Uredi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>&Pogled</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Oznake</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Datoteka</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Izvoz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>Ala&ti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>&Stil</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Čvor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>&Prozor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Dok</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>Značajke</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>&Slojevi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>Rel&acija</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>P&okaži</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>Glavna alatna traka</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>&Izlaz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>&O programu</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>&Otvori</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Napravite novi dokument i uvezite datoteku</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Povečaj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Zakrivljeni link</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Poništi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>&Ponovo uradi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>&Pomakni</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Uvoz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Uvezi datoteku u trenutni dokument</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Preuzmi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Preuzimanje podataka karte za novo područje</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Poveznica</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Stvori vezu</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Odaberi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>&Učitaj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>&Ukloni</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Ukloni odabrane značajke</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Stvori novi čvor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>&Preokreni</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Stvori kružni tok</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Novi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>&Razdvoji</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>&Spoji</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>&Prelomiti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Prelomi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>Re&lacija</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Stvori relaciju</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>&Područje</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Stvori novo područje</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Izvoz svih vidljivih slojeva u datoteku</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Traži</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Pronađite i odaberite stavke</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>Izvoz značajki unutar pogleda u datoteku</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>&Spoji</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Spoji čvor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>Spoji odabrane čvorove (prvi odabrani će ostati)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Snimi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Preuzmi više</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Preuzimanje više podataka karte za tekuće područje</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Značajke</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>&Informacije</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>&Poravnaj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Poravnaj čvorove</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>Poravnaj odabrane čvorove. Prva dva odabrana određuju liniju.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation>&Raširi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation>Poravnaj i rasporedi odabrane čvorove jednoliko.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>&Kopiraj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>Kopiraj odabrane značajke i oznake u međuspremnik</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Zaljepi oznake</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>Spoji oznake u međuspremniku s onima odabranih značajki.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Zalijepi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Pošalji značajku u prljavi sloj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>&Slikovni sloj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>&Raster/SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>&Početak</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>Pokreni GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>S&tani</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>Zaustavi GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>&Centrirati na GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Snimaj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>Snimaj GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Pauza</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>Pauziraj GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>G&eoSlika</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>&Dodaj člana</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>&Ukloni člana</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>&Nikada</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>&Uvijek</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>O&dvoji</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>&Stilovi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Kamera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Rotiraj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Značajke</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>&Podjeli dalje</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>&Zaključaj povečanje prema pozadini</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>OsmChange (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Zatvori</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>Pojednostav&i</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation>Pojednostavi cestu(e)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>&Nijedan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>&Terasa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation>&Poravnaj s osima</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation>Poravnaj rubuve na regularne osi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Svojstva...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation>Označi prljave značajke</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation>&Izreži</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation>Izvuci</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation>Interakcija istiskivanja za puteve (JOSM stil)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation>Uključi djecu u odabir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Preuzmi djecu koja nedostaju</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>Obriši %1 oznaku na %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>Obriši %1 oznake na %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Ukloni člana '%1' na %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Stvori područje %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Područje: Napravi cestu %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Dodaj rupu.</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Želite li dodati (još jednu) rupu na ovom području?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Područje: Završi cestu %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Područje: Dodaj čvor %1 cesti %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>Zatvori područje %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Stvori kružni tok %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation>Zatvori cestu %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Ukloni značajke %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>Ukloni značajke</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Obriši djecu</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation>Želite li izbrisati čvorove djecu također? +Imajte na umu da će OSM čvorovi izvan preuzetog područja biti zadržani.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation>Preokreni %1 put</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>Lijevom tipkom miša za odabir; Povucite lijevo za pomicanje</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Spajanje Čvorovi u %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation>Zadržite pokazivač za odabir; Povucite lijevo za rotiranje</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation>Zadržite pokazivač za odabir; Povucite ljevo za promjenu veličine</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>Lijevom tipkom miša do prvog ugla -> povucite lijevo da bi odredili područje -> lijevom tipkom miša za uvećanje</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>GPS Exchange format (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>OpenStreetMap format (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>NMEA GPS log format (*. NMEA *. NMA) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>KML datoteke (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>Odvojeno zarezom (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Geooznačene slike (*. jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>ESRI Shapefile (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation>Geography Markup Language (*.gml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Podržani formati</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Merkaartorov dokument (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Sve datoteke (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>pločica %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>Nisko</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>Visoko</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>Ne prozirno</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Značajka</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Čvor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Relacija</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Učitaj sliku</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>Dodaj pozicijski čvor slici</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation>Geooznači sliku sa ovom pozicijom</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Odustani</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>Datoteka</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Uredi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>Pogled</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>Prikaži</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>Usmjerene strelice</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Slojevi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Stvori</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Put</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Alati</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>Prozori</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Pomoć</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation>Izreži značajke</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Međuspremnik nevažeći</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>Međuspremnik ne sadrži ispravne podatke</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Upozorenje o autorskom pravu</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>Nije valjana datoteka</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 ne može biti otvoren</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Greška prilikom preuzimanja</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Stvori poligon</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Prisilno učitavanje značajke</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Stvori spoj</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Višestruko raskrižje.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Dodaj kućne brojeve</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation>Poravnaj s osima</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>trokutno</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>okomito</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>peterokutno</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>šesterokutno</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation>sedmerokutno</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>osmerokutni</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation>Poravnaj na %1 os(i)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation>Poravnajte na %1 redovitih osi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation>Poravnjavanje na osi nije uspjelo. Molimo vas da podesite oštre kutove i pokušate ponovno.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation>Poravnjavanje na osi nije uspjelo i nije pronašlo rješenje.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Poravnaj čvorove</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>Odvoji čvor %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Dodaj član relaciji</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation>Spoji područja</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>Razdvoji područje</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Stvori relaciju %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Snimi stil karte</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Merkaartor stil karte (*. mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Učitaj stil karte</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation>Merkaartor stil karte (*. mas) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>bez naslova</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Snimi Merkaartorov dokument</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Merkaartor dokumenti datoteke (*. MDC)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation>Snimi Merkaartorov predložak</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>Ne mogu snimiti datoteku</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 ne može biti otvoren za zapisivanje.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Nevažeća datoteka</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 nije valjan Merkaator dokument.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>izvoz OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>OSM datoteke (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>Izvoz osmChange</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>osmChange datoteke (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Izvoz GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>GPX datoteke (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Izvoz KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>KML datoteke (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (int)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Dodaj oznaku</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Nevažeća oznaka</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>Oznaka ne može biti prazna</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Unesite novi, zadrži isti za prepisati ili otkazati.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>kloni oznaku</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Odaberi oznaku za uklanjanje</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Nevažeća projekcija</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>Ne mogu postaviti projekciju "%1".</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>GPS greška</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Merkaartor predložšci oznaka (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Preporučeno ja da snimite promjene nakon učitavanja. +Želite li to sada napraviti?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>posljednji: </i><b>%1</b&gt; by <b>%2</b&gt;</translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>posljednji: </i><b>%1</b&gt;</translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>sloj: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>koordinata</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>opis</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>komentar</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Čvor</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>nadmorska visina</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>brzina</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>veličina</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>članovi</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>Gornji lijevi</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>Donje desno</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Relacija</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Uloga</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Član</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation>Zatvorena cesta</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Dužina</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Veličina</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>%1 čvorova</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Područje</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Put</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>Pogled</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation>Granično područje</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Projekcija</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Nova oznaka</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Dvostruki ključ</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Više od 150 postavke</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Novi poslužitelj</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Oblik</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>Odabrane stavke</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation>Klasa</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Naziv</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Greška!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>Usluga tražila imena zahtijeva provjeru autentičnosti.</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Oblik</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>bez naslova</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation>PDF datoteka (*.pdf)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Sve datoteke (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Slikovne datoteke (*.png *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>SVG datoteke (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation>Izvoz raster/SVG</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation>Opcije</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>minimalna Šir/Duž</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>maksimalna Šir/Duž</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation>Prikaži točke</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation>Prikaži relacije</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>Izvoz u PDF...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>Izvoz u SVG...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation>izvoz u raster...</translation> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Oblik</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Korisnik:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Urednik stila karte</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Globalno</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Pozadina</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Proporcionalna debljina</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>Nepromjenljive debljine</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Dodaj</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Ukloni</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Kopija</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>metar/piksel</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>Vidljiv do</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Crtaj obojano</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Crtkano</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>isključeno</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Popuni područje</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation>Ispuni s ikonom za dotjeravanje</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Granica</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Nacrtaj stepenice</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Nacrtaj ikonu</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Oznaka</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Font</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Naljepnica oznake</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Halo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Područje</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Crtaj obojano pozadinskom bojom</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Naljepnica s oznakom pozadine</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Uvijek</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Odaberi boju</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>Nema važeču geooznaku</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>Učitaj bez pridruženog čvora</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>Ekstrakt infoa iz barkoda (Walking Papers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>Ignoriraj</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>Učinite to za sve trenutne slike.</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Dijalog</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>bez naslova</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>SVG datoteke (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Sve datoteke (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Slikovne datoteke (*.png *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Postavke</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Općenito</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Prozirnost niska/visoka</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation>Dopusti kreiranje čvora/puta i odabranom načinu</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Boje</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Pozadina</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>GPX trag</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>Pikseli</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Sučelje</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Lebdjeti</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Relacije</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Fokus</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Istakni</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation>Prljavo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Lokalno</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Koristi jezik</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation>Opcije</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Stil karte</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Direktorij prilagođenih stilova</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Trenutni stil</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Predložak</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Ugrađen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Korisnički definirano</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Podatci</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation>XAPI</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Dokumenti</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation>Automatski učitaj predložak</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Automatski snimi dokumente nakon učitavanja</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>GPS ulaz</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>Serijski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Host</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>Snimi NMEA log</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Mreža:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Postavke proxyija</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Zaporka:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Korisnik:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Host:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Adapter karte</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation>Automatski dodaj "source" oznaku prilikom kreiranja značajki preko pozadinske karte</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Alati</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Naziv:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Putanja;</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Primjeni</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Dodaj</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Ukloni</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Engleski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Arapski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Češki</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Nizozemski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Njemači</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Francuski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>Mađarski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Talijanski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>Japanski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Poljski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Ruski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Španjolski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Švedski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Ukrajinski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Merkaartor predložak oznaka (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Odaberi boju</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>Alat već postoji</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Alat ovakvog naziva već postoji. +Molim odaberite drugi naziv te odaberite <Primjeni> dugme ukoliko želite izmjeniti postojeći.</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>Ne mogu obrisati unaprijed definiran alat</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>Ne mogu obrisati unaprijed definiran alat "%1"</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>Ne mogu promjeniti ime unaprijed definiranog alata</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>Ne mogu promjeniti ime unaprijed definiranog alata "%1"'</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation>Odaberi predložak</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation>Merkaartorov dokument (*.mdc)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation>Postava projekcija</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>Projekcije</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation>Lista projekcija:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Naziv:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>PROJ4 niz</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Primjeni</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Dodaj</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Ukloni</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation>Dokument</translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Dijalog</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation>Korisnički definirano PROJ4(+proj=...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Svojstva</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 odabran(ih) predmet(a)</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 odabran(ih) predmet(a)</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Odabrane stavke</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Svojstva - vše elemenata</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Svojstva - točka</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Svojstva - relacija</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Svojstva</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation>Pogreška pri čitanju datoteke predloška</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Centriraj kartu</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Odaberi člana</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Kaskadno čišćenje</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>Pomakni čvor %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation>Izvoz GPX ...</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Odustani</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation>Uvoz ...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>Uvezi osmChange</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>Uvoz NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>Uvoz NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Nevažeći</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>Metara</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>Nedostupan</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>GPS log pogreški</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>GPS log pogreški</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Dužina</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Visina</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 metara</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation># sateliti</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Popravi tip</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Nevažeći</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Brzina</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Širina</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation>Prilagođavanje alatne trake</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation>Akcije</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>Novi</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Ukloni</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>Preimenuj</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>U redu</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Primjeni</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Odustani</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation>Gore</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation>Dolje</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation>< R A S T A V LJ A Č ></translation> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation>Korisnička alatna traka</translation> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Oblik</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Članovi</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation>Ukloni označene član(ove)</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation>Dodaj oznaku "izvor"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Oblik</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Identifikator</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation>Dodaj oznaku "izvor"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Bez satelita</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Odabir</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Ključ</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Vrijednost</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Naziv</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Identifikator</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation>Upit</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Zatvori</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Stilovi</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Stilovi</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>U redu</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Odustani</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>TMS poslužitelji</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Lista servera:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Naziv:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>Nabavite usluge</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>Usluge:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projekcija:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Merkator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>Širina/Dužina (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation>Veličina pločice:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation>Minimalno povećanje</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation>Vrjednost "source" oznake:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>URL licence:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Primjeni</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Dodaj</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Ukloni</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>Adresa i staze ne mogu biti prazni</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Ključ</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Vrijednost</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Oblik</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation>ILI</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>I</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation>NE</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation>je</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation>je jedan od</translation> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Nedefiniran</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Nedefiniran</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation>Terasa</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation>Nema numeriranja kuća</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>Broj kuća</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>Dodaj kućne brojeve (Karlsruhe shema)</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation>Rasponi</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>Na primjer "1-9;15-17;19,19A"</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation>Uzorak</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Svi brojevi</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>Neparni brojevi</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>Parni brojevi</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Ekstrakt - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation># od djelova traga</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Ukupna udaljenost</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Ukupno trajanje</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1h %2m</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Ekstrakt crtanog sloja</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Zatvori</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Širina</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Dužina</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Identifikator</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation>Dodaj oznaku "izvor"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Dijalog</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Zaporka</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Korisničko ime</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Koristi proxy</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Očisti</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>WMS posslužitelj</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Lista servera:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Naziv:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Slojevi;</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projekcija:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>Nivoi povećanja</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>Format slike:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Stilovi:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation>Vrjednost "source" oznake:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>URL licence:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Primjeni</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Dodaj</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Ukloni</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>Adresa i staze ne mogu biti prazni</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_hu.ts b/translations/merkaartor_hu.ts new file mode 100644 index 0000000..56e9a1a --- /dev/null +++ b/translations/merkaartor_hu.ts @@ -0,0 +1,7391 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="hu" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>Merkaartor névjegye</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>Ez a program a GNU General Public License v2 licenc alatt került kiadásra</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Merkaartor verzió</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Qt verzió</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>GDAL verzió</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Változások listája</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>OK</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Leírás</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Billentyűparancs</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Importálás</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Exportálás</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>&Alapértelmezett</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Mégse</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Billentyűparancs-szerkesztő</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Billentyűparancs-séma betöltése</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Merkaartor Billentyűparancs-séma (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Nem sikerült megnyitni a fájlt</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 nem nyitható meg.</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>Billentyűparancs-séma mentése</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>névtelen</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Minden fájl (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Nem sikerült megnyitni a fájlt a mentéshez</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 nem nyitható meg írásra.</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation>Hídépítő</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation>Elnézést, nem tudom, hogyan építsek hidat ONNAN. Kérlek, csak két pontot adj meg.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation>Szakasz konvertálása híddá</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation>A kijelölt szakasz már hídként/alagútként van címkézve. Kerlek, győződj meg róla, hogy tudod, mit csinálsz.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation>Nem támogatott művelet: úgy tűnik, hogy a híd nem egy egyszerű vonal lenne.</translation> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Nincs leírás</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Űrlap</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Űrlap</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation>Pontosság (méter/szakasz)</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation>Típus</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation>Körforgalom</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation>Sima kör</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation>Bal</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation>Jobb</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation>Közlekedési oldal</translation> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation><b>Nincs</b> módosított objektum</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation><b>Egy</b> módosított objektum található</translation> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Visszavonás</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Térképet középre</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>Térképet középre nagyítva</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Visszavonás</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation><b>Nincsenek</b> módosított objektumok.</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Kitakarítás</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>Nagyítás</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>HOZZÁADja %1 vonalat</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>HOZZÁADja %1 nyompontot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>HOZZÁADja %1 kapcsolatot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>MEGVÁLTOZTATja %1 nyompontot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>MEGVÁLTOZTATja %1 kapcsolatot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>MEGVÁLTOZTATja %1 vonalat</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>ELTÁVOLÍTja %1 nyompontot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>ELTÁVOLÍTja %1 vonalat</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>ELTÁVOLÍTja %1 kapcsolatot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Hiba a kérés feltöltésekor</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Kérlek, ellenőrizd a felhasználónevedet és jelszavadat a Beállítások menüben</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Hiba történt a kérés feltöltése közben (%1) +A kiszolgáló üzenete: „%2”</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +Az API üzenete: „%1”</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Módosítások feltöltése…</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>MEGNYITja a módosításcsomagot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>LEZÁRja a módosításcsomagot</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Hiba a kérés feltöltésekor</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Kérlek, ellenőrizd a felhasználónevedet és jelszavadat a Beállítások menüben</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Hiba történt a kérés feltöltése közben (%1) +A kiszolgáló üzenete: „%2”</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +Az API-üzenete: „%1”</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation>Hiba történt a kérés feltöltése közben (%1) +„%2” +Kérlek, töltsd le újra problémás jellemzőt az ütközés feloldása érdekében.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>Változások ellenőrzése…</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>MEGNYITja a módosításcsomagot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>LEZÁRja a módosításcsomagot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation>A módosításcsomag nem zárható le.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation>Egy ismeretlen hiba történt. Lehetséges, hogy már le lett zárva, vagy le lesz zárva automatikusan. Ha meg szeretnél erről győződni, kérlek, ellenőrizd saját kezűleg az osm.org webhelyen.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>HOZZÁADja %1 kapcsolatot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>HOZZÁADja %1 vonalat</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>HOZZÁADja %1 nyompontot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>MEGVÁLTOZTATja %1 kapcsolatot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>MEGVÁLTOZTATja %1 vonalat</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>MEGVÁLTOZTATja %1 nyompontot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>ELTÁVOLÍTja %1 nyompontot</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>ELTÁVOLÍTja %1 vonalat</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>ELTÁVOLÍTja %1 kapcsolatot</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>névtelen</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Módosított réteg</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Feltöltött réteg</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Háttérkép</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation>%1. rajzolóréteg</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation>%1. szűrőréteg</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>OSM exportálás</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>OSM exportálása…</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>Dokumentum</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation>Történet újraépítése: %1 pont létrehozása </translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation>Történet újraépítése: %1 pont frissítése </translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation>Történet újraépítése: %1 pont törlése</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation>Történet újraépítése: %1 vonal létrehozása</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation>Történet újraépítése: %1 vonal frissítése</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation>Történet újraépítése: %1 vonal törlése</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation>Történet újraépítése: %1 kapcsolat létrehozása</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation>Történet újraépítése: %1 kapcsolat frissítése</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation>Történet újraépítése: %1 kapcsolat törlése</translation> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Letöltés</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Hely</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Könyvjelző</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Jelenlegi látómező</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation>WWW hivatkozás (OSM/Google Térkép)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation>Xapi kiválasztó</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>Az alábbi térképből (OpenStreetMap projekt által szolgáltatott térkép)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Nyers GPS-nyomvonalak letöltése is</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>Minden kapcsolat feloldása</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 letöltés</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Feloldatlan letöltése…</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>%1 / %2 feloldatlan letöltése</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>%1 / %2 feloldatlan feldolgozása</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Feldolgozás...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>XML feldolgozása</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Ütközések %1 adataiban</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>Üres vonalat/kapcsolatot találtam</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Az üres vonalak/kapcsolatok valószínűleg hibák. +Meg szeretnéd jelölni azokat törlésre?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>%1 üres jellemző eltávolítása</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Ütközéseket találtam</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>Ez azt jelenti, hogy valamit, amit megváltoztattál a legutóbbi letöltés óta, valaki más megváltoztatta a kiszolgálón. +A jellemzőket átmásoltam mint „conflict_…” az „Ütközések…” rétegre. +Mielőtt feltölthetnéd a változtatásaidat, saját kezűleg kell összevonnod a két változatot, és el kell távolítanod az „Ütközések…” rétegből.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Feltöltés…</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Változtatások előkészítése</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>Várakozás a kiszolgáló válaszára</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Letöltés…</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Letöltés OSM-ről (csatlakozás)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>Váratlan HTTP állapotkód (%1) +A kiszolgáló üzenete: „%2”</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +Az API üzenete: „%1”</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Nem sikerült letölteni</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Érvénytelen felhasználónév/jelszó</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>Megoldatlan ütközések</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>Kérlek, old fel előbb a meglévő ütközéseket</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>%1-%2 nyompontok letöltése</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation>MapDust</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Pontok letöltése</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Letöltés: %1,%2 (nagyít %3)...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>Nagyítás</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Bezárás</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>Nem lehet törölni</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation>Nem lehet törölni a kijelölést, mert a letöltött területen kívülre esik.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>Nem lehet törölni mindent</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation>A teljes kijelölést nem lehet törölni, mert egy része a letöltött területen kívülre esik. +Töröljem, amit lehetséges?</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation>%1 vonal megfordítása</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation>%1 vonal megfordítása</translation> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Exportálás</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>Mit szeretnél exportálni?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Minden láthatót (azaz ami nem rejtett)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>Látómezőt</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Kijelölést</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Jellemzők</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Térképet középre</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>Térképet középre nagyítva</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Hiányzó gyerekek letöltése</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Hozzáadás a kijelöléshez</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Törlés</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Kapcsolatok</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Mind</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Jellemzők</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>Csak teljesen a látómezőben levő jellemzők</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation>Szűrés látómező szerint</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Keresés…</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation>Csak a jelenlegi kijelölésben lévő jellemzők megjelenítése.</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation>Szűrés kijelölés szerint</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>Visszaállít</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Párbeszédablak</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Név</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Szűrő</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>…</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Bezárás</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>Szűrők beállítása</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Szűrők</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Szűrők listája:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Név:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Szűrő</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Alkalmazás</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Hozzáadás</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Eltávolítás</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>Hálózati időtúllépés</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>Nem lehet olvasni a fénykép részleteit a Walking Papers kiszolgálóról.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Kérlek, adj meg Walking Papers URL-t</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Geoképek</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Térképet középre</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation>c</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Képek eltávolítása</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Fájlnév vágólapra másolása</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Következő kép kiválasztása</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>PgDown</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Előző kép kiválasztása</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>PgUp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>Geocímkézett kép mentése…</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>Fényképréteg</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Geocímkézett képek betöltése</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>Válaszd ki, melyik réteghez tartoznak a képek:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation>A réteg csak olvasható</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation>A használt réteg nem írható. Írhatóvá kell tenni? +Ha nem, akkor nem tudsz ehhez tartozó képeket betölteni.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Képek betöltése…</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Betöltés megszakítása</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>Nincs ilyen fájl</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>A „%1” kép nem található.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Hiba a „%2” fájl megnyitásakor: +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Hiba az EXIF-adatok „%1” fájlból történő betöltésekor.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>Adj meg eltolást</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>Képek elhelyezése inkább:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>a nyomvonal végére</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>a nyomvonal elejére</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>óó:pp:mp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>Nincs nyompont</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>Nincs nyompont a „%1” képhez</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>mp „másodperc”</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>pp „perc” és mp „másodperc”</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>óó „óra”, pp „perc' és mp „másodperc”</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>Rossz kép?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>A „%1” képet %2 idővel a következő nyompont rögzítése előtt készítették. +Még mindig szeretnéd használni?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>A „%1” képet %2 idővel a következő nyompont rögzítése után készítették. +Még mindig szeretnéd használni?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation>Kimeneti fájlnév megadása</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>JPEG képek (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Hiba „%1” megnyitásakor: +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>Ugrás</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Könyvjelző</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation>WWW hivatkozás (OSM/Google Térkép)</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation>Koordináták</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation>Leképezett megjelenítése</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>lonMin, latMin, lonMax, latMax</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>latCent, lonCent, latSpan, lonSpan</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Információ</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>OSM API URL</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>OSM XAPI URL</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Keresés</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>Érvénytelen OSM URL</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>A megadott URL érvénytelen!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Érvénytelen koordináta-formátum</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>A koordinátáknak ilyen formában kell lennie: „<bal hosszúság>, <alsó szélesség>, <jobb hosszúsűg>, <felső szélesség>”</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>A koordinátáknak ilyen formában kell lennie: „<közép hosszúság>, <közép szélesség>, <kiterjedési szélesség>, <kiterjedési hosszúság>”</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Nincs</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>Shape feldolgozó</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>Nagyítás</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation>Látómező vetületének állítása a réteghez</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation>Eltolási beállítások visszaállítása</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Bezárás</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>WMS feldolgozó</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>TMS feldolgozó</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>Bővítmények</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Térkép – nincs</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Térkép – WMS – %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Térkép – WMS-C – %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>Térkép – WMS-Csempézett – %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Térkép – TMS – %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Térkép – %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>Licencfeltételek: %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>Licencfeltételek nincsenek elfogadva</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation>Nem jelölted be a jelölőnégyzetet, amely jelzi, hogy elfogadod a licencfeltételeket. +Így nem használhatod ezt a forrást térképrétegként. +Tényleg ezt szeretnéd?</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Kiszolgáló</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Csempeméret</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>Minimális/maximális nagyítás</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Vetület</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Párbeszédablak</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>Bemenet</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>OSM előnézet</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Jellemzők</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>Az első sor tartalmazza a fejlécet</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Elválasztó</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Pontosvessző (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Tab</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Más:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation>Szöveghatároló</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Nincs</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation>Aposztróf (')</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation>Idézőjel (")</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>Vetület (PROJ4 formátumában; hagyd üresen ehhez: szélesség/hosszúság)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Mezők</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>Mezők listája:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>Mező neve (= címkekulcs):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>Címketípus:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Importálás</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>Importálás tartománya</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>Innen (0 a kezdettől):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>Idáig (0 a végéig):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>Beállítások betöltése…</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Beállítások mentése…</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Karakterlánc</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Egész szám</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>Lebegőpontos szám</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Hosszúság</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Szélesség</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Érvénytelen vetület</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>Nem sikerült a vetületet beállítani.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Nincs koordináta</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>Szélesség vagy hosszúság mező hiányzik. Így nem lehetséges importálni a fájlt. +Biztosan ki szeretnél lépni?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>CSV importálás beállításainak betöltése</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Merkaartor importálásbeállítás (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Érvénytelen fájl</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 fájl nem nyitható meg.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1 nem egy CSV importálásbeállítási fájl</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation>CSV importálás beállításainak mentése</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>névtelen</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Minden fájl (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation>Nem lehet megnyitni a mentett importálásbeállításokat</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 nem nyitható meg írásra.</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation>Nem lehet beállítani a vetületet; adj meg egyet</translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Információ</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Méret</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation>%n jellemző</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Jellemzők</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Összes megjelenítése</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Összes elrejtése</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Összes csak olvasható</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Semmi sem csak olvasható</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Bezárás</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Rétegek</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Mind</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>Térkép</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>Rajz</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>Nyomvonalak</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation>Rétegek visszaállítása az alapértelmezettre</translation> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Űrlap</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Látható</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Csak olvasható</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>Alacsony</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>Magas</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>Átlátszatlan</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Átlátszóság</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation>Réteg bezárása: módosított objektumok vannak</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation>Módosított jellemzők vannak ezen a rétegen. +Biztos vagy benne, hogy be szeretnéd zárni? (nem visszavonható)</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation>Réteg bezárása: nem üres</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation>Biztos vagy benne, hogy be szeretnéd zárni ezt a réteget? (nem visszavonható)</translation> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>Licencfeltételek</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation>SzövegFelirat</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>Elolvastam, és egyetértek a licencfeltételekkel</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Ne kérdezzen meg ismét</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation>%1 v%2 +Bővítmények betöltése…</translation> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation>%1 v%2 +Előkészítés…</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>&Súgó</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Létrehozás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Szerkesztés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>&Nézet</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Könyvjelzők</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Fájl</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Exportálás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>&Eszközök</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>&Stílus</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation>&Címkesablonok</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Pont</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>&Ablak</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Dokkok</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>&Jellemző</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>&Rétegek</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>&Kapcsolat</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>&Megjelenítés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>Fő eszköztár</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>&Kilépés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>&Névjegy</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>&Megnyitás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Új dokumentum létrehozása, fájl importálása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>&Közelítés az összesre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>&Közelítés az ablakra</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>Közelítés az ablakra</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>&Távolítás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>&Közelítés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Közelítés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Ívelt bekötőút</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Visszavonás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>Új&ra</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>&Mozgatás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation>Importálás a &GDAL használatával</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Importálás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Fájl importálása a jelenlegi dokumentumba</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Letöltés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Térképadatok letöltése egy új területhez</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Bekötőút</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Bekötőút létrehozása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Kijelölés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>&Feltöltés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Változtatások feltöltése a kiszolgálóra</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>&Eltávolítás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>A kijelölt jellemzők törlése</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation>&Billentyűparancs-szerkesztő…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Új pont létrehozása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>&Megfordítás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation>&Körforgalom</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Körforgalom létrehozása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Új</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>&Kettévágás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>&Egyesítés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>Szét&választás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Szakítás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>&Kapcsolat</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Kapcsolat létrehozása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>&Terület</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Új terület létrehozása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Minden látható réteg exportálása egy fájlba</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Keresés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Elemek keresése és kiválasztása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>A látómezőbeli jellemzők exportálása egy fájlba</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>&Egyesítés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Pontok egyesítése</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>A kijelölt pontok egyesítése (az elsőként kijelölt fog megmaradni)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Mentés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Több letöltése</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>További térképadatok letöltése a jelenlegi területhez</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Tulajdonságok</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>&Információ</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>&Igazítás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Pontok igazítása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>A kijelölt pontok igazítása. Az első kettő kiválasztott határozza meg a vonalat.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation>&Szétterítés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation>Pontok szétterítése</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation>A kijelölt pontok igazítása és szétterítése egyenletesen.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>&Másolás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>A kijelölt jellemzők és címkék másolása a vágólapra</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>A kijelölt jellemző címkéinek másolása a vágólapra. Ha a jellemző nyompont, akkor a koordinátáit is másolja.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Címkék beillesztése (&felülír)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>A vágólapon található címkék beilleszése (és felülírása) a kijelölt jellemzőre.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>Címkék beillesztése (&egyesítés)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Címkék beillesztése</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>A vágólapon található címkék beillesztése (összefűzve a meglévő címkékkel)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>A vágólapon található címkék összefűzése a kijelölt jellemzők címkéivel.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Beillesztés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Jellemzők beillesztése a vágólapról</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>A vágólapon található jellemzők beillesztése. Ha a jellemzők azonosítói már szerepelnek a dokumentumban, akkor felülírja azokat.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Jellemző áthelyezése a módosított rétegre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>&Képréteg</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>&Raszter/SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>&Indítás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>GPS indítása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>GPS visszajátszása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>&Megállítás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>GPS megállítása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>GPS &középre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>Kiszínezés megjelenítése</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Rögzítés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>GPS rögzítése</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Szüneteltetés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>GPS szüneteltetése</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>&Geokép</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>&Tag hozzáadása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>&Tag eltávolítása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>&Soha</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>&Mindig</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>&Leválasztás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>&Stílusok</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation>Fájl importálása a jelenlegi dokumentumba GDAL használatával</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Kamera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Forgatás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation>&Sokszög</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Jellemzők</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>&Felosztás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation>Szakasz felosztása egyenlően</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>&Közelítés zárolása a csempés háttérhez</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>OsmChange (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Bezárás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>&Egyszerűsítés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation>Vonal(ak) egyszerűsítése</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation>Vonal egyszerűsítése a szükségtelen gyerekpontok eltávolításával</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>&Nincs</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation>Terület felosztása két pont között</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>&Terület felosztása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation>Terület felosztása lakóhelyekké</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation>Egy kijelölt terület egyenletes felosztása lakóhelyekké.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation>&Igazítás tengelyhez</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation>Élek igazítása szabályos tengelyekhez</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Tulajdonságok…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation>&Módosított jellemzők kiemelése</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation>&Kivágás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation>&Kizárás</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation>Műveletek kizárása vonalakhoz (JOSM stílus)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation>Kijelölés be- és kikapcsolása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation>Gyerekek belefoglalása a kijelölésbe</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>Méretezés</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation>GDAL SQLite/SpatiLite</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation>Drótváz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation>Szülő(k) kiválasztása</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Hiányzó gyerek letöltése</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation>&Híd</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation><html><head/><body><p>Vonal átalakítása híddá</p></body></html></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>%2 „%1” címkéjének törlése</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>%2 %1 címkéjének törlése</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation>%1 „source” címkéjének beállítása</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>%2 „%1” tagjának eltávolítása</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation>Tagok átrendezése a(z) %1 kapcsolatban</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>%1 kapcsolat megváltozott</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>%1 terület létrehozása</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Terület: %1 vonal létrehozása</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Lyuk hozzáadása.</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Szeretnél (még) egy lyukat adni ehhez a területhez?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Terület: %1 vonal befejezése</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Terület: %1 pont hozzáadaása a(z) %2 vonalhoz</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>%1 terület lezárása</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>BAL-KATTINTÁS: kezdés;HÚZÁS: méretezés;SHIFT-HÚZÁS: forgatás;BAL-KATTINTÁS: befejezés</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>%1 körforgalom létrehozása</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation>%1 vonal lezárása</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>BAL-KATTINTÁS: kijelölés;JOBB-KATTINTÁS: mozgatás;CTRL-BAL-KATTINTÁS: kijelölés megfordítása;SHIFT-BAL-KATTINTÁS: hozzáadás a kijelöléshez;BAL-HÚZÁS: terület kijelölése;CTRL-JOBB-HÚZÁS: közelítés;DUPLA-KATTINTÁS: pont létrehozása;DUPLA-KATTINTÁS egy ponton: vonal kezdése;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>KATTINTÁS: kijelölés/mozgatás;CTRL-KATTINTÁS: kijelölés megfordítása;SHIFT-KATTINTÁS: hozzáadás a kijelöléshez;SHIFT-HÚZÁS: terület kijelölése;CTRL-HÚZÁS: közelítés;DUPLA-KATTINTÁS: pont létrehozása;DUPLA-KATTINTÁS egy ponton: vonal kezdése;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>%1 jellemző eltávolítása</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>Jellemzők eltávolítása</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Gyerekek törlése.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation>Szeretnéd törölni a gyerekpontokat is? +Vedd figyelembe, hogy a letöltött területen kívül lévő OSM pontok megtartásra kerülnek.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation>%1 vonal megfordítása</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>BAL-KATTINTÁS: kijelölés;BAL-HÚZÁS: mozgatás</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>Azonos pozícióban pontok találhatók.</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>Egyesíteni szeretnéd az összes pontot a leejtés helyén?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Pontokat egyesítése ebbe: %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation>RÁMUTATÁS: kijelölés;BAL-HÚZÁS: forgatás</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation>Jellemző forgatása</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation>RÁMUTATÁS: kijelölés;BAL-HÚZÁS: méretezés</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation>Jellemző méretezése</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>BAL-KATTINTÁS az első sarokhoz -> BAL-HÚZÁS a terület megadásához -> BAL-KATTINTÁS közelítéshez</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>GPS Exchange formátum (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>OpenStreetMap formátum (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation>OpenStreetMap változtatásformátum (*.osc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Noni GPSPlot formátum (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>NMEA GPS naplóformátum (*.nmea *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>KML fájl (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>Vesszővel elválasztott formátum (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Geocímkézett képek (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>ESRI Shapefájl (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation>Geography Markup Language (*.gml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation>Protobuf Binary Format (*.pbf) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Támogatott formátumok</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Merkaartor dokumentum (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Minden fájl (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>csempe %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>Alacsony</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>Magas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>Átlátszatlan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Jellemző</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Pont</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Kapcsolat</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Kép betöltése</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>Pont pozíciójának hozzáadása a képhez</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation>Kép geocímkézése ezzel a pozícióval</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Mégse</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>Fájl</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Szerkesztés</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>Nézet</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>Megjelenítés</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>Irányjelző nyilak</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Rétegek</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Létrehozás</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Vonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Eszközök</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>Ablakok</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Súgó</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation>Jellemzők kivágása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Érvénytelen vágólap</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>A vágólap nem tartalmaz érvényes adatot.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation>GDAL importálási figyelmeztetés</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation>Arra készülsz, hogy fájl(oka)t importálj GDAL használatával. Ez a funkció meglehetősen kísérleti, és vagy működik, vagy NEM, lehetséges összeomlást okozva. Győződj meg róla, hogy nem vesztesz adatot abban az esetben, ha valami nem működne. +Kérlek, összeomlás esetén jelentsd a hibákat, de ne lepődj meg rajta. + +Folytassuk az importálást? +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation>Fájl importálása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Mentetlen változtatások</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>A jelenlegi térkép mentetlen változtatásokat tartalmaz, amik el fognak veszni egy új térkép kezdésekor. +Szeretnéd megszakítani egy új térkép kezdését, vagy folytassuk, ezzel eldobva a régi változtatásokat?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation>Mentetlen stílusmódosítások</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation>Módosítottad a jelenlegi stílust. +El szeretnéd menteni a változtatásaidat?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Útpontok</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>%1 nyomvonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Nagy kövér figyelmeztetés szerzői jogra</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Egy KML fájlt próbálsz importálni. Kérlek, légy tekintettel arra, hogy: + +– Nem importálhatsz az OSM-be Google Earth-ben létrehozott KML fájlt. Talán azt + gondolod, hogy GE-ben készített pontok a sajátjaid. Nem azok! + Az még mindig egy GE-ből származtatott munka, és mint ilyen, nem használhatod az OSM-ben. + + – Ha Internetről töltötted le, jó eséllyel szerzői jog védi. + Kérlek, győződj meg arról teljesen, hogy a szerző megengedi az adatai OSM-beli felhasználását, vagy + hogy az adatok közkincsnek minősülnek. + +Ha bizonytalan vagy, kérlek, kérj tanácsot a „legal” vagy „talk” OpenStreetMap levelezőlistákon. + +Teljesen biztos vagy abban, hogy ezt a KML-t jogod van importálni az OSM-be?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>Nem érvényes fájl</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 fájlt nem lehet megnyitni.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation>Beérkező távirányítókérés</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation>Be szerettem volna tölteni a(z) „%1” objektumot, de nem tudom, hogyan kell. Elnézést.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation>%1 %2 POI távoli hozzáadása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation>Beérkező távirányítókérés</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation>Ismeretlen művelet-URL: %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>Régi Qt verzió észlelve</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>Ez a telepítés a Qt %1 verzióját használja, amely különféle ismert hibákat tartalmaz, amik az adatokat OpenStreetMapra feltöltvén 401-es kiszolgáló-válaszkódokat eredményeznek. Biztosan folytatni szeretnéd (ez nem ajánlott)? +További tudnivalókért lásd: http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>Feltöltés OSM-be</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Úgy tűnik nem adtad meg +OpenStreetMap felhasználónevedet és jelszavadat. +Meg szeretnéd tenni ezt most?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Hiba letöltéskor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>A térkép nem tölthető le</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation>Hiba MapDust letöltésekor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation>A MapDust hibák nem tölthetők le</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Sokszög létrehozása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>Add meg az oldalak számát</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Jellemzők feltöltésének kényszerítése</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation>Fájl megnyitása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Csomópont létrehozása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Többszöri metszés.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>Ezek a vonalak többször metszik egymást. +Még mindig szeretnél létrehozni egy-egy csomópontot mindegyikhez (később még törölheted azt, ami nem kell)?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Házszámok hozzáadása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation>Szakaszok száma, amikre fel lesz osztva</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation>Add meg a szakaszok számát</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation>Igazítás tengelyhez</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation>Add meg a szabályos tengelyek számát, amikhez az oldalak igazítva lesznek (pl. 4 a derékszögűhöz)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>háromszögű</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>derékszögű</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>ötszögű</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>hatszögű</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation>hétszögű</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>nyolcszögű</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation>Igazítás %1 tengelyre</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation>Igazítás %1 szabályos tengelyre</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation>Nem sikerült igazítani a tengelyekhez</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation>Igazítás a tengelyekhez művelet sikertelen. Kérlek, pontosítsd bármelyik éles sarkot, és próbáld újra. </translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation>Igazítás a tengelyekhez művelet sikertelen, és nem látszik a megoldás.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation>Bing kivonat</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Pontok igazítása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation>Pontok szétterítése</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>%1 pont leválasztása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Tag hozzádása kapcsolathoz</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Tag eltávolítása kapcsolatból</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation>Hozzáadás multipoligonhoz</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation>Területek egyesítése</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>Terület felosztása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation>Terület felosztása %1 részre</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>%1 kapcsolat létrehozása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Térképstílus mentése</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Merkaartor térképstílus (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Térképstílus betöltése</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation>Merkaartor térképstílus (*.mas) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation>MapCSS stíluslap (*.css)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation>Történet újraépítése</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation>Megkíséreljük újraépíteni a történetet. +Nincs rá garancia, és nem lehet visszavonni. +Biztos vagy benne, hogy meg szeretnéd ezt próbálni? </translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>névtelen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Merkaartor dokumentum mentése</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Merkaartor dokumentumfájlok (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation>Merkaartor dokumentumsablon mentése</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>Nem sikerült megnyitni a fájlt a mentéshez</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 nem nyitható meg írásra.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation>Nem sikerült megnyitni a sablondokumentumot a mentéshez</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Érvénytelen fájl</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 érvénytelen Merkaartor dokumentum.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>Exportálás OSM-be</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>OSM fájlok (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>Exportálás osmChange-be</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>osmChange fájlok (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Exportálás GPX-be</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>GPX fájlok (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Exportálás KML-be</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>KML fájlok (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation>Jellemző kibontása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation>Jellemzők kibontása…</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation>Gombok címkéinek elrejtése az eszköztáron</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (beépített)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Könyvjelző hozzáadása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Adj nevet a könyvjelzőnek.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Érvénytelen könyvjelzőnév</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>A könyvjelző nem lehet üres.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Figyelem: már van ilyen könyvjelzőnév</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Adj meg újat, tartsd meg ugyanazt a felülíráshoz, vagy mégse.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Könyvjelző eltávolítása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Válaszd ki az eltávolítandó könyvjelzőt.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Érvénytelen vetület</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>Nem lehet beállítani a(z) „%1” vetületet.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>GPS hiba</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>Nem sikerült megnyitni a GPS portot.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>NMEA naplófájl megnyitása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>Címkesablonok mentése</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Merkaartor címkesablonok (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>Címkesablonok megnyitása</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation>Figyelmeztetés! Nem tölthetők be a Merkaartor fordítások a(z) „%1” nyelvhez. Váltás az alapértelmezett angolra.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>Feloldatlan ütközések</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>Kérlek, old fel előbb a meglévő ütközéseket</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Erősen ajánlott a változtatásokat elmenteni a dokumentumba feltöltés után. +Meg szeretnéd ezt tenni most?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>Verzió: </i><b>%1</b> </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>utoljára módosítva: </i><b>%1</b> <b>%2</b> által</translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>utoljára módosítva: </i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>réteg: </i><b>%1</b> </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation>Böngészés</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Útpont</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>koordináta</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>leírás</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>megjegyzés</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Pont</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>magasság</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>sebesség</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>méret</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>tagok</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>Bal felső</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>Jobb alsó</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Kapcsolat</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Szerep</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Tag</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation>Zárt vonal</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Hossz</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Méret</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>%1 pont</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Terület</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Vonal</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation>%1 m/képpont</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation>Igazítás: %1m @ %2</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation>%1ms</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>Nézet</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation>Befoglaló keret</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Vetület</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Új könyvjelző</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>Beállítások feltöltése nem sikerült</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Duplikált kulcs</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Több mint 150 beállítás</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation>Beállítások kommunikációja nem sikerült</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation>Kommunikációs hiba</translation> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Új kiszolgáló</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Űrlap</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>Címkék</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>Kijelölt elemek</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation>Osztály</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Név</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Ismeretlen mező</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Hiba!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>A névkereső szolgáltatás hitelesítést igényel.</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Űrlap</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>Kimeneti fájlnév</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>névtelen</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation>PDF fájlok (*.pdf)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Minden fájl (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Képfájlok (*.png *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>SVG fájlok (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation>Raszter/SVG exportrálás</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation>Beállítások</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>min. lat/Lon</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>max. lat/Lon</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation>Pontok megjelenítése</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation>Kapcsolatok megjelenítése</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>Méretarány megjelenítése</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation>Szélességi/magassági háló megjelenítése</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation>Nem stílusos jellemzők megjelenítése</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation>Nyomtatás felbontása</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation>300</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation>600</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation>1200</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation>dpi</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>Exportálás PDF-be…</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>Exportálás SVG-be…</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation>Exportálás raszterbe…</translation> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Űrlap</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Felhasználó:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation>Jelszó:</translation> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Térképstílusszerkesztő</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Mindenre</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Háttér</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation>Pontok</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Arányos vastagság</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>Rögzített vastagság</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>Szűrő</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Hozzáadás</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Eltávolítás</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Duplikálás</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>Címkeválasztás</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>méter/képpont</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>Látható maximum</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>Látható minimum</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Rajzolószín</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Szaggatott</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>ki</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Terület kitöltése</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation>Kitöltés a kiszínező ikonnal</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Körvonal</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation>Belső</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation>Külső</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>Kiszínezés</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Vonal rajzolása</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Ikon rajzolása</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation>Irányjelző nyilak rajzolása</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Címke</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Betűkészlet</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Feliratcímke</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Körvonal</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Terület</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Rajzolás háttérszínnel</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Felirat háttércímkével</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Mindig</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Szín kiválasztása</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>Nincs érvényes geocímke</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>Szövegcímke</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation>Ez a fotó nem tartalmaz geocímkéző EXIF adatokat. +Szeretné megcsinálni most?</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation>Próbáljuk meg egyeztetetni egy nyomponttal</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>Betöltés társított pont nélkül</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>Információ kinyerése vonalkódból (Walking Papers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>Hagyjuk figyelmen kívül</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>Alkalmazás minden jelenlegi fotóra.</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Párbeszédablak</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>Kimeneti fájlnév</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>névtelen</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>SVG fájlok (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Minden fájl (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Képfájlok (*.png *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Beállítások</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>Látvány</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Általános</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Alacsony/magas átlátszatlanság</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>Egyszeres egérkattintásos műveletek</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>Egyedi Qt stílus használata</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation>Pont/vonal létrehozásának engedélyezése kijelölés módban</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>Rejtett kapcsolatok kiválaszthatók</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Színek</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Háttér</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>Stílus felülírása</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>GPX nyomvonal</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>képpont</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Felület</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Rámutatás</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Kapcsolatok</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Fókusz</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Kiemelés</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation>Módosított</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Nyelv</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Nyelv használata</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>Standard címkék lefordítása</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation>Renderelés</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation>Beállítások</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation><html><head/><body><p>Ha engedélyezve van, a drótvázrenderelés (Nézet->Drótváz) a jelenlegi stílust fogja használni a színekhez és kitöltéshez. Csak a rögzített vastagság lesz használva a szélességhez. </p></body></html></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation>A jelenlegi stílus használata a drótvázrendereléshez</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation>Szerkesztés</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation>Gyors szerkesztés</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation>Drótváz szerkesztés</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation>Teljes renderelő szerkesztés</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Térképstílus</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Egyéni stílusmappa</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Jelenlegi stílus</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Sablon</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>Címkesablon</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Beépített</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Egyéni</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Adatok</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation>XAPI</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Dokumentumok</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation>Dokumentumsablon automatikus betöltése</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Dokumentumok automatikus mentése feltöltés után</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>Nyomvonalak</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation>GDAL</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation>Vetület megerősítése</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>GPS bemenet</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>Soros</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Gép</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>NMEA napló mentése</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>Rendszeridő igazítása a GPS-hez</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Hálózat</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Proxybeállítások</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Jelszó:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Felhasználó:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Port:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Gép:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Térképfeldolgozó</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation>„source” címke automatikus hozzáadása jellemzők létrehozásakor háttérkép felett</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Eszközök</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Név:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Útvonal:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Alkalmazás</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Hozzáadás</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Eltávolítás</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Angol</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Arab</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation>Kínai (Taiwan)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation>Horvát</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Cseh</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Holland</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Német</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Francia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>Magyar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation>Indonéziai (Indonézia)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Olasz</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>Japán</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Lengyel</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Orosz</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation>Portugál (Brazil)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Spanyol</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Svéd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Ukrán</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation>[kevesebb, mint 50% kész] Kínai (Kína)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation>[kevesebb, mint 50% kész] Észt</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation>[kevesebb, mint 50% kész] Német (Osztrák)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation>[kevesebb, mint 50% kész] Portugál</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation>[kevesebb, mint 50% kész] Szlovák</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation>[kevesebb, mint 50% kész] Vietnám</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Merkaartor címkesablon (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Szín kiválasztása</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>Az eszköz már létezik</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Ilyen nevű eszköz már van. +Kérlek, válassz más nevet, vagy kattints az <Alkalmazás> gombra, ha a meglévőt szeretnéd módosítani</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>Előre beállított eszköz nem törölhető</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>A(z) „%1” előre beállított eszköz nem törölhető</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>Előre beállított eszköz neve nem módosítható</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>A(z) „%1” előre beállított eszköz neve nem módosítható</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>Végrehajtható fájl választása eszközhöz</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation>Dokumentumsablon kiválasztása</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation>Merkaartor dokumentum (*.mdc)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>Naplókönyvtár kiválasztása</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation>Vetület beállítása</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>Vetületek</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation>Vetületek listája:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Név:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>PROJ4 karakterlánc</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Alkalmazás</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Hozzáadás</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Eltávolítás</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation>Kérlek, adj meg egy vetületet</translation> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation>Dokumentum</translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Párbeszédablak</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation>Előre definiált</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation>Szabványos (EPSG:...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation>Egyéni PROJ4(+proj=...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation>WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation>Hiba a WKT karakterláncban</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation>Nem sikerült exportálni a PROJ4 formátumba</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation>Érvénytelen WKT karakterlánc</translation> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Tulajdonságok</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 kiválasztott elem</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 kiválasztott elem</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Kiválasztott elemek</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Tulajdonságok – Több elem</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Tulajdonságok – Pont</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Tulajdonságok – Kapcsolat</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Tulajdonságok</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation>Hiba a sablonfájl olvasásakor</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Térképet középre</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>Térképet középre nagyítva</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Tag kijelölése</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Kaszkádolt takarítás</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>%1 pont mozgatása</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation>GPX exportálása…</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Mégse</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation>Importálás…</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation>Importálva: %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>osmChange importálása</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>NGT importálása</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>NMEA importálása</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation>Bing útdetektor</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation>A kimenet nem szerezhető meg.</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation>Nem érvényes adat.</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation>A kimenet nem dolgozható fel.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation>Üres megjegyzés használata a módosításcsomaghoz?</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation>A módosításcsomag megjegyzése üres. Egy jó megjegyzés megadása udvariasságnak tekinthető a térképezőtársaid felé, így mindenki tudja, mire szolgál a változtatásod, és milyen szándékkal. +Még mindig üres megjegyzéssel szeretnéd beküldeni a módosításcsomagot?</translation> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Érvénytelen</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation>Nincs helyzetmegjelölés</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation>Nincs idő</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>méter</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>Nem érhető el</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation>Helyzetmegjelölés OK</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>GPS naplóhiba</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Nem lehet létrehozni a GPS naplófáljt: %1.</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation>Nem lehet csatlakozni ide: %1:%2</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>GPS naplóhiba</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Nem lehet létrehozni a GPS naplófáljt: %1.</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>Szövegcímke</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99° 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Hosszúság</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Magasság</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 méter</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation>Műholdak száma</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Helyzetmegjelölés típusa</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Érvénytelen</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Sebesség</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Szélesség</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>Nem megfelelő az eredmény-adatfolyam!</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation>Eszköztárak testreszabása</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation>Műveletek</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation>Eszköztárak</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>Új</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Eltávolítás</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>Átnevezés</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation>Az összes visszaállítása</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Alkalmazás</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Mégse</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation>Fel</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation>Le</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation>Jelenlegi eszköztárműveletek</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation>< E L V Á L A S Z T Ó ></translation> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation>Egyéni eszköztár</translation> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Űrlap</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Tagok</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation>Kijelölt tag(ok) eltávolítása</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>Címkék</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation>"source" címke hozzáadása</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation>Kijelölt címkék eltávolítása</translation> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Űrlap</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Azonosító</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>Címkék</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation>"source" címke hozzáadása</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation>Kijelölt címkék eltávolítása</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>…</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Nincs műhold</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Kijelölés</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Kulcs</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Érték</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Név</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Azonosító</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation>Lekérdezés</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation>Maximális visszaadott eredmény (0 az összeshez)</translation> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation>Réteg frissítése</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Bezárás</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Stílusok</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Stílusok</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Feltöltés OpenStreetMapra</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation>Megjegyzés</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation>Egy jó megjegyzés tömören és megfelelően leírja a szerkesztést.</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation>Az alábbi változtatások lesznek beküldve:</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation>Hozzáadva</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation>Feltöltve</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation>Törölve</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation>Vonal</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation>Pont</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation>Kapcsolat</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation>Összesen</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Mégsem</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>TMS kiszolgálóbeállító</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>TMS kiszolgálók</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Kiszolgálók listája:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Név:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Kiszolgáló URL:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>Szolgáltatások lekérdezése</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>Szolgáltatások:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation>Ez egy szabványos TMS kiszolgáló.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Vetület:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Mercator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>Szélesség/hosszúság (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation>Bal alsó kiindulópont</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation>Csempeméret:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation>Minimális közelítés:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation>Maximális közelítés:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation>„source” címke értéke:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>Licenc URL:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Alkalmazás</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Hozzáadás</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Eltávolítás</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation>Merkaartor: szolgáltatások lekérdezése</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>Cím és útvonal nem lehet üres.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation>Hiba a szolgáltatások olvasásakor. A kiszolgáló valószínűleg nem támogatja ezt a funkciót. +</translation> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Kulcs</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Érték</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation>Címkeszerkesztő</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation>Már van ilyen nevű címke.</translation> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>Ennek a szerkesztése hozzáadáshoz…</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Űrlap</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation>VAGY</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>ÉS</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation>NEM</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation>ez</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation>egyike</translation> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Nincs megadva</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Nincs megadva</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation>Terület felosztása</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation>Nincs házszámozás</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>Házak száma</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>Házszámok hozzáadása (Karlsruhe-séma)</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation>Tartományok</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>Például „1-9;15-17;19,19A”</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation>Minta</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Minden szám</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>Páratlan számok</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>Páros számok</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation>Opcionálisan kijelölhetsz egy pontot is a területen, és a házszámozás ettől a végtől fog kezdődni.</translation> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Kivonat – %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation>Nyomvonalszakaszok száma</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Teljes távolság</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Teljes időtartam</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1 óra %2 perc</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Rajzolóréteg kibontása</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>Közelítés</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Bezárás</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>Nyompont</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Szélesség</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Hosszúság</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Azonosító</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Címkék</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation>"source" címke hozzáadása</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation>Kijelölt címkék eltávolítása</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>…</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Párbeszédablak</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Webhely</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Jelszó</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Felhasználónév</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Proxy használata</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>Nagyítás</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Törlés</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>WMS kiszolgálóbeállító</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>WMS kiszolgálók</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Kiszolgálók listája:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Név:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Kiszolgáló URL:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Rétegek:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation>Cím</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Vetület:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation>Kicsempézés</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>Nagyítási szintek</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>Képformátum:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Stílusok:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation>„source” címke értéke:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>Licenc URL:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Alkalmazás</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Hozzáadás</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Eltávolítás</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: képességek lekérdezése</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>Cím és útvonal nem lehet üres.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation>Névtelen réteg</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation>Névtelen</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation>Ez egy gyorsítótárazó WMS kiszolgáló.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation>Nem sikerült kapcsolódni a WMS kiszolgálóhoz: %1</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation>A képességek nem kérdezhetők le: %1</translation> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_id_ID.ts b/translations/merkaartor_id_ID.ts new file mode 100644 index 0000000..f2a31ca --- /dev/null +++ b/translations/merkaartor_id_ID.ts @@ -0,0 +1,7383 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="id_ID" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>Tentang Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>Program ini berlisensi dibawah GNU General Public License v2</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Versi Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Versi Qt</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>Versi GDAL</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Catatan Perubahan</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>OK</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Penjelasan</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Pintasan</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Impor</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Ekspor</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>&Standar</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Batal</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Pintasan Editor</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Muat Skema Pintasan</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Skema pintasan Merkaartor (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Gagal membuka berkas</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 tidak dapat dibuka.</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>Simpan skema Pintasan</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>Tanpa Judul</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Semua Berkas (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Tidak dapat membuka berkas simpanan</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 tidak dapat dibuka untuk diubah</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation>BridgeBuilder</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation>Maaf, saya tidak tahu cara membangun jembatan dari ITU. Silahkan, berikan saya dua titik saja.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation>Konversi ruas ke jembatan</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation>Ruas yang dipilih sudah ditandai sebagai jembatan/terowongan. Silahkan, pastikan anda tahu apa yang anda lakukan.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation>Tindakan tidak didukung: Jembatan tidak terlihat seperti satu arah.</translation> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Tidak ada penjelasan</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Bentuk</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Bentuk</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation>Presisi (meter/segmen)</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation>Tipe</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation>Bundaran</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation>Lingkaran biasa</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation>Kiri</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation>Kanan</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation>Sisi mengemudi</translation> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation>Disana <b>tidak ada</b> objek kotor</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation>Ada <b>satu</b> objek kotor</translation> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Kembalikan</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Tengah peta</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>Tengah && Perbesar peta</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Kembalikan</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation><b>Tidak ada</b> objek kotor.</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Bersihkan</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>Perbesar</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>MENAMBAH jalan %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>MENAMBAH trackpoint %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>MENAMBAH relasi %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>MENGUBAH trackpoint %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>MENGUBAH relasi %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>MENGUBAH jalan %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>MENGHAPUS trackpoint %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>MENGHAPUS jalan %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>MENGHAPUS relasi %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Kesalahan permintaan unggah</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Silahkan konfirmasi username dan kata kunci pada menu Preferensi</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Ada kesalahan mengunggah permintaan (%1) +Pesan server adalah '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +Pesan API adalah '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Mengunggah perubahan...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>MEMBUKA set perubahan</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>MENUTUP set perubahan</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Kesalahan permintaan unggah</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Silahkan konfirmasi username dan kata kunci pada menu Preferensi</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Ada kesalahan mengunggah permintaan (%1) +Pesan server adalah '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +Pesan API adalah '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation>Ada kesalahan mengunggah permintaan (%1) +"%2" +Silahkan unduh-ulang fasilitas permasalahan untuk mengatasi hal ini.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>Memeriksa perubahan...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>MEMBUKA set perubahan</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>MENUTUP set perubahan</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation>Perubahan tidak dapat ditutup</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation>Terjadi kesalahan yang tidak diketahui. Mungkin sudah ditutup, atau akan ditutup secara otomatis. Jika Anda ingin memastikan, silakan, periksa secara manual di situs web osm.org.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>MENAMBAH relasi %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>MENAMBAH jalan %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>MENAMBAH trackpoint %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>MENGUBAH relasi %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>MENGUBAH jalan %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>MENGUBAH trackpoint %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>MENGHAPUS trackpoint %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>MENGHAPUS jalan %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>MENGHAPUS relasi %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>Tanpa Judul</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Lapisan kotor</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Lapisan terunggah</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Latar pembanding</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation>Menggambar lapisan #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation>Seleksi lapisan #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>Ekspor OSM</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>Mengekspor OSM...</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>Dokumen</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation>Sejarah pembangunan: Membuat titik %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation>Sejarah pembangunan: Mengubah titik %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation>Sejarah pembangunan: Menghapus titik %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation>Sejarah pembangunan: Membuat jalan %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation>Sejarah pembangunan: Mengubah jalan %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation>Sejarah pembangunan: Menghapus jalan %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation>Sejarah pembangunan: Membuat relasi %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation>Sejarah pembangunan: Mengubah relasi %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation>Sejarah pembangunan: Menghapus relasi %1</translation> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Unduh</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Lokasi</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Tandai</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Pandangan saat ini</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation>Tautan WWW (OSM/Google maps)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation>Pemilih Xapi</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>Dari peta dibawah (map disediakan oleh proyek OpenStreetMap)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Unduh juga jalur GPS mentah</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>Perbaiki semua relasi</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>Unduh %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Pengunduhan tidak dapat diselesaikan</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>Pengunduhan tidak selesai %1 dari %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>Mengurai permasalahan %1 dari %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Menguraikan...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Mengurai XML</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Konflik dari %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>Jalan/relasi kosong terdeteksi</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Jalan/relasi kosong mungkin keliru. +Anda mau menandai untuk dihapuskan?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Menghapus ciri kosong %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Konflik telah terdeteksi</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>Maksudnya ciri yang sudah anda ubah sejak terakhir unduh telah diubah oleh orang lain di server. +Cirinya telah terduplikasi sebagai "konflik_..." pada lapisan "Konflik...". +Sebelum benar-benar mengunggah perubahan, anda harus menggabungkan secara manual kedua versi tersebut dan menghapus salah satunya dari lapisan "Konflik...".</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Mengunggah...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Menyiapkan perubahan</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>Menunggu respon dari server</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Mengunduh...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Mengunduh dari OSM (menyambungkan)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>Kode status http tak terduga (%1) +Pesan servernya '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation>Pesan API-nya '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Gagal unduh</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Username/password tidak sah</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>Konflik yang tidak bisa diperbaiki</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>Silahkan perbaiki konflik yang ada terlebih dahulu</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>Mengunduh trackpoint %1-%2</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation>MapDust</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Mengunduh titik</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Mengunduh %1,%2 (perbesaran %3)...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>Perbesaran</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Tutup</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>Tidak dapat dihapus</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation>Tidak dapat menghapus yang terpilih karena diluar area unduhan.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>Tidak dapat menghapus apapun</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation>Objek terpilih yang telah lengkap tidak dapat dihapus karena bagiannya ada di luar area unduh. Hapus yang mungkin saja?</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation>Balikan jalan %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation>Membalikan %1 jalan</translation> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Ekspor</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>Apa yang ingin anda ekspor?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Tampilkan semua (contoh, tidak disembunyikan)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>Sudut-pandang</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Terpilih</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Ciri</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Tengah peta</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>Tengah && Perbesar peta</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Unduh anak yang hilang</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Tambahkan ke yang terpilih</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Hapus</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Relasi</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Semua</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Ciri</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>Hanya ciri penuh yang ada pada sudut-pandang</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation>Filter menurut viewport</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Cari...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation>Hanya tampilkan fitur yang memotong pilihan saat ini.</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation>Filter menurut pilihan</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>Ulang</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Nama</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Saring</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Tutup</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>Pengaturan saring</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Saring</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Daftar saringan:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nama:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Saring</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Terapkan</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Tambah</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Hapus</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>Jaringan kehabisan waktu</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>Tidak dapat membaca rincian foto dari server Walking Papers</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Silahkan perjelas URL Walking Papers</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Gambar geo</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Tengah peta</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation>c</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Hapus gambar</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Saling nama berkas ke clipboard</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Pilih gambar berikutnya</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>PgDown</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Pilih gambar sebelumnya</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>PgUp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>Simpan gambar geotag</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>Lapisan foto</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Memuat gambar geotag</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>Pilih lapisan yang akan diacu oleh gambar:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation>Lapisan hanya baca-saja</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation>Lapisan yang digunakan tidak dapat diubah. Jadikan dapat diubah? +Jika tidak, anda tidak dapat memuat gambarnya.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Memuat gambar...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Gagalkan pemuatan</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>Tidak ada berkas</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>Tidak dapat menemukan gambar "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Kesalahan ketika membuka "%2": +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Kesalahan ketika membuka data EXIF dari "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>Tentukan penyeimbang</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>Tempatkan gambar lebih ke:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>akhir jalan.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>awal jalan.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>hh:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>Tidak ada TrackPoints</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>Tidak ada TrackPoints yang ditemukan untuk gambar "%1"</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss 'detik'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm 'menit dan' ss 'detik</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh 'jam', mm 'menit dan' ss 'detik'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>Gambar salah?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>Gambar "%1" telah diambil %2 sebelum trackpoint berikutnya direkam. +Amda ingin tetap menggunakannya?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>Gambar "%1" telah diambil %2 setelah trackpoint terakhir direkam. +Anda tetap ingin menggunakannya?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation>Tetapkan nama berkas keluaran</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>Gambar JPEG (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Kesalahan ketika membuka "%1": +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>Menuju ke</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Tandai</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation>Link WWW (peta OSM/Google)</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation>Koordinat</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation>Perlihatkan proyeksi</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>bujur-Min, lintang-Min, bujur-Max, lintang-Max</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>lintang-Tengah, bujur-Tengah, lintang-Jeda, bujur-Jeda</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Info</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>Url API OSM</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>Url XAPI OSM</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Cari</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>Url OSM salah</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>Url yang ditetapkan salah!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Bentuk Koordinat salah</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>Koordinat harus: '<left lon>, <bottom lat>, <right lon>, <top lat>'</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>Koordinat harus: '<center lat>, <center lon>, <span lat>, <span lon>'</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Tidak ada</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>Adaptor bentuk</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>Perbesaran</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation>Atur tampilan proyeksi ke lapisan</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation>Atur-ulang pengaturan penjajaran</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Tutup</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>Adaptor WMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>Adaptor TMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>Plugin</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Peta - Tidak ada</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Peta - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Peta - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>Peta - Kubus-WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Peta - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Peta - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>Penjelasan Lisensi: %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>Pernyataan Lisensi tidak dapat diterima</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation>Anda tidak mencentang checkbox yang menunjukkan pernyataan anda terhadap lisensi. +Jika demikian, anda tidak dapat menggunakan sumber ini sebagai lapisan peta. +Apakah anda bermaksud demikian?</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Penyedia</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Ukuran kubus</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>Perbesaran terkecil/terbesar</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Proyeksi</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>Masukkan</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>Pratinjau OSM</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Spesifikasi</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>Baris awal mengandung header</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Pembatas</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Titik-koma (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Tab</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Lainnya:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation>Kutipan kata</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Tidak ada</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation>Kutip satu (')</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation>Kutip ganda (")</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>Proyeksi (pada bentuk PROJ4; kosongkan untuk lintang/bujur)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Bidang</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>Daftar bidang:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>Nama bidang(= label kunci) :</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>Tipe bidang:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Impor</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>Jarak impor</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>Dari (0 dari mulai):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>ke (0 ke akhir):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>Memuat pengaturan...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Simpan pengaturan...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Kata</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Angka bulat</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>Pecahan</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Bujur</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Lintang</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Proyeksi salah</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>Tidak dapat menentukan proyeksi</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Tidak ada koordinat</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>Bidang Lintang atau Bujur hilang. Tidak memungkinkan untuk impor berkas nanti. +Anda yakin akan keluar?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>Memuat pengaturan impor CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Impor pengaturan Merkaartor (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Berkas salah</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 tidak dapat dibuka.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1 bukan berkas pengaturan impor CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation>Simpan pengaturan impor CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>tanpa-judul</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Semua berkas (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation>Tidak dapat membuka pengaturan impor tersimpan</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 tidak dapat dibuka untuk diubah</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation>Tidak dapat menetapkan proyeksi; silahkan tetapkan satu</translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Info</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Ukuran</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation>%n ciri</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Ciri</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Tampilkan semua</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Sembunyikan semua</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Baca-saja Semua</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Baca-saja tidak ada</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Tutup</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Lapisan</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Semua</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>Peta</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>Gambar</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>Jalur</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation>Kembalikan Lapisan ke semula</translation> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Bentuk</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Nampak</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Baca-saja</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>Rendah</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>Tinggi</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>Buram</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Kegelapan</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation>Lapisan keluar: objek kotor ada</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation>Ada ciri kotor pada lapisan ini. +Anda yakin akan keluar? (tidak dapat dikembalikan)</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation>Lapisan keluar: tidak kosong</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation>Anda yakin menutup lapisan ini? (tidak dapat dikembalikan)</translation> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>Penjelasan Lisensi</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>Saya telah membaca dan menyetujui penjelasan lisensi tersebut</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Jangan tanyakan saya ini lagi</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation>%1 v%2 Memuat plugin</translation> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation>%1 v%2 Memulai...</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>&Pertolongan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Membuat</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Ubah</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>&Pandangan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Penanda</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Berkas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Ekspor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>Per&alatan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>&Gaya</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation>Model lab&el</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Titik</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>&Jendela</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Wadah</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>&Ciri</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>&Lapisan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>Rel&asi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>&Tampilkan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>Baris-alat Utama</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>&Keluar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>&Tentang</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>&Buka</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Buat dokumen baru dan impor berkas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>Perbesar &semua</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>&Jendela perbesaran</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>Jendela perbesaran</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>Per&kecil</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>Per&besar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Perbesar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Tautan menikung</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Kembalikan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>&Ulangi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>&Pindah</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Impor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Impor berkas kedalam dokumen ini</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Unduh</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Unduh data peta untuk area baru</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Tautan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Membuat tautan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Pilih</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>&Unggah</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Unggah perubahan ke penyedia</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>&Hapus</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Hapus ciri terpilih</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Membuat titik baru</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>&Balikan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation>&Bundaran</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Membuat Bundaran</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Baru</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>&Bagi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>&Gabung</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>&Pisahkan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Pisah</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>Re&lasi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Membuat Relasi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>&Area</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Membuat area baru</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Export semua lapisan yang terlihat ke berkas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Cari</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Cari dan pilih objek</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>Expor ciri pada tampilan ke berkas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>%Gabung</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Gabung Titik</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>Gabung titik terpilih (pilihan pertama akan tetap)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Simpan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Unduh yang lain</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Unduh data peta lain untuk area ini</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Sifat</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>&Info</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>&Meluruskan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Sejajarkan titik</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>Sejajarkan titik terpilih. Dua yang terpilih diawal menggambarkan garis.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation>&Penyebaran</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation>Penyebaran titik</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation>Sejajarkan dan sebarkan titik terpilih secara seimbang</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>&Salin</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>Salin ciri terpilih dan beri label pada clipboard</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>Salin label ciri terpilih ke clipboard; jika cirinya adalah sebuah trackpoint, salin koordinatnya juga.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Tempel Label (&Timpa)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>Tempel (dan timpa) label pada clipboard ke sifat terpilih.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>Tempel Label (&Gabung)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Tempel label</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>Tempel label dari clipboard (Gabung dengan label yang ada)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>Gabung label pada clipboard dengan sifat yang sedang dipilih.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Tempel</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Tempel ciri dari clipboard</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>Tempel ciri pada clipboard; Jika identitas ciri sudah ada pada dokumen, timpa saja.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Memasukkan ciri ke lapisan kotor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>Lapisan &Gambar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>&Raster/SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>&Mulai</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>Mulai GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>Ulangi GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>&Berhenti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>Hentikan GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>&Tengahkan ke GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>Tampilkan perbaikan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Rekam</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>Rekam GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Tunda</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>Tunda GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>G&eoImage</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>&Tambah anggota</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>&Hapus anggota</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>&Tidak pernah</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>&Selalu</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>&Lepaskan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>&Gaya</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation>Import file kedalam dokumen terkini menggunakan GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Kamera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Putar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation>&Poligon</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Ciri</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>&Membagi-lagi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation>Bagi-lagi ruas secara seimbang</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>&Kunci perbesaran ke latar persegi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>OsmChange (OCS)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Tutup</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>&Sederhanakan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation>Sederhanakan jalan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation>Sederhanakan jalan dengan menghapus beberapa titik yang tidak penting</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>&Tidak ada</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation>Pisah area antar dua titik</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>&Petak</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation>Petak area ke tempat tinggal</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation>Pisahkan area terpilih ke beberapa petak pemukiman.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation>Meluruskan A&xis</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation>Sejajarkan tepi ke sumbu biasa</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Properti...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation>Perjelas ciri ko&tor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation>&Potong</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation>&Tolak</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation>Tolak interaksi untuk jalan (gaya JOSM)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation>Pilih tombol</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation>Masukan anak kedalam objek terpilih</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>Skala</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation>GDAL SQLite/SpatiLite</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation>Wireframe</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation>Pilih pendahulu-(pendahulu)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Unduh turunan yang hilang</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation>&Jembatan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation><html><head/><body><p>Ubah jalan menjadi jembatan</p></body></html></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>Bersihkan label '%1' pada %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>Bersihan %1 label pada %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation>Menetapkan "sumber" label pada %1</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Menghapus anggota '%1' pada %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation>Susun ulang anggota pada relasi %1</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>Mengubah relasi %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Membuat Area %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Area: Membuat Jalan %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Membuat lubang.</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Anda ingin membuat lubang (lain) di area ini?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Area: Jalan Selesai %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Area: Tambah titik %1 ke Jalan %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>Tutup Area %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>KLIK-KIRI untuk memulai; TAHAN-KLIK untuk skala; SHIFT-TAHAN-KLIK untuk memutar; KLIK-KIRI untuk mengakhiri</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Membuat Bundaran %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation>Tutup Jalan %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>KLIK-KIRI untuk memilih; KLIK-KANAN untuk memindah-objek; CTRL-KLIK-KIRI untuk mengubah pilihan; SHIFT-KLIK-KIRI untuk menambah pilihan; KLIK-TAHAN-KIRI untuk memilih area; CTRL-TAHAN-KANAN untuk perbesaran; KLIK-GANDA untuk membuat titik; KLIK-GANDA pada titik untuk mengawali jalan;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>KLIK untuk pilih/pindah;CTRL-KLIK untuk mengubah yang terpilih;SHIFT-KLIK untuk menambah yang terpilih;SHIFT-TAHAN untuk memilih area;CTRL-TAHAN untuk perbesaran;KLIK-GANDA untuk membuat titik;KLIK-GANDA pada titik untuk mengawali jalan;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Hapus ciri %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>Hapus ciri</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Hapus Turunan.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation>Anda akan menghapus titik turunannya juga? Sebagai catatan bahwa titik OSM diluar area unduh akan tetap terjaga.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation>Balikan %1 jalan</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>KLIK-KIRI untuk memilih; TAHAN-KIRI untuk memindah</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>Titik di posisi yang sama ditemukan.</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>Anda akan menyatukan semua titik pada tempat yang baru?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Gabungkan Titik kedalam %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation>DEKATI untuk memilih;TAHAN-KIRI untuk memutar</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation>Ciri Memutar</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation>DEKATI untuk memilih;TAHAN-KIRI untuk skala</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation>Ciri Skala</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>KLIK-KIRI untuk sudut pertama -> TAHAN-KIRI untuk menentukan area -> KLIK-KIRI untuk perbesaran</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>Bentuk Pertukaran GPS (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>Bentuk OpenStreetMap (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation>Format perubahan OpenStreetMap (*.osc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Bentuk Noni GPSPlot (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>Bentuk catatan GPS NMEA (*.nmea *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>Berkas KML (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>Bentul pemisah koma (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Gambar geotag (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>Shapefile ESRI (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation>Bahasa Markup Geography (*.gml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation>Bentuk Biner Protobuf (*.pbf) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Bentuk yang didukung</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Dokumen Merkaartor (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Semua Berkas (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>Kotak %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>Rendah</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>Tinggi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>Buram</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Ciri</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Titik</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Relasi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Memuat gambar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>Tambahkan posisi titik ke gambar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation>Geotag gambar dengan titik ini</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Batal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>Berkas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Ubah</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>Pandangan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>Perlihatkan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>Arah Panah</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Lapisan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Membuat</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Jalan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Peralatan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>Jendela</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Tolong</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation>Ciri Potong</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Clipboard tidak benar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>Clipboard tidak berisi data yang benar.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation>Peringatan Import GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation>Anda akan mengimport file(-file) menggunakan GDAL. Fitur ini agak eksperimental, dan mungkin TIDAK berfungsi, berkemungkinan menyebabkan kerusakan. Pastikan Anda tidak akan kehilangan data apa pun jika ini tidak berhasil. +Silakan laporkan bug jika terjadi kerusakan, dan jangan khawatir. + +Lanjutkan import? +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation>Impor berkas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Perubahan belum disimpan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>Peta ini berisi perubahan yang belum disimpan yang akan hilang ketika memulai yang baru. +Anda ingin membatalkan memulai peta baru atau melanjutkan dan menggagalkan perubahan yang sebelumnya?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation>Gaya yang belum tersimpan berubah</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation>Anda telah merubah gaya saat ini. +Anda tetap ingin menyimpan perubahan?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Titik tuju</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>Jalur %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Peringatan hak cipta Big Fat</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Anda mencoba mengimpor berkas KML. Untuk diketahui bahwa : + +- Anda tidak dapat ke OSM dari berkas KML yang dibuat dari Google Earth. JIka anda berfikir bahwa titik yang anda buat dari GE adalah milik anda, itu sebetulnya bukan! +Titik itu adalah turunan dari GE, dan, untuk yang demikian, tidak dapat digunakan di OSM. + +- Jika anda mengunduhnya dari Internet, kemungkinan disana ada hak cipta. +Silahkan pastikan bahwa penggunaan data tersebut pada OSM sudah mendapat ijin dari pembuatnya, atau data tersebut berada pada domain publik. + +Jika tidak yakin, silahkan baca petunjuknya pada "legal" atau "talk" milis openstreetmap. + +Anda yakin bahwa KML ini boleh di impor ke OSM?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>Tidak ada berkas yang benar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 tidak dapat dibuka.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation>Permintaan Kontrol Asing masuk</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation>Ingin memuat objek '%1', tapi tidak tahu caranya. Maaf.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation>Remote menambahkan POI %1 %2</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation>Permintaan kontrol asing masuk</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation>Tindakan tidak diketahui url: %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>Versi Qt tua terdeteksi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>Pengaturan anda menggunakan Qt %1, yang berisi beragam kesalahan saat mengunggah data ke OpenStreetMap menyebabkan kode respon penyedia 401 muncul. Anda yakin untuk melanjutkan (tidak disarankan). +Untuk informasi lebih lanjut silahkan kunjungi http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>Mengunggah OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Sepertinya anda belum menentukan username dan password OpenStreetMap. +Anda ingin melakukannya sekarang?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Kesalahan mengunduh</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>Peta tidak dapat diunduh</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation>Kesalahan mengunduh MapDust</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation>Bugs MapDust tidak dapat diunduh</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Membuat Poligon</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>Tentukan jumlah sisi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Paksa mengunggah Ciri</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation>Buka file</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Membuat Persimpangan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Beberapa persimpangan.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>Jalan itu memiliki banyak persimpangan. +Anda tetap akan membuat persimpangan untuk tiap jalan (Persimpangan yang salah tetap dapat dihapus setelahnya)?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Tambahkan Nomor Jalan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation>Jumlah ruas dibagi dalam</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation>Tentukan jumlah ruas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation>Sejajarkan sumbu</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation>Tentukan jumlah sumbu normal untuk mensejajarkan tepian (contoh 4 untuk persegi)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>segitiga</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>segi-empat</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>segi-lima</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>segi-enam</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation>segi-tujuh</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>segi-delapan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation>Sejajarkan ke %1 sumbu</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation>Sejajarkan ke %1 sumbu normal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation>Tidak dapat mensejajarkan ke sumbu</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation>Pensejajaran ke sumbu gagal. Silahkan sesuaikan sudut lancip dan coba lagi.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation>Pensejajaran ke sumbu gagal dan tidak menemukan solusinya.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation>Ekstrak Bing</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Sejajarkan Titik</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation>Sebarkan Titik</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>Lepaskan Titik %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Tambahkan anggota ke relasi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Hapus anggota dari relasi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation>Tambahkan ke Multipoligon</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation>Gabung area</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>Pisahkan area</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation>Petak area ke %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Membuat relasi %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Simpan gaya peta</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Gaya peta Merkaartor (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Memuat gaya peta</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation>Gaya peta Merkaartor (*.mas) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation>MapCSS stylesheet (*.css)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation>Bangun-kembali Sejarah</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation>Diusahakan untuk membangun kembali sejarah. +Tidak bisa dipastikan juga, dan tidak ada pengembalian aksi. +Anda yakin akan mencoba ini?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>Tanpa Judul</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Simpan dokumen Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Berkas dokumen Merkaartor (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation>Simpan dokumen model Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>Tidak dapat membuka berkas tersimpan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 tidak dapat dibuka untuk diubah.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation>Tidak dapat membuka dokumen model tersimpan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Berkas tidak benar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 bukan dokumen Merkaartor yang benar.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>Ekspor OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>Berkas OSM (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>Ekspor osmChange</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>Berkas osmChange (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Ekspor GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>Berkas GPX (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Ekspor KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>Berkas KML (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation>Pencabutan ciri</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation>Mencabut ciri...</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation>Sembunyikan label tombol alat</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (int)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Tambahkan Penanda</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Tentukan nama dari penanda.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Nama penanda tidak benar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>Penanda tidak boleh kosong.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Peringatan: Nama Penanda sudah ada</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Isikan yang baru, biarkan sama untuk menimpa atau gagalkan.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Menghapus Penanda</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Pilih penanda yang akan dibuang.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Proyeksi tidak benar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>Tidak dapat menetapkan proyeksi "%1".</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>Kesalahan GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>Tidak dapat membuka pintu GPS.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>Membuka berkas catatan NMEA</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>Simpan Model Label</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Model label Merkaartor (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>Buka Model Label</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation>Perhatian! tidak dapat membuka terjemahan Merkaartor untuk bahasa "%1". Mengganti ke pengaturan awal Bahasa Inggris.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>Konflik yang belum diperbaiki</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>Silahkan perbaiki konflik yang ada terlebih dahulu</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Disarankan dengan sangat untuk menyimpan perubahan ke dokumen setelah mengunggah. +Anda akan melakukannya sekarang?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>terakhir: </i><b>%1</b> dari <b>%2</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>terakhir: </i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>lapisan: </i><b>%1</b> </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation>Telusuri</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Titik tuju</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>koord</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>penjelasan</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>komentar</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Titik</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>ketinggian</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>kecepatan</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>ukuran</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>anggota</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>Kiri-atas</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>Bawah-kanan</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>relasi</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Aturan</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Anggota</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation>Tutup jalan</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Panjang</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Ukuran</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>%1 titik</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Area</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Jalan</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation>%1 m/pixel</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation>Sejajar: %1m @ %2</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation>%1ms</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>Tampilan</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation>Kotak Pembatas</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Proyeksi</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Tanda Baru</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>Mengunggah Pilihan gagal</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Duplikasi kunci</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Lebih dari 150 pilihan</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation>Komunikasi Pilihan gagal</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation>Kesalahan Komunikasi</translation> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Penyedia Baru</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Bentuk</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>Label</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>Objek terpilih</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation>Kelas</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Nama</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Bidang yang tidak diketahui</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Kesalahan!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>Layanan pencari nama membutuhkan otentikasi.</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Bentuk</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>Nama berkas keluaran</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>Tanpa Judul</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation>Berkas PDF (*.pdf)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Semua Berkas (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Berkas Gambar (*.png *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>Berkas SVG (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation>Ekspor Raster/SVG</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation>Pilihan</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>Lat/Lon terkecil</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>Lintang/Bujur terbesar</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation>Perlihatkan Titik</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation>Perlihatkan Relasi</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>Perlihatkan Skala</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation>Perlihatkan Kotak Lintang/Bujur</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation>Tampilkan ciri tanpa gaya</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>Ekspor ke PDF...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>Expor ke SVG</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation>Ekspor ke Raster...</translation> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Bentuk</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Pengguna:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation>Password:</translation> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Pengolah gaya peta</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Global</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Latar</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation>Titik</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Ketebalan yang cukup</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>Perbaiki ketebalan</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>Seleksi</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Tambah</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Hapus</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Duplikasi</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>Pemilihan label</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>meter/pixel</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>Terlihat sampai</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>Terlihat dari skala</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Gambarkan dengan warna</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Berlari</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>mati</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Isikan area</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation>Isi dengan ikon Touchup</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Perbatasan</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation>Interior</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation>Eksterior</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>Touchup</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Langkah menggambar</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Menggambar Ikon</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation>Gambar Tanda Arah Lalu Lintas</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Label</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Huruf</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Tanda Label</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Halo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Area</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Gambar dengan warna latar</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Beri Label dengan latar </translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Selalu</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Pilih Warna</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>Tidak ada geotag yang benar</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation>Foto ini tidak berisi data geotag EXIF. +Apa yang ingin anda lakukan berikutnya?</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation>Mencoba mencocokan dengan titik jalur</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>Memuat tanpa titik yang berhubungan</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>Ekstrak info dari barcode (Walking Papers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>Abaikan</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>Lakukan ini untuk semua foto.</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>Nama File keluaran</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>Tanpa Judul</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>Berkas SVG (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Semua berkas (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Berkas Gambar (*.png *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Pengaturan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>Visual</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Umum</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Kegelapan rendah/tinggi</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>Interaksi tombol tetikus tunggal</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>Gunakan gaya Qt variasi</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation>Perbolehkan pembuatan titik/jalan pada moda terpilih</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>Relasi dapat dipilih ketika disembunyikan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Warna</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Latar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>Gaya Timpa</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>Jalur GPX</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>Pixel</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Tatap-muka</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Mendekati</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Relasi</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Fokus</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Tebalkan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation>Kotor</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Lokal</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Menggunakan bahasa</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>Label terjemahan standar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation>Melukiskan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation>Pilihan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation><html><head/><body><p>Jika mungkin, penggambaran wireframe (Penampilan-Wireframe) akan menggunakan gaya ini untuk warna dan isinya. Hanya ketebalan tetap yang digunakan untuk lebar,</p></body></html></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation>Gunakan gaya ini untuk penggambaran wireframe</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation>Mengubah</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation>Mengubah cepat</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation>Mengubah wireframe</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation>Mengubah gambaran penuh</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Gaya peta</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Kandar gaya variasi</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Gaya saat ini</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Model</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>Model label</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Terpasang-tetap</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Variasi</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Data</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation>XAPI</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Dokumen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation>Muat-otomatis model dokumen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Simpan otomatis dokumen setelah unggah</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>Jalur</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation>GDAL</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation>Konfirmasi proyeksi</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>Masukkan GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>Serial</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Host</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>Simpan catatan NMEA</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>Atur waktu sistem ke GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Jaringan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Pengaturan proxy</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Password:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Pengguna:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Port:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Host:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Adaptor Peta</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation>Secara otomatis menambah label "sumber" ketika membuat ciri pada peta latar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Peralatan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Nama:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Jalur:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Terapkan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Tambah</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Hapus</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Inggris</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Arab</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation>Kroasia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Ceko</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Belanda</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Jerman</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Perancis</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>Hongaria</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Italia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>Jepang</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Polandia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Rusia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Spanyol</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Swedia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Ukraina</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Model label Merkaartor (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Pilih Warna</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>Alat sudah ada</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Nama alat yang ini sudah ada. +Silahkan pilih nama lain atau klik tombol <Apply> jika anda ingin mengubah yang sudah ada</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>Tidak dapat menghapus alat yang sudah ditetapkan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>Tidak dapat menghapus alat "%1" yang sudah ditetapkan </translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>Tidak dapat mengubah nama alat yang sudah ditetapkan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>Tidak dapat mengubah nama alat "%1" yang sudah ditetapkan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>Pilih alat yang dapat dieksekusi</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation>Pilih dokumen model</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation>Dokumen Markaartor (*.mdc)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>Pilih kandar Catatan</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation>Menyiapkan proyeksi</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>Proyeksi</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation>Daftar Proyeksi:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nama:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>Kata PROJ4</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Terapkan</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Tambah</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Hapus</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation>Silahkan tetapkan proyeksi</translation> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation>Dokumen</translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation>Yang telah ditetapkan</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation>Standar (EPSG:...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation>Variasi PROJ4(+proj=...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation>WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation>Kesalahan di kata WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation>Tidak dapat mengekspor ke bentuk PROJ4</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation>Kata WKT tidak benar</translation> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Properti</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 objek terpilih</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 objek(-objek) terpilih</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Objek terpilih</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Properti - Banyak elemen</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Properti - Titik</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Properti - Relasi</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Properti</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation>Kesalahan membaca berkas model</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Tengah peta</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>Tengah && Perbesar peta</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Pilih anggota</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Bersihkan total</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>Pindahkan titik %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation>Mengekspor GPX...</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Batal</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation>Mengimpor...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation>Mengimpor: %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>Impor osmChange</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>Impor NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>Impor NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation>Jalan Bing terdeteksi</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation>Tidak dapat mengambil keluaran.</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation>Tidak ada data yang benar.</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation>Tidak bisa mengurai keluaran.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation>Gunakan komentar perubahan kosong?</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation>Komentar perubahan kosong. Ini dianggap sopan kepada sesama pembuat peta untuk memberikan komentar yang baik, sehingga semua orang tahu apa yang dilakukan perubahan Anda dan dengan niat apa. +Apakah anda akan tetap mengosongkan komentar?</translation> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Tidak benar</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation>Tidak ada perbaikan</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation>Tidak ada waktu</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>Meter</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>Tidak tersedia</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation>Perbaikan OK</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>kesalahan catatan GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Tidak dapat membuat berkas catatan GPS: %1</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation>Tidak dapat terhubung ke %1:%2</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>Kesalahan catatan GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Tidak dapat membuat berkas catatan GPS: %1</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Bujur</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Ketinggian</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 meter</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation># Satelit</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Gaya perbaikan</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Tidak benar</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Kecepatan</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Lintang</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>Hasil aliran yang tidak biasa!</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation>Variasikan Baris-Peralatan </translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation>Aksi</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation>Baris-peralatan</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>Baru</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Hapus</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>Ubah Nama</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation>Kembalikan Semua</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Terapkan</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Batal</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation>Keatas</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation>Kebawah</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation>Aksi Baris-peralatan Ini</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation>< S E P A R A T O R ></translation> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation>Variasi Baris-Peralatan</translation> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Bentuk</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Anggota</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation>Hapus anggota(-anggota) terpilih</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>Label</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation>Menambahkan label "sumber"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation>Hapus label terpilih</translation> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Bentuk</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>Label</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation>Menambahkan label "sumber"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation>Hapus label terpilih</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Tidak ada satelit</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Pilihan</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Kunci</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Nilai</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Nama</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation>Query</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation>Jumlah hasil maksimal (0 untuk semua)</translation> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation>Segarkan lapisan</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Tutup</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Gaya</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Gaya</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Unggah ke Openstreetmap</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation>Komentar</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation>Komentar yang bagus harus secara ringkas dan memadai mendeskripsikan pengeditan.</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation>Perubahan berikut akan dilakukan:</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation>Ditambahkan</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation>Diperbarui</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation>Dihapus</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation>Jalan</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation>Titik</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation>Relasi</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation>Jumlah</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Batal</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>Menyiapkan layanan TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>Penyedia TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Daftar Penyedia:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nama:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Url Penyedia:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>Ambil Layanan</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>Layanan:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation>Ini adalah penyedia standar TMS.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Proyeksi:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Mercator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>Lintang/Bujur (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation>Titik asal ada di bawah-kiri</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation>Ukuran Persegi:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation>Perbesaran terkecil:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation>Perbesaran terbesar:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation>Nilai label "sumber":</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>Lisensi URL:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Terapkan</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Tambah</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Hapus</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation>Merkaartor: GetServices</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>Alamat dan jalan tidak boleh kosong.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation>Kesalahan membaca layanan. Server mungkin tidak mendukung fitur ini +</translation> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Kunci</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Nilai</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation>Editor tag</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation>Tag ini sudah ada</translation> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>Ubah ini untuk menambah...</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Bentuk</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation>OR</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>DAN</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation>BUKAN</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation>adalah</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation>salah-satu-dari</translation> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Tidak dijelaskan</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Tidak dijelaskan</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation>Petak</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation>Tidak ada nomor rumah</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>Nomor rumah</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>Tambahkan Nomor Rumah (Skema Karlsruhe)</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation>Jarak</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>Contoh "1-9; 15-17; 19, 19A"</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation>Pola</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Semua nomor</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>Nomor Ganjil</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>Nomor Genap</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation>Sebagai pilihan, anda dapat memilih titik pada sebuah area dan penomoran rumah akan dimulai dari sana.</translation> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Mengurai - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation># dari ruas jalan</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Total jarak</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Total waktu</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1h %2m</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Mengurai lapisan Gambar</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>Perbesaran</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Tutup</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>Trackpoint</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Lintang</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Bujur</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Label</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation>Menambahkan label "sumber"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation>Hapus label terpilih</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Website</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Kata Kunci</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Nama Pengguna</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Gunakan Proxy</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>Perbesaran</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Bersihkan</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>Menyiapkan penyedia WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>Penydia WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Daftar Penyedia:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nama:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Url Penyedia:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Lapisan:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation>Judul</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Proyeksi:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation>Jadikan Persegi</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>Tingkat perbesaran</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>Bentuk Gambar:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Gaya:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation>Nilai label "sumber":</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>Lisensi URL:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Terapkan</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Tambah</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Hapus</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: GetCapabilities</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>Alamat dan jalan tidak boleh kosong.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation>Lapisan tanpa nama</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation>Tanpa Judul</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation>Ini adalah penyedia caching WMS.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation>Tidak dapat menghubungi penyedia WMS: %1</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation>Tidak dapat mengambil kemampuan: %1</translation> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_it.ts b/translations/merkaartor_it.ts new file mode 100644 index 0000000..7f10322 --- /dev/null +++ b/translations/merkaartor_it.ts @@ -0,0 +1,7393 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="it" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>Informazioni su Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>Questo programma è rilasciato sotto licenza GNU General Public License v2</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Versione di Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Versione di Qt</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>Versione di GDAL</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Log delle modifiche</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>OK</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Descrizione</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Tasto rapido</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Importa</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Esporta</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>&Predefinito</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Annulla</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Editor tasti rapidi</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Carica schema tasti rapidi</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Schema tasti rapidi di Merkaartor (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Impossibile aprire il file</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>Impossibile aprire %1.</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>Salva schema tasti rapidi</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>senza titolo</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Tutti i file (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Impossibile aprire il file da salvare</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>Impossibile aprire %1 in scrittura.</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation>BridgeBuilder</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation>Mi dispiace, non so come costruire un ponte a partire da TALE oggetto. Forniscimi solo due nodi.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation>Converti segmento in ponte</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation>Il segmento selezionato è già etichettato come ponte/tunnel. Assicurati di sapere ciò che stai facendo.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation>Azione non supportata: il ponte non sembra essere a senso unico.</translation> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation>File</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation>Esci</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation>Carica</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation>Carica una città dal catasto</translation> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation>La città non può essere caricata</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation>Scaricato: %1/%2 +Tempo rimanente: %3:%4</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation>Scaricato: %1/%2 +Tempo rimanente: %3:%4:%5</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation>Scaricato: %1/%2</translation> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Senza descrizione</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Forma</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Forma</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation>Precisione (metri/segmento)</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation>Tipo</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation>Rotatoria</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation>Cerchio semplice</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation>A sinistra</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation>A destra</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation>Lato guida</translation> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation><b>Non</b> c'è alcun oggetto scorretto.</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation>C'è <b>un</b> oggetto scorretto</translation> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Annulla</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Centra mappa</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>Centra ed esegui zoom sulla mappa</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Annulla</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation><b>Non</b> ci sono oggetti scorretti.</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Pulisci</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>AGGIUNGI strada %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>AGGIUNGI trackpoint %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>AGGIUNGI relazione %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>AGGIORNA trackpoint %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>AGGIORNA relazione %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>AGGIORNA strada %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>RIMUOVI trackpoint %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>RIMUOVI strada %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>RIMUOVI relazione %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Errore durante il caricamento della richiesta</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Controlla nome utente e password nel menù Preferenze</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Si è verificato un errore durante il caricamento di questa richiesta (%1) +Il messaggio del server è "%2"</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +Il messaggio delle API è '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Caricamento modifiche in corso...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>APRI elenco cambiamenti</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>CHIUDI elenco cambiamenti</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Errore durante il caricamento della richiesta</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Controlla nome utente e password nel menù Preferenze</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Si è verificato un errore durante il caricamento di questa richiesta (%1) +Il messaggio del server è "%2"</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +Il messaggio delle API è '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation>Si è verificato un errore durante il caricamento di questa richiesta (%1) +"%2" +Scarica nuovamente la caratteristica con problemi per gestire il conflitto.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>Controllo modifiche in corso...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>APRI elenco cambimenti</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>CHIUDI elenco cambiamenti</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation>Impossibile chiudere l'elenco cambiamenti</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation>Si è verificato un errore sconosciuto. L'elenco potrebbe essere già chiuso o potrebbe venir chiuso automaticamente. Se vuoi essere sicuro controlla manualmente sul sito Web osm.org.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>AGGIUNGI relazione %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>AGGIUNGI strada %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>AGGIUNGI trackpoint %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>AGGIORNA relazione %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>AGGIORNA strada %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>AGGIORNA trackpoint %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>RIMUOVI trackpoint %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>RIMUOVI strada %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>RIMUOVI relazione %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>senza titolo</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Livello di lavoro</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Livello caricato</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Immagine di sfondo</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation>Livello di disegno numero %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation>Livello filtro numero %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>Esportazione OSM</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>Esportazione OSM in corso...</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>Documento</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation>Ricostruzione cronologia: Crea nodo %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation>Ricostruzione cronologia: Aggiorna nodo %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation>Ricostruzione cronologia: Elimina nodo %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation>Ricostruzione cronologia: Crea strada %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation>Ricostruzione cronologia: Aggiorna strada %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation>Ricostruzione cronologia: Elimina strada %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation>Ricostruzione cronologia: Crea relazione %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation>Ricostruzione cronologia: Aggiorna relazione %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation>Ricostruzione cronologia: Elimina relazione %1</translation> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Download</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Località</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Segnalibro</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Vista corrente</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation>Collegamento WWW (OSM/Google Maps)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation>Selettore Xapi</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>Dalla mappa sottostante (mappa fornita dal progetto OpenStreetMap)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Scarica anche le tracce GPS grezze</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>Risolvi tutte le relazioni</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 download</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Download non risolti in corso...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>Download di %1 di %2 non risolti in corso</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>Analisi di %1 di %2 non risolti in corso</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Analisi in corso...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Analisi XML in corso</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Conflitti da %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>Rilevate strade/relazioni vuote</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Le strade/relazioni vuote sono probabilmente errori. +Vuoi contrassegnarle per la rimozione?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Rimuovi caratteristica vuota %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Sono stati rilevati dei conflitti</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>Ciò significa che alcune delle caratteristiche che hai modificato dall'ultimo download nel frattempo sono state modificate da qualcun altro sul server. +Le modifiche sono state duplicate come "conflict_..." nel livello "Conflitti...". +Prima di essere in grado di caricare le tue modifiche dovrai unire manualmente le due versioni e rimuovere quelle dal livello "Conflitti...".</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Caricamento in corso...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Preparazione delle modifiche in corso</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>In attesa di una risposta dal server</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation><numerusform>Scaricamento da OSM (%n byte)</numerusform><numerusform>Scaricamento da OSM (%n byte)</numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation><numerusform>Scaricamento da OSM (%n kilobyte)</numerusform><numerusform>Scaricamento da OSM (%n kilobyte)</numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Download in corso...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Download da OSM in corso (connessione in corso)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>Codice di stato HTTP inaspettato (%1) +Il messaggio del server è '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +Il messaggio delle API è '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Download non riuscito</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Nome utente/password non validi</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>Conflitti non risolti</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>Correggi i conflitti esistenti prima di procedere</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>Download dei nodi della traccia %1-%2 in corso</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation>MapDust</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Download punti in corso</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Download %1,%2 (zoom %3) in corso...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Chiudi</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>Impossibile eliminare</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation>Impossibile eliminare la sezione perché è al di fuori dell'area scaricata.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>Impossibile eliminare tutto</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation>La selezione completa non può essere eliminata perché parte di essa è al di fuori dell'area scaricata. +Eliminare il possibile?</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation>Inverti strada %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation>Inverti %1 strade</translation> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Esporta</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>Cosa vuoi esportare?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Tutti gli oggetti visibili (ossia non nascosti)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>Riquadro di visualizzazione</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Selezione</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Caratteristiche</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Centra mappa</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>Centra ed esegui zoom sulla mappa</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Scarica oggetti figli mancanti</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Aggiungi alla selezione</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Elimina</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Relazioni</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation>Percorsi</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation>Nodi</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Tutti</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Caratteristiche</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>Solo le caratteristiche completamente all'interno del riquadro di visualizzazione</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation>Filtra per riquadro di visualizzazione</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Trova...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation>Visualizza solo le caratteristiche che intersecano la selezione corrente.</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation>Filtra per selezione</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>Ripristina</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Finestra di dialogo</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Nome</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Filtro</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Chiudi</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>Impostazione filtri</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Filtri</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Lista filtri:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nome:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Filtro</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Applica</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Aggiungi</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Elimina</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation>Specifica etichetta “source”…</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation>Apri file GDAL</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation>Valore:</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation>Nome/i file</translation> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation>Nessun file valido</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation>Impossibile trovare un file GDAL valido.</translation> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>Timeout di rete</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>Impossibile leggere i dettagli della foto dal server di Walking Papers.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Specifica un URL Walking Papers</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>Indirizzo URL:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Immagini geografiche</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Centra mappa</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation>c</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Rimuovi immagini</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Copia il nome del file negli Appunti</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Seleziona immagine successiva</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>PAG GIÙ</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Seleziona immagine precedente</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>PAG SU</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>Salva immagine con tag geografico...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>Livello foto</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Carica immagini geografiche</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>Seleziona il livello al quale appartengono le immagini:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation>Il livello è in sola lettura</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation>Il livello utilizzato non è scrivibile. Renderlo scrivibile? +In caso contrario, non è possibile caricare le immagini che contiene.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Caricamento immagini in corso...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Interrompi caricamento</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>Il file non esiste</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>Impossibile trovare l'immagine "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Errore durante l'apertura di "%2": +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Errore durante il caricamento dei dati EXIF da "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>Specifica offset</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>Posiziona l'immagine più a:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>fine della traccia</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>inizio della traccia</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>hh:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>Nessun punto traccia</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>Non è stato trovato nessun punto traccia per l'immagine "%1"</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss 'secondi'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm 'minuti e' ss 'secondi'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh 'ore,' mm 'minuti e' ss 'secondi'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>Immagine errata?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>L'immagine "%1" è stata scattata %2 prima della registrazione del punto traccia successivo. +Vuoi ancora utilizzarla?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>L'immagine "%1" è stata scattata %2 dopo la registrazione dell'ultimo punto traccia. +Vuoi ancora utilizzarla?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation>Specifica il nome del file di output</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>Immagini JPEG (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Errore durante l'apertura di "%1": +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation>Carica immagine/i…</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation>Specifica etichetta “source”…</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation>Apri file GeoTIFF</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation>Valore:</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation>Nome/i file</translation> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation>Nessun file valido</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation>Impossibile trovare un file GeoTIFF valido.</translation> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>Vai a</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Segnalibro</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation>Collegamento WWW (OSM/Google Maps)</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation>Coordinate</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation>Visualizza proiettate</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>lonMin, latMin, lonMax, latMax</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>latCent, lonCent, latDimen, lonDimen</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Informazioni</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>URL API OSM</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>URL XAPI OSM</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Cerca</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>Indirizzo OSM non valido</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>L'indirizzo specificato non è valido!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Formato coordinate non valido</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>Le coordinate devono essere: '<lon sinistra>, <lat inferiore>, <lon destra>, <lat superiore>'</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>Le coordinate devono essere: '<lat centrale>, <lon centrale>, <ampiezza lat>, <ampiezza lon>'</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Nessuno</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>Adattatore forma</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation>Imposta la proiezione di visualizzazione a quella del livello</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation>Reimposta l'adattamento dell'allineamento</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Chiudi</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>Adattatore WMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>Adattatore TMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>Plugin</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Mappa - Nessuna</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Mappa - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Mappa - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>Mappa - WMS-Tiled - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Mappa - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Mappa - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>Condizioni di licenza: %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>Le condizioni di licenza non sono state accettate</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation>Non hai selezionato la casella di controllo per l'accettazione delle condizioni di licenza. +In questo modo non sarai in grado di utilizzare questa fonte come livello mappa. +È davvero ciò che vuoi?</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Server</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Dimensione tile</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>Zoom minimo/massimo</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Proiezione</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Finestra di dialogo</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>Input</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>Anteprima OSM</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Specifiche</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>La prima riga contiene le intestazioni</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Separatore</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Punto e virgola (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Scheda</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Altro:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation>Delimitatori stringhe</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Nessuno</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation>Virgolette singole (')</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation>Virgolette doppie (")</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>Proiezione (in formato PROJ4; lasciare vuoto per latitudine/longitudine)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Campi</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>Lista campi:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>Nome campo (= chiave tag):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>Tipo campo:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Importa</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>Intervallo di importazione</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>Da (0 per importare dall'inizio):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>A (0 per importare fino alla fine):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>Carica impostazioni...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Salva impostazioni...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Stringa</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Intero</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>Numero in virgola mobile</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Longitudine</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Latitudine</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Proiezione non valida</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>Impossibile impostare la proiezione.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Nessuna coordinata</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>Campi latitudine o longitudine mancanti. Non sarà possibile importare il file. +Vuoi veramente uscire?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>Carica impostazioni di importazione CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Impostazioni importazione Merkaartor (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>File non valido</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>Impossibile aprire %1.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1 non è un file impostazioni di importazione CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation>Salva impostazioni di importazione CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>senza titolo</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Tutti i file (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation>Impossibile aprire le impostazioni di importazione salvate</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>Impossibile aprire %1 in scrittura.</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation>Impossibile impostare la proiezione; specificane una</translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Informazioni</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Dimensioni</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation>%n caratteristiche</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Caratteristiche</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Mostra tutto</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Nascondi tutto</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Tutto in sola lettura</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Niente in sola lettura</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Chiudi</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Livelli</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Tutti</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>Mappa</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>Disegna</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>Tracce</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation>Reimposta i livelli ai valori predefiniti</translation> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Forma</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Visibile</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Sola lettura</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>Basso</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>Alto</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>Opaco</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Opacità</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation>Chiudi livello: presenti oggetti scorretti</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation>Ci sono caratteristiche scorrette in questo livello. +Sei sicuro di volerlo chiudere? (Non è possibile annullare quest'operazione)</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation>Chiudi livello: non vuoto</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation>Sei sicuro di voler chiudere questo livello? (Non è possibile annullare quest'operazione)</translation> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>Condizioni di licenza</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>Ho letto e accetto le condizioni di licenza</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Non chiedermelo più</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation>%1 versione %2 +Caricamento plugin in corso...</translation> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation>%1 versione %2 +Inizializzazione in corso...</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>&Aiuto</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Crea</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Modifica</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>&Visualizza</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Segnalibri</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&File</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Esporta</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>&Strumenti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>&Stile</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation>Aggiungi ta&g ai modelli</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Nodo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>Fi&nestra</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Elementi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>Cara&tteristica</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>&Livelli</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>Rel&azione</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>V&isualizza</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>Barra degli strumenti principale</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>&Esci</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>&Informazioni su</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>&Apri</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Crea un nuovo documento e importa un file</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>Zoom &tutti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>Zoom &finestra</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>Zoom finestra</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>Zoom indietr&o</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>Zoom avant&i</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Zoom avanti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Collegamento curvo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Annulla</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>&Ripeti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>Sp&osta</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation>Importa con &GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Importa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Importa un file nel documento corrente</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Download</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Scarica dati mappa per una nuova area</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Collegamento</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Crea collegamento</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Seleziona</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>&Carica</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Carica le modifiche sul server</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>&Elimina</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Elimina caratteristiche selezionate</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation>Crea un nuovo percorso</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation>Inverti direzione del percorso</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation>Crea un percorso parallelo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation>Nuovo documento</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation>Nascondi/mostra barra degli strumenti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation>Nascondi/mostra barra degli strumenti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation>Nascondi tutti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation>Mostra tutti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation>Menu GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation>Proprietà…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Crea nuovo nodo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>Inve&rti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation>R&otatoria</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Crea rotatoria</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Nuovo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>&Suddividi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>&Unisci</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>Rom&pi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Suddividi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>Re&lazione</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Crea relazione</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>&Area</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Crea nuova area</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Esporta tutti i livelli visibili in un file</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Trova</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Trova e seleziona elementi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>Esporta le caratteristiche visibili nel riquadro di visualizzazione in un file</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>&Unisci</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Unisci nodi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>Unisce i nodi selezionati (il primo selezionato rimane)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Salva</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Scarica più dati</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Scarica più dati mappa per l'area corrente</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Proprietà</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>&Informazioni</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>&Allinea</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Allinea i nodi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>Allinea i nodi selezionati. I primi due selezionati sono il riferimento per la linea.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation>&Diffondi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation>Diffondi nodi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation>Allinea e distribuisce i nodi selezionati in modo uniforme.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>&Copia</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>Copia le caratteristiche e i tag selezionati negli Appunti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>Copia i tag della caratteristica selezionata negli Appunti; se la caratteristica è un punto traccia, copia anche le coordinate.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Incolla tag (s&ovrascrivi)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>Incolla (e sovrascrivi) i tag negli Appunti sulla caratteristica selezionata.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>Incolla tag (&unisci)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Incolla i tag</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>Incolla i tag dagli Appunti (uniscili a quelli esistenti)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>Unisce i tag dagli appunti a quelli della caratteristica selezionata.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Incolla</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Incolla caratteristiche dagli Appunti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>Incolla le caratteristiche dagli Appunti; se gli ID delle caratteristiche sono già nel documento, sovrascrivile.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Aggiungi caratteristica al livello di modifica</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>Livello &immagine</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>&Raster/SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>&Avvia</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>Avvia GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>Ripeti GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>Fe&rma</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>Ferma GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>&Centra sul GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>Mostra ritocchi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Registra</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>Registra GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Pausa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>Pausa GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>Immagine g&eoreferenziata</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>&Aggiungi membro</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>&Rimuovi membro</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>&Mai</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>&Sempre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>S&epara</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>&Stili</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation>Importa un file nel documento corrente utilizzando GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Videocamera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Ruota</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation>&Poligono</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Caratteristiche</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>&Suddividi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation>Suddividi segmento egualmente</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>B&locca lo zoom in base allo sfondo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>OsmChange (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Chiudi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>S&emplifica</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation>Semplifica strada/e</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation>Semplifica la strada rimuovendo nodi figli non necessari</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>&Nulla</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation>Dividi area compresa tra due nodi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>&Terrazza</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation>Terrazza l'area in residenze</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation>Dividi l'area selezionata in residenze a schiera.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation>Allinea a&ssi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation>Allinea i bordi agli assi regolari</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Proprietà...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation>Evidenzia caratteristiche scorrett&e</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation>Tag&lia</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation>E&strudi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation>Estrudi interazione strade (stile JOSM)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation>Abilita/disabilita selezione</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation>Includi oggetti figli nella selezione</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>Scala</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation>GDAL SQLite/SpatiLite</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation>Wireframe</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation>Seleziona oggetti genitori</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Scarica oggetti figli mancanti</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation>&Ponte</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation><html><head/><body><p>Trasforma la strada in un ponte</p></body></html></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>Rimuovi tag '%1' da %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>Rimuovi %1 tag da %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation>Imposta tag "fonte" su %1</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Rimuovi membro '%1' da %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation>Riordina i membri nella relazione %1</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>Relazione modificata %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Crea area %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Area: crea strada %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Aggiungi un buco.</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Vuoi aggiungere un (nuovo) buco a questa area?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Area: completa strada %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Area: Aggiungi nodo %1 a strada %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>Chiudi area %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>CLICK con il tasto SINISTRO per iniziare;TRASCINA per ridimensionare;MAIUSC+TRASCINA per ruotare;CLICK con il tasto SINISTRO per finire</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Crea rotatoria %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation>Chiudi strada %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>CLICK con il tasto SINISTRO per selezionare;CLICK con il tasto DESTRO per la panoramica;CTRL+CLICK con il tasto SINISTRO per alternare la selezione;SHIFT+CLICK con il tasto SINISTRO per aggiungere alla selezione;TRASCINA con il tasto SINISTRO per selezionare un'area;CTRL+TRASCINA con il tasto DESTRO per zoomare;DOPPIO CLICK per creare un nodo;DOPPIO CLICK su un nodo per iniziare una strada;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>CLICK per selezionare/muovere;CTRL+CLICK per alternare la selezione;SHIFT+CLICK per aggiungere alla selezione; SHIFT+TRASCINA per selezionare un'area;CTRL+TRASCINA per zoomare;DOPPIO CLICK per creare un nodo;DOPPIO CLICK su un nodo per iniziare una strada;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Rimuovi caratteristica %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>Rimuovi caratteristiche</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Elimina oggetti figli.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation>Vuoi anche eliminare i nodi figli? +Nota che i nodi OSM al di fuori dell'area scaricata saranno mantenuti.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation>Inverti %1 strade</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>CLICK con il tasto SINISTRO per selezionare;TRASCINA con il tasto SINISTRO per spostare</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>Trovati nodi nella stessa posizione.</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>Vuoi unire tutti i nodi nella posizione selezionata?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Unisci nodi in %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation>PASSA IL PUNTATORE per selezionare;TRASCINA con il tasto SINISTRO per ruotare</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation>Ruota caratteristica</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation>CLICCA per selezionare;TRASCINA con il tasto SINISTRO per ridimensionare</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation>Ridimensiona caratteristica</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>CLICK con il tasto SINISTRO sul primo angolo -> TRASCINA con il tasto SINISTRO per specificare l'area -> CLICK con il tasto SINISTRO per zoomare</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>Formato interscambio GPS (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>Formato OpenStreetMap (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation>Formato modifica OpenStreetMap (*.osc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Formato Noni GPSPlot (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>Formato log GPS NMEA (*.nmea, *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>File KML (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>Formato delimitato da virgole (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Immagini georeferenziate (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>Shapefile ESRI (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation>Geography Markup Language (*.gml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation>Formato binario Protobuf (*.pbf) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Formati supportati</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Documento Merkaartor (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Tutti i file (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>tile %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>Bassa</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>Alta</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>Opaca</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Caratteristica</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Nodo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Relazione</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Carica immagine</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>Aggiungi posizione nodo all'immagine</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation>Aggiungi tag geografico all'immagine con questa posizione</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Annulla</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>File</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Modifica</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>Visualizza</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>Mostra</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>Frecce direzionali</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Livelli</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Crea</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Strada</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Strumenti</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>Finestre</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Aiuto</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation>Taglia caratteristiche</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Appunti non validi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>Gli Appunti non contengono dati validi.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation>Avviso di importazione GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation>Stai per importare uno o più file utilizzando GDAL. Questa funzionalità è abbastanza sperimentale e potrebbe funzionare o meno; forse potrebbe causare dei crash. Assicurati di non perdere alcun dato nel caso in cui non funzioni. +Per favore, segnala i bug nel caso in cui si verifichi un crash, ma non stupirtene. + +Continuare con l'importazione? +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation>Importa file</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Modifiche non salvate</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>La mappa corrente contiene modifiche non salvate che saranno perse creando un nuovo documento. +Vuoi annullare la creazione di un nuovo documento o continuare e scartare le modifiche della mappa vecchia?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation>Modifiche di stile non salvate</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation>Hai modificato lo stile corrente. +Vuoi salvare le modifiche?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Waypoint</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>Traccia %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Avviso importante sul copyright</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Stai tentando di importare un file KML. Sii al corrente di quanto segue: + + - Non puoi importare in OSM un file KML creato da Google Earth. Benché tu possa + pensare che i nodi che hai creato da GE siano di tua proprietà, non lo sono! + Essi sono comunque un'opera derivata da GE e, in quanto tali, non possono essere + usati in OSM. + +- Se hai scaricato il file da Internet, ci sono buone probabilità che esso sia coperto da copyright. + Sii assolutamente sicuro che l'utilizzo di questi dati in OSM sia concesso dall'autore, o + che i dati siano di pubblico dominio. + +Se non ne sei sicuro, discutine sulle mailing list "legal" o "talk-it" di OpenStreetMap. + +Sei assolutamente sicuro che questo file KML possa essere importato legalmente in OSM?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>File non valido</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>Impossibile aprire %1.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation>Richiesta di controllo remoto in arrivo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation>Volevo caricare l'oggetto '%1', ma non sapevo come fare. Mi dispiace.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation>Aggiunta remota punto di interesse %1 %2</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation>Richiesta di controllo remoto in arrivo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation>URL azione sconosciuto: %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>Rilevata vecchia versione di QT</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>La tua installazione utilizza QT %1, che contiene vari errori noti durante il caricamento dei dati su OpenStreetMap, i quali portano a risposte 401 da parte del server. Sei sicuro di voler continuare (sconsigliato)? +Per ulteriori informazioni vedi http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>Caricamento su OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Sembra che tu non abbia specificato i tuoi +nome utente e password di OpenStreetMap. +Vuoi farlo adesso?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Errore durante il download</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>Impossibile scaricare la mappa</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation>Errore durante il download di MapDust</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation>Impossibile scaricare i bug di MapDust</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Crea poligono</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>Specifica il numero di lati</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Forza il caricamento della caratteristica</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation>Apri file</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation>Unisci percorsi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation>Dividi percorsi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation>Semplifica percorsi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Crea incrocio</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Incroci multipli.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>Queste strade hanno incroci multipli. +Vuoi creare un incrocio per ognuno di essi (quelli non voluti possono essere eliminati successivamente)?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Aggiungi numeri civici</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation>Numero di segmenti in cui suddividere</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation>Specifica il numero di segmenti</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation>Allinea assi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation>Specifica il numero di assi regolari da allineare ai bordi (ad es. 4 per un rettangolo)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>triangolare</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>rettangolare</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>pentagonale</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>esagonale</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation>eptagonale</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>ottagonale</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation>Allinea a %1 assi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation>Allinea a %1 assi regolari</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation>Impossibile allineare agli assi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation>Operazione di allineamento agli assi non riuscita. Regola eventuali spigoli e riprova.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation>L'operazione di allineamento degli assi non è riuscita e non è andata a convergere a una soluzione.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation>Estrai da Bing</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Allinea nodi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation>Diffondi nodi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>Stacca nodo %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Aggiungi elemento alla relazione</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Rimuovi membro dalla relazione</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation>Aggiungi a multipoligono</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation>Unisci aree</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>Dividi area</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation>Terrazza l'area in %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Crea relazione %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Salva stile mappa</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Stile mappa Merkaator (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Carica stile mappa</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation>Stile mappa Merkaartor (*.mas) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation>Foglio di stile MapCSS (*.css)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation>Ricostruisci cronologia</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation>Tenterò di ricostruire la cronologia. +Non ci sono però garanzie che ciò riesca, e l'operazione non potrà essere annullata. +Sei sicuro di voler provare a eseguire quest'operazione?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>senza titolo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Salva documento</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Documento di Merkaartor (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation>Salva modello Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>Impossibile aprire il file da salvare</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>Impossibile aprire %1 in scrittura.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation>Impossibile aprire il modell salvato</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>File non valido</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 non è un documento di Merkaartor valido.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>Esporta OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>File OSM (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>Esporta osmChange</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>File osmChange (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Esporta GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>File GPX (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Esporta KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>File KML (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation>Estrazione caratteristiche</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation>Estrazione caratteristiche in corso...</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation>Nascondi etichette pulsanti barra degli strumenti</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (int)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Aggiungi segnalibro</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Specifica il nome del segnalibro.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Nome segnalibro non valido</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>Il segnalibro non può essere vuoto.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Attenzione: il segnalibro esiste già</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Inseriscine uno nuovo, mantieni lo stesso nome per sovrascriverlo o annulla l'operazione.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Rimuovi segnalibro</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Seleziona il segnalibro da rimuovere.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Proiezione non valida</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>Impossibile impostare la proiezione "%1".</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>Errore GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>Impossibile aprire la porta di comunicazione con il GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>Apri file di log NMEA</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>Salva modelli tag</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Modelli tag di Merkaartor (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>Apri modelli tag</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation>Attenzione! Impossibile caricare le traduzioni di Merkaartor per la lingua "%1". Imposto la lingua predefinita (inglese).</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>Conflitti non risolti</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>Correggi i conflitti esistenti prima di procedere</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>È fortemente raccomandato salvare le modifiche apportate al documento dopo un caricamento. +Vuoi farlo ora?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b> </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>ultimo: </i><b>%1</b> di <b>%2</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>ultimo: </i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>livello: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation>Sfoglia</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Waypoint</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>coordinate</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>descrizione</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>commento</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Nodo</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>altezza sul liv. del mare</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>velocità</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>dimensione</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>membri</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>Alto sinistra</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>Basso destra</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Relazione</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Ruolo</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Membro</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation>Strada chiusa</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Lunghezza</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Dimensione</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>%1 nodi</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Area</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Via</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation>%1 m/pixel</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation>Allineamento: %1m @ %2</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation>%1ms</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>Visualizza</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation>Riquadro di selezione</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Proiezione</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Nuovo segnalibro</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>Caricamento preferenze non riuscito</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Chiave duplicata</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Più di 150 preferenze</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation>Trasmissione delle preferenze non riuscita</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation>Errore di comunicazione</translation> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Nuovo server</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Forma</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>Tag</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>Elementi selezionati</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation>Classe</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Nome</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Campo sconosciuto</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Errore!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>Il servizio ricerca nome richiede l'autenticazione.</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Forma</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>Nome file di output</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>senza titolo</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation>File PDF (*.pdf)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Tutti i file (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Immagini (*.png, *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>File SVG (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation>Esporta Raster/SVG</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation>Opzioni</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>lat/lon min</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>lat/lon max</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation>Mostra nodi</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation>Mostra relazioni</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>Mostra scala</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation>Mostra griglia lat/lon</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation>Mostra caratteristiche senza stile</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation>Risoluzione di stampa</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation>300</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation>600</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation>1200</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation>dpi</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>Esporta come PDF...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>Esporta come SVG...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation>Esporta come raster...</translation> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Forma</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Nome utente:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation>Password:</translation> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Editor stile mappa</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Globale</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Sfondo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation>Nodi</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Spessore proporzionale</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>Spessore fisso</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>Filtro</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Aggiungi</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Elimina</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Duplica</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>Seleziona tag</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>metri/pixel</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>Visibile fino a</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>Visibile dalla scala</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Disegna con il colore</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Tratteggiata</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>disabilitato</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Riempi area</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation>Riempi con l'icona Ritocco</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Confini</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation>Interno</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation>Esterno</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>Ritocco</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Disegna passi</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Disegna icona</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation>Disegna segni direzione traffico</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Etichetta</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Carattere</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Etichetta tag</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Alone</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Area</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Disegna con colore di sfondo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Etichetta con tag di sfondo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Sempre</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Seleziona colore</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>Nessun geotag valido</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>Etichetta di testo</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation>Questa foto non contiene dati EXIF di georeferenziazione. +Cosa vuoi fare?</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation>Prova ad abbinarla a un nodo traccia</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>Caricala senza nodo associato</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>Estrai informazioni dal codice a barre (Walking Papaers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>Ignorala</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>Applica questa scelta a tutte le foto correnti.</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Finestra di dialogo</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>Nome file di output</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>senza titolo</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>File SVG (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Tutti i file (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Immagini (*.png, *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Preferenze</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>Visualizza</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Generale</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Opacità bassa/alta</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>Iterazione singolo pulsante del mouse</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>Utilizza stile Qt personalizzato</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation>Consenti la creazione di nodi/strade in modalità Selezione</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>Relazioni selezionabili mentre sono nascoste</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Colori</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Sfondo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>Sovrascrivi stile</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>Traccia GPX</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>Pixel</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Interfaccia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Passaggio mouse</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Relazioni</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Selezionato</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Evidenzia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation>Scorretto</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Lingua</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Utilizza lingua</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>Traduci i tag standard</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation>Rendering</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation>Opzioni</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation><html><head/><body><p>Se quest'opzione è abilitata, la renderizzazione wireframe (Visualizza-Wireframe) utilizzerà lo stile corrente per i colori e il riempimento. Per la larghezza sarà utilizzato solo lo spessore fisso. </p></body></html></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation>Utilizza stile corrente per il rendering wireframe</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation>Modifica</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation>Modifica veloce</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation>Modifica wireframe</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation>Modifica con renderizzazione completa</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Stile mappa</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Cartella stili personalizzati</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Stile corrente</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Modelli</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>Modelli dei tag</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Interno</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Personalizzato</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Dati</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation>XAPI</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Documenti</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation>Carica automaticamente il modello</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Salva automaticamente i documenti dopo il caricamento</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>Tracce</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation>GDAL</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation>Conferma proiezione</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>Input GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>Seriale</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Porta</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Host</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>Salva log NMEA</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>Imposta l'ora di sistema sul GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Rete</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Impostazioni proxy</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation>Usa proxy</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation>Timeout di rete (sec):</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation>Immagine di sfondo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation>Cartella della cache</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation>Dimensione cache (in MB;0 per disabilitare)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Password:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Nome utente:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Porta:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Host:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Adattatore mappa</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation>Aggiungi automaticamente i tag "fonte" durante la creazione di caratteristiche su una mappa di sfondo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Strumenti</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Nome:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Percorso:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Applica</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Aggiungi</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Elimina</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Inglese</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Arabo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation>Cinese (Taiwan)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation>Croato</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Ceco</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Olandese</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Tedesco</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Francese</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>Ungherese</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation>Indonesiano (Indonesia)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Italiano</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>Giapponese</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Polacco</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Russo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation>Portoghese (Brasile)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Spagnolo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Svedese</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Ucraino</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation>[completato per meno del 50%] Cinese (Cina)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation>[completato per meno del 50%] Estone</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation>[completato per meno del 50%] Tedesco (Austria)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation>[completato per meno del 50%] Portoghese</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation>[completato per meno del 50%] Slovacco</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation>[completato per meno del 50%] Vietnamita</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Modelli tag di Merkaartor (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Seleziona colore</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>Lo strumento esiste già</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Uno strumento con questo nome esiste già. +Scegli un altro nome o clicca sul pulsante <Applica> se vuoi modificare quello esistente</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>Impossibile eliminare uno strumento preimpostato</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>Impossibile eliminare lo strumento preimpostato "%1"</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>Impossibile modificare il nome di uno strumento preimpostato</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>Impossibile modificare il nome dello strumento preimpostato "%1"</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>Seleziona file eseguibile dello strumento</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation>Seleziona un modello</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation>Documento Merkaartor (*.mdc)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>Seleziona la cartella dei log</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation>Impostazione proiezioni</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>Proiezioni</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation>Lista proiezioni:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nome:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>Stringa PROJ4</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Applica</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Aggiungi</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Elimina</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation>Specifica la proiezione</translation> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation>Documento</translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Finestra di dialogo</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation>Predefinito</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation>Standard (EPSG:...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation>Formato PROJ4(+proj=...) personalizzato</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation>WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation>Errore nella stringa WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation>Impossibile esportare nel formato PROJ4</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation>Stringa WKT non valida</translation> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Proprietà</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 elementi selezionati</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 elementi selezionati</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Elementi selezionati</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Proprietà - Elementi multipli</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Proprietà - Nodi</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Proprietà - Relazione</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Proprietà</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation>Errore durante la lettura del modello</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Centra mappa</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>Centra ed esegui zoom sulla mappa</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Seleziona membro</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Pulizia a cascata</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>Sposta nodo %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation>Esportazione GPX in corso...</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Annulla</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation>Importazione in corso...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation>Importato: %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>Importa da osmChange</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>Importa NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>Importa NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation>Rilevamento di strade Bing</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation>Impossibile ottenere l'output.</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation>Nessun dato valido</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation>Impossibile analizzare l'output.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation>Utilizzare un commento vuoto per l'elenco cambiamenti?</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation>Il commento per l'elenco cambiamenti è vuoto. Fornire un buon commento, in modo tale che chiunque sappia cosa fa la tua modifica e con quali intenzioni, è considerato una cortesia nei confronti dei tuoi colleghi mappatori. +Vuoi comunque inviare un commento per l'elenco cambiamenti vuoto?</translation> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Non valido</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation>Posizione non disponibile</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation>Ora e data non disponibili</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>Metri</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>Non disponibile</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation>Posizione acquisita</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>Errore registrazione GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Impossibile creare un file di log GPS: %1</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation>Impossibile connettersi a %1:%2</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>Errore registrazione GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Impossibile creare un file di log GPS: %1</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>Etichetta di testo</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Longitudine</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Altitudine</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 metri</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation>Numero satelliti</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Tipo fix</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Non valido</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Velocità</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Latitudine</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>Flusso dati di risposta non corretto!</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation>Personalizza barre degli strumenti</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation>Azioni</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation>Barre degli strumenti</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>Nuovo</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Elimina</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>Rinonima</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation>Ripristina tutto</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Applica</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Annulla</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation>Sopra</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation>Giu</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation>Azioni correnti barra degli strumenti</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation>< S E P A R A T O R E ></translation> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation>Barra degli strumenti personalizzata</translation> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Forma</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation>Uso del terreno</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Mebmri</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation>Rimuovi membro/i selezionato/i</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>Tag</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation>Aggiungi tag "fonte"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation>Rimuovi tag selezionato/i</translation> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Forma</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>Tag</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation>Aggiungi tag "fonte"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation>Rimuovi tag selezionato/i</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Nessun satellite</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation>Cerca città</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation>Nome</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation>Cerca</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation>Risultati</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation>Nessun risultato</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation>La tua ricerca non ha prodotto risultati.</translation> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Selezione</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Chiave</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Valore</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Nome</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation>Ricerca</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation>Numero massimo risultati restituiti (0 per tutti)</translation> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation>Aggiorna livello</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Chiudi</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Stili</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Stili</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Carica su OpenStreetMap</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation>Commento</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation>Un buon commento dovrebbe descrivere la modifica in modo sintetico e adeguato.</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation>Saranno inviate le seguenti modifiche:</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation>Aggiunti</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation>Aggiornati</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation>Eliminati</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation>Strade</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation>Nodi</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation>Relazioni</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation>Somma</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Annulla</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>Impostazioni server TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>Server TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Elenco server:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nome:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>URL del server:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>Recupera servizi</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>Servizi:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation>Questo è un server TMS standard.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Proiezione:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Mercatore (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>Lat/Lon (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation>L'origine è in basso a sinistra</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation>Dimensione dei riquadri:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation>Zoom minimo:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation>Zoom massimo:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation>Valore del tag "fonte":</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>URL della licenza:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Applica</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Aggiungi</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Elimina</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation>Merkaartor: GetServices</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>Indirizzo e percorso non possono essere vuoti.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation>Errore durante la lettura dei servizi. Probabilmente il server non supporta questa funzionalità.</translation> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Chiave</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Valore</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation>Editor tag</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation>Un tag con questo nome esiste già.</translation> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>Modifica questo per aggiungere...</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Forma</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation>O</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>E</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation>NO</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation>è</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation>è uno di</translation> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Non definito</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Non definito</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation>Fila di case a schiera</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation>Nessun numero civico</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>Numero case</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>Aggiungi numeri civici (schema Karlsruhe)</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation>Intervalli</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>Ad esempio "1-9;15-17;19,19A"</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation>Motivo</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Tutti i numeri</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>Numeri dispari</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>Numeri pari</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation>Puoi anche selezionare facoltativamente un nodo nell'area e il conteggio dei numeri civici partirà da li.</translation> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Estrai - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation>Numero di segmenti traccia</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Distanza totale</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Durata totale</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1h %2m</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Estrai il livello di disegno</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Chiudi</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>Trackpoint</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Latitudine</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Longitudine</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Tag</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation>Aggiungi tag "fonte"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation>Rimuovi tag selezionato/i</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Finestra di dialogo</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Sito Web</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Password</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Nome utente</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Utilizza proxy</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Porta</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Pulisci</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>Imposta server WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>Server WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Elenco server:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nome:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>URL del server:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Livelli:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation>Titolo</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Proiezione:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation>Ridimensionalo</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>Livelli di zoom</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>Formato immagine:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Stili:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation>Valore del tag "fonte":</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>URL della licenza:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Applica</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Aggiungi</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Elimina</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: GetCapabilities</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>Indirizzo e percorso non possono essere vuoti.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation>Livello senza nome</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation>Senza titolo</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation>Questo è un server WMS con caching.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation>Impossibile contattare il server WMS: %1</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation>Impossibile ottenere le caratteristiche supportate: %1</translation> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation>Caricamento immagine…</translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation>Timeout di rete</translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation>Nome/i file</translation> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation>Nessun file valido</translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation>Impossibile caricare file.</translation> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_ja.ts b/translations/merkaartor_ja.ts new file mode 100644 index 0000000..4818bb2 --- /dev/null +++ b/translations/merkaartor_ja.ts @@ -0,0 +1,7378 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="ja" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>Merkaartorについて</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>変更ログ</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>OK</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>記述</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>ショートカット</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>インポート(&I)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>エクスポート(&E)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>デフォルト(&D)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>キャンセル(&C)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>ショートカットの編集</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>ショートカット設定をロード</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Merkaartorショートカット設定 (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>ファイルを開けません。</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 を開けません。</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>ショートカット設定の保存</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>タイトルなし</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>全てのファイル(*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>保存ファイルを開くことができません。</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 を書き込み用に開けません。</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>記述がありません。</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>フォーム</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>フォーム</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation>変更されたオブジェクトは<b>ありません</b></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation><b>一つ</b>の変更されたオブジェクトがあります</translation> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>取り消し</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>中央に表示</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>中央に表示してズーム</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>取り消し</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>クリーンアップ</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>ズーム</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>道路 %1 を追加</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>トラックポイント %1 の追加</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>関連 %1 を追加</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>トラックポイント %1 のアップデート</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>関連 %1 のアップデート</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>道路 %1 のアップデート</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>トラックポイント%1の削除</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>道路%1の削除</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>関連%1の削除</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>アップロード要求のエラー</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>設定メニューでユーザ名、パスワードをチェックしてください。</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>この要求(%1)のアップロードでエラーが発生しました。 +サーバからのメッセージは'%2'です。</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +APIメッセージは'%1'です</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>変更点をアップロード中...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>変更セットのオープン</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>チェンジセットを閉じる</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>アップロード要求のエラー</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>設定メニューでユーザ名、パスワードをチェックしてください。</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>この要求(%1)のアップロードでエラーが発生しました。 +サーバからのメッセージは'%2'です。</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +APIメッセージは'%1'です</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation>要求 (%1) をアップロード中にエラーが発生しました。 +"%2" +衝突を処理するために、問題のある地物を再ダウンロードしてください。</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>変更をチェック中...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>変更セットのオープン</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>チェンジセットを閉じる</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>関連 %1 を追加</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>道路 %1 を追加</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>トラックポイント %1 の追加</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>関連 %1 のアップデート</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>道路 %1 のアップデート</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>トラックポイント %1 のアップデート</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>トラックポイント%1の削除</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>道路%1の削除</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>関連%1の削除</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>タイトルなし</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>変更された</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>アップロードされたレイヤー</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>背景画像</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation>描画レイヤー#%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation>フィルタレイヤー#%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>OSMエクスポート</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>OSMをエクスポート中...</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>文書</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>ダウンロード</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>位置</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>ブックマーク</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>現在のビュー</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation>WWWリンク(OSM/Googleマップ)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation>Xapiセレクタ</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>下の地図から(地図はOpenStreetMapプロジェクトから提供されています)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>生GPSトラックデータもダウンロード</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>全てのリレーションを解決</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 ダウンロード</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>未解決部をダウンロード中...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>未解決の %2分の%1 をダウンロード</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>%2中%1の未解決をパース中</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>パース中...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>XMLのパース</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>%1からの矛盾</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>空の道路や関連を見つけました。</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>空の道路や関連はおそらく誤りです。 +これらに削除マークをつけますか?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>空のフィーチャを削除します。 %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>矛盾を検出しました。</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>これは、あなたが最後にダウンロードした以降に変更した地物がサーバー上の誰かによって変更されたことを意味します。 +これらの地物は「競合...」レイヤーの"conflict_..."として複製されています。 +変更をアップロードする前に、手動で二つのバージョンをマージして、「競合...」レイヤーから取り除く必要があります。</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>アップロード中...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>変更の準備中</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>サーバの応答待ち</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>ダウンロード中...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>OSMデータのダウンロード(接続中)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>予期していないhttp状態コード(%1) +サーバメッセージは'%2'です。</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +APIメッセージは'%1'です</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>ダウンロード失敗</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>ユーザ名/パスワードが不正です。</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>解決できない矛盾</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>既存の矛盾を先に解決してください。</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>トラックポイント %1-%2のダウンロード</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>ダウンロードするポイント</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>%1,%2 (ズーム %3)のダウンロード...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>ズーム</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>閉じる</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>削除できません</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation>ダウンロード領域外なので選択されたものを削除できません。</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>全てを削除できません</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation>選択されたものの一部がダウンロード領域の外側なので、完全に削除することはできません。 +削除できるものだけを削除しますか?</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation>ウェイ%1を反転</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation>%1ウェイを反転</translation> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>エキスポート</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>何をエキスポートしますか?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>表示されているもの全て(何も隠さない)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>ビューポート</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>選択</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>地物</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>中央に表示</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>中央に表示してズーム</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>不足している子要素をダウンロードする</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>選択に追加</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>削除</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>関連</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>全て</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>地物</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>ビューポートに完全に含まれている地物のみ</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>検索...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>リセット</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>ダイアログ</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>名前</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>フィルタ</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>閉じる</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>フィルタ設定</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>フィルタ</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>フィルタリスト:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>名前:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>フィルタ</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>適用</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>追加</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>削除</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>ネットワークタイムアウト</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>Walking Papersサーバから写真の詳細を読み込めません。</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Walking PapersのURLを指定してください</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>ジオイメージ</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>中央に表示</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>画像の削除</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>ファイル名をクリップボードにコピーする</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>次のイメージを選択</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>PgDown</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>前のイメージを選択</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>PgUp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>ジオタグ付き画像を保存...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>写真レイヤー</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>ジオタグされた画像のロード</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>イメージが関連づくレイヤーの選択</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation>レイヤーは読み込み専用</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation>使っているレイヤーは書き込みできません。書き込み可能にしますか? +そうでなければ、これに画像を読み込むことはできません。</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>画像のロード...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>読み込みの停止</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>そのようなファイルはありません</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>画像"%1"が見つかりません。</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>"%2"読み込み時エラー: +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>"%1"からのEXIFデータ読み込み時エラー</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>オフセットの指定</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>トラックの終了点</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>トラックの開始点</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>hh:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>トラックポイントがない</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>画像"%1"にあうトラックポイントがありません。</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss '秒'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm '分' ss '秒'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh '時' mm '分' ss '秒'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>画像間違えた?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>イメージ "%1"は最初のトラックポイントが記録される前%2に取られました。 +それでもこれを使いますか?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>イメージ "%1"は最後のトラックポイントが記録された後%2に取られました。 +それでもこれを使いますか?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation>出力ファイル名を指定</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>JPEG画像(*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>"%1"読み込み時エラー: +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>移動</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>ブックマーク</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation>WWWリンク(OSM/Googleマップ)</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>最小経度、最小緯度、最大経度、最大緯度</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>緯度(1/100単位), 経度(1/100単位), 緯度(巾), 経度(巾)</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>情報</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>OSM API Url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>OSM XAPI url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>検索</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>不正なOSMのURL</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>指定されたURLは不正です。</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>不正なCoordinatesフォーマット</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>座標は次のものでなければなりません: '<左経度>, <下緯度>, <右経度>, <上緯度>'</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>座標は次のものでなければなりません: '<中心緯度>, <中心経度>, <緯度幅>, <経度幅>'</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>なし</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>形状アダプタ</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>ズーム</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation>ビューの投影法をレイヤーに設定</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>閉じる</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>WMSアダプター</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>TMSアダプター</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>プラグイン</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>マップ - なし</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>マップ - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>地図 - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>地図 - WMS-Tiled - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>マップ - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>マップ - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>ライセンス条項: %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>ライセンス条項を承諾していない</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation>あなたは、ライセンス規約に了承の意思表示のチェックボックスに入力をしていません。 +そのため、このソースをまっプレイヤーとして利用できません。 +本当にやりたいことですか?</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>サーバ</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>タイルのサイズ</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>最小/最大ズーム</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>投影法</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>ダイアログ</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>入力</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>OSMプレビュー</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>仕様</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>先頭行にヘッダを含む</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>区切り文字</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>セミコロン(;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>タブ</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>その他:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>なし</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation>シングルクオート(')</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation>ダブルクオート(")</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>投影法 (PROJ4 形式; 緯度/経度形式の場合は空白にする)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>フィールド</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>フィールドリスト:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>フィールド名(=タグキー) :</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>フィールド型:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>インポート</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>インポート範囲</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>開始位置(0が先頭):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>末尾(0は最後):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>設定を読み込む...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>設定を保存...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>文字列</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>整数</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>実数</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>経度</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>緯度</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>不正な投影法</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>投影法を設定できません。</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>座標なし</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>緯度又は経度のフィールドがありません。このファイルをインポートすることはできません。 +本当に終了しますか?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>CSV インポート設定を読み込む</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Merkaartorインポート設定 (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>不正なファイル</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 を開けません。</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1はCSVインポート設定ファイルではありません</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation>CSVインポート設定を保存</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>タイトルなし</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>全てのファイル(*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation>インポートする設定を保存するためにオープンできません</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 を書き込み用に開けません。</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation>投影法を設定できません; 一つ選択してください</translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>情報</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>サイズ</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>地物</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>全て表示</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>全て隠す</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>全て読み込み専用</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>全て読み込み専用解除</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>閉じる</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>レイヤー</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>全て</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>地図</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>描画</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>トラック</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation>レイヤーをデフォルトにリセットする</translation> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>フォーム</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>可視</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>読み込み専用</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>薄い</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>濃い</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>不透明</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>表示濃度</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation>レイヤークローズ: 変更オブジェクトが存在</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation>このレイヤーには変更された地物があります。 +本当に閉じますか?(元には戻せません)</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation>レイヤークローズ: 空でない</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation>本当にこのレイヤーを閉じてもいいですか?(元には戻せません)</translation> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>ライセンス条項</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>ライセンス条項を読み、承諾しました</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>今後確認しない。</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>ヘルプ(&H)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>作成(&C)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>編集(&E)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>ビュー(&V)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>ブックマーク(&B)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>ファイル(&F)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>エクスポート(&E)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>ツール(&T)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>スタイル(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation>タグテンプレート(&g)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>ノード(&N)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>ウィンドウ(&W)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>ドック (&D)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>フィーチャ(&t)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>レイヤー(&L)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>関連(&a)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>表示(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>メインツールバー</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>終了(&Q)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>情報(&A)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>開く(&O)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>新規文書を作成して、ファイルをインポート</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>全てズーム(&a)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>ウィンドウズーム(&w)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>ズームウィンドウ</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>ズームアウト(&o)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>ズームイン(&i)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>ズームイン</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>曲がったリンク</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>元に戻す(&U)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>やり直す(&R)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>移動(&M)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>インポート(&I)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>現在の文書にファイルをインポート</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>ダウンロード(&D)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>新規エリアの地図データをダウンロード</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>リンク</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>リンクの作成</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>選択(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>アップロード(&U)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>変更をサーバにアップロード</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>削除(&e)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>選択したフィーチャを削除</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>新規ノードの作成</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>逆転(&R)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>ロータリーの作成</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>新規(&N)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>分割(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>接合(&J)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>切り離す(&B)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>分割</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>関連(&l)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>関連の作成</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>領域(&A)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>新規エリアの作成</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>全ての表示中レイヤーをファイルに書き出す</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>検索</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>検索とアイテムの選択</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>ビューポートの地物をファイルにエクスポートする</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>マージ(&M)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>ノードの結合</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>選択されたノードをマージする(最初に選択されたものが残る)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>保存(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>更新ダウンロード</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>現在のエリアの地図データをダウンロード</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>プロパティ(&P)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>情報(&I)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>整列(&A)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>ノードの整列</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>選択したノードを整列させます。最初に選択した2つの線上にならべます。</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation>選択されたノードを均等割り付け</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>コピー(&C)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>選択したフィーチャーとタグをクリップボードにコピー</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>選択した地物のタグをクリップボードにコピーします;地物がトラックポイントなら、緯度経度もコピーします。</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>タグを上書き貼り付け(&O)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>クリップボードのタグを選択したーフィーチャーに貼り付け(し上書き)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>タグを追加貼り付け(&M)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>タグを貼り付け</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>クリップボードからタグを貼り付け(既存のタグに追加)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>選択したフィーチャーのタグと、クリップボードのタグを混ぜる</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>貼り付け</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>クリップボードからタグを貼り付け</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>クリップボードのフィーチャーを貼り付けます;もしフィーチャーIDがすでに文書にある場合は上書きされます。</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>地物を変更レイヤーにコミットする</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>画像レイヤー(&I)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>ラスタ/SVG(&R)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>開始(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>GPSの開始</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>GPSの再生</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>ストップ(&t)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>GPSの停止</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>GPS位置を中心にする(&C)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>パターンを表示</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>記録</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>GPS記録</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>一時停止</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>GPSを一時停止</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>ジオイメージ(&e)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>メンバー追加(&A)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>メンバー削除(&R)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>表示しない(&N)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>常に(&A)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>分離(&D)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>スタイル(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>カメラ</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>回転</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>地物</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation>セグメントを等間隔に分割する</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>背景タイルのズームを固定(&L)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>OsmChange (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>閉じる</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>単純化(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation>道路を単純化する</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation>不要な子ノードを削除することで道路を単純化します</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>なし(&N)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation>領域を二つのノードで分割する</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>テラスハウス(&T)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation>領域をテラスハウス化する</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation>選択された領域をテラスハウスに分割します。</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation>軸を合わせる(&A)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation>等間隔の軸に端を合わせる</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>プロパティ...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation>変更した地物をハイライトする(&y)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation>切り取り(&t)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation>押し出し(&E)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation>ウェイ押し出し(JOSM形式)の説明</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation>トグルを選択</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation>選択に子ノードも含む</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>拡大縮小</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>不足している子要素をダウンロードする</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>%2のタグ'%1'をクリアー</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>%2の%1タグをクリア</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation>%1に"source"タグを設定</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>%2のメンバー'%1'の削除</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation>関連%1のメンバーを再整列する</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>リレーションが修正されました。 %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>エリア %1 を作成する</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>領域: 道路作成 %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>穴の追加</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>この領域に穴を追加しますか?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>領域: 道路終了 %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>エリア: ノード %1 を道路 %2 に追加</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>領域%1を閉じる</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>左クリックで開始; ドラッグで拡大縮小; SHIFT-ドラッグで回転; 左クリックで終了</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>ロータリー%1の作成</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation>道路%1を閉じる</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>左クリックで選択; 右クリックでスクロール; CTRL-左クリックで選択のオン/オフ; SHIFT-左クリックで選択へ追加; 左ドラッグで領域選択; CTRL-右ドラッグでズーム; ダブルクリックでノード作成; ノード上でのダブルクリックでウェイの開始;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>クリックで選択; CTRL-クリックで選択のオン/オフ; SHIFT-クリックで選択へ追加; SHIFT-ドラッグで領域選択; CTRL-ドラッグでズーム; ダブルクリックでノード作成; ノード上でのダブルクリックでウェイの開始;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>フィーチャ%1の削除</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>地物の削除</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>子の削除</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation>子ノードも削除しますか? +ダウンロード領域外のOSMノードは保持されることに注意してください。</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation>%1ウェイを反転</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>左クリックで選択; 左ドラッグで移動</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>同じ位置のノードが見つかりました。</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>ドロップした位置の全てのノードをマージしますか?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>ノードを%1にマージします</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation>マウスカーソルを置くと選択; 左ドラッグで回転</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation>地物を回転</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation>マウスカーソルを置くと選択; 左ドラッグで拡大縮小</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation>地物を拡大縮小</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>左クリックで最初の角->左ドラッグで領域指定->左クリックでズーム</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>GPS 交換フォーマット (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>OpenStreetMapフォーマット(*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation>OpenStreetMap change format (*.osc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Noni GPSPlotフォーマット(*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>NMEA GPSログフォーマット(*.nmea *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>KMLファイル (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>カンマ区切り形式(*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>ジオタグされた画像(*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>ESRIシェイプファイル (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation>Geography Markup Language (*.gml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>サポートされたフォーマット</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Merkaartor文書(*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>全てのファイル(*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>タイル %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>薄い</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>濃い</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>不透明</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>フィーチャ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>ノード</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>関連</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>画像を読み込む</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>ノードの位置をイメージに追加</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation>この位置にイメージをジオタグする</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>キャンセル</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>ファイル</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>編集</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>ビュー</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>表示</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>方向付き矢印</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>レイヤー</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>作成</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>ウエイ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>ツール</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>ウィンドウ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>ヘルプ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation>地物の切り取り</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>クリップボードが不正です</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>クリップボードには有効なデータがありません。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>保存されていない変更</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>現在の地図には保存されていない変更があり、新しい地図を開いたときに失われます。 +新しい地図の開始をキャンセルしますか?それとも、継続して古い変更を破棄しますか?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>ウエイポイント</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>トラック %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>重大な著作権の警告</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>あなたはKMLファイルをインポートしようとしています。次のことを確認してください: + + - OSMにGoogleアースから作成したKMLファイルをインポートすることはできません。GEから作られた + ノードがあなたのものだと思っているかもしれませんが、そうではないのです! + それでも、GEからの派生物になります。だから、OSMで使えないのです。 + + - インターネットからそれをダウンロードしたならば、変更も著作者に帰属します。 + それらのデータがOSMで使うことを、著者によって完全に許諾されていますでしょうか。あるいは + データがパブリックドメインにありますか。(日本では、法的にパブリックドメインは存在しません。) + +もし、わからないならば、"legal"や"talk"といったopenstreetmap メーリングリストでアドバイスを求めてみてください。 +このKMLをOSMにインポートすることが、法的に完全に確認できていますか?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>不正なファイルです</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 を開けません。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>古い Qt のバージョンが見つかりました</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>あなたの設定は、Qt %1を使用しています。これには、OpenStreetMapにデータをアップロードをするときに知られているいろんなエラーがあり、401サーバ応答コードになってしまうことがあります。(推奨されていませんが、)続けますか? +さらなる情報は、http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor で知ることができます。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>OSMのアップロード</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>OpenStreetMapユーザ名とパスワード +を指定していないようです。 +いま指定しますか?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>ダウンロードエラー</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>地図をダウンロードできません。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>多角形を作成する</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>辺の数を指定してください</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>地物を強制的にアップロードする</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>交差点を作成する</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>複数交差</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>これらの道路には複数の交差があります。 +それでもそれぞれに交差点を造りますか?(不要な交差点は後で削除できます)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>街路番号を追加する</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation>分割する数</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation>セグメントの数を指定してください</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation>軸合わせ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation>辺を合わせるための軸の数を指定してください(例えば直交なら4)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>3角形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>4角形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>5角形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>6角形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation>7角形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>8角形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation>%1軸に合わせる</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation>%1等間隔軸に合わせる</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation>軸に合わせられません</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation>軸合わせ操作に失敗しました。鋭角の角を調整してもう一度試してください。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation>軸合わせ操作に失敗し、解決法が収束しませんでした。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>ノードの整列</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>ノード %1 の切り離し</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>関連にメンバーを追加</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>関連からメンバーの削除</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation>領域を結合</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>領域の分割</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation>領域をテラスハウス化する %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>関連%1の作成</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>マップスタイルの保存</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Merkaartorマップスタイル(*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>マップスタイルのロード</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation>Merkaartor地図スタイル (*.mas) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation>MapCSSスタイルシート(*.css)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>タイトルなし</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Merkaartor文書を保存</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Merkaartor文書ファイル (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation>Merkaartorテンプレート文書を保存</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>保存ファイルを開くことができません。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 を書き込み用に開けません。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation>テンプレート情報を保存するためにオープンできません</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>不正なファイル</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 は、ただしい Merkaartor データファイルではありません。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>OSMのエキスポート</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>OSM ファイル (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>osmChangeをエクスポート</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>osmChangeファイル(*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>GPXのエキスポート</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>GPXファイル (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>KMLのエキスポート</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>KMLファイル(*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (int)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>ブックマークに追加</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>ブックマークの名前を指定</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>不正なブックマーク名</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>ブックマークは空白にできません。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>警告!ブックマークの名前がすでに存在しています。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>上書きするならこのまま、さもなければ新しい名前を入力するか、キャンセルしてください。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>ブックマークの削除</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>削除するブックマークを選択</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>不正な投影法</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>投影法を"%1"に設定できませんでした。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>GPSエラー</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>GPSポートを開けません。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>NMEAログファイルを開く</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>タグテンプレートの保存</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Merkaartorタグテンプレート(*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>タグテンプレートを開く</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation>警告! "%1"言語用のMerkaartor翻訳ファイルを読み込めません。デフォルトの英語に切り替えます。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>解決できない矛盾</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>既存の矛盾を先に解決してください。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>アップロード後に、これら変更をあなたの文書として保存することを強く推奨します。 +そうしますか?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>last: </i><b>%1</b> by <b>%2</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>last: </i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>レイヤー: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>ウエイポイント</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>coord</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>記述</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>コメント</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>ノード</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>高度</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>速度</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>サイズ</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>メンバー</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>左上</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>右下</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>関連</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>役割</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>メンバー</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation>閉じたウェイ</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>距離</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>サイズ</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>%1 ノード</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>エリア</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>ウエイ</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>ビュー</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation>境界</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>投影法</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>新規ブックマーク</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>設定のアップロード失敗</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>重複したキー</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>150以上の設定項目</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>新規サーバ</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>フォーム</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>タグ</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>選択したアイテム</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation>クラス</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>名前</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>不明なフィールド</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>エラー!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>地名検索サービスは、認証が必要です。</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>フォーム</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>出力ファイル名</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>タイトルなし</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation>PDFファイル(*.pdf)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>全てのファイル(*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>画像ファイル (*.png *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>SVGファイル (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation>ラスタ/SVGのエクスポート</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation>オプション</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>最小 緯度/経度</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>最大緯度/経度</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation>ノードを表示</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation>関連を表示</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>スケールを表示</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation>緯度/経度グリッドを表示</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation>スタイル指定されていない地物を表示</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>PDFとしてエクスポート...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>SVGとしてエクスポート...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation>ラスタデータとしてエクスポート...</translation> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>フォーム</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>ユーザ:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation>パスワード:</translation> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>マップスタイル編集</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>グローバル</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>背景</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>比例幅</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>固定幅</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>フィルタ</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>追加</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>削除</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>重複</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>タグの選択</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>メートル/ピクセル</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>スケールから見える</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>カラーで表示</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>点線</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>オフ</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>領域を埋める</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation>アイコンパターンで塗りつぶす</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>境界</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>パターン</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>階段を表示</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>アイコンを表示</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>ラベル</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>フォント</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>ラベルタグ</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>ハロ</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>エリア</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>背景色を表示</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>背景タグのラベル</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>常に</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>色の選択</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>有効なジオタグなし</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>テキストラベル</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation>この写真にはジオタグEXIFデータがありません。 +次にどうしますか?</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation>トラックノードとマッチングしようとする</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>関連するノードなしで読み込む</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>情報をバーコードから抽出 (Walking Papers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>無視</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>これを現在の写真全てに対して行う。</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>ダイアログ</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>出力ファイル名</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>タイトルなし</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>SVGファイル (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>全てのファイル(*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>画像ファイル (*.png *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>設定</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>外観</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>一般</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>表示濃度の濃淡</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>シングルクリックでマウス操作</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>カスタムQtスタイルを使う</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation>選択モードでノード/ウェイ作成を可能にする</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>隠れている関連を選択可能にする</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>配色</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>背景</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>スタイルの上書き</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>GPXトラック</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>ピクセル</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>インターフェース</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>上にある時</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>関連</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>フォーカス</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>ハイライト</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation>変更</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>地域</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>多国語を使う</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>標準タグを翻訳</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation>オプション</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>マップスタイル</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>カスタムスタイルディレクトリ</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>現在のスタイル</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>テンプレート</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>タグのテンプレート</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>内蔵</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>カスタム</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>データ</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation>XAPI</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>文書</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation>テンプレート文書を自動的に読み込む</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>アップロード後文書を自動保存</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>トラック</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>GPS入力</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>シリアル</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>ポート</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>ホスト</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>NMEAログを保存</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>システム時間をGPSで合わせる</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>ネットワーク</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>プロキシー設定</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>パスワード:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>ユーザ:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>ポート:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>ホスト:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>マップアダプタ</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation>背景地図の上に地物を作成するときに自動的に"source"タグを追加する</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>ツール</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>名前:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>パス:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>適用</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>追加</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>削除</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>英語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>アラビア数字</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Czech</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>オランダ語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>German</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>フランス語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>ハンガリー語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Italian</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>日本語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Polish</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Russian</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>スペイン語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>スウェーデン語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>ウクライナ語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Merkaartorタグテンプレート(*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>色の選択</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>ツールがすでに存在します</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>この名前のツールはすでに存在しています。 +他の名前を選択するか、既存の名前を変更して<適用>ボタンをおしてください。</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>プリセットツールを削除できません</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>プリセットツール"%1"を削除できません</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>プリセットツールの名前を変更できません</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>プリセットツールの"%1"の名前を変更できません。</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>ツールの実行ファイルを選択</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation>テンプレート文書を選択</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation>Merkaartor文書(*.mdc)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>ログディレクトリを選択</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation>投影法設定</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>投影法</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation>投影法リスト</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>名前:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>PROJ4文字列</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>適用</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>追加</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>削除</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation>文書</translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>ダイアログ</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation>事前定義</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation>標準(EPSG:...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation>カスタムPROJ4(+proj=...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>プロパティ</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 の選択したアイテム</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 の選択したアイテム</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>選択したアイテム</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>プロパティ - 複数要素</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>プロパティ - ノード</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>プロパティ - 関連</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>プロパティ</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation>テンプレートファイル読み込みエラー</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>中央に表示</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>中央に表示してズーム</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>メンバーを選択</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>ノード %1 の移動</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation>GPXをエクスポート中...</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>キャンセル</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation>インポート中...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>osmChangeをインポート</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>NGTのインポート</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>NMEAのインポート</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>不正</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>メートル</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>無効</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2次元</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3次元</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>GPSログエラー</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>GPSログファイル %1を作成できません。</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation>%1に接続できない:%2</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>GPSログエラー</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>GPSログファイル %1を作成できません。</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>テキストラベル</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>経度</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>高度</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 メーター</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation># 衛星</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>位置補正タイプ</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>不正</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>速度</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>緯度</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>適切な結果ストリームではありません!</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation>ツールバーをカスタマイズ</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation>アクション</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation>ツールバー</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>新規</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>削除</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>名前の変更</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation>全てを元に戻す</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>適用</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>キャンセル</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation>上</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation>現在のツールバーアクション</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation><区切り></translation> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation>カスタムツールバー</translation> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>フォーム</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>メンバー</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation>選択したメンバーを削除</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>タグ</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation>"source"タグを追加</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation>選択したタグを削除</translation> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>フォーム</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>タグ</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation>"source"タグを追加</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation>選択したタグを削除</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>衛星が見つかりません</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>選択</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>キー</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>値</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>名前</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation>クエリ</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation>返される結果の最大値(0は全て)</translation> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>閉じる</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>スタイル</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>スタイル</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Openstreetmapにアップロードする</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>キャンセル</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>TMSサーバ設定</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>TMSサーバ</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>サーバリスト:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>名前:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>サーバURL:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>Servicesを取得</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>サービス:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>投影法:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Mercator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>緯度/経度(EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation>原点は左下</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation>タイルサイズ</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation>最小ズーム:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation>最大ズーム:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation>"source"タグの値:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>ライセンス URL:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>適用</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>追加</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>削除</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation>Merkaartor: GetServices</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>アドレスやパスは空白にできません</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>キー</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>値</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>これを追加用に編集...</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>フォーム</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation>OR</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>かつ</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>未定義</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>未定義</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation>テラスハウス</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation>住居番号なし</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>住居の数</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>住居番号を追加(Karlsruhe scheme)</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation>範囲</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>例: "1-9;15-17;19,19A"</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation>パターン</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>全ての番号</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>奇数</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>偶数</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation>オプションとして、領域の中のノードを選択して、住居番号をそちら側から開始させることもできます。</translation> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>展開中 - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation>トラックセグメント数</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>合計距離</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>合計時間</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1時間 %2分</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>描画レイヤーに展開する</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>ズーム</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>閉じる</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>トラックポイント</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>緯度</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>経度</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>タグ</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation>"source"タグを追加</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation>選択したタグを削除</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>ダイアログ</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Webサイト</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>パスワード</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>ユーザ名</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>プロキシーを使う</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>ポート</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>ズーム</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>クリア</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>WMSサーバ設定</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>WMSサーバ群</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>サーバリスト:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>名前:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>サーバURL:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>レイヤー:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>投影法:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation>タイル表示</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>ズームレベル</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>画像形式:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>スタイル:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation>"source"タグの値:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>ライセンス URL:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>適用</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>追加</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>削除</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: GetCapabilities</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>アドレスやパスは空白にできません</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_nl.ts b/translations/merkaartor_nl.ts new file mode 100644 index 0000000..c97d4e5 --- /dev/null +++ b/translations/merkaartor_nl.ts @@ -0,0 +1,7369 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="nl" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>Over Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Merkaartor-versie</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Qt-versie</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>GDAL versie</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Overzicht van wijzigingen</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>OK</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Beschrijving</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Sneltoets</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Importeer</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Exporteren</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>&Standaard</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Annuleren</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Sneltoets Editor</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Laad Snelkoppeling thema</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Merkaartor snelkoppeling schema (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Het is niet mogelijk om het bestand te openen</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 kon niet worden geopend</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>naamloos</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Alle bestanden (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Het is niet mogelijk om het opgeslagen bestand te openen</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 kon niet worden geopend om te schrijven.</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation>Zet segment om naar brug</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation>Het geselecteerde segment is reeds getagged als brug/tunnel. Zorg er aub voor dat u weet wat u doet.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation>Bestand</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation>Afsluiten</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation>Laden</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation>Laad een stad vanuit het kadaster</translation> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation>De stad kan niet worden ingeladen</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Geen omschrijving</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Formulier</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Formulier</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation>Rotonde</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation>Links</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation>Rechts</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation>Er is <b>geen</b> gewijzigd object</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation>Er is <b>één</b> gewijzigd object</translation> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Ongedaan maken</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Centreer de kaart</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>Centreer && zoom de kaart</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Ongedaan maken</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Opschonen</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>Zoomen</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>Weg %1 toevoegen</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>trackpunt %1 toevoegen</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>Relatie %1 toevoegen</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>Relatie %1 bijwerken</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>Weg %1 BIJWERKEN</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>VERWIJDER trackpunt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>VERWIJDER weg %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>VERWIJDER relatie %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Fout bij het uploaden</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Controleer uw gebruikersnaam en wachtwoord in het Eigenschappen menu</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Er was een fout bij het doorsturen van dit verzoek naar de server (%1) +Server boodschap is '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +API-boodschap is '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Wijzigingen doorsturen naar server...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>OPEN wijzigingsset</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>SLUIT wijzigingsset</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Fout bij het uploaden</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Controleer uw gebruikersnaam en wachtwoord in het Eigenschappen menu</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Er was een fout bij het doorsturen van dit verzoek naar de server (%1) +Server boodschap is '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +API-boodschap is '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>Nakijken van de wijzigingen...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>OPEN wijzigingsset</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>SLUIT wijzigingsset</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>Relatie %1 toevoegen</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>Weg %1 toevoegen</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>trackpunt %1 toevoegen</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>Relatie %1 bijwerken</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>Weg %1 BIJWERKEN</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>VERWIJDER trackpunt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>VERWIJDER weg %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>VERWIJDER relatie %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>zonder titel</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Wijzigingen laag</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Doorgestuurde laag</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Achtergrondafbeeldingen</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation>Tekenlaag #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation>Filterlaag #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>OSM Export</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>Exporteren naar OSM...</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>Document</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Download</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Plaats</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Bladwijzer</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Huidig beeld</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation>WWW link (OSM/Google maps)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>Van de map beneden (map beschikbaar gesteld door het OpenStreetMap project)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Haal ook de GPS-sporen van anderen op</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 download</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Downloaden ongebonden...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>Downloaden ongebonden %1 van %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>Verwerken ongebonden %1 van %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Verwerken...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Inlezen XML</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Conflicten van %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>Lege wegen/relaties gevonden</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Lege wegen/relaties zijn mogelijke fouten. +Wil je deze markeren om te verwijderen?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Verwijder lege kenmerk %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Er zijn conflicten gevonden</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>Dit betekent dat een aantal van de elementen die u heeft gewijzigd sinds uw laatste download, ondertussen werden gewijzigd op de server door iemand anders. +De elementen werden gedupliceerd op de conflictenlaag. +Voordat u uw wijzigingen zal kunnen doorsturen naar de server, moet u eerst manueel de twee versies samenvoegen en verwijderen van de conflictenlaag.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Aan het doorsturen...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Voorbereiding van wijzigingen</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>Wachten op antwoord van de server</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Bezig met downloaden...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Downloaden van OSM (verbinden)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>Onverwachte HTTP-status code (%1) +De boodschap van de server is '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +API-boodschap is '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Download mislukt</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Gebruikersnaam/wachtwoord fout</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>Onopgeloste conflicten</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>Los eerst bestaande conflicten op</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>Downloaden trackpunten %1-%2</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Punten aan het downloaden</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Downloaden van %1,%2 (zoom %3)...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>Zoomen</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Sluiten</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>Verwijderen niet mogelijk</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>Kan niet alles verwijderen</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation>Weg %1 omkeren</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation>%1 wegen omkeren</translation> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Exporteren</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>Wat wenst u te exporteren?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Alle zichtbare (niet verborgen)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Geselecteerd</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Kenmerken</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Centreer de kaart</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>Centreer && zoom de kaart</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Download ontbrekende relaties</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Aan selectie toevoegen</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Verwijderen</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Relaties</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Alles</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Kenmerken</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>Enkel kenmerken volledig in het zichtbare scherm</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Zoek...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Dialoog</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Naam</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Sluiten</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>Instellingen voor filters</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Filters</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Filterlijst:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Naam:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Toepassen</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Toevoegen</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Verwijderen</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>Kan de foto details van de Walking Paper server niet lezen.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Gelieve the URL op te geven waar de Walking Papers zich bevinden</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Geo afbeeldingen</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Centreer de kaart</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Verwijder afbeeldingen</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Kopieer bestandsnaam naar klembord</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Selecteer volgende afbeelding</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>PgDown</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Selecteer vorige afbeelding</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>PgUp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>Geogerefeerde afbeelding opslaan...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>Fotolaag</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Laad afbeeldingen die geografische referenties (geotags) bevatten</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>Selecteer tot welke laag de afbeeldingen behoren:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Afbeeldingen laden....</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Laden afbreken</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>Bestand bestaat niet</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>Kan afbeelding "%1" niet vinden</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Fout bij het openen van "%2": +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Fout bij het lezen van EXIF-data van "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>Plaats afbeeldingen meer naar:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>einde van het spoor</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>Begin van het spoor</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>hh:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>Geen TrackPunten</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>Geen TrackPunten gevonden voor afbeelding "%1"</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss 'seconden'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm 'minuten en' ss 'seconden'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh 'uren,' mm 'minuten en' ss 'seconden'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>Verkeerde afbeelding?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>Afbeelding "%1" is %2 gemaakt voordat het eerste routepunt was opgeslagen. +Wenst u er nog steeds gebruik van te maken?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>Afbeelding "%1" is %2 gemaakt nadat het laatste routepunt was opgeslagen. +Wenst u deze nog steeds te gebruiken?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>JPEG afbeeldingen (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Fout bij het openen van "%1": +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>Ga Naar</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Bladwijzer</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Informatie</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>OSM API Url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>OSM XAPI url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Opzoeken</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>Onjuiste OSM url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>Het opgegeven adres is niet geldig!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Onjuist Coördinatenformaat</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>Coördinaten als: '<links lon>, <onder lat>, <rechts lon>, <boven lat>'</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>Coördinaten als: '<midden lat>, <midden lon>, <breedte lat>, <bleedte lon>'</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Geen</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>Zoomen</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Sluiten</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>WMS adapter</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>TMS adapter</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>Invoegtoepassingen</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Kaart - Geen</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Kaart - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Kaart - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>Kaart - WMS-Tegels - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Kaart - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Kaart - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>Licentievoorwaarden: %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>De licentievoorwaarden werden niet aanvaard</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Server</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Tegelgrootte</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>Min/Max zoomniveau</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Projectie</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Dialoog</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>Invoer</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Specificaties</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>De eerste lijn bevat de veldnamen</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Scheidingsteken</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Puntkomma (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Tab</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Ander:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Geen</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>Projectie (in PROJ4-formaat; leeg laten voor breedte-/lengtegraad)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Velden</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>Veldenlijst:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>Veldnaam (= tagsleutel):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>Veldtype</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Importeer</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>Importeer bereik</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>Vanaf (0 vanaf start):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>Tot (0 tot einde):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>Laad instellingen...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Instellingen opslaan</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Geheel getal</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Lengtegraad</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Breedtegraad</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Onjuiste projectie</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>Het is niet mogelijk om de projectie in te stellen.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Geen coördinaten</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>Veld voor breedte- of lengtegraad ontbreekt. Het is onmogelijk om dit bestand te importeren. +Wenst u echt te stoppen?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>Laad CSV importeerinstellingen</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Merkaartor instellingen voor importeren (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Onjuist bestand</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 kon niet worden geopend</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation>CSV-importeerinstellingen opslaan</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>zonder titel</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Alle bestanden (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 kon niet worden geopend om te schrijven.</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation>Het is niet mogelijk om de projectie in te stellen: gelieve er één te specifiëren</translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Informatie</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Maat</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Kenmerken</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Toon alles</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Verberg Alle</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Alles Alleen-lezen</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Niets Alleen-lezen</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Sluiten</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Lagen</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Alles</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>Kaart</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>Teken</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>Sporen</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Formulier</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Zichtbaar</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Alleen-lezen</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>Laag</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>Hoog</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>Ondoorzichtig</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Ondoorzichtigheid</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation>Sluiten laag: er zijn nog gewijzigde objecten aanwezig</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation>Er zijn gewijzigde kenmerken op deze laag. +Bent u zeker dat u deze wenst af te sluiten? (Dit kan niet meer ongedaan worden gemaakt)</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation>Sluiten laag: niet leeg</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation>Weet u zeker dat u deze laag wenst af te sluiten? (kan niet worden ongedaan gemaakt)</translation> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>Licentievoorwaarden</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>Ik heb de licentievoorwaarden gelezen en verklaar me er akkoord mee</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Vraag me dit niet nog een keer</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>&Help</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Maak</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Bewerk</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>&Scherm</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Bladwijzers</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Bestand</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Exporteren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>&Gereedschappen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>&Stijl</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation>Ta&gsjablonen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>K&nooppunt</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>&Venster</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Vastmaken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>Fea&ture</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>&Lagen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>Rel&atie</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>&Toon</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>Hoofdgereedschappenbalk</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>&Afsluiten</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>&Over</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>&Openen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Maak een nieuw document en importeer een bestand</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>Zoom &volledig uit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>Zoom &venster</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>Zoomvenster</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>&Uitzoomen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>&Inzoomen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Zoom in</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Gebogen lijn</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Ongedaan maken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>&Opnieuw</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>&Verplaats</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Importeer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Importeer een bestand in het huidige document</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Download</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Download kaartgegevens voor een nieuw gebied</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Link</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Koppeling maken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Selecteer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>&Op de server opslaan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Wijzigingen doorsturen naar de server</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>V&erwijderen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Verwijder geselecteerde kenmerken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Maak nieuwe node</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>&Omdraaien</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Maak Rotonde</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Nieuw</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>&Opsplitsen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>&Koppelen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>&Losmaken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Breken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>Re&latie</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Maak Relatie</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>&Gebied</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Maak nieuw gebied</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Exporteer alle zichtbare lagen naar een bestand</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Zoek</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Zoek en selecteer items</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>Exporteer de zichtbare onderdelen in het scherm naar een bestand</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>Sa&menvoegen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Knooppunten samenvoegen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>Voeg de geselecteerde nodes samen (eerst geselecteerde blijft bestaan)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Opslaan</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Download meer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Download meer kaartgegevens voor het huidige gebied</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Eigenschappen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>&Informatie</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>&Uitlijnen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Knopen uitlijnen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>Knopen uitlijnen. De eerste twee geselecteerde knopen bepalen op welke lijn.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation>Uit&spreiden</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation>Verspreid knooppunten</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation>Knopen uitlijnen en evenredig verdelen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>Kopieer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>Kopieer geselecteerde onderdelen en tags naar het klembord</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>Kopieer de geselecteerde onderdelen tags naar het klembord; als het onderdeel een routepunt is, kopieer het coördinaat ook.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Plak Tags (&Overschrijf)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>Plak (en overschrijf) de tags op het klembord op het geselecteerde onderdeel.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>Plak Tags (&Samenvoegen)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Plak onderdelen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>Plak onderdelen van het klembord (Voeg samen met bestaande tags)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>Voeg de tags op het klembord samen met die van het geselecteerde onderdeel.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Plakken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Plak onderdelen van het klembord)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>Bewaar de kenmerken in het klembord; Indien de kenmerk ID's al bestaan, overschrijf ze.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Stuur onderdeel naar de wijzigingen laag</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>&Afbeeldingslaag</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>&Raster/SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>&Start</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>Start GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>GPS afspelen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>S&top</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>Stop GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>&Centreer op GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Opnemen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>GPS opnemen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Pauzeer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>Pauzeer GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>G&eoafbeelding</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>&Lid toevoegen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>&Lid verwijderen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>&Nooit</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>&Altijd</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>&Losmaken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>&Stijlen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Camera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Roteren</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation>&Veelhoek</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Kenmerken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>&Maak onderverdeling</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>OsmChange (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Sluiten</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>&Vereenvoudig</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation>Vereenvoudig weg(en)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation>Vereenvoudig weg door overbodige kinderknooppunten te verwijderen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>Gee&n</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation>Splits gebied tussen twee knooppunten</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>&Terras</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation>Verdeel gebied in woongebiedterrassen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Eigenschappen ...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation>Accentueer gewij&zigde kenmerken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation>Selecteer omschakelaar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation>Selecteer eveneens de kinderobjecten</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>Schalen</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Download ontbrekende relaties</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>Maak Tag '%1' voor %2 leeg</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>Maak %1 tags leeg op %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Verwijder onderdeel '%1' uit %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation>Sorteer de leden van relatie %1</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>Relatie Gewijzigd %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Maak Gebied %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Gebied: maak weg %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Gat toevoegen</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Wil je een (ander) gat in dit gebied maken?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Gebied: beëindig weg %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Gebied: Voeg punt %1 toe aan weg %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>Gebied %1 sluiten</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>LINKS-KLIKKEN om te starten; SLEPEN om te schalen; SHIFT-SLEPEN om te draaien; LINKS-KLIKKEN om te beëindigen</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Maak Rotonde %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation>Weg %1 sluiten</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>LINKS-KLIK om te selecteren;RECHTS-KLIK om het hele scherm te verplaatsen;CTRL-LINKS-KLIK om de selectie te wisselen;SHIFT-LINKS-KLIK om elementen toe te voegen aan de selectie;LINKS-SLEPEN om een gebied te selecteren;CTRL-RECHTS-SLEPEN om te zoomen;DUBBELKLIK om een knooppunt aan te maken;DUBBELKLIK op een knooppunt om te starten met het aanmaken van een weg;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>KLIK om te selecteren/verplaatsen;CTRL-KLIK om selectie te wisselen;SHIFT-KLIK om aan selectie toe te voegen;SHIFT-SLEEP om een gebied te selecteren;CTRL-SLEEP om in en uit te zoomen;DUBBELKLIK om een knooppunt aan te maken;DUBBELKLIK op een knooppunt om te beginnen met het aanmaken van een weg;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Verwijder kenmerk %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>Kenmerken verwijderen</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Wis Kinderen.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation>Wenst u de de onderliggende knooppunten ook te verwijderen? +Houd er rekening mee dat knooppunten buiten het afgehaalde gebied behouden zullen blijven.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation>%1 wegen omkeren</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>LINKS-KLIKKEN om te selecteren; LINKS-SLEPEN om te verplaatsen</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>Knooppunten gevonden op dezelfde positie</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>Wil je alle nodes op de doelpositie samenvoegen?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Nodes samengevoegd in %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation>Muisaanwijzer eroverheen bewegen om te selecteren; LINKS-SLEPEN om te roteren</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation>Kenmerk roteren</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation>Muisaanwijzer eroverheen bewegen om te selecteren; LINKS-SLEPEN om te herschalen</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation>Kenmerk schalen</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>LINKS-KLIK in de eerste hoek -> LINKS-SLEEP om gebied aan te geven -> LINKS-KLIK om te zoomen</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>GPS uitwissel formaat (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>OpenStreetMap formaat (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation>OpenStreetMap wijzigingenformaat (*.osc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Noni GPSPlot formaat (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>NMEA GPS log formaat (*.nmea *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>KML bestand (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>bestandsformaat met door komma's gescheiden waardes (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Afbeeldingen met positieinformatie (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>ESPRI Shapebestand (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Ondersteunde formaten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Merkaartordocument (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Alle bestanden (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>tegel %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>Laag</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>Hoog</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>Ondoorzichtig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Kenmerk</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Knooppunt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Relatie</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Laad afbeelding</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation>Sla geografische coördinaten op in foto</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Annuleren</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>Bestand</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Wijzigen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>Zicht</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>Toon</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>Richtingpijlen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Lagen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Creëer</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Weg</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Gereedschappen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>Vensters</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Help</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Klembord niet geldig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>Klembord bevat geen geldige data.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation>Bestand importeren</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Niet-opgeslagen wijzigingen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>De huidige kaart bevat niet-opgeslagen wijzigingen die verloren zullen gaan als u aan een nieuwe begint. +Wenst u het aanmaken van een nieuwe kaart te annuleren of wenst u verder te gaan en de gemaakte wijzigingen te verliezen?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation>Niet opgeslagen Style aanpassingen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Punten op een weg</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>Spoor %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Copyright waarschuwing</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Je probeert een KML bestand te importeren. Let op dat: + + - Je geen KML bestand in OSM kan importeren indien gemaakt met Google Earth. Hoewel het voor de hand ligt + om te denken dat de nodes die je met GE maakte van jou zijn, zijn ze dat niet! + Ze zijn een afgeleid werk van GE en kunnen daarom, als zodanig, niet worden gebruikt in OSM. + + - Indien je het bestand downloadde van het internet, bestaat eveneens de kans dat er een copyright op zit. + Je moet er absoluut zeker van zijn, dat het gebruik van dit bestand toegestaan is door de maker, of dat de data publiek domein is. + +Bij twijfel, raadpleeg de "legal", "talk" (beiden Engels) of "talk-nl" (Nederlands) Openstreetmap mailing lists. + +Weet je absoluut zeker dat deze KML legaal geïmporteerd kan worden in OSM?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>Geen geldig bestand</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 kon niet worden geopend</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>Oude versie van Qt gedetecteerd</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Het lijkt erop dat u uw +OpenStreetMapgebruikersnaam en -wachtwoord nog niet heeft opgegeven. +Wenst u dit nu te doen?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Fout tijdens downloaden</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>De kaart kon niet worden afgehaald</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Polygoon creëren</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>Specifieer het aantal kanten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Forceer Feature Uploaden</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation>Open bestand</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Maak Kruising</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Meerdere snijpunten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>Die wegen hebben meerdere intersecties. +Wenst u nog steeds een kruispunt voor elk ervan aan te maken (ongewenste kruispunten kunnen achteraf nog steeds worden verwijderd)?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Voeg huisnummers toe</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation>In hoeveel segmenten wenst u dit op te delen?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>driehoekig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>rechthoekig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>vijfhoekig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>zeshoekig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation>zevenhoekig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>achthoekig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation>Uitlijnen op %1 assen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation>Het uitlijnen op de assen is mislukt. Gelieve scherpe hoeken te corrigeren en het opnieuw te proberen.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation>Het uitlijnen op de assen is mislukt. Geen oplossing gevonden.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Knopen uitlijnen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation>Verspreid knooppunten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>Maak Node %1 los</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Lid toevoegen aan de relatie</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Verwijder onderdeel uit relatie</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation>Voeg toe aan Multipolygon</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation>Gebieden verbinden</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>Splits gebied</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Maak Relatie %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Kaartstijl opslaan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Merkaartor kaartstijl (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Laad kaartstijl</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation>Merkaartor kaartstijl (*.mas) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation>MapCSS stylesheet (*.css)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>naamloos</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Merkaartordocument opslaan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Merkaartor documentbestanden (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation>Merkaartor sjabloondocument opslaan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 kon niet worden geopend om te schrijven.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Onjuist bestand</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 is geen geldig Merkaartordocument.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>Exporteer OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>OSM Bestanden (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>Exporteer osmChange</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>osmChange Files (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Exporteer GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>GPX Bestanden (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Exporteer KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>KML Bestanden (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (int)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Bladwijzer toevoegen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Specifieer de naam van de bladwijzer</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Onjuiste bladwijzer naam</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>Bladwijzer mag niet blanco zijn</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Waarschuwing: bladwijzernaam bestaat reeds</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Voeg een nieuwe toe, houd de huidige om te overschrijven of annuleer.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Bladwijzer verwijderen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Selecteer de te verwijderen bladwijzer</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Onjuiste projectie</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>Het is niet mogelijk om de projectie "%1" in te stellen.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>GPS fout</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>Het is niet mogelijk om de GPS-poort te openen.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>Open NMEA log bestand</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>Tagsjablonen opslaan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Merkaartor tag sjablonen (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>Open Tag Sjablonen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>Onopgeloste conflicten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>Los eerst bestaande conflicten op</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Het wordt sterk aangeraden om de wijzigingen van je document op te slaan na het uploaden. +Wil je het nu opslaan?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>laatste: </i><b>%1</b&gt; door <b>%2</b&gt;</translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>laatste: </i><b>%1</b&gt;</translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>laag: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation>Bladeren</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Knooppunt</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>beschrijving</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>commentaar</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Knooppunt</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>hoogte</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>snelheid</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>grootte</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>leden</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>Linksboven</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>Rechtsonder</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Relatie</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Rol</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Lid</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation>Gesloten weg</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Lengte</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Maat</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>%1 knooppunten</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Gebied</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Weg</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation>%1 m/pixel</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>Zicht</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Projectie</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Nieuwe Bladwijzer</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>Voorkeuren uploaden mislukt</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Dubbele sleutel</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Meer dan 150 voorkeuren</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation>Communicatiefout</translation> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Nieuwe Server</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Formulier</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation>Klasse</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Naam</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Ongekend veld</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Fout!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>Name finder service vereist authenticatie</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Formulier</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>Uitvoer bestandsnaam</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>zonder titel</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation>PDF-bestanden (*.pdf)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Alle bestanden (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Afbeeldingen (*.png, *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>SVG-bestanden (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation>Export van raster/SVG</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation>Opties</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation>Toon knooppunten</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation>Toon relaties</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>Toon schaal</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation>Toon breedte-/lengtegraad op het raster</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>Exporteren naar PDF...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>Exporteren naar SVG...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation>Exporteren naar raster...</translation> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Formulier</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Gebruiker:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation>Wachtwoord:</translation> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Kaartstijl bewerker</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Globaal</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Achtergrond</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Proportionele dikte</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>Vaste lijnbreedte</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Toevoegen</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Verwijderen</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Dupliceer</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>Tagselectie</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>meter/pixel</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Teken met kleur</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Gestreept</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>uit</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Vul gebied</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Grens</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Teken stappen</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Teken icoon</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Label</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Lettertype</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Label tag</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Halo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Gebied</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Teken met achtergrondkleuren</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Label met achtergrond tag</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Altijd</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Kleur selecteren</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>Deze geotag is niet correct</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>Laad met geassocieerd knooppunt</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>Negeer het</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>Doe dit voor alle huidige foto's.</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Dialoog</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>Uitvoer bestandsnaam</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>zonder titel</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>SVG-bestanden (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Alle bestanden (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Afbeeldingen (*.png, *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Voorkeuren</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>Visueel</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Algemeen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Ondoorzichtigheid laag/hoog</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>Interactie met 1 muisknop</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>Maak gebruik van uw eigen Qt-stijl</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation>Laat het aanmaken van knopen/wegen toe in selectiemodus</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>Relaties selecteerbaar als ze verborgen zijn</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Kleuren</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Achtergrond</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>Stijl overschrijven</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>GPX pad</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>Pixels</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Interface</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Muisover</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Relaties</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Focus</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Accentueren</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Lokalisatie</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Gebruik taal</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>Vertaal standaardtags</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation>Opties</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Kaartstijl</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Eigen stijlen map</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Huidige stijl</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Sjabloon</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>Tagsjabloon</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Ingebouwd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Eigen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Gegevens</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation>XAPI</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Documenten</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Document automatisch opslaan na het bewaren op de server</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>Sporen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>GPS-invoer</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>Serieel</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Poort</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Gastheer</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>NMEA-log opslaan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>Stel systeemtijd in op GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Netwerk</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Proxy instellingen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Wachtwoord:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Gebruiker:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Poort:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Computer:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Kaart Adapter</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation>Automatisch "source" tag toevoegen wanneer kenmerken worden aangemaakt met een kaart op de achtergrond</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Gereedschappen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Naam:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Pad:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Toepassen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Toevoegen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Verwijderen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Engels</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Arabisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation>Chinees (Taiwan)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation>Kroatisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Tsjechisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Nederlands</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Duits</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Frans</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>Hongaars</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation>Indonesisch (Indonesië)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Italiaans</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>Japans</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Pools</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Russisch</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation>Portugees (Brazilië)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Spaans</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Zweeds</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Oekraïens</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Merkaartor tag sjabloon (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Kleur selecteren</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>Gereedschap bestaat reeds</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Een gereedschap met deze naam bestaat al. +Selecteer een andere naam of druk op de <Uitvoeren> knop wanneer de bestaande dient te worden gewijzigd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>Kan huidige gereedschap niet verwijderen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>Kan huidige gereedschap "%1" niet verwijderen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>Kan de naam van het huidige gereedschap niet wijzigen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>Kan huidige gereedschap "%1"'s naam niet wijzigen</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>Selecteer uitvoerbaar gereedschap</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation>Selecteer sjabloondocument</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation>Merkaartordocument (*.mdc)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>Folder voor logbestanden selecteren</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation>Instellingen projecties</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>Projecties</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation>Projectielijst:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Naam:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>PROJ4 string</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Toepassen</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Toevoegen</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Verwijderen</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation>Specifieer aub de projectie</translation> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation>Document</translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Dialoog</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation>Voorgedefinieerd</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation>Standaard (EPSG:...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation>WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Eigenschappen</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 object(en) geselecteerd</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 object(en) geselecteerd</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Geselecteerde items</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Eigenschappen - Meerdere elementen</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Eigenschappen - Knooppunt</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Eigenschappen - Relatie</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Eigenschappen</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation>Fout bij het inlezen van sjabloonbestand</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Centreer de kaart</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>Centreer && zoom de kaart</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Selecteer lid</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Cascade opschonen</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>Verplaats knooppunt %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation>GPX exporteren...</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Annuleren</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation>Bezig met importeren...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>Importeer osmChange</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>Importeer NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>Importeer NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation>Geen geldige gegevens.</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Onjuist</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation>Geen tijd</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>Meter</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/u</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>Niet beschikbaar</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>GPS log fout</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Het is niet mogelijk om het volgende GPS-logbestand aan te maken: %1.</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation>Niet mogelijk om met %1 te verbinden: %2</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>GPS log fout</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Het is niet mogelijk om het volgende GPS-logbestand aan te maken: %1.</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Lengtegraad</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Hoogte</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 meter</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation># Satellieten</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Repareer Type</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Onjuist</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Snelheid</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/u</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Breedtegraad</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>Geen geldig resultaten stream!</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation>Gereedschapsbalken aanpassen</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation>Acties</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation>Werkbalken</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>Nieuw</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Verwijderen</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>Wijzig naam</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Toepassen</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Annuleren</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation>Naar boven</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation>Aangepaste werkbalk</translation> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Formulier</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Leden</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation>Verwijder geselecteerde leden</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation>Voeg "source" tag toe</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Formulier</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Sleutel</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation>Voeg "source" tag toe</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation>Verwijder geselecteerde tag(s)</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Geen satellieten</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation>Zoek stad</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation>Afdeling</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation>Naam</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation>Zoek</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation>Resultaten</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation>Geen resultaat</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation>De zoekopdracht gaf geen resultaat.</translation> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Selectie</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Sleutel</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Waarde</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Naam</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Sleutel</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation>Bevraging</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation>Vernieuw laag</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Sluiten</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Stijlen</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Stijlen</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Doorsturen naar Openstreetmap</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation>Reactie</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation>Een goede reactie is beknopt en omschrijft correct de aanpassing.</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation>De volgende wijzigingen zullen worden toegepast:</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation>Toegevoegd</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation>Aangepast</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation>Verwijderd</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation>Wegen</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation>Knooppunten</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation>Relaties</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation>Som</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Annuleren</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>TMS servers instelling</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>TMS Servers</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Serverlijst:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Naam:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Server Url (adres):</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>Verkrijg diensten</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>Diensten :</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projectie</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Mercator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>Lat/Lon (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation>Nulpunt is linksonderaan</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation>Tegelgrootte:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation>Minimum zoomniveau:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation>Max zoomniveau:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation>"source" tag waarde:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>URL-adres van de licentievoorwaarden:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Toepassen</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Toevoegen</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Verwijderen</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation>Merkaartor: GetServices</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>Adres en pad mogen niet blanco zijn.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation>Fout bij het inlezen van de diensten. De server ondersteunt deze feature niet.</translation> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Sleutel</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Waarde</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation>Er bestaat reeds een tag met deze naam.</translation> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>Wijzig dit om toe te voegen...</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Formulier</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation>OF</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>EN</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation>NIET</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation>is</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation>isoneof</translation> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Niet gedefinieerd</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Niet gedefinieerd</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation>Terras</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation>Geen huisnummering</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>Aantal huizen</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>Huisnummers toevoegen (Karlsruhe schema)</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation>Bereiken</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>Bijvoorbeeld "1-9;15-17;19,19A"</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation>Patroon</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Alle nummers</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>Oneven nummers</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>Even getallen</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation>Kies optioneel een node in het gebied en de huisnummers zullen op het einde beginnen.</translation> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Extraheer - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation># weggedeeltes</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Totale afstand</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Totale duur</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1h %2m</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Tekenlaag extraheren</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>Zoomen</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Sluiten</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Breedtegraad</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Lengtegraad</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Sleutel</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Tags</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation>Voeg "source" tag toe</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation>Verwijder geselecteerde tag(s)</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Dialoog</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Website</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Wachtwoord</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Naam gebruiker</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Maak gebruik van proxy</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Poort</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>Zoomen</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Leegmaken</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>WMS-serversinstellingen</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>WMS Servers</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Serverlijst:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Naam:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Server Url (adres):</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Lagen:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation>Titel</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projectie</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>Zoomniveaus</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>Afbeeldingsformaat:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Stijlen:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation>"source" tag waarde:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>URL-adres van de licentievoorwaarden:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Toepassen</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Toevoegen</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Verwijderen</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: GetCapabilities</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>Adres en pad mogen niet blanco zijn.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation>Naamloos</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation>Laad afbeelding...</translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_pl.ts b/translations/merkaartor_pl.ts new file mode 100644 index 0000000..6b933c7 --- /dev/null +++ b/translations/merkaartor_pl.ts @@ -0,0 +1,7386 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="pl" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>Informacje o Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>Ten program jest objęty licencją GNU General Public License v2</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Wersja Merkaartora</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Wersja Qt</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>Wersja GDAL</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Lista zmian</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>OK</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Opis</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Skrót klawiszowy</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Importuj</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Eksportuj</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>&Domyślne</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Anuluj</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Edytor skrótów klawiszowych</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Otwórz schemat skrótów klawiszowych</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Schemat skrótów klawiszowych Merkaartora (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Nie można otworzyć pliku</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 nie mógł zostać otwarty.</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>Zapisz schemat skrótów klawiszowych</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>bez nazwy</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Wszystkie Pliki (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Nie można otworzyć pliku do zapisu</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 nie mógł zostać otwarty do zapisu.</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation>BridgeBuilder</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation>Przepraszam, ale nie wiem, jak zbudować most z TEGO. Proszę, daj mi tylko dwa węzły.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation>Konwertuj segment na most</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation>Wybrany segment jest już oznaczony jako most/tunel. Upewnij się, że wiesz, co robisz.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation>Niewspierana akcja: Most nie wydaje się być jedną drogą.</translation> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Brak opisu</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Okno formy</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Okno formy</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation>Dokładność (metry/segmenty)</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation>Rodzaj</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation>Rondo</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation>Zwykły okrąg</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation>Lewo</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation>Prawo</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation>Strona ruchu</translation> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation><b>Brak</b> zmian</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation><b>Jeden</b> obiekt zmieniono</translation> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Cofnij</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Wyśrodkuj mapę</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>Wyśrodkuj i powiększ mapę</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Cofnij</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation><b>Nie ma</b> zmienionych obiektów.</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Czyszczenie</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>Powiększ</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>DODAJ drogę %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>DODAJ punkt trasy %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>DODAJ relację %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>AKTUALIZUJ punkt trasy %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>AKTUALIZUJ relację %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>AKTUALIZUJ drogę %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>USUŃ punkt trasy %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>USUŃ drogę %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>USUŃ relację %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Błąd podczas wysyłania</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Proszę sprawdzić nazwę użytkownika oraz hasło w ustawieniach</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Wystąpił błąd podczas wysyłania zapytania (%1). +Serwer odpowiedział: %2</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +Komunikat API "%1"</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Wysyłanie zmian...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>OTWÓRZ zestaw zmian</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>ZAMKNIJ zestaw zmian</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Błąd podczas wysyłania</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Proszę sprawdzić nazwę użytkownika oraz hasło w ustawieniach</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Wystąpił błąd podczas wysyłania zapytania (%1). +Serwer odpowiedział: %2</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +Komunikat API "%1"</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation>Wystąpił błąd podczas wysyłania żądania (%1) +„%2” +Proszę ponownie pobrać żeby rozwiązać kolizję.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>Sprawdzanie zmian…</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>OTWÓRZ zestaw zmian</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>ZAMKNIJ zestaw zmian</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation>Nie można zamknąć zestawu zmian.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation>Wystąpił nieznany błąd. Może być już zamknięty lub zamknie się automatycznie. Jeśli chcesz być pewny, sprawdź ręcznie na stronie osm.org.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>DODAJ relację %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>DODAJ drogę %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>DODAJ punkt trasy %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>AKTUALIZUJ relację %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>AKTUALIZUJ drogę %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>AKTUALIZUJ punkt trasy %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>USUŃ punkt trasy %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>USUŃ drogę %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>USUŃ relację %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>bez nazwy</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Warstwa robocza</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Wysłana warstwa</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Obrazy tła</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation>Warstwa rysunku #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation>Warstwa filtrująca #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>Eksport OSM</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>Eksportowanie w formacie OSM…</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>Dokument</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation>Odtwarzanie historii: utwórz węzeł %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation>Odtwarzanie historii: usuń węzeł %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation>Odtwarzanie historii: usuń węzeł %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation>Odtwarzanie historii: utwórz drogę %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation>Odtwarzanie historii: aktualizuj drogę %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation>Odtwarzanie historii: usuń drogę %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation>Odtwarzanie historii: utwórz powiązanie %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation>Odtwarzanie historii: aktualizuj powiązanie %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation>Odtwarzanie historii: usuń powiązanie %1</translation> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Pobierz</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Położenie</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Zakładka</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Aktualny widok</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation>Łącze WWW (mapy OSM/Google)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation>Wybieranie Xapi</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>Użyj poniższej mapy (zapewnianej przez projekt OpenStreetMap)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Pobieranie ścieżek GPS</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>Rozwiązywanie wszystkich relacji</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>Pobranie %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Pobieranie brakujących członków...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>Pobieranie zależności %1 z %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>Przetwarzanie zależności %1 z %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Parsowanie...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Przetwarzanie XML</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Kolizje w %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>Wykrytu puste drogi lub relacje</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Puste drogi lub relacje są prawdopodobnie błędami. +Czy zaznaczyć je do usunięcia?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Usuwa pustą cechę %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Znaleziono kolizje</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>Oznacza to, że niektóre z cech, które zostały edytowane od ostatniego pobrania danych zostały zmodyfikowane na serwerze przez kogoś innego. +Cechy te zostały zduplikowane jako "conflict_..." na warstwie "Konflikty...". +Zanim będzie można wysłać zmiany na serwer, należy ręcznie scalić obie wersje i usunąć je z warstwy "Konflikty...".</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Wysyłanie…</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Przygotowywanie zmian</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>Oczekiwanie na odpowiedź serwera</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Pobieranie...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Pobieranie z OSM (łączenie)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>Niespodziewany kod zwrotny http (%1) +Komunikat serwera brzmi: %2</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +Komunikat API "%1"</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Błąd podczas pobierania</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Nazwa użytkownika lub hasło niepoprawne.</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>Nierozwiązane konflikty</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>Proszę najpierw rozwiązać wszystkie istniejące kolizje</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>Pobieranie punktów trasy %1-%2</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation>MapDust</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Pobieranie punktów</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Pobieranie %1,%2 (powiększenie %3)...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>Powiększ</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Zamknij</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>Nie można usunąć</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation>Nie można wusunąć zaznaczenia, gdyż mieści się ono poza pobranym obszarem.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>Nie możn usunąć wszystkiego</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation>Nie można usunąć całego zaznaczenia, gdyż część mieści się poza pobranym obszarem. +Czy usunąć co się da?</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation>Odwróć drogę %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation>Odwróć %1 dróg</translation> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Eksportowanie</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>Co wyeksportować?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Wszystkie widoczne warstwy</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>Aktualny widok</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Zaznaczone</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Cechy</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Wyśrodkuj mapę</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>Wyśrodkuj i powiększ mapę</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Pobierz brakujących członków</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Dodaj do zaznaczenia</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Usuń</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Relacje</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Wszystkie</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Cechy</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>Tylko cechy znajdujące się w widoku</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation>Filtr z widoku</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Szukaj...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation>Pokaż tylko obiekty przecinające bieżące zaznaczenie.</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation>Filtr z wyboru</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>Przeładować</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Okno dialogowe</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Nazwa</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Filtr</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Zamknij</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>Ustawienia filtrów</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Filtry</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Spis filtrów:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nazwa:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Filtr</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Zastosuj</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Dodaj</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Usuń</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>Przekroczono limit czasu połączenia</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>Nie można wczytać informacji o obrazie z serwera Walking Papers.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Proszę podać adres URL z serwisu Walking Papers</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>Adres URL:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Geolokalizowane obrazy</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Wyśrodkuj mapę</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation>c</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Usuń obrazy</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Skopiuj nazwę pliku do schowka</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Wybierz następny obraz</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>PageDown</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Wybierz poprzedni obraz</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>PageUp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>Zapisz geotagowany obraz…</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>Warstwa obrazów:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Wczytaj geolokalizowane obrazy</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>Warstwa, na której powinny się znajdować obrazy:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation>Warstwa tylko do odczytu</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation>Używana warstwa nie może być zapisana. Czy zmienić ją na zapisywalną? +Jeśli nie, to nie można załadować należących do niej obrazów.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Wczytywanie obrazów...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Przerwij wczytywanie</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>Nie ma takiego pliku</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>Nie można znaleźć obrazu %1.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Błąd podczas otwierania %2: +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Błąd podczas wczytywanie danych EXIF z %1.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>Podaj przesunięcie</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>Ustaw obrazy bliżej:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>końca ścieżki</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>początku ścieżki</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>hh:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>Brak punktów trasy</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>Nie znaleziono żadnego punktu trasy dla obrazu %1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss 'sekund'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm 'minut' i ss 'sekund'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh godzin, mm minut i ss sekund</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>Błędny obraz?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>Obraz %1 został wykonany %2 zanim następny punkt trasy został zapisany. +Czy na pewno go wykorzystać?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>Obraz %1 został wykonany %2 po zapisaniu ostatniego punktu trasy. +Czy na pewno go wykorzystać?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation>Podaj nazwę pliku wyjściowego</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>Obrazy JPEG (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Błąd podczas otwierania "%1": +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>Idź do</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Zakładka</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation>Łącze WWW (mapy OSM/Google)</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation>Współrzędne</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation>Pokazuj projekcje</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>min wys., min szer., max wys., max szer.</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>latCent, lonCent, latZas, lonZas</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Informacje</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>OSM API url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>URL OSM XAPI</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Wyszukaj</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>Błędny adres OSM</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>Podany adres jest nieprawidłowy!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Błędny format współrzędnych</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>Współrzędne muszą być w formacie: <lewa wys.>, <dolna szer.>, <prawa wys.>, <górna szer.></translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>Współrzędne muszą być w formacie: <środkowa szerokość>, <środkowa wysokość>, <zasięg szerokości>, <zasięg wysokości></translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Brak</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>Adapter kształtu</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>Powiększ</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation>Ustaw rzut widoku dla warstwy</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation>Przywróć dopasowanie ułożenia</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Zamknij</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>Adapter WMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>Adapter TMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>Wtyki</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Brak mapy</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Mapa - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Mapa - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>Mapa - WMS-Kafelki - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Mapa - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Mapa - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>Warunki licencji</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>Nie zaakceptowano warunków licencyjnych</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation>Nie potwierdziłeś przyjęcia warunków licencji. +Nie będziesz więc mógł używać tego źródła jako warstwy mapy. +Czy jesteś pewny że tego chcesz?</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Serwer</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Rozmiar kafla</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>Min/Maks powiększenia</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Rzut</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Okno dialogowe</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>Wejście</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>Podgląd OSM</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Specyfikacja</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>Pierwszy wiersz zawiera nagłówek</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Separator</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Średnik (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Tabulator</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Inne:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation>Cudzysłów ciągu</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Brak</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation>Prosty cytat (')</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation>Cudzysłów (")</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>Odwzorowanie (w formacie PROJ4; pozostawić puste dla szerokości/wysokości)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Pola</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>Spis pól:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>Nazwa pola (= nazwa etykiety):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>Rodzaj pola:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Importuj</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>Importuj zakres</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>Od (0 od początku):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>Do (0 = koniec)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>Wczytaj ustawienia…</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Zapisz ustawienia…</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Ciąg znaków</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Liczba całkowita</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>Liczba zmiennoprzecinkowa</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Wysokość geograficzna</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Szerokość geograficzna</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Nieprawidłowe odwzorowanie</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>Nie można ustawić odwzorowania</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Brak współrzędnych</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>Brakuje pól szerokość lub długość geograficzna. Importowanie nie będzie możliwe. +Zakończyć?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>Wczytaj ustawienia importu plików CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Ustawienia importu programu Merkaartor (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Niepoprawny plik</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 nie mógł zostać otwarty.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1 nie jest plikiem ustawień importu CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation>Zapisz ustawienia importu plików CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>bez nazwy</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Wszystkie Pliki (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation>Nie można otworzyć ustawień zapisu importowania</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 nie mógł zostać otwarty do zapisu.</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation>Nie można ustawić rzutu; proszę podać jakiś</translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Informacje</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Rozmiar</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation>%n obiektów</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Cechy</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Pokaż wszystkie</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Ukryj wszystkie</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Tylko do odczytu - wszystko</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Tylko do odczytu - nic</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Zamknij</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Warstwy</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Wszystkie</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>Mapa</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>Rysuj</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>Ścieżki</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation>Przywróć domyślne warstwy</translation> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Okno formy</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Widoczna</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Tylko do odczytu</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>Niska</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>Wysoka</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>Nieprzeźroczysta</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Nieprzeźroczystość</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation>Zamykanie warsty: zmienione objekt są w niej</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation>Ruszano cechy na tej wraste. +Czy napewno ją zamknąć? (Nie ma możliwości cofnięcia)</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation>Zamykanie warsty: nie jest pusta</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation>Czy jesteś pewsien że chcesz zamknąć tą warstwę? (Tej operacji nie można cofnąć)</translation> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>Warunki dostępności</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation>Etykieta tekstowa</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>Przeczytałem, i zgadzam się z warunkami licencji</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Nie pytaj o to więcej</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation>%1 v%2 +Ładowanie wtyczek...</translation> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation>%1 v%2 +Inicjowanie...</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>P&omoc</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Utwórz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Edycja</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>&Widok</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Zakładki</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Plik</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Eksportuj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>&Narzędzia</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>&Styl</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation>Szablony ta&gów</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Węzły</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>&Okna</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Panele</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>&Cecha</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>&Warstwy</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>Rel&acje</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>&Pokaż</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>Główny pasek narzędzi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>&Zamknij</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>Informacje &o</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>&Otwórz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Utwórz nowy dokument i zaczerpnij plik</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>Pokaż &wszystko</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>Powiększ &okno</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>Powiększa okno</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>&Zmniejsz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>&Powiększ</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Powiększ</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Zakrzywiony łącznik</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Cofnij</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>&Przywróć</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>&Przesuń</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation>Importuj przy użyciu &GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Importuj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Importuje plik do obecnego dokumentu</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Pobierz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Pobierz dane dla nowego obszary</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Łącznik</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Utwórz łącznik</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Zaznacz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>&Wyślij</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Wyślij zmiany na serwer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>&Usuń</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Usuń wybrane cechy</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Utwórz nowy węzeł</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>Odw&róć</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation>R&ondo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Tworzenie ronda</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Nowy</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>&Podziel</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>P&ołącz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>Ro&zdziel</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Rozłącz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>Re&lacja</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Tworzenie relacji</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>&Obszar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Utwórz nowy obszar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Eksportuje wszystkie widoczne warstwy do pliku</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Znajdź</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Wyszukaj i zaznacz elementy</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>Eksportuje aktualny widok do pliku</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>&Scal</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Scala węzły</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>Scala zaznaczone węzły (pozostanie ten zaznaczony jako pierwszy)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Zapisz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Pobierz więcej</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Pobierz więcej danych dla obecnego obszaru</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Właściwości</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>&Informacje</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>Wyrówn&aj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Wyrównaj węzły</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>Wyrównuje zaznaczone węzły. Pierwsze dwa wskazują linię wyrównania.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation>&Rozciągnij</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation>Rozstaw węzły</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation>Wyrówać i rozstawić wybrane węzły równomiernie</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>&Kopiuj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>Skopiuje zaznaczoną cechę i znaczniki do schowka</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>Kopiuje tagi wybranej cechy do schowka; jeśli cecha jest punktem trasy kopiuje również jej współrzędne.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Wklej etykiety (&nadpisanie)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>Wkleja (nadpisując) etykiety w schowku do wybranego elementu.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>Wklej etykiety (&scal)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Wkelj etykiety</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>Wkleja etykiety ze schowka (scala z obecnymi etykietami)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>Scal etykiety w schowku z etykietami aktualnie wybranej cechy.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Wklej</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Wkleja cechy ze schowka</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>wkleje cechy ze schowka. Jeśli cechy o takich samych identyfikatorach znajdują się już w dokumencie zostaną nadpisane.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Wyślij cechę na warstwę roboczą</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>Warstwa z &obrazami</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>&Raster/SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>&Uruchom</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>Uruchom GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>Powtórz GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>Za&trzymaj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>Zatrzymaj GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>&Wyśrodkuj na GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>Pokazuj detale</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Nagraj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>Nagrywanie sygnału z GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Wstrzymaj</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>Wstrzymaj GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>G&eobraz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>Dod&aj członka</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>&Usuń członka</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>&Nigdy</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>Z&awsze</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>O&dłącz</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>&Style</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation>Importuj plik do bieżącego dokumentu przy użyciu GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Aparat cyfrowy</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Obróć</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation>&Wielobok</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Cechy</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>&Rozdzielić</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation>Podziel segment równomiernie</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>&Zablokuj powiększenie do wielkości kafelków</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>ZmianaOSM (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Zamknij</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>Up&rość</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation>Upraszcza drogę</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation>Upraszcze drogi poprzez usunięcie zbędnych węzłów</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>Ż&aden</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation>Podziel obszar międzt dwoma węzłami</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>&Drabina</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation>Podziel zakres na mieszkania</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation>Podziel wybrany obszar na drabinkę mieszkań.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation>Wyrówanie &osi</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation>Wyrównaj kąty do regularnych osi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Właściwości...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation>Podświetlaj rzecz&y ruszane</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation>&Wytnij</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation>Wyczerpnij</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation>Wyciągnij interakcje dróg (styl JOSM)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation>Przełącz wybranie</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation>Włącz pochodne do wyboru</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>Skala</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation>GDAL SQLite/SpatiLite</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation>Siatka</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation>Wybierz nadrzędne</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Pobierz brakujących członków</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation>&Most</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation><html><head/><body><p>Przekształć drogę w most</p></body></html></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>Wyczyść znacznik %1 na %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>Wyczyść %1 etykiet na %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation>Ustaw tag "źródło" dla %1</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Usuń członka %1 z %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation>Zmień kolejność członków relacji %1</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>Zmodyfikuj relację %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Utwórz obszar %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Obszar: Stwórz drogę %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Dodaj dziurę.</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Utworzyć nową dziurę w tym obszarze?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Obszar: Zakończ drogę %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Obszar: Dodaj węzeł %1 do drogi %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>Zamknij obszar %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>Kliknij, aby rozpocząć; przeciągnij, aby przeskalować; przeciągnij z wciśniętym klawiszem SHIFT, aby obrócić; kliknij, aby zakończyć</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Utwórz rondo %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation>Zamknąć drogę %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>LEWY-KLIK, aby wybrać; PRAWY-KLIK, aby przesunąć; CTRL-LEWY-KLIK, aby przełączyć wybór; SHIFT-LEWY-KLIK, aby dodać do zaznaczenia; LEWY-KLIK-PRZECIĄGANIE, aby zaznaczyć obszar; CTRL-PRAWY-KLIK-PRZECIĄGANIE, aby przybliżać; DWUKLIK, aby utworzyć węzeł, DWUKLIK na węźle, aby zacząć drogę;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>KLIK, aby wybrać/przesunąć; CTRL-KLIK, aby przełączyć wybór; SHIFT-KLIK, aby dodać do zaznaczenia; SHIFT-PRZECIĄGANIE, aby zaznaczyć obszar; CTRL-PRZECIĄGANIE, aby przybliżać; DWUKLIK, aby utworzyć węzeł; DWUKLIK na węźle, aby zacząć drogę;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Usuń cechę %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>Usuń cechy</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Usuń potomków.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation>Czy usunąć również pochodne węzły? +Węzły OSM poza pobranym obszarem zostaną zachowane.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation>Odwróć %1 dróg</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>Kliknij aby zaznaczyć; przeciągnij, aby przesunąć</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>Znaleziono węzły o tych samych współrzędnych.</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>Czy na pewno scalić wszystkie węzły w miejscu docelowym?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Scal węzły w %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation>ZAWIS zaznacza;LEWY-CIĄGNIE obraca</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation>Obróć cechę</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation>NAJEDŹ, aby zaznaczyć; PRZECIĄGNIJ, aby skalować</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation>Skaluj obiekt</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>Kliknij, aby wyznaczyć pierwszy róg -> Przeciągnij, aby zaznaczyć obszar -> Kliknij, aby powiększyć</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>Format GPX (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>Format OpenStreetMap (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation>Plik zmian OpenStreetMap (*.osc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Format Noni GPSPlot (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>Log NMEA (*nmea *nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>Plik KML (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>Wartości oddzielone przecinkami (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Geolokalizowane obrazy (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>Plik kszałtów ESRI (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation>Język zaznaczania geograficznego (*.gml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation>Postać zero-jedynkowa Protobuf (*.pbf) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Obsługiwane formaty</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Dokument Merkaartora (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Wszystkie Pliki (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>kafel %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>Niska</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>Wysoka</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>Nieprzeźroczysta</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Cecha</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Węzeł</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Relacja</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Wczytaj obraz</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>Dodaj pozycję węzła do obrazu</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation>Oznacz obraz bieżącą pozycją</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Anuluj</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>Plik</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Edycja</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>Widok</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>Pokaż</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>Strzałki kierunkowe</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Warstwy</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Utwórz</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Droga</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Narzędzia</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>Okna</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Pomoc</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation>Ustawienie Wycinania</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Zawartośc schowka jest niepoprawna</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>Schowek nie zawiera poprawnych danych</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation>Ostrzeżenie importu GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation>Chcesz zaimportować plik(i) przy użyciu GDAL. Ta funkcja jest raczej eksperymentalna i może działać lub NIE, powodując awarie. Upewnij się, że nie stracisz żadnych danych w przypadku błędu. +Zgłaszaj błędy w przypadku awarii, ale nie bądź nimi zaskoczony. + +Kontynuować import? +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation>Importuj plik</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Niezapisane zmiany</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>Aktualna mapa zawiera niezapisane zmiany, które zostaną utracone podczas tworzenia nowej. +Anulować tworzenie nowej mapy czy porzucić poprzednie zmiany?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation>Niezapisany zmiany w stylu</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation>Dokonano zmian w bierzącym stylu. +Czy zachować zmiany?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Punkty pośrednie</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>Ścieżka %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Ważne ostrzeżenie o prawach autorskich</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Podjęto próbę importu pliku KML. Należy być świadomym tego, że: + +- nie wolno importować do OpenStreetMap plików KML utworzonych w Google Earth. Mogłoby się wydawać, iż węzły utworzone w Google Earth są wyłącznym tworem użytkownika, jednakże w rzeczywistością stanowią tzw. utwór zależny od Google Earth i jako taki nie można ich wykorzystać w OSM. + +- jeśli pobrano plik z Internetu, istnieje możliwość, że są objęte prawem autorskim. Proszę się w pełni upewnić, że użycie tych danych w projekcie OpenStreetMap jest dozwolone przez autora albo dane te w domenie publicznej. + +W razie wszelkich wątpliwości, proszę skontaktować się z listą dyskusyjną "legal" lub "talk". + +Na pewno można legalnie zaimportować ten plik do OSM?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>Brak poprawnego pliku</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 nie mógł zostać otwarty.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation>Przychodzące zapytanie zdalnego sterowania</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation>Oczekiwano załadowania obiektu '%1', ale nie wiadomo, jak to zrobić. Przepraszam.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation>Zdalne dodawanie POI %1 %2</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation>Przychodzące zapytanie zdalnego sterowania</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation>Nieznany url działania: %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>Wykryto nieaktualną wersję Qt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>Używasz Qt w wersji %1, która zawiera różne znane błędy powodujące zwrot kodów 401 podczas wysyłania danych na serwery OpenStreetMap. Czy chcesz kontynować (nie zalecane)? +Więcej informacji znajdziesz na stronie http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>Wysyłanie do OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Nie podano nazwy użytkownika i hasła do OpenStreetMap. +Czy chcesz to zrobić teraz?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Błąd podczas pobierania</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>Nie można pobrać mapy</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation>Błąd pobierania MapDust</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation>Nie można borać błędów z MapDust</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Utwórz wielokąt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>Podaj ilość boków</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Wymusza wysłanie cechy</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation>Otwórz plik</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Tworzy skrzyżowanie</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Rozbudowane skrzyżowanie.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>Te drogi mają wiele przecięć. +Utworzyć skrzyżowanie dla każdego przecięcia? (Niechciane skrzyżowania można zawsze później usunąć ręcznie).</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Dodaje adresy</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation>Ilość segmentów na które podzielić</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation>Podaj islość odcinków</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation>Wyrównywanie osi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation>Podaj liczbę osi do których mają zostać wyrównane kąty (wsz. 4 dla prostokątu)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>trójkątny</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>prostokątny</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>pentagonalny</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>heksagonalny</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation>heptagonalny</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>oktagonalny</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation>Wyrównać do %1 osi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation>Wyrównaj do %1 regularnych osi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation>Niemożna wyrównać osi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation>Wyrównywanie do osi nie powiodło się. Proszę usunąć ostre kąty i spróbować ponownie.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation>Wyrównywanie do osi nie powiodło się i nie znalazło rozwiązania.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation>Zacznij wyciągać</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Wyrównaj węzły</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation>Rozstaw węzły</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>Odłącz węzeł %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Dodaj członka do relacji</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Usuń członka z relacji</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation>Dodaj do wieloboku</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation>Połącz obszary</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>Podziel obszar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation>Podziel zakrez na %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Utwórz relację %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Zapisz styl mapy</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Styl map Merkaartor (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Otwórz styl mapy</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation>Styl mapty Merkaartoa (*.mas) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation>Arkusz stylu MapCSS (*.css)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation>Przebuduj historię</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation>Zostanie podjęta próba odtworzenia historii. +Nie ma gwarancji, i nie da się tego cofnąć. +Czy jesteś pewny że tego chcesz? </translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>bez nazwy</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Zapisz dokument Merkaartora</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Pliki dokumenty Merkaartora (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation>Zapisz szablon Merkaartora</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>Nie można otworzyć pliku do zapisu</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 nie mógł zostać otwarty do zapisu.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation>Nie można otworzyć zapisać szablonu</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Niepoprawny plik</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 nie jest poprawnym dokumentem Merkaartora.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>Eksportuj w formacie OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>Pliki OpenStreetMap (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>Eksportuj w formacie osmChange</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>pliki zmian (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Eksportuj GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>Pliki GPX (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Exportuj KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>Plik KML (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation>Wyodrębnianie obiektu</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation>Wyodrębnianie obiektów...</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation>Ukryj etykiety przycisków narzędzi</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (wb.)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Dodaj zakładkę</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Podaj nazwę zakładki.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Niepoprawna nazwa zakładki</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>Nazwa zakładki nie może być pusta.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Uwaga! Zakładka o tej samej nazwie już istnieje.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Wprowadź nową nazwę, zostaw obecną by nadpisać zakładkę lub anuluj.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Usuń zakładkę</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Wybierz zakładkę do usunięcia.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Nieprawidłowe odwzorowanie</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>Nie można ustawić odzworowania "%1".</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>Błąd GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>Nie można otworzyć portu GPS.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>Otwórz log NMEA</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>Zapisz szablon etykiet</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Szablony etykiet Merkaartora (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>Otwórz szablon etykiet</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation>Ostrzeżenie! Nie można załadować tłumaczenia Merkaartora dla języka "%1". Przełączanie na angielski.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>Nierozwiązane konflikty</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>Proszę najpierw rozwiązać wszystkie istniejące kolizje</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Zaleca się zapisanie zmian w dokumencie po ich wysłaniu. +Czy zrobić to teraz?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>edytowane: </i><b>%1</b> przez <b>%2</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>edytowane: </i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>warstwa: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation>Przeglądaj</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Punkt trasy</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>współrzędne</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>opis</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>komentarz</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Węzeł</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>wzniesienie</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>prędkość</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>rozmiar</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>członkowie</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>Górny lewy róg</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>Dolny prawy róg</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Relacja</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Funckja</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Członek</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation>Zamknięta droga</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Długość</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Rozmiar</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>%1 wezłów</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Obszar</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Droga</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation>%1 m/plamkę</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation>Wyrównaj: %1m @ %2</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation>%1ms</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>Widok</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation>Ramka</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Rzut</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Nowa zakładka</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>Wysyłanie ustawień zakończone niepowodzeniem</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Duplikat klucza</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Więcej niż 150 ustawień</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation>Komunikacja z ustawieniami zakończona niepowodzeniem</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation>Błąd komunikacji</translation> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Nowy serwer</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Okno formy</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>Etykiety</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>Zaznaczone elementy</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation>Rodzaj</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Nazwa</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Nieznane pole</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Błąd!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>Serwis wyszukiwania nazw wymaga logowania.</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Okno formy</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>Plik wynikowy</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>bez nazwy</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation>Pliki PDF (*.pdf)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Wszystkie Pliki (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Pliki graficzne (*.png, *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>Pliki SVG (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation>Eskport w formacie SVG/rastrowym</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation>Ustawienia</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>min szer./wys.</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>max szer./wys.</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation>Pokazuj węzły</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation>Pokazuj relacje</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>Wyświetlanie skali</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation>Pokazuj siatkę pozycyjną</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation>Pokazuj niestylizowane cechy</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation>Rozdzielczość wydruku</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation>300</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation>600</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation>1200</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation>dpi</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>Eksportuj do PDF...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>Eksportuj do SVG...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation>Eksportuj do Raster...</translation> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Okno formy</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>Adres URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Użytkownik:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation>Pwd</translation> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Edytor stylu mapy</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Główne</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Tło</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation>Węzły</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Proporcjonalna grubość</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>Stała grubość</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>Filtr</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Dodaj</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Usuń</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Powiel</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>Wybrana etykieta</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>metrów/piksel</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>Widoczne do</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>Widoczne od skali</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Rysuj na kolorowo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Kreskowanie</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>wyłączone</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Wypełnienie</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation>Wypełnij ikonką Touchup</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Granica</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation>Wnętrze</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation>Zewnętrzne</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>Szczegóły</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Rysuj schodki</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Rysowanie ikony</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation>Rysuj oznaczenia kierunku ruchu</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Etykieta</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Czcionka</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Treść etykiety</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Halo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Obszar</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Rysowanie z tłem</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Etykieta z tłem</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Zawsze</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Wybór koloru</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>Brak poprawnego geotagu</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>Etykieta tekstowa</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation>Ta fotografia nie zawiera danych kartograficznych EXIF. +Co robić?</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation>Spróbuj dopasować do węzła trasy</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>Wczytaj bez przypisanego węzła</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>Pobierz informacje z kodu kreskowego (Walking Papers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>Ignoruj</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>Wykonaj dla wszystkich bierzących zdjęć.</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Okno dialogowe</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>Plik wynikowy</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>bez nazwy</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>Pliki SVG (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Wszystkie Pliki (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Pliki graficzne (*.png, *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Konfiguracja</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>Wygląd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Ogólne</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Nieprzeźroczystość (niska/wysoka)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>Obsługa pojedynczym klawiszem myszy</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>Użyj wbudowanego stylu Qt</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation>Zezwól na tworzenie węzłów/dróg w trybie wyboru</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>Zaznaczanie ukrytych relacji</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Kolory</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Tło</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>Nadpisanie stylu</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>Ścieżka GPX</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>pikseli</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Interfejs</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Podświetlenie</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Relacje</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Zaznaczenie</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Podświetlenie</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation>Brudny</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Język</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Język</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>Tłumaczenie standardowych etykiet</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation>Renderowanie</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation>Opcje</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation><html><head/><body><p>Jeżeli renderowanie szkieletu jest włączone (Widok-Szkielet) będzie używać aktualnego stylu kolorów i wypełnienia. Tylko ustalone grubości będą użyte dla szerokości. </p></body></html></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation>Użyj aktualnego stylu do renderowania szkieletu</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation>Edytowanie</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation>Szybkie edytowanie</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation>Edytowanie w widoku szkieletu</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation>Edytowanie w widoku renderowanym</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Styl mapy</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Katalog z własnymi stylami</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Aktualny styl</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Szablon</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>Szablon etykiet</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Wbudowany</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Użytkownika</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Dane</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation>XAPI</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>Adres URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Dokumenty</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation>Automatycznie ładuj szablon</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Automatyczne zapisywanie dokumentów po wysłaniu</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>Ścieżki</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation>GDAL</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation>Potwierdź rzut</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>Wejście GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>Port szeregowy</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Komputer</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>Zapisywanie logu NMEA</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>Ustawianie czasu systemowego według GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Sieć</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Ustawienia serwera proxy</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Hasło:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Nazwa użytkownika:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Port:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Adres:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Adapter map</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation>Automatycznie dodawaj tag "source" przy tworzeniu obiektów na mapie podkładowej</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Narzędzia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Nazwa:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Ścieżka:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Zastosuj</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Dodaj</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Usuń</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Angielski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Arabski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation>Chiński (Tajwan)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation>Horwacki</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Czeski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Holenderski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Niemiecki</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Francuski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>Węgierski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation>Indonezyjski (Indonezja)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Włoski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>Japoński</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Polski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Rosyjski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation>Portugalski (Brazylia)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Hiszpański</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Szwedzki</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>ukraiński</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation>[mniej niż 50% ukończenia] Chiński (Chiny)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation>[mniej niż 50% ukończenia] Estoński</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation>[mniej niż 50% ukończenia] Niemiecki (Austria)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation>[mniej niż 50% ukończenia] Portugalski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation>[mniej niż 50% ukończenia] Słowacki</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation>[mniej niż 50% ukończenia] Wietnamski</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Szablon etykiet Merkaartor (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Wybór koloru</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>Narzędzie już istnieje</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Narzędzie o tej nazwie już istnieje. +Proszę wybrać inną nazwę lub kliknąć przycisk <Zastosuj> aby zmodyfikować już istniejące.</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>Nie można usunąć tego narzędzia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>Nie można usunąc narzędzia "%1"</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>Nie można zmodyfikować nazwy narzędzia</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>Nie można zmodyfikować nazwy narzędzia "%1"</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>Wybór pliku wykonywalnego</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation>Wybierz szablon</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation>Dokument Merkaartora (*.mdc)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>Wybór katalogu logów</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation>Ustawienia rzutów</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>Rzuty</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation>Lista rzutów:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nazwa:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>Parametry PROJ4</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Zastosuj</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Dodaj</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Usuń</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation>Proszę podać rzut</translation> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation>Dokument</translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Okno dialogowe</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation>Zadane</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation>Standard (EPSG:...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation>Dopasowane PROJ4(+proj=...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation>WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation>Błąd w ciągu WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation>Nie można wyeksportować w postaci PROJ4</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation>Blędny ciąg WKT</translation> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Właściwości</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 zaznaczonych element/ów</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 zaznaczonych element/ów</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Zaznaczone elementy</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Właściwości - wiele elementów</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Właściwości - węzeł</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Właściwości - Relacja</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Właściwości</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation>Błąd w trakcie wczytywania szablonu</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Wyśrodkuj mapę</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>Wyśrodkuj i powiększ mapę</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Wybierz członka</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Kaskodawe wyczyszczenie</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>Przesuń węzeł %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation>Eksportuj GPX...</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Anuluj</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation>Czerpanie...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation>Zaczerpnięto: %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>Importuj plik osmChange</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>Importuj NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>Importuj NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation>Wykrywanie dróg Bing</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation>Nie ma dostępu do wyjścia.</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation>Brak poprawnych danych.</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation>Nie można rozpoznać wyników.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation>Użyć pustego komentarza do zestawu zmian?</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation>Komentarz do zestawu zmian jest pusty. Ze względu na grzeczność dla Twoich kolegów-maperów zalecane jest dodanie komentarza, żeby wszyscy wiedzieli, co i dlaczego zmieniłeś. +Czy nadal chcesz zostawić pusty komentarz?</translation> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Niepoprawny</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation>Nieulstalony</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation>Brak czasu</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>metrów</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>Niedostępne</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation>Ustalony</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>Błąd logowania GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Nie można utworzyć logu GPS: %1.</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation>Nie można połączyć z %1:%2</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>Błąd logowania GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Nie można utworzyć logu GPS: %1.</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>Etykieta tekstowa</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99° 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Wysokość geograficzna</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Wysokość n.p.m.</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 metrów</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation># satelit</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Rodzaj ustalenia</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Niepoprawny</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Prędkość</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Szerokość geograficzna</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>Niepoprawny strumień!</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation>Dostosowanie paska narzędzi</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation>Operacje</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation>Paski narzędzi</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>Nowy</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Usuń</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>Zmień nazwę</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation>Przywróć wszystko</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Zastosuj</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Anuluj</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation>Góra</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation>W dół</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation>Bierzące działania paska narzędzi</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation>< S E P A R A T O R ></translation> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation>Dostosowany pasek narzędzi</translation> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Okno formy</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Członkowie</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation>Usuń wybranych członków/a</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>Etykiety</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation>Dodać etykiety "source"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation>Usuń wybrane etykiety/a</translation> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Okno formy</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>Etykiety</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation>Dodać etykiety "source"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation>Usuń wybrane etykiety/a</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Brak satelit</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Zaznaczenie</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Klucz</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Wartość</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Nazwa</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation>Zapytanie</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation>Maksymalna ilość wyników (0 - nieograniczona)</translation> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation>Odświerz warstwę</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Zamknij</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Style</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Style</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Wyślij do Openstreetmap</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation>Komentarz</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation>Dobry komentarz powinien opisywać edycję krótko i zwięźle.</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation>Zostaną wprowadzone następujące zmiany:</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation>Dodane</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation>Zaktualizowane</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation>Usunięte</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation>Drogi</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation>Węzły</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation>Relacje</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation>Suma</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Anuluj</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>Ustawienia serwerów TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>Serwery TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Serwery:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nazwa:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Adres serwera:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>Pobierz usługi</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>Usługi :</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation>To jest standardowy serwer TMS.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Rzut:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Merkator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>Szerokość/Wysokość (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation>Początek w lewym dolnym rogu</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation>Rozmiar kafla:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation>Minimalne powiększenie:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation>Maksymalne powiększenie:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation>zawartość etykiety "source":</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>URL licencji:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Zastosuj</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Dodaj</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Usuń</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation>Merkaartor: PobierzUsługi</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>Adres i ścieżka nie mogą być puste.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation>Błąd odczytu usług. Serwer prawdopodobnie nie obsługuje tej funkcji. +</translation> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Klucz</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Wartość</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation>Edytor tagów</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation>Tag o tej nazwie już istnieje.</translation> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>Kliknij aby dodać...</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Okno formy</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation>OR</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>DODAJ</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation>NOT</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation>jest</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation>isoneof</translation> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Niezdefiniowany</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Niezdefiniowany</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation>Drabinka</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation>Brak numeracji domów</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>Liczba domów</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>Dodać numerację domów (schemat Karlsruhe)</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation>Zakresy</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>Przykładowo "1-9;15-17;19,19A"</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation>Wzorek</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Wszystkich członków</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>Liczby nieprarzyste</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>Liczby parzyste</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation>Dodatkowo możesz zaznaczyć węzeł w obszarze, jako początek dla numeracji domów.</translation> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Wyodrębnij - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation>Ilość segmentów trasy</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Całkowita odległość</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Całkowity czas trwania</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1h %2m</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Wyodrębnij rysowaną warstwę</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>Powiększ</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Zamknij</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>Punkt trasy</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Szerokość geograficzna</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Wysokość geograficzna</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Etykiety</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation>Dodać etykiety "source"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation>Usuń wybrane etykiety/a</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Okno dialogowe</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Adres</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Hasło</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Nazwa użytkownika</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Użyj proxy</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>Powiększ</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Wyczyść</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>Ustawienia serwerów WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>Serwery WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Serwery:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nazwa:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Adres serwera:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Warstwy:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation>Tytuł</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Rzut:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation>Kafelkuj</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>Stopnie powiększenia</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>Format obrazka:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Style:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation>zawartość etykiety "source":</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>URL licencji:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Zastosuj</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Dodaj</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Usuń</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: Pobierz właściwości</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>Adres i ścieżka nie mogą być puste.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation>Warstwa bez nazwy</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation>Bez nazwy</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation>To jest serwer buforujący WMS.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation>Nie można połączyć się z serwerem WMS: %1</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation>Nie można uzyskać możliwości: %1</translation> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_pt_BR.ts b/translations/merkaartor_pt_BR.ts new file mode 100644 index 0000000..7fedf36 --- /dev/null +++ b/translations/merkaartor_pt_BR.ts @@ -0,0 +1,7379 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="pt_BR" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>Sobre o Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>Este programa está licenciado nos termos da GNU General Public License v2</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Versão Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Versão Qt</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>Versão GDAL</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Registro de mudanças</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>OK</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Descrição</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Atalho</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Importar</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Exportar</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>Pa&drão</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Cancelar</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Editor de Atalhos</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Carregar esquema de atalho</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Esquema de atalhos Merkaator (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Não foi possível abrir arquivo</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 não pode ser aberto.</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>Salvar esquema de atalhos</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>Sem título</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Todos os arquivos (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Não foi possível abrir arquivo salvo</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 não pode ser aberto para escrita.</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation>ConstrutorDePontes</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation>Desculpe, eu não sei como construir uma ponte DISTO. Por favor, dê apenas dois nós.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation>Converter segmento para ponte</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation>O segmento selecionado já está marcado como uma ponte/túnel. Por favor, certifique-se de que você sabe o que está fazendo.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation>Ação inválida: parece que a ponte não é uma linha única. </translation> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Sem descrição</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Forma</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Forma</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation>Precisão (metros/segmento)</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation>Tipo</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation>Rotatória</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation>Círculo simples</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation>Esquerda</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation>Direita</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation>Sentido de circulação</translation> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation>Não há <b>nenhum</b> objeto alterado</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation>Há <b>um</b> objeto alterado</translation> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Desfazer</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Centro do mapa</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>Centro && Zoom do mapa</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Desfazer</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Limpar</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>Adicionar estrada %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>Adicionar ponto de pista %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>Adicionar relação %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>Atualizar ponto de pista %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>Atualizar relação %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>Atualizar estrada %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>Romover ponto de pista %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>Remover estrada %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>Remover relação %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Erro ao carregar solicitação</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Por favor, verifique seu nome de usuário e senha no menu Preferências</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Houve um erro ao carregar esta solicitação (%1) +A mensagem do servidor foi '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +A mensagem da API foi '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Carregando mudanças....</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>Abrir mudança definida</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>Fechar mudança definida</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Erro ao carregar solicitação</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Por favor, verifique seu nome de usuário e senha no menu Preferências</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Houve um erro ao carregar esta solicitação (%1) +A mensagem do servidor foi '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +A mensagem da API foi '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation>Houve um erro ao enviar esta requisição (%1) +"%2" +Baixe novamente o atributo problemático para resolver o conflito.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>Verificando mudanças...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>Abrir mudança definida</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>Fechar mudança definida</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>Adicionar relação %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>Adicionar estrada %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>Adicionar ponto de pista %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>Atualizar relação %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>Atualizar estrada %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>Atualizar ponto de pista %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>Romover ponto de pista %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>Remover estrada %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>Remover relação %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>Sem título</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Camada Suja</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Camada enviada</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Imagens de fundo</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation>Camada de desenho #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation>Filtrar camada #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>Exportação OSM</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>Exportando OSM...</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>Documento</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Download</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Local</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Marcador</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Visão atual</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation>Vínculo WWW (OSM/Google maps)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation>Seletor da Xapi</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>A partir do mapa abaixo (mapas fornecidos pelo projeto OpenStreetMap)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Também baixar pistas GPS</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>Resolver todas as relações</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 baixados</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Baixando não resolvido...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>Baixando não resolvido %1 de %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>Analisando não resolvido %1 de %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Analizando...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Analizando XML</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Conflitos de %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>Estradas/relações vazias detectadas</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Estradas/relações vazias são provavelmente erros. +Você deseja marcá-las para exclusão?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Remover característica vazia %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Os conflitos têm sido detectados</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>Isso significa que alguns dos recursos que você modificou desde o seu último download já foram modificado por alguém no servidor. +Os recursos têm sido duplicados como "conflito..." sobre a camada "Conflitos..". +Antes de carregar as alterações, você terá que manualmente mesclar as duas versões e remover uma da camada "Conflitos...".</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Enviando...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Preparando mudanças</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>Esperando resposta do servidor</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Baixando...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Baixando de OSM (conectando)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>Código de status de http inesperado (%1) +A mensagem do servidor foi '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +A mensagem da API foi '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Falha ao baixar</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Usuário/senha inválidos</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>Conflitos não resolvidos</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>Por favor, resolva primeiro os conflitos existentes</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>Baixando pontos de pista %1-%2</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Baixando pontos</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Baixando %1,%2 (zoom %3)...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Fechar</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>Impossível excluir</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation>Impossível excluir seleção porque está fora da área carregada.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>Impossível excluir tudo</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation>Nem toda a seleção pode ser excluída porque parte dela está fora da área carregada. +Excluir apenas o possível?</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation>Reverter caminho %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation>Reverter %1 caminhos</translation> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Exportar</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>O que você deseja exportar?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Todos visíveis (não ocultos)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>Janela de exibição</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Selecionado</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Recursos</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Centro do mapa</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>Centro && Zoom do mapa</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Download de crianças desaparecidas</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Adicionar para seleção</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Excluir</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Relações</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Todos</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Recursos</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>Apenas características totalmente dentro da janela de exibição</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Procurar...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>Restaurar</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Diálogo</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Nome</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Filtro</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Fechar</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>Configuração de Filtros</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Filtros</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Lista de Filtros</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nome:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Filtro</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Aplicar</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Adicionar</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Remover</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>Tempo limite de rede esgotado</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>Não foi possível ler os detalhes da foto no servidor do Walking Papers.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Por favor, especifique uma URL do Walking Papers válida</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>Endereço:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Geo imagens</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Centro do mapa</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation>c</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Remover imagens</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Copiar nome de arquivo para área de transferência</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Selecionar próxima imagem</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>PageDown</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Selecionar imagem anterior</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>PageUp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>Salvar imagem com geotags...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>Camada de fotos</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Carregar imagens georeferenciadas</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>Selecionar a camada a que pertencem as imagens seguintes:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation>Camada é somente-leitura</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation>A camada utilizada não é gravável. Deseja torná-la gravável? +Caso contrário, você não poderá carregar imagens pertencentes a ela.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Carregando imagens ...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Cancelar carregamento</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>Arquivo não existe</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>Não foi possível localizar imagem "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Erro ao abrir "%2": +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Erro ao carregar dados EXIF a partir de "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>Especificar distância</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>Posição das imagnes mais para o:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>final da pista</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>início da pista</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>hh:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>Sem pontos de pista</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>Pontos de pista não encontrados para a imagem "%1"</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss 'segundos'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm 'minutos e' ss 'segundos'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh 'horas,' mm 'minutos e' ss 'segundos'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>Imagen incorreta?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>A imagem "%1" foi obtida %2 antes do próximo ponto de pista que foi gravado. +Desejas continuar a usá-lo?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>A imagem "%1" foi obtida %2 depois do último ponto de pista que foi gravado. +Desejas continuar a usá-lo?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation>Especifique o nome do arquivo de saída</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>Imagens JPEG (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Erro ao abrir "%1": +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>Ir para</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Marcador</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation>Vínculo WWW (OSM/Google maps)</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation>Coordenadas</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation>Exibir projetado</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>lonMin, latMin, lonMax, latMax</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>latCent, lonCent, latSpan, lonSpan</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Informações</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>URL da API OSM</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>URL da XAPI OSM</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Pesquisar</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>URL OSM inválida</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>A URL especificada não é válida!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Formato das coordenadas inválido</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>Formato das coordenadas: '<left lon>, <botton lat>, <right lon>, <top lat>'</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>Formato das coordenadas: '<center lat>, <center lon>, <span lat>, <span lon>'</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Nenhum</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>Adaptador de forma</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation>Definir projeção atual à da camada</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation>Resetar ajustamento de alinhamento</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Fechar</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>Adaptador WMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>Adaptador TMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>Complementos</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Mapa - Nenhum</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Mapa - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Mapa - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>Mapa - WMS-Tiled - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Mapa - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Mapa - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>Termos da Licença: %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>Termos da Licença não aceitos</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation>Você ainda não marcou a caixa de verificação expressando sua concordância com os termos de licenciamento. +Como tal, você não será capaz de utilizar esta fonte como uma camada do mapa. +É realmente o que você queria?</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Servidor</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Tamanho da imagem</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>Ampliação mínima/máxima</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Projeção</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Diálogo</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>Entrada</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>Pré-visualização OSM</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Especificações</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>Primeira linha contem cabeçalhos</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Delimitador</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Ponto-e-vírgula (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Aba</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Outro:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Nenhum</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation>Aspas simples (')</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation>Aspas duplas (")</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>Projection (em formato PROJ4; deixe latitude/longitude em branco)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Campos</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>Lista de campos:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>Nome do Campo (= chave etiqueta) :</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>Tipo de campo:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Importar</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>Importar faixa</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>Desde (0 para o início):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>Para (0 para final)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>Carregando configurações...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Salvar configurações...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Texto</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Inteiro</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>Float</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Longitude</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Latitude</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Projeção inválida</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>Não foi possível definir projeção.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Sem coordenadas</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>Faltando campo de Latitude ou Longitude. Será impossível importar o arquivo. +Tem certeza de que deseja sair?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>Carregar configurações de importação CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Configurações de importação do Merkaator (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Arquivo inválido</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 não pode ser aberto.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1 não é um arquivo CSV de configuração de importação</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation>Salvar opções de importação de CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>Sem título</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Todos os arquivos (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation>Não foi possível salvar as opções de importação</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 não pode ser aberto para escrita.</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation>Incapaz de definir projeção; por favor especifique uma</translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Informações</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Tamanho</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Recursos</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Mostrar todas</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Ocultar todas</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Todas apenas leitura</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Nenhuma apenas leitura</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Fechar</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Camadas</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Todos</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>Mapa</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>Desenhar</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>Estradas</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation>Redefinir Camadas para o padrão</translation> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Visível</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Apenas leitura</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>Baixo</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>Alto</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>Opaco</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Opacidade</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation>Fechar Camada: Objetos alterados presentes.</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation>Há objetos alterados nesta camada. +Tem certeza que deseja fechá-la? (impossível Desfazer)</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation>Fechar Camada: Não vazia</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation>Tem certeza que deseja fechar esta camada? (impossível Desfazer)</translation> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>Termos da Licença</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>Eu li e aceito os termos da licença</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Não me pregunte isto novamente</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>A&juda</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Criar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Editar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>E&xibir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Marcadores</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Arquivo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Exportar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>F&erramentas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>E&stilo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation>Modelos de Eti&quetas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Nó</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>&Janela</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Barras</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>Carac&terística</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>&Camadas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>Rel&ação</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>M&ostrar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>Barra de ferramentas principal</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>&Sair</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>So&bre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>&Abrir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Criar um novo documento e importar um arquivo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>Zoom em &tudo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>Zoom na &janela</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>Zoom na janela</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>&Diminuir zoom</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>&Aumentar zoom</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Aumentar zoom</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Link curvo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Desfazer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>&Refazer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>&Mover</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Importar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Importar um arquivo no documento atual</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Download</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Baixar dados de mapa para uma nova área</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Link</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Criar link</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Selecionar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>&Enviar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Enviar alterações ao servidor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>R&emover</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Remover características selecionadas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Criar um novo nó</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>Inve&rter</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Criar desvio</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Novo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>&Dividir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>&Unir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>&Separar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Separar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>Re&lação</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Criar relação</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>&Áreas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Criar uma nova área</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Exportar todas as camadas visíveis para um arquivo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Localizar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Localizar e selecionar itens</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>Exportar as características da janela de exibição para um arquivo</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>&Unir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Unir nó</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>Unir os nós selecionados (o primeiro permanecerá selecionado)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Salvar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Baixar mais</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Baixar mais dados de mapa para a área atual</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Propriedades</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>&Informações</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>&Alinhar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Alinhar nós</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>Alinhar os nós selecionados. Os dois primeiros selecionados dão o alinhamento.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation>E&spalhar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation>Espalhar nós</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation>Alinhar e espalhar igualmente os nós selecionados</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>&Copiar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>Copiar as características selecionadas e os rótulos para a área de transferência</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>Copiar os rótulos das características selecionadas para a área de transferência; se a característica é um ponto de via, copiar as coordenadas também.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Colar rótulos (&Substituir)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>Colar (e substituir) os rótulos na área de transferência para o recurso selecionado.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>Colar rótulos (&Unir)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Colar rótulos</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>Colar rótulos da área de transferência (Unir com os rótulos existentes)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>Unir os rótulos na área de transferência com os do recurso selecionado.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Colar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Colar características da área de transferência</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>Colar as caracteristicas na área de transferência; se as caracteríssticas já estão no documento, substitua-as.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Confirmar característica para a camanda temporária</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>Camada de &imagem</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>&Raster/SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>&Iniciar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>Iniciar GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>Reproduzir GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>P&arar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>Parar GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>&Centrar no GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>Mostrar retoque</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Gravar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>Gravar GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Pausar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>Pausar GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>G&eoImagem</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>&Adicionar membro</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>&Remover membro</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>&Nunca</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>&Sempre</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>&Separar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>E&stilos</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation>Importar um arquivo para o documento atual usando o GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Casa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Girar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation>&Poligono</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Recursos</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>&Subdividir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation>Subdividir segmento igualmente</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>&Travar zoom para o fundo de quadros</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>OsmChange (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Fechar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>Simplifique</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation>Simplifique rua(s)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation>Simplifique a trilha através da remoção desnecessária nós filho</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>&Nenhum</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation>Dividir área entre dois nós</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>&Terraço</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation>Área de Terraço em Residências</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation>Dividir uma área selecionada em residências geminadas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation>Alinhar bordas a eixos regulares</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Propriedades...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation>E&xtrudir</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation>Extrudir interação para caminhos (estilo JOSM)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation>Selecionar alternação</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation>Incluir filhos na seleção</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>Redimensionar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Download de crianças desaparecidas</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>Apagar rótulo '%1' em %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>Limpar %1 etiquetas em %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation>Definir rótulo "source" em %1</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Remover membro '%1' em %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation>Reordenar membros na relação %1</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>Relação modificada %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Criar área %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Área: Criar via %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Adicionar um buraco.</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Você deseja adicionar um (outro) buraco a esta área?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Área: Concluir via %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Área: Adicionar nó %1 a via %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>Fechar Área %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>CLICK IZQUIERDO para inciar;ARRASTRAR para escalar;SHIFT+ARRASTRE para rotar;CLICK IZQUIERDO para terminar</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Criar desvio %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation>Encerrar Estrada %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>CLIQUE para selecionar/mover;CTRL-CLIQUE para alternar seleção;SHIFT-CLICK para adicionar à seleção;SHIFT-ARRASTO para seleção de área;CTRL-ARRASTO para ampliação;DUPLO-CLIQUE para criar um nodo;DUPLO-CLIQUE em um nodo para iniciar um caminho;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Remover característica %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>Remover objetos</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Excluir filhos.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation>Também deseja excluir os nodos filhos? +Note que nodos do OSM fora da área carregada serão mantidos.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation>Reverter %1 caminhos</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>CLIQUE para selecionar;CLIQUE+ARRASTE para mover</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>Encontrados vários nós na mesma posição.</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>Deseja unir todos os nós em um ponto de reunião?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Uni nós em %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation>APONTE para selecionar;ARRASTO-ESQUERDO para rotacionar</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation>Rotacionar Objeto</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation>APONTE para selecionar;ARRASTO-ESQUERDO para redimensionar</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation>Redimensionar Objeto</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>Click-izquierdo a la primera esquina -> Arrastre-izquierdo al area especifica ->Click izquierdo para ampliar</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>Formato GPS Exchange (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>Formato OpenStreetMap (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation>Formato de Mudanças do OpenStreetMap (*.osc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Formato Noni GPSPlot (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>Formato de registro NMEA GPS (*.nmea *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>Arquivo KML (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>Formato separado por vírgulas (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Imagens georeferenciadas (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>Arquivo de forma ESRI (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation>Linguagem de Marcação de Geografia (*.gml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Formatos suportados</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Documento Merkaartor (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Todos os arquivos (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>imagem %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>Baixo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>Alto</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>Opaco</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Característica</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Nó</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Relação</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Carregar imagem</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>Adicionar um nó de posição a imagem</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation>Geoetiquetar imagem com esta posição</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Cancelar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>Arquivo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Editar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>Ver</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>Mostrar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>Setas de Direção</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Camadas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Criar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Direção</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Ferramentas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>Janelas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Ajuda</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation>Recortar Objetos</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Conteúdo inválido para a área de transferência</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>A área de transferência não contem dados válidos.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation>Importar arquivo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Alterações não salvas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>O mapa atual contem alterações não salvas que serão perdidas quando se iniciar um novo. +Deseja cancelar o início de um novo mapa ou continuar e descartar as alterações?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Pontos da via</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>Via %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Aviso de advertência de copyright</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Estás intentando importar un archivo KML. Ten en cuenta que: + + - No puedes importar a OSM un archivo KML creado por Google Earth. Aunque creas + que los nodos que has creado desde GE son tuyos, ¡no lo son! + Todavía hay trabajo derivado por parte de GE, y por lo tanto, no puede ser usado en OSM. + + - Si lo has descargado desde internet, hay posibilidades de que tenga copyright. + Tienes que estar absolutamente seguro de que usar esos datos en OSM está permitido por el autor, o + que los datos son de dominio público + +Si no estás seguro, deberías preguntar en las listas "legal" o "talk" de correo de openstreetmap. + +¿Estás absolutamente seguro de que este KML puede ser importado legalmente en OSM?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>Arquivo não é válido</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 não pode ser aberto.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>Versão antiga de Qt detectada</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>Sua configuração utiliza Qt %1, que contém vários erros conhecidos em transferir dados para o OpenStreetMap levando ao código 401 como resposta do servidor. Tem certeza que deseja continuar (o que não é recomendado)? +Para mais informações consulte http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>Enviar OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Parece que você não especificou o seu +nome de usuário e senha do OpenStreetMap. +Você deseja fazer isso agora?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Erro ao baixar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>O mapa não pode ser baixado</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Criar polígono</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>Especificar o número de lados</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Forçar envio do recurso</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation>Abrir arquivo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Criar junção</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Cruzamentos múltiplos.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>Essas vias têm cruzamentos múltiplos. +Você ainda deseja criar uma junção para cada uma (cruzamentos indesejados podem ainda serem excluídos depois da mão)?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Adicionar números de rua</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation>Número de segmentos a dividir</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation>Especifique o número de segmentos</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation>Alinhar Eixo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation>Especifique o número de eixos regulares aos quais alinhar (ex.: 4 para retangular)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>tringular</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>retangular</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>pentagonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>hexagonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation>heptagonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>octogonal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation>Alinhar a %1 eixos</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation>Alinhar a %1 eixos regulares</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation>Incapaz de alinhar a eixos</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation>Operação de alinhar a eixos falhou. Por favor ajuste alguma aresta e tente novamente.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation>Operação de alinhar a eixos falhou e não convergiu em uma solução.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Alinhar nós</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation>Espalhar nós</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>Separar nó %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Adicionar membro à relação</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Remover membro da relação</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation>Unir áreas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>Dividir área</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation>Área de Terraço em %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Criar relação %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Salvar estilo de mapa</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Estilo de mapa Merkaartor (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Carregar estilo de mapa</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation>Estilo de mapa do Merkaartor (*.mas) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation>MapCSS stylesheet (*.css)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>Sem título</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Salvar documento Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Arquivos de documentos Merkaartor (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation>Salvar modelo de documento do Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>Não foi possível abrir arquivo salvo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 não pode ser aberto para escrita.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation>Incapaz de abrir salvar modelo de documento</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Arquivo inválido</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 não é um documento de Merkaartor válido.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>Exportar OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>Arquivos OSM (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>Exportar osmChange</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>Arquivos de mudanças OSM (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Exportar GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>Arquivos GPX (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Exportar KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>Arquivos KML (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (inteiro)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Adicionar marcador</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Especificar o nome do marcador.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Nome de marcador inválido</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>O marcador não pode estar em branco.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Aviso: O nome do marcador já existe</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Digite um novo, mantenha o mesmo para substituir ou cancelar.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Remover marcador</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Selecionar o marcador para remover.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Projeção inválida</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>Não foi possível definir projeção "%1".</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>Erro de GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>Não foi possível abrir a porta GPS.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>Abrir arquivo de registro NMEA</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>Salvar modelos rotulados</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Modelos de rótulos Merkaartor (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>Abrir modelos de rótulos</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation>Alerta! Não foi possível carregar as traduções do Merkaartor para a linguagem "%1". Alternando para o padrão Inglês.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>Conflitos não resolvidos</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>Por favor, resolva primeiro os conflitos existentes</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Se recomienda encarecidamente guardar los cambios en el documento tras una carga. +¿Desea hacerlo ahora?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>Último: </i><b>%1</b> by <b>%2</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>Último: </i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>Camada: </i><b>%1</b> </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation>Buscar</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Ponto da tota</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>coordenada</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>descrição</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>comentérios</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Nó</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>elevação</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>velocidade</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>tamanho</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>membros</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>No topo à esquerda</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>Abaixo à direita</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Relação</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Função</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Membro</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation>Caminho fechado</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Comprimento</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Tamanho</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>nós %1</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Área</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Direção</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>Ver</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation>Caixa Delimitadora</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Projeção</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Novo marcador</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>Falha ao carregar preferências</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Chave duplicada</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Mais de 150 preferências</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation>Erro de comunicação</translation> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Novo servidor</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>Etiquetas</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>Itens selecionados</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation>Classe</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Nome</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Campo desconhecido</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Erro!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>O servidor do serviço de busca requer autenticação.</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>Nome do arquivo de saída</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>Sem título</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation>Arquivos PDF (*.pdf)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Todos os arquivos (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Arquivos de imagens (*.png *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>Arquivos SVG (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation>Exportação Raster/SVG</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation>Opções</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>min lat/Lon</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>máx lat/Lon</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation>Mostrar Nodos</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation>Mostrar Relações</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>Mostrar escala</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation>Mostrar Latitude/Longitude na Grade</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation>Mostrar objetos sem estilo</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation>300</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation>600</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation>1200</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation>dpi</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>Exportar para PDF...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>Exportar para SVG...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation>Exportar para Raster...</translation> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>Endereço:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Usuário:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation>Senha:</translation> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Editor de estilo de mapa</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Global</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Fundo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation>Nós</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Espessura proporcional</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>Espessura fixa</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>Filtro</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Adicionar</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Remover</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Duplicar</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>Marcar seleção</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>metros/pixel</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>Visível até</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>Visível a partir da escala</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Desenhar com cores</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Tracejada</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>off</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Área de preenchimento</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Borda</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation>Interior</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation>Exterior</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>Retoque</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Desenhar etapas</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Desenhar ícone</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Etiqueta</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Fonte</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Marcar etiqueta</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Halo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Área</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Desenhar com a cor de fundo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Etiquetar com a marca de fundo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Sempre</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Selecionar cor</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>Sem Geoetiqueta Válida</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation>Esta foto não possui dados EXIF de geo-tagging. +O que você deseja fazer agora?</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation>Tentar alinhar com nó de trilha</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>Carregar sem nós associado</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>Extrair informações do barcode (Walking Papers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>Ignorar</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>Aplicar em todas as fotos atuais.</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Diálogo</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>Nome do arquivo de saída</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>Sem título</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>Arquivos SVG (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Todos os arquivos (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Arquivos de imagens (*.png *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Preferências</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>Visual</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Geral</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Opacidade baixa/alta</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>Única interação do botão do mouse</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>Utilizar estilo Qt personalizado</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation>Permitir criação de nodo/caminho em modo de seleção</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>Relações selecionáveis quando ocultas</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Cores</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Fundo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>Sobrescrever estilo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>Pista GPX</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>Pixels</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Interface</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Pairar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Relações</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Foco</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Destacar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation>Alterado</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Local</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Utilizar idioma</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>Traduzir as etiquetas padrão</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation>Renderização</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation>Opções</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation>Edição</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation>Edição rápida</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation>Edição de wireframe</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Estilo de mapa</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Diretório de estilos personalizados</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Estilo atual</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Modelo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>Marcar modelo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Predefinidos</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Personalizado</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Dados</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation>XAPI</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>Endereço:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Documentos</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation>Carregar modelo de documento automaticamente</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Salvar documentos automaticamente depois de carregá-los</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>Estradas</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation>GDAL</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation>Confirmar projeção</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>Entrada de GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>Serial</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Porta</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Host</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>Salvar registro NMEA</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>Definir a hora do sistema GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Rede</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Configurações de proxy</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Senha:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Usuário:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Porta:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Servidor:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Adaptador de mapa</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation>Adicionar automaticamente o rótulo "source" ao criar objetos sobre um mapa de fundo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Ferramentas</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Nome:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Caminho:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Aplicar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Adicionar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Remover</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Inglês</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Árabe</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation>Chinês (Taiwan)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation>Croata</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Tcheco</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Holandês</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Alemão</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Francês</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>Húngaro</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation>indonésio (Indonésia)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Italiano</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>Japonês</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Polonês</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Russo</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation>Português (Brasil)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Espanhol</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Sueco</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Ucraniano</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Merkaartor tag template (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Selecionar cor</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>A ferramenta já existe</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Ya existe una herramienta con este nombre. +Por favor elija otro nombre o haga clic <Aplicar> buton si quiere modificar el existente</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>Não foi possível excluir ferramenta predefinida</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>Não foi possível excluir ferramenta predefinida "%1"</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>Não foi possível modificar o nome da ferramenta predefinida</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>Não foi possível modificar o nome da ferramenta predefinida "%1"</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>Selecionar o executável da ferramenta</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation>Selecionar modelo de documento</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation>Documento do Merkaartor (*.mdc)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>Selecionar o diretório de registros (log)</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation>Configuração de Projeções</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>Projeções</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation>Lista de Projeções:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Nome:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>String PROJ4</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Aplicar</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Adicionar</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Remover</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation>Documento</translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Diálogo</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation>Predefinido</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation>Padrão (EPSG:...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation>PROJ4 personalizado (+proj=...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Propriedades</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 iten(s) selecionado(s)</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 iten(s) selecionado(s)</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Itens selecionados</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Propriedades - Vários itens</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Propriedades - Nó</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Propriedades - Relação</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Propriedades</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation>Erro lendo arquivo de modelo</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Centro do mapa</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>Centro && Zoom do mapa</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Selecionar membro</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Limpeza em cascata</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>Mover nó %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation>Exportanto GPX...</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Cancelar</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation>Importando...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>Importar osmChange</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>Importar NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>Importar NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Inválido</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>Metros</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>Indisponível</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>Erro de registro GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Não é possível criar arquivo de registro do GPS: %1.</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation>Não é possível conectar-se a %1:%2</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>Erro de registro GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Não é possível criar arquivo de registro do GPS: %1.</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Longitude</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Altitude</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 metros</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation># Satélites</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Fixar tipo</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Inválido</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Velocidade</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Latitude</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>Fluxo de resultados incorreto!</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation>Personalizar Barras de Ferramentas</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation>Ações</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation>Barras de ferramentas</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>Novo</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Remover</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>Renomear</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation>Restaurar Tudo</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Aplicar</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Cancelar</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation>Acima</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation>Abaixo</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation>Ações Atuais da Barra de Ferramentas</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation>< S E P A R A D O R ></translation> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation>Barra de Ferramentas Personalizada</translation> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Membros</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation>Remover membro(s) selecionado(s)</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>Etiquetas</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation>Adicionar rótulo "source"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation>Remover rótulo(s) selecionado(s)</translation> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Identificador</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>Etiquetas</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation>Adicionar rótulo "source"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation>Remover rótulo(s) selecionado(s)</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Sem satélites</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Seleção</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Chave</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Valor</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Nome</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Identificador</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation>Consulta</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation>Máximo de resultados a obter (0 para todos)</translation> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Fechar</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Estilos</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Estilos</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Enviar para Openstreetmap</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation>Comentar</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation>Um bom comentário deve descrever a alteração concisamente e adequadamente.</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation>As seguintes mudanças serão salvas:</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation>Adicionado</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation>Atualizado</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation>Excluído</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation>Linhas</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation>Nós</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation>Relações</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation>Soma</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Cancelar</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>Configuração dos servidores TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>Servidores TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Lista de servidores:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nome:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>URL do servidor:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>Obter Serviços</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>Serviços :</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation>Este é um servidor TMS padrão.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projeção:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Mercator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>Lat/Lon (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation>Origem está abaixo-esquerda</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation>Tamanho do ladrilho:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation>Ampliação mínima:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation>Ampliação máxima:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation>Valor do rótulo "source":</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>URL da Licença:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Aplicar</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Adicionar</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Remover</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation>Merkaartor: GetServices</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>Endereço e Rota não podem estra em branco.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Chave</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Valor</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation>Editor de tags</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation>Já existe uma tag com esse nome.</translation> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>Editar isso para adicionar...</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation>OU</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>E</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation>NÃO</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation>é</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation>é um de</translation> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Indefinido</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Indefinido</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation>Terraço</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation>Sem Numeração</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>Numeração de Edifícios</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>Adicionar Numeração (método de Karlsruhe)</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation>Intervalos</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>Por exemplo "1-9;15-17;19,19A"</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation>Modelo</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Todos os números</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>Números ímpares</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>Números Pares</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation>Opcionalmente você também pode selecionar um nodo na área e a numeração das casas começará por esta extremidade.</translation> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Extrair - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation># de segmentos do traçado</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Distância total</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Duração total</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1h %2m</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Extrair camada de desenho</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Fechar</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>Ponto de pista</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Latitude</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Longitude</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Identificador</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Etiquetas</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation>Adicionar rótulo "source"</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation>Remover rótulo(s) selecionado(s)</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Diálogo</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Site</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Senha</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Nome de usuário</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Utilizar proxy</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Porta</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>Zoom</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Limpar</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>Configurar servidores WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>Servidores WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Lista de servidores:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Nome:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>URL do servidor:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Camadas:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation>Título</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projeção:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation>Azulejar</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>Níveis de Zoom</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>Formato da imagem:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Estilos:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation>Valor do rótulo "source":</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>URL da Licença:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Aplicar</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Adicionar</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Remover</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: Tenha capacidades</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>Endereço e Rota não podem estra em branco.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation>Camada sem nome</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation>Sem título</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_ru.ts b/translations/merkaartor_ru.ts new file mode 100644 index 0000000..082b310 --- /dev/null +++ b/translations/merkaartor_ru.ts @@ -0,0 +1,7388 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="ru" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>О программе Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation>Версия PROJ</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>Эта программа распространяется под лицензией GNU General Public License v2</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Версия Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Версия Qt</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>Версия GDAL</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation>Авторские права Bart Vanhauwaert, Chris Browet, Ladislav Láska и другие, 2006-2021</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Журнал изменений</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>ОК</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Описание</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Комбинация клавиш</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>Импорт</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>Экспорт</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>По умолчанию</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&ОК</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>Отмена</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Редактор комбинаций клавиш</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Скачать схему клавиатурных сокращений</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Схема клавиатурных сокращений Merkaartor (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Невозможно открыть файл</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 не может быть открыт.</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>Сохранить схему клавиатурных сокращений</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>документ Merkaartor</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Все файлы (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Невозможно открыть сохранённый файл</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 не может быть открыт для записи.</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation>Строительство мостов</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation>Из этого нельзя построить мост. Укажите только две точки.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation>Преобразовать сегмент в мост</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation>Тег выбранного сегмента уже указан как мост/туннель. Проверьте, что вы выбрали правильное действие. </translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation>Недопустимое действие: похоже мост не является односторонним.</translation> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation>Файл</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation>Выход</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation>Загрузить</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation>Загрузить город из кадастра</translation> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation>Город не может быть загружен</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation>Загружено: %1/%2 +Оставшееся время: %3:%4</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation>Загружено: %1/%2 +Оставшееся время: %3:%4:%5</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation>Загружено: %1/%2</translation> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Нет описания</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation>Точность (метры/сегмент)</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation>Тип</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation>Кольцевая развязка</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation>Плоский круг</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation>Налево</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation>Направо</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation>Сторона движения</translation> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation><b>Нет</b> черновых объектов</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation><b>Один</b> черновой объект</translation> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Отмена</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Центр карты</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>Центрировать и масштабировать карту</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Отмена</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation><b>Нет</b> черновых объектов</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Очистка</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>Масштаб</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>ДОБАВЛЕНА линия%1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>ДОБАВЛЕНА точка трека %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>ДОБАВЛЕНО отношение %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>ОБНОВИТЬ точку трека %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>ОБНОВЛЕНО отношение %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>ОБНОВЛЕНА линия %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>УДАЛИТЬ точку трека %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>УДАЛЕНА линия %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>УДАЛЕНО отношение %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Ошибка запроса на передачу данных на сервер</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Пожалуйста, проверте ваш логин и пароль в меню настройка -> Параметры</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Произошла ошибка передачи на сервер этого запроса: (%1) +Сообщение сервера: '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +сообщение API: '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Передача изменений на сервер</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>ОТКРЫТЬ пакет правок</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>ЗАКРЫТЬ пакет правок</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Ошибка запроса на передачу данных на сервер</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Пожалуйста, проверте ваш логин и пароль в меню настройка -> Параметры</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Произошла ошибка передачи на сервер этого запроса: (%1) +Сообщение сервера: '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +сообщение API: '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation>Произошла ошибка передачи этого запроса на сервер (%1) +"%2" +Пожалуйста, cкачайте заново проблемную область, чтобы уладить конфликт.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>Проверка изменений...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>ОТКРЫТЬ пакет правок</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>ЗАКРЫТЬ пакет правок</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation>Невозможно закрыть пакет правок.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation>Неизвестная ошибка. Пакет правок возможно уже закрыт или будет закрыт автоматически. Проверьте на сайте osm.org.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>ДОБАВЛЕНО отношение %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>ДОБАВЛЕНА линия%1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>ДОБАВЛЕНА точка трека %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>ОБНОВЛЕНО отношение %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>ОБНОВЛЕНА линия %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>ОБНОВИТЬ точку трека %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>УДАЛИТЬ точку трека %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>УДАЛЕНА линия %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>УДАЛЕНО отношение %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>документ Merkaartor</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Слой черновика</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Слой, переданный на сервер OSM</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Фоновая картинка</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation>Слой для рисования #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation>Слой с фильтром #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>Экспорт OSM</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>Экспорт OSM...</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>Документ</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation>Обновление истории: Создание точки %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation>Обновление истории: Обновление точки %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation>Обновление истории: Удаление точки %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation>Обновление истории: Создание линии %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation>Обновление истории: Обновление линии %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation>Обновление истории: Удаление линии %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation>Обновление истории: Создание отношения %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation>Обновление истории: Обновление отношения %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation>Обновление истории: Удаление отношения %1</translation> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Скачать</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Местоположение</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Закладка</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Текущий вид</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation>Веб-ссылка (OSM/Google maps)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation>Выбор Xapi</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>С карты ниже (карта представлена проектом OpenStreetMap)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Также скачать необработанные треки GPS</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>Уладить все отношения</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 скачано</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Скачивание не удалось...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>Скачивается неразрешаемый объект %1 из %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>Обрабатывается неразрешаемый объект %1 из %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Обработка...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Обработка XML</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Конфликт из %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>Обнаружена пустая линия или отношение</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Пустые линии или отношения возможно созданы по ошибке. +Желаете пометить их для удаления?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Удаление пустого объекта %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Конфликты были устранены</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>Это означает, что некоторые особые объекты из вашего последнего скачивания, которые вы правили, были изменены +кем-то ещё на сервере. Эти особые объекты продублированы и помечены как "конфликт_..." в слое "Конфликты...". Прежде чем передать изменения на сервер, вы должны вручную объединить эти две версии и удалить их из слоя "Конфликты...".</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Передача на сервер...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Подготовка изменений</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>Ожидание ответа сервера</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation><numerusform>Скачивание с OSM (%n байт)</numerusform><numerusform>Скачивание с OSM (%n байта)</numerusform><numerusform>Скачивание с OSM (%n байт)</numerusform><numerusform>Скачивание с OSM (%n байт)</numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation><numerusform>Скачивание с OSM (%n кб)</numerusform><numerusform>Скачивание с OSM (%n кб)</numerusform><numerusform>Скачивание с OSM (%n кб)</numerusform><numerusform>Скачивание с OSM (%n кб)</numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Скачивание...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Скачивание с OSM (соединение с сервером)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>Непредвиденный код статуса http (%1) +Сервер ответил '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +сообщение API: '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Ошибка скачивания</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Неверный логин и пароль</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>Неразрешаемые конфликты</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>Пожалуйста, разрешите вначале имеющиеся конфликты</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>Скачиваются точки трека %1-%2</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation>MapDust</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Скачивание точек</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Скачивается %1,%2 (масштаб %3)...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>Масштаб</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Закрыть</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>Невозможно удалить</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation>Невозможно удалить выбранное, так как оно находиться вне скаченной области.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>Невозможно удалить все</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation>Выделение полностью не может быть удалено, т. к. его часть находится за границей скачанной области. +Удалить то, что возможно?</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation>Перевернуть линию %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation>Перевернуть %1 линии</translation> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Экспорт</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>Что экспортировать?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Всё видимое (не скрытое)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>Содержимое экрана</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Выбранное</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Особые объекты</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Центр карты</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>Центрировать и масштабировать карту</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Скачать отсутствующих наследников</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Добавить к выделенному</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Удалить</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Отношения</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation>Линии</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation>Точки</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Всё</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Особые объекты</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>Только те особые объекты, которые видны на экране</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation>Фильтр по окну обзора</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Поиск...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation>Отобразить особые объекты, пересекающиеся только с текущим выделением.</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation>Фильтр по выделению</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>Сбросить</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Публикация изменений</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Имя</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Фильтр</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Закрыть</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>Настройка фильтров</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Фильтры</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Список фильтров:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Имя:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Фильтр</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Применить</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Добавить</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Удалить</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation>Открыть GDAL файлы</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation>Значение:</translation> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation>Имя файла</translation> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>Ожидание сети</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>Невозможно считать данные фотографии с сервера Walking Papers.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Пожалуйста, укажите URL Walking Papers</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Геоизображения</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Центр карты</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Удалить изображения</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Копировать имя файла в буфер</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Выбрать следующее изображение</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>PgDown</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Выбрать предыдущее изображение</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>PgUp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>Сохранить геотегированное изображение...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>Фотографический слой</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Скачать изображения с геотегами</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>Выделить слой, к которому принадлежат изображения:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation>Слой только для чтения</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation>Используемый слой нередактируемый. Он должен быть редактируемым? +Если нет, Вы не можете загрузить в него изображения.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Скачивание изображений...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Отмена загрузки</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>Нет такого файла</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>Не могу найти картинку "%1"</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Ошибка в момент открытия "%2":%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Ошибка во время загрузки EXIF-данных из "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>Задать смещение</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>Ещё изображения позиции:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>конец трека</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>начало трека</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>чч:мм:сс</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>Точки трека отсутствуют</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>Для изображения "%1" нет точек трека</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss 'секунд'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm 'минут и' ss 'секунд'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh 'часов,' mm 'минут и' ss 'секунд'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>Ошибочное изображение?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>Изображение "%1" было принято %2 до того, как следующая точка трека +была записана. Вы всё равно хотите использовать его?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>Изображение "%1" было принято %2 после того, как была записана +последняя точка трека. Вы всё равно хотите использовать его?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation>Укажите имя выходного файла</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>Изображения JPEG (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Ошибка в момент открытия "%1":%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation>Загрузить изображение...</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation>Открыть GeoTIFF файлы</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation>Значение:</translation> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation>Имя файла</translation> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>Перейти к</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Закладка</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation>Веб-ссылка (OSM/Google maps)</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation>Координаты</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation>Отобразить проекцию</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>долМин, ширМин, долМакс, ширМакс</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>ширЦентр, долЦентр, ширРазм, долРазм</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Информация</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>Ссылка на OSM API</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>Ссылка на OSM XAPI</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Поиск</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>Неправильная ссылка OSM</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>Указанная ссылка неверна!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Неправильный формат координат</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>Координаты задаются строкой вида: '<left lon>, <bottom lat>, <right lon>, <top lat>'</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>Координаты задаются строкой вида: '<center lat>, <center lon>, <span lat>, <span lon>'</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Нет</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>Адаптер форм</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>Масштаб</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation>Присвоить слою проекцию вида</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation>Сбросить настройки выравнивания</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Закрыть</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>адаптер WMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>адаптер TMS</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>Плагины</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Карта - <отсутствует></translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Карта - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Карта - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>Карта - квадраты WMS- %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Карта - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Map - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>Условия лицензии: %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>Условия лицензии не приняты</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation>Вы не поставили галочку под согласием с условиями лицензионного соглашения. +Вы не сможете использовать этот источник в качестве карты слоя. +Вы действительно этого хотите?</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Сервер</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Размер квадрата</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>Мин/Макс масштаб</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Проекция</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Публикация изменений</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>Ввод</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>Предварительный просмотр OSM</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Условные обозначения</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>Первая строка содержит заголовки</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Разделитель</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation>Запятая (,)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Точка с запятой (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Табуляция</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Другой:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation>Кавычки строки</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Нет</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation>Одинарные кавычки (')</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation>Двойные кавычки (")</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>Проекция (в формате PROJ4; оставьте пустой широту/долготу)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Поля</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>Список полей:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>Название поля (= tag key) :</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>Тип поля:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Импорт</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>Диапазон импорта</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>От (0 от начала):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>До (0 до конца):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>Загрузить настройки...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Сохранить настройки...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Строка</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Целое</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>Число с плавающей точкой</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Долгота</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Широта</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Неправильная проекция</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>Невозможно задать проекцию.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Нет координат</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>Отсутствует поле широты или долготы. Невозможно импортировать файл. +Вы действительно хотите выйти?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>Загрузить настройки импорта CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Настройки импорта Merkaartor (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Неверный файл</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 не может быть открыт.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1 не является файлом настроек импорта CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation>Сохранить настройки импорта CSV</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>документ Merkaartor</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Все файлы (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation>Невозможно открыть сохранённые настройки импорта</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 не может быть открыт для записи.</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation>Невозможно задать проекцию; укажите проекцию</translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Информация</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Размер</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation>%n особых объектов</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Особые объекты</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Показать всё</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Скрыть всё</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Всё только для чтения</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Нет объектов "только для чтения"</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Закрыть</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Слои</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Всё</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>Карта</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>Рисовать</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>Треки</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation>Сброс слоев по умолчанию</translation> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Видимый</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Только для чтения</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>слабо</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>сильно</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>непрозрачный</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Прозрачность</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation>Закрытие слоя: Количество черновых объектов</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation>На этом слое есть черновые объектов. +Вы действительно хотите его закрыть? (Невозможно отменить)</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation>Закрытие слоя: Не пустой</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation>Вы уверенны, что хотите закрыть этот слой? (Невозможно отменить)</translation> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>Условия лицензии</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>Я прочитал и согласился с условиями лицензии</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Не спрашивать в будущем</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation>%1 v%2 +Загрузка плагинов...</translation> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation>%1 v%2 +Инициализация...</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>Спр&авка</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>С&оздать</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Редактировать</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>&Вид</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>Закладки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Файл</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>Экспорт</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>&Инструменты</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>Стиль</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation>Тегировать темплет</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Точка</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>О&кно</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>Панели</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>Особенность</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>&Слои</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>От&ношение</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>&Показать</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation>Линия</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation>Проекция</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation>Недавно открытые</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation>Недавно импортированные</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation>Стрелки-указатели</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>Главная панель инструментов</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>Выход</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>О программе &Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>Открыть</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Создать новый документ и импортировать файл</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>Показать всё</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>Произвольный масштаб</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>Произвольный масштаб</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>Отдалить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>Приблизить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Приблизить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Плавное соединение</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>Отменить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>Вернуть</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>Переместить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation>Импорт через GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>Импорт</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Импортировать файл в существующий документ</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>Скачать</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Скачать данные карты для новой области</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Связь</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Создать связь</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>Выбрать</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>Передать на сервер</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Передать изменения на сервер</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>Удалить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Удалить выделенные особые объекты</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation>&Линия</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation>Создать новую линию</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation>Изменить направление линии</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation>&Перейти к…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation>Параллельная линия</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation>Создать параллельную линию</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation>Новый документ</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation>Редактировать...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation>Сохранить как...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation>&Загрузить...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation>Изогнутая линия</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation>Настройки...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation>&Всё…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation>&Поиск...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation>Содержимое экрана</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation>Добавить...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation>Удалить...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation>Сохранить в файл</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation>Скрыть/показать панель свойств</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation>Скрыть/показать панель свойств</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation>Скрыть/показать панель слоёв</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation>Скрыть/показать панель отмены изменений</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation>Выбранное…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation>OSM (бинарный)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation>Скрыть/показать панель инструментов</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation>Скрыть/показать панель инструментов</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation>Скрыть всё</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation>Показать всё</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation>&Точки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation>Названия</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation>Скрыть/показать панель GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation>Масштаб</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation>Отношения</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation>Редактор комбинаций клавиш…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation>&Объединить...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation>Сохранить...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation>Отделить точку от линии</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation>Работать автономно</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation>Скрыть/показать панель стилей</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation>Редактор серверов WMS...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation>Редактор серверов TMS...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation>Меню GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation>Прямоугольное &строение</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation>Виртуальные точки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation>Координатная сетка</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation>Редактор проекций...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation>&Фотографии на карте</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation>Принудительно удалить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation>&Редактор фильтров...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation>Объединить области</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation>Редактор панели инструментов...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation>&Печать...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation>Предварительный просмотр...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation>Свойства…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation>Сохранить как шаблон документа...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation>Создать многоугольник</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Создать новую точку</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>Поменять направление</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation>&Круговая развязка</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Создать кольцевую развязку</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>Новый</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>Разделить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>Объединить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>Разбить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Разрыв</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>Отношение</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Создано отношение</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>Мультиполигон</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Создать полигон или мультиполигон</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Экспортировать все видимые слои в файл</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Поиск</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Найти и выбрать объекты</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>Экспортировать особые объекты из окна просмотра в файл</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>Объединить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Объединить точки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>Объединить выбранные точки (сохраняется первая выбранная)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>Сохранить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Скачать ещё</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Скачать больше данных карты для данной области</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>Свойства</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>Информация</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>Выровнять</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Выровнять точки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>Выровнять выбранные точки. Первые две выбранных точки образуют линию.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation>Распределить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation>Распределить точки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation>Выровнять и распределить выделенные точки одинаково.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>Копировать</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>Скопировать выделенные оcобые объекты и теги в конверт</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>Скопировать выделенные теги особых объектов в буфер обмена; если свойство это точка трека, то скопируйте и координаты.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Вставить теги (Перезаписать)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>Вставить (и заменить) теги из буфера обмена в выбранный особый объект.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>Вставить теги (Объединить)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Вставить теги</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>Вставить теги из буфера обмена (Объединить с существующими тегами)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>Объединить теги из буфера обмена с тегами выделенного особого объекта.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Вставить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Вставить особые объекты из буфера обмена</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>Вставить особые объекты в буфер обмена; если id особых объектов уже в документе, переписать их.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Занести особые объекты в слой черновика</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>Слой изображения</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>Растр/SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>Начать</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>Старт GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>Воспроизвести заново GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>Стоп</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>Выключить GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>Центрировать по GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>Показать последние правки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Запись</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>Записать GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Пауза</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>Пауза в работе GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>Геоизображение</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>Добавить участника</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>Удалить участника</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>Никогда</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>Всегда</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>Отделить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>Стили</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation>Импортировать файл в существующий документ через GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Камера</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Вращать</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation>&Многоугольник</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Особые объекты</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>Подраздел</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation>Разделить сегмент на равные части</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>Зафиксировать масштаб на уровне фона разбитого на квадраты</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>OsmChange (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Закрыть</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>Упростить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation>Упростить дороги</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation>Упростить линию, удалив ненужные дочерние точки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>Отсутствует</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation>Разделить полигон между двумя точками</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>Нумеровать дома вдоль улицы</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation>Пронумеровать дома внутри полигона</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation>Разделить выбранный полигон на зоны с нумерованными рядами домов.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation>О&севое Выравнивание</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation>Выравнять края по регулярным осям.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Свойства...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation>Выделить неверны&е свойства</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation>Вы&резать</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation>В&ыдавить</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation>Выдавить линию (стиль JOSM)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation>Выбрать переключатель</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation>Добавить к выбранному дочерние элементы</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>Масштаб</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation>GDAL SQLite/SpatiLite</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation>Контуры</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation>Выбрать родителя(ей)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Скачать отсутствующих наследников</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation>&Мост</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation><html><head/><body><p>Преобразовать линию в мост</p></body></html></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>Очищен тег '%1' для %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>Стереть %1 тегов на %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation>Присвоить тегу-источнику %1</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Удалить участника '%1' в %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation>Упорядочить участников отношения %1</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>Изменено отношение %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Создан полигон %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Полигон: Создана линия %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Добавить дыру.</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Желаете вложить полигон в этот полигон?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Полигон: Закончена линия %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Полигон: Добавлена точка %1 на линию %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>Закрыть Область %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>LEFT-CLICK - начать;DRAG - масштабировать;SHIFT-DRAG - повернуть;LEFT-CLICK - закончить</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation>Создать многоугольник %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Создать кольцевую развязку %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation>Создать точку %1 на линии %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation>Создать линию %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation>Создать точку: %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation>Добавить точку %1 к линии %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation>Закрыть Дорогу %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>ЛЕВЫЙ КЛИК для выбора;ПРАВЫЙ КЛИК для поворота;CTRL-ЛЕВЫЙ КЛИК для переключения выбора;SHIFT-ЛЕВЫЙ-КЛИК для добавления к выбранному;ЛЕВЫЙ КЛИК-ПЕРЕМЕЩЕНИЕ для выбора места;CTRL-ПРАВЫЙ КЛИК-ПЕРЕМЕЩЕНИЕ для изменения масштаба;ДВОЙНОЙ-КЛИК создание точки;ДВОЙНОЙ-КЛИК по точке для создания линии;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>КЛИК для выбора/перемещения;CTRL-КЛИК для переключения выбора;SHIFT-КЛИК добавить к выбранному;SHIFT-ПЕРЕМЕЩЕНИЕ для выбора места;CTRL-ПЕРЕМЕЩЕНИЕ для изменения масштаба;ДВОЙНОЙ-КЛИК создание точки;ДВОЙНОЙ-КЛИК по точке для создания линии;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Удалить особый объект %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>Удалить свойства</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Удалить наследника.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation>Вы также хотите удалить дочерние точки? +Точки OSM вне загруженной области будут сохранены.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation>Перевернуть %1 линии</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>LEFT-CLICK - выделить;LEFT-DRAG - передвинуть</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation>Переместить точки</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation>Переместить точку %1</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>Найдены совпадающие точки.</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>Вы хотите слить все близко расположенные точки</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation>Объединить точки в %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Объеденить точки в %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation>Наведите курсор мыши для выделения;ЛЕВЫЙ КЛИК-ПЕРЕМЕЩЕНИЕ для поворота</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation>Свойства поворота</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation>Наведите курсор мыши для выделения;ЛЕВЫЙ КЛИК-ПЕРЕМЕЩЕНИЕ для изменения масштаба</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation>Свойства Масштаба</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>LEFT-CLICK - первый угол-> LEFT-DRAG охватить область-> LEFT-CLICK - приблизить</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>Формат обмена GPS (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>Формат OpenStreetMap (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation>Формат обмена OpenStreetMap (*.osc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Не формат GPSPlot (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>Формат журнала NMEA GPS (*.nmea *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>файл KML (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>Формат с разделением запятаей (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Изображения с геотегами (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>Шейпфайл ESRI (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation>Язык Географической Разметки (*.gml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation>Protobuf Binary Format (*.pbf) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Поддерживаемые форматы</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Документ Merkaartor (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Все файлы (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>квадрат карты %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>слабо</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>сильно</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>непрозрачный</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Особый объект</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Точка</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Отношение</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Загрузить изображение</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>Добавить точку положения на изображение</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation>Геотегированное изображение этого положения</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Отмена</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>Файл</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Правка</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>Вид</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>Показать</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>Стрелки-указатели</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Слои</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Создать</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Линия</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Инструменты</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>Окна</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Справка</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation>Вырезать Свойства</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Конверт неисправен</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>В конверте нет правильных данных.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation>Предупреждение импорта GDAL</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation>Вы собираетесь импортировать файл(ы) через GDAL. Эта функция является экспериментальной и может не работать, приводят к сбою приложения. Убедитесь, что Вы не потеряете данные в случае сбоя. +Просим сообщать об ошибках в случае сбоя. + +Продолжить импорт?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation>Импорт файла</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Несохранённые изменения</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>Текущая карта содержит несохранённые ихменения, которые будут потеряны, если начать редактирование новой карты. Хотите отменить начало создания новой карты или продолжить и потерять все изменения?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation>Несохранённые изменения стиля</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation>Вы изменили текущий стиль. +Сохранить изменения?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Путевые точки</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>Трек %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Big Fat Copyright Warning</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Вы пытаетесь импортировать файл KML. Пожалуйста, имейте в виду, что: + + - Вы не можете импортировать файл KML в OSM, если он создан в Google Earth. Несмотря на то, + что вы и можете думать, что точки, которые вы создали в GE - ваши, однако, это не так! + Они являются производной работы GE, потому не могут использоваться в OSM. + + - Если вы скачали их из интернета, велик шанс, что они имеют копирайт. + Пожалуйста, убедитесь в том, что их использование в OSM разрешено автором, + или что данные публичны. + +Если вы не уверены, обращайтесь за справкой к спискам рассылки openstreetmap "legal" или "talk". + +Итак, вы абсолютно уверены, что этот KML может быть легально импортирован в OSM?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>Неверный файл</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 не может быть открыт.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation>Входящий запрос на удаленное управление</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation>Прошу прощения, но не знаю как загрузить объект '%1'.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation>Удаленное добавление POI %1 %2</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation>Входящий запрос на удаленное управление</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation>Неизвестное действие url: %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>Обнаружена старая версия Qt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>У вас установлена Qt версии %1, в которой проявляются различные известные ошибки при передаче данных на сервер OpenStreetMap, начинающиеся с кода ответа сервера 401. Вы уверены, что хотите продолжить работу? (Правда это не рекомендуется). +Для получения дополнительной информации, смотрите http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>Передача данных на сервер OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Вы не указали в настройках ваш +логин и пароль для сервиса OpenStreetMap. +Желаете это сделать сейчас?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Ошибка скачивания</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>Карта не может быть скачана</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation>Ошибка скачивания MapDust</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation>Невозможно скачать ошибки MapDust</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Создать многоугольник</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>Задать количество сторон</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Принудительно передать особый объект на сервер</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation>Открыть файл</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation>Объединить линии</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation>Разрезать линии</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation>Упростить линии</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Создать соединение</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Многократное пересечение.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>Эти линии имеют несколько пересечений. +Вы всё ещё хотите создать соединения для каждой из них? (Нежелательные пересечения можно позже удалить вручную)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Добавить номер улицы</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation>Количество сегментов, на которое разделить</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation>Укажите количество сегментов</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation>Осевое Выравнивание</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation>Укажите количество регулярных осей для выравнивания краев (напр., 4 для прямоугольника)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>треугольный</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>прямоугольный</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>пятиугольный</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>шестиугольный</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation>семиугольный</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>восьмиугольный</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation>Выравнять по %1 осям</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation>Выравнять по %1 регулярным осям</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation>Невозможно выравнять по осям</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation>Операция выравнивание по осям не выполнена. Пожалуйста, исправьте все острые углы и попробуйте еще раз.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation>Операция выравнивание по осям не выполнена и не возможно найти решение.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation>Извлечение из Bing</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Выровнять точки</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation>,Распределить точки</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>Отделить точку %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Добавлен элемент в отношение</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Удалить элемент из отношения</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation>Добавить к мультиполигону</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation>Объединить области</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>Разделить полигон</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation>Пронумеровать %1 внутри полигона</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Создано отношение %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Сохранить стиль карты</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Стиль карты Merkaartor (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Открыть стиль карты</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation>Merkaartor стиль карты (*.mas) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation>MapCSS таблица стилей (*.css)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation>Обновить Историю</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation>Попытка обновления истории. +Возможен сбой, отменить не возможно. +Вы действительно хотите попробовать?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>документ Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Сохранить документ Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Документы Merkaartor (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation>Сохранить шаблон документа Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>Невозможно открыть сохранённый файл</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 не может быть открыт для записи.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation>Невозможно открыть сохранение шаблона документа</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Неверный файл</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 - не документ Merkaartor.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>Экспорт OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>Файлы OSM (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>Экспорт osmChange</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>Файлы osmChange (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Экспорт GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>Файлы GPX (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Экспорт KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>Файлы KML (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation>Извлечение особых объектов</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation>Извлечение особых объектов...</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation>Скрыть подписи кнопок</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (int)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Добавить закладку</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Укажите имя закладки.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Неверное имя закладки</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>Закладка не может быть пустой.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Внимание: такое имя закладки уже существует</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Введите новое значение, оставте тоже самое, что бы перезаписать или нажмите отмена, что бы не добавлять.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Удалить закладку</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Выберите закладку для удалени.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Неправильная проекция</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>Невозможно задать проекцию "%1".</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>ошибка GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>Невозможно открыть порт GPS.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>Открыть файл журнала NMEA</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>Сохранить шаблоны тегов</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Шаблоны тегов Merkaartor (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>Открыть шаблоны тегов</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation>Внимание! Не возможно загрузить перевод Merkaartor для "%1" языка. Переключение на Английский.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>Неразрешаемые конфликты</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>Пожалуйста, разрешите вначале имеющиеся конфликты</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Мы рекомендуем сохранить изменения в документе после передачи их на сервер. +Хотите сделать это сейчас?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation>Назначить тег '%1=' для %2</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation>Назначить тег '%1=%2' для %3</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation>Создать точку на линии %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation>Создать параллельную линию %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation>Создать точку %1</translation> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>посл.: </i><b>%1</b> от <b>%2</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>посл.: </i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>слой: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation>Обзор</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Путевая точка</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>коорд</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>описание</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation>WGS84 координаты</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>комментарий</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Точка</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>высота</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>скорость</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>размер</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>участники</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>Верхний левый угол</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>Правый нижний угол</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Отношение</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Роль</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Член</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation>Закрытая линия</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Длина</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Размер</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>точек: %1</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Мультиполигон</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Линия</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation>%1 м/пиксель</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation>Выравнивание: %1м @ %2</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation>%1мсек</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 м</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 км</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>Вид</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation>Ограничивающий Прямоугольник</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Проекция</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Новая закладка</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>Передача параметров на сервер не удалась</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Дублировать ключ</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Более чем 150 параметров</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation>Ошибка связи при передаче параметров</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation>Ошибка связи</translation> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Новый сервер</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation>Условия использования</translation> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>Теги</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>Выбранные объекты</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation>Класс</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Имя</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Неизвестное поле</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Ошибка!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>Сервис поиска названий требует проверку подлинности.</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>Имя выходного файла</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>документ Merkaartor</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation>PDF файлы (*.pdf)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Все файлы (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Файлы изображений (*.png *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>Файлы SVG (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation>Экспортировать Растр/SVG</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation>Опции</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>мин Шир/Дол</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>макс Шир/Дол</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation>Показать точки</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation>Показать отношения</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>Показать Масштаб</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation>Показывать Координатную Сетку</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation>Отобразить особые объекты без стиля</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation>Разрешение печати</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation>300</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation>600</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation>1200</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation>dpi</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>Экспорт в PDF...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>Экспорт в SVG</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation>Экспорт в Растр...</translation> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Пользователь:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation>Пароль:</translation> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Редактор стиля карты</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Общий</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Фон</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation>Точки</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Пропорциональная толщина</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>Фиксированная тощина</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>Фильтр</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Добавить</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Удалить</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Сделать копию</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>Выбор тега</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>метров на пиксель</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>Видимый от</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>Видимый при масштабе</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Рисовать цветом</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Пунктир</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>через</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Закрасить полигон</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation>Заливка иконками - раздел Детали</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Границы</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation>Внутренняя</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation>Внешняя</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>Детали</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Нарисовать след</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Рисовать значёк</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation>Нарисовать знаки направления движения</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Ярлык</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Шрифт</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Тег надписи</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Ореол</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Мультиполигон</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Рисовать на цветном фоне</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Ярлык с тегом фона</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Всегда</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Выбрать цвет</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>Нет верного геотега</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation>Данная фотография не содержит гео-тег данные EXIF. +Что вы намерены делать дальше?</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation>Попытаться сопоставить с точкой трека</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>Загрузить без связанной точки</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>Извлечь информацию из штрих-кода (Walking Papers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>Игнорировать это</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>Сделать это для всех текущих фотографий.</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Публикация изменений</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>Имя выходного файла</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>документ Merkaartor</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>Файлы SVG (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Все файлы (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Файлы изображений (*.png *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Параметры</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>Отображение</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Основное</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Прозрачность мин/макс</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>Работа однокнопочной мышью</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>Использовать пользовательский стиль Qt</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation>Разрешить создание точек/линий в режиме выбора</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>Отношения можно выбирать, даже если они скрыты</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Цвета</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Фон</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>Перезаписать стиль</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>Трек GPX</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>Пикселей</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Интерфейс</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Подсветка</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Отношения</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Фокус</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Подсветить</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation>Нечистый</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Язык</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Использовать язык</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>Переводить стандартные теги</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation>Рендеринг</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation>Опции</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation><html><head/><body><p>В случае выбора при отображении контуров (Вид-Контуры) будет использоваться текущий стиль для цветов и заливки. Будет использовать фиксированная толщина. </p></body></html></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation>Использовать текущий стиль для рендеринга контуров</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation>Редактирование</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation>Быстрое редактирование</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation>Редактирование контуров</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation>Редактирование в полном рендере</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Стиль карты</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Каталог назначения стилей</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Текущий стиль</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Шаблон</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>Шаблон тега</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Встроенный</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Собственный</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Данные</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation>XAPI</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Документы</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation>Автоматически загружать документ шаблона</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Автоматически сохранить документ после передачи его на сервер</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>Треки</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation>…</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation>Необходимо перезапустить программу, чтобы изменения вступили в силу.</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation>Сглаживание</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation>Шаблон тега</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation>Nominatim (геокодинг)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation>GDAL</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation>Подтвердить проекцию</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>Ввод GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>Serial</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Порт</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Сервер</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>Сохранить журнал NMEA</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>Установить системное время по GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Сеть</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Настройки прокси сервера</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation>Использовать прокси</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation>Директория кеша</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation>Размер кеша (в МБ; 0 для отключения)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Пароль:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation>OSM API (ссылка, например, "http://www.openstreetmap.org/api/0.6")</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Пользователь:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Порт:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Адрес:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Адаптер карты</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation>Автоматически добавлять "исходный" тег, когда создается фоновая карта</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Инструменты</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Имя:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Путь:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Применить</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Добавить</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Удалить</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Английский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Арабский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation>Китайский (Тайвань)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation>Хорватский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Чешский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Голландский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Немецкий</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Французский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>Венгерский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation>Индонезийский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Итальянский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>Японский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Польский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Русский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation>Португальский (Бразилия)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Испанский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Шведский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Украинский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation>[менее 50%] Китайский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation>[менее 50%] Эстонский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation>[менее 50%] Финский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation>[менее 50%] Немецкий (Австрия)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation>[менее 50%] Португальский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation>[менее 50%] Словацкий</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation>[менее 50%] Вьетнамский</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Шаблон тега Merkaartor (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Выбрать цвет</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>Инструмент уже присутствует</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Инструмент с таким именем уже существует. +Выберите другое имя, либо нажмите <Apply>, если хотите изменить существующее</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>Невозможно удалить инструмент заготовки</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>Невозможно удалить инструмент заготовки "%1"</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>Невозможно изменить имя инструмента заготовки</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>Невозможно изменить имя инструмента заготовки "%1"'</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>Выберите исполняемый файл инструмента</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation>Выбрать шаблон документа</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation>Merkaartor документ (*.mdc)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>Выберите директорию для журналов</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation>Параметры проекций</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>Проекции</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation>Список проекций:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Имя:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>Строка PROJ4</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Применить</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Добавить</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Удалить</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation>Уточните проекцию</translation> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation>Документ</translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Публикация изменений</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation>Предопределенный</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation>Стандарт (EPSG:...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation>Пользовательский PROJ4(+proj=...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation>WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation>Ошибка в строке WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation>Невозможно экспортировать в формат PROJ4</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation>Неправильная строка WKT</translation> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Свойства</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>выбрано элементов %1/%1</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>выбрано элементов %1/%2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Выбранные объекты</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Свойства - Разные элементы</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Свойства - Точка</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation>Свойства - Линия</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Свойства - Отношение</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Свойства</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation>Ошибка при чтении файла шаблона</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Центр карты</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>Центрировать и масштабировать карту</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Выделить участника</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Каскадная очистка</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>Переместить точку %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation>Экспорт GPX...</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Отмена</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation>Импорт...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation>Импортировано: %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>Импорт osmChange</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>Импорт NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>Импорт NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation>Обнаружение дорог Bing</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation>Невозможно получить результат.</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation>Нет корректных данных.</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation>Невозможно обработать результат.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation>Оставить пустой комментарий к пакету правок?</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation>Отсутствует комментарий к пакету правок. Считается хорошим тоном по отношению к другим участникам проекта оставить содержательный комментарий, чтобы все знали что было изменено и с какой целью. +Вы все равно желаете оставить пустой комментарий?</translation> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation>Назначить тег '%1=%2' для %3</translation> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation>Удалить тег '%1' от %2</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Неверный</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation>Не зафиксировано</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation>Нет времени</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>Метры</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>км/час</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>Недоступно</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation>Исправление OK</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>Журнал ошибок GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Невозможнол создать файл журнала GPS: %1.</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation>Невозможно присоединить к %1:%2</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>Журнал ошибок GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Невозможнол создать файл журнала GPS: %1.</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Долгота</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Высота</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 метров</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation># Спутников</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Исправить опечатки</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Неверный</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Скорость</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 км/ч</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Широта</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>Нет потока с подходящими результатами!</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation>Настроить панели</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation>Действия</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation>Панели инструментов</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>Новый</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Удалить</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>Переименовать</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation>Восстановить всё</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>ОК</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Применить</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Отмена</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation>по возрастанию</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation>по убыванию</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation>Текущая панель действий</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation>< Р А З Д Е Л И Т Е Л Ь ></translation> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation>Настроить панель</translation> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation>Землепользование</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Члены</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation>Удалить выбранные элемент(ы):</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>Теги</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation>Добавить "исходный" тег</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation>Удалить выбранные тег(и)</translation> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>Теги</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation>Добавить "исходный" тег</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation>Удалить выбранные тег(и)</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Нет спутников</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation>Имя</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation>Поиск</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation>Результаты</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation>Нет результатов</translation> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Поиск объектов</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Ключ</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Значение</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Имя</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation>Запрос</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation>Максимальные возвращенные результаты (0 для всех)</translation> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation>Обновить слой</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Закрыть</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Стили</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Стили</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Передать на сервер Openstreetmap</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation>Комментарий</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation>Хороший комментарий должен коротко и адекватно описывать правку.</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation>Будут внесены следующие изменения:</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation>Добавлено</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation>Обновлено</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation>Удалено</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation>Линии</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation>Точки</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation>Отношения</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation>Сумма</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>ОК</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Отмена</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>Настройки сервера TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>Сервера TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Список серверов:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Имя:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Ссылка на сервер:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>Получить сервисы</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>Сервисы :</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation>Это стандартный TMS сервер.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Проекция:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Mercator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>Шир/Дол (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation>Начало координат в левом нижнем углу</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation>Размер мозаики:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation>Мин масштаб:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation>Максимальный масштаб:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation>значение "исходного" тега:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>Ссылка на лицензию:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Применить</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Добавить</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Удалить</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation>Merkaartor: GetServices</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>Адрес и путь не могуть быть пустыми.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation>Ошибка чтения сервисов. Сервер возможно не поддерживает эту функцию. +</translation> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Ключ</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Значение</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation>Редактор тегов</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation>Тег с таким наименованием уже существует.</translation> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>Добавить...</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation>ИЛИ</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>И</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation>НЕ</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation>является</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation>один_из</translation> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Неопределено</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Неопределено</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation>Нумеровать дома вдоль улицы</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation>Отсутствует нумерация домов</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>Количество зданий</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>Добавить нумерацию домов (схема Karlsruhe)</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation>Диапазоны</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>Например "1-9;15-17;19,19А"</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation>Шаблон</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Все номера</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>Нечётные номера</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>Чётные номера</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation>Опционально можно выбрать точку в области, и нумерация домов начнется с этого конца.</translation> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Извлечение - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation># сегментов трека</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Общее расстояние</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 км</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Общая продолжительность</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1ч %2м</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Извлечь редактируемый слой</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>Масштаб</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Закрыть</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>Точка трека</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Широта</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Долгота</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Теги</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation>Добавить "исходный" тег</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation>Удалить выбранные тег(и)</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Публикация изменений</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Сайт</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Пароль</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Логин</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Использовать прокси</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Порт</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>Масштаб</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Очистить</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>Настройки серверов WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>Сервера WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Список серверов:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Имя:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Ссылка на сервер:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Слои:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation>Название</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Проекция:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation>Разбить на квадраты</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>Уровни масштаба</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>Формат изображения:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Стили:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation>значение "исходного" тега:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>Ссылка на лицензию:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Применить</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Добавить</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Удалить</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: ПолучитьВозможности</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>Адрес и путь не могуть быть пустыми.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation>Слой без названия</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation>Без названия</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation>Это кэширующий WMS сервер</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation>WMS сервер не доступен: %1</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation>Невозможно получить возможности: %1</translation> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation>Загрузить изображение...</translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation>Имя файла</translation> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_sv.ts b/translations/merkaartor_sv.ts new file mode 100644 index 0000000..1cc17c9 --- /dev/null +++ b/translations/merkaartor_sv.ts @@ -0,0 +1,7367 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="sv" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>Om Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Ändringslogg</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>OK</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Beskrivning</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Kortkommando</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Importera</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Exportera</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>&Förvald</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Avbryt</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Redigerare för kortkommandon</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Ladda shema för genvägar</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Merkaartor shema för genvägar (*mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Kan inte öppna filen</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 kunde inte öppnas</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>Spara shema för genvägar</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>namnlös</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Alla filer (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Kan inte öppna sparad fil</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 kunde inte öppnas för skrivning</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Ingen beskrivning</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Formulär</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Formulär</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Ångra</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Centrera karta</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>Centrera && Zooma karta</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Ångra</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Rensa</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>Zooma</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>LÄGG TILL väg %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>LÄGG TILL spårpunkt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>LÄGG TILL relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>UPDATERA spårpunkt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>UPDATERA relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>UPDATERA väg %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>TA BORT spårpunkt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>TA BORT väg %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>TA BORT relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Fel vid uppladdningsbegäran</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Kontrollera ditt användarnamn och lösenord i menyn för inställningar</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Ett fel inträffade när den här förfrågan laddades upp (%1) +Meddelande från servern: %2</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +API-meddelande är '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Laddar upp ändringar...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>ÖPPNA ändringsset</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>STÄNG ändringsset</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Fel vid uppladdningsbegäran</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Kontrollera ditt användarnamn och lösenord i menyn för inställningar</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Ett fel inträffade när den här förfrågan laddades upp (%1) +Meddelande från servern: %2</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +API-meddelande är '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation>Det var ett problem med att ladda upp den här förfrågan (%1) +"%2" +Vänligen ladda ner de objekt som har problem igen för att lösa konfilkten.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>Kontrollerar ändringar...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>ÖPPNA ändringsset</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>STÄNG ändringsset</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>LÄGG TILL relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>LÄGG TILL väg %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>LÄGG TILL spårpunkt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>UPDATERA relation %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>UPDATERA väg %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>UPDATERA spårpunkt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>TA BORT spårpunkt %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>TA BORT väg %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>TA BORT relation %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>namnlös</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Skräplager</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Ladda upp lager</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Bakgrundsbilder</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>OSM export</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>Exportera OSM...</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Ladda ned</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Position</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Lägg till bokmärke</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Aktuell vy</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>Från kartan nedan (tillhandahållet av OpenStreetMap)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Ladda också ner GPS-spår</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>Lös alla relationer</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 nedladdat</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Nedladdning olöst...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>Nedladdning olöst %1 av %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>Analys olöst %1 av %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Tolkar...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Tolkar XML</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Konflikter från %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>Tomma vägar/relationer upptäckta</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Tomma vägar/relationer är troligen felaktiga. +Vill du markera de för borttagning?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Ta bort tomma tecken %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Konflikter har upptäckts</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>Detta innebär att några av tecknen du ändrade sedan senaste nedladdningen har modifierats av någon annan på servern. +Tecknen har duplicerats som "coflict_..." på "Conflicts..." lagret. +Före du kan ladda upp dina ändrngar måste du manuellt sammanfoga de två versionerna och ta bort den från "Conflicts..." lagret.</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Laddar upp...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Förbereder ändringar</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>Väntar på kontakt från servern</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Laddar ner...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Laddar ner från OSM (ansluter)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>Oväntad http statuskod (%1) +Meddelande från server: '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +API-meddelande är '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Nerladdning misslyckades</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Användarnamn/lösenord ogiltigt</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>Olösta konflikter</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>Lös först alla konflikter</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>Ladda ner spårpunkter %1-%2</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Laddar ner punkter</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Laddar ner %1, %2 (zoom %3)...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>Zooma</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Stäng</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Exportera</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>Vad vill du exportera?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Alla synliga (dvs. inte dolda)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>Visningsområde</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Valda</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Tecken</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Centrera karta</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>Centrera && Zooma karta</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Ladda ner saknade barn</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Lägg till i markering</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Ta bort</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Relationer</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Alla</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Tecken</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>Endast tecken helt inom vyn</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Sök...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>Återställ</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Dialogruta</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Namn</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Stäng</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>Filterinställning</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Filterlista:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Namn:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Verkställ</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Lägg till</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Ta bort</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>Tidsgräns för nätverk</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>Kan inte hämta fotots detaljer från Walking Papers server</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>Ange URL för Walking Papers</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Geobilder</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Centrera karta</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Ta bort bilder</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Kopiera filnamn från urklipp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Välj nästa bild</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>Sida ner</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Välj föregående bild</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>Sida upp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>Spara geotaggade bilder...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>Fotolager</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Ladda geotaggade bilder</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>Välj vilket lager som bilderna tillhör:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Laddade bilder ...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Avbryt laddning</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>Ingen sådan fil</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>Kan inte hitta bild "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Fel vid öppnande av "%2": +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Fel vid laddande av EXIF-data från "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>Ange offset</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>Placera bilderna mera till:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>slut på spåret</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>början på spåret</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>hh:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>Inga spårpunkter</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>Inga spårpunkter funna för bilden "%1"</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss 'sekunder'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm 'minuter och' ss 'sekunder'</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh 'timmar,' mm 'minuter och' ss 'sekunder</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>Fel bild?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>Bild "%1" togs %2 innan nästa spårpunkt registrerades.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>Bild "%1" togs %2 efter den sista spårpunkten registrerades.</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>JPEG bilder (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Fel vid öppnade av "%1": +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>Gå till</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Lägg till bokmärke</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>lonMin, latMin, lonMax, latMax</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>latCen, lonCen, latOmf, lonOmf</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Info</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>OSM API Url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>OSM XAPI url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Sök</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>Ogiltig URL för OSM</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>Den angivna URLen är ogiltig</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Ogiltigt format på koordinater</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>Koordinater måste vara på formatet: '<vänster lon>, <nedre lat>, <höger lon>, <övre lat>'</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>Koordinater måste vara på formatet: '<center lat>, <center lon>, <omf lat>, <omf lon>'</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Ingen</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>Formadapter</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>Zooma</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Stäng</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>WMS-adapter</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>TMS adapter</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Karta - Ingen</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Karta - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>Karta - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>Karta - WMS-Tiled - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Karta - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Karta - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Rutstorlek</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Projektion</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Dialogruta</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>Indata</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>OSM förhandsgranska</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Specifikationer</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>Första raden innehåller rubriker</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Avgränsare</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Semikolon (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Tabb</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Annat:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Ingen</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>Projektion (i PROJ4 format; lämna tomt för latitud/longitud)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Fält</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Importera</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>Importera omfång</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>Från (0 från start):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>Till (0 till slutet)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>Ladda inställningar...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>Spara inställningar...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Textsträng</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Heltal</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>Flyttal</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Longitud</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Latitud</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Ogiltig kartprojektion</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>Kan inte ställa in projektion</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>Inga koordinater</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>Fält för latitud eller longitud saknas. Det kommer inte vara möjligt att läsa in filen. +Vill du verkligen avsluta?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>Ladda CSV importinställningar</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Merkaartor importinställningar (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Ogiltig fil</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 kunde inte öppnas</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1 är inte en giltig fil för CSV import</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation>Spara CSV importinställningar</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>namnlös</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Alla filer (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation>Kan inte öppna spara importinställning</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 kunde inte öppnas för skrivning</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Info</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Storlek</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Tecken</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Visa alla</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Dölj alla</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Skrivskydda alla</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Skrivskydda ingen</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Stäng</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Lager</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Alla</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>Spår</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Formulär</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Synligt</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Skrivskyddad</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>Låg</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>Hög</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>Ogenomskinlig</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Ogenomskinlighet</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Fråga mig inte detta igen</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>&Hjälp</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Skapa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>&Redigera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>&Visa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Bokmärken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Fil</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Exportera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>Ver&ktyg</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>&Stil</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Nod</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>&Fönster</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Paneler</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>Tecken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>&Lager</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>Rel&ation</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>&Visa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>Huvudverktygsrad</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>&Avsluta</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>&Om</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>&Öppna</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Skapa ett nytt dokument och importera en fil</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>Zooma &alla</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>Zooma &fönster</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>Zoomfönster</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>Zooma &ut</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>Zooma &in</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Zooma in</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Böjd länk</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Ångra</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>&Gör om</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>&Flytta</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Importera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Importera en fil till aktuellt dokument</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Ladda ner</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Ladda ner kartdata för ett nytt område</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Länka</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Skapa länk</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Markera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>Ladda &upp</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Ladda upp ändringar till servern</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>&Ta bort</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Ta bort valda tecken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Skapa ny nod</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>&Ändra riktning</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Skapa rondell</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Ny</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>&Dela</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>&Sammanfoga</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>%Slå isär</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Slå isär</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>Re&lation</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Skapa relation</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>&Yta</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Skapa ny yta</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Exportera alla synliga lager till en fil</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Sök</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Sök och välj föremål</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>Exportera tecknes i vyn till en fil</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>&Slå ihop</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Slå ihop noder</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>Slå ihop valda noder (första valda blir kvar)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Spara</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Ladda ner mer</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Ladda ner mer kartdata för nuvarande vy</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Egenskaper</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>&Information</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>&Justera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Rikta in noder</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>Rikta in valda noder. Första två valda ger linjen.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation>&Sprid</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation>Sprid noder</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation>Räta och sprid valda noder lika</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>&Kopiera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>Kopiera valt tecken och taggar till urklipp</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>Kopiera valda teckens taggar till urklipp; om tecknet är en spårpunkt, kopiera också koordinaterna.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Klistra in taggar (&Skriv över)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>Klistra in (och skriv över) taggar från utklipp till det valda tecknet</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>Klistra in taggar (&Slå ihop)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Klistra in taggar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>Klistra in taggar från urklipp (Lägg till existerande taggar)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>Slå ihop taggar i urklipp med de för den valda tecknet.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Klistra in</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Klistra in tecken från urklipp</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>Klistra in tecken till urklipp; Om tecknens id redan finns i dokumentet, skriv över dem.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Överlämna tecken till skräplagret</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>&Bildlager</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>&Rasterbild/SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>&Starta</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>Starta GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>Återspela GPS-spår</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>S&toppa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>Stoppa GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>&Centrera på GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>Visa försköning</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Spela in</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>Spela in GPS-spår</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Pausa</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>Pausa GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>G&eorefererad bild</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>&Lägg till medlem</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>&Ta bort medlem</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>A&ldrig</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>&Alltid</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>&Koppla loss</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>&Stilar</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Kamera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Rotera</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Tecken</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>&Dela upp</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation>Dela upp segment lika</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>&Lås zoomning till rutad bakgrund</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>OsmChange (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Stäng</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>För&enkla</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation>Förenkla väg(ar)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation>Förenkla väg genom att ta bort onödiga delnoder</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>I&nga</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation>Dela yta mellan två noder</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>&Terrass</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation>Dela vald yta i "terrasserade" tomter</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Egenskaper...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Ladda ner saknade barn</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>Rensa tagg '%1' från %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>Rensa %1 taggar på %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Ta bort medlem '%1' från %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation>Ändra ordning på medlemmar till relation %1</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>Relation modifierad %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Skapa yta %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Yta: Skapa väg %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Lägg till ett hål</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Vill du lägga till (ytterligare) ett hål i den här ytan?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Yta: Slutför väg %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Yta: Lägg till nod %1 till väg %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>VÄNSTERKLICKA för att starta;DRAG till skala;SHIFT-DRAG för att rotera;VÄNSTER-KLICKA för att avsluta</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Skapa rondell %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Ta bort tecken %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Ta bart barn</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>VÄNSTERKLICKA för att välja; VÄNSTERDRAG för att flytta</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>Noder vid samma position funna</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>Vill du slå ihop alla noder vid punkten där du släppte?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Slå ihop noder till %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>VÄNSTERKLICKA till första hörnet -> VÄNSTER-DRAG till en yta -> VÄNSTERKLICKA för att zooma</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>GPS utbytesformat (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>OpenStreetMap filformat (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation>OpenStreetMap ändringsformat (*.osc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Noni GPSPlot-format (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>NMEA GPS logg-format (*.nmea, *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>KML-fil (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>Kommaseparerat format (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Geotaggad bild (*jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>ESRI Shapefil (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Format som stödjs</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Merkaartor-dokument (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Alla filer (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>ruta %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>Låg</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>Hög</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>Ogenomskinlig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Tecken</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Nod</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Relation</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Ladda bild</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>Lägg till nodposition till bild</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation>Geotagga bild från denna position</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Avbryt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>Redigera</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>Vy</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>Visa</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>Riktningspilar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Lager</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>Skapa</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Väg</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Verktyg</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>Fönster</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>Hjälp</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Urklipp ogiltig</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>Urklipp innehåller inte giltiga data</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Osparade ändringar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>Den aktuella kartan innehåller osparade ändringar som kommer förloras när en ny skapas. +Vill du avbryta skapandet av en ny karta eller fortsätta och förkasta ändringarna?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Vägpunkter</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>Spår %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Stor Fet Varning Angående Upphovsrätt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Du försöker importera en KML-fil. Observera att: + - Du kan inte importera en KML-fil skapad från Google Earth till OSM. Även om du + kanske tror att noder skapade från GE är dina så är de inte det! + De är fortfarande ett härlett arbete från GE och kan därför inte användas i OSM. + + - Om du laddade ner det från internet, kan det vara upphovsrättskyddat. + Var absolut säker på att skaparen av datan tillåter att de används i OSM eller att de är + i Public Domain (det finns ingen upphovsrätt på de) + +Om du är osäker, vänligen fråga på OpenStreetMaps mailinglistor "legal" eller "talk". + +Är du helt säker på att upphovsrätten för denna KML-fil tillåter att den importeras till OSM?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>Ingen giltig fil</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 kunde inte öppnas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>Gammal version av Qt upptäckt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>Din installation använder Qt %1, vilket innehåller en del kända fel med uppladdning till OpenStreetMap,vilket leder till 401-felmeddelanden från servern. Är du säker på att du vill fortsätta (ej rekommenderat). +För mer information se http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor (på engelska)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>Ladda upp OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Det verkar som att du inte har angett +ditt användarnamn och lösenord för OSM. +Vill du göra detta nu?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Fel vid nedladdning</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>Kartan kunde inte laddas ner</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Skapa polygon</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>Ange antal sidor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Tvinga uppladdning av tecken</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Skapa knutpunkt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Flera skärningspunkter</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>Dessa vägar har flera skärningar. +Vill du fortfarande skapa en korsning för varje (Oönskade skärningar kan fortfarande tas bort efteråt)?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Lägg till gatnummer</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation>Antal segment att dela upp i</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Rikta in noder</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation>Sprid noder</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>Lösgör nod %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Lägg till medlem till relation</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Ta bort medlemmar från relationer</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>Dela yta</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation>Gör yta till husrad med %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Skapa relation %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Spara stil för karta</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Merkaartor kartstil (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Ladda kartstil</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>namnlös</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Spara Merkaartor-dokument</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Merkaartor dokumentfiler (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>Kan inte öppna sparad fil</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 kunde inte öppnas för skrivning</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Ogiltig fil</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 är inte en giltig Merkaartor-fil</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>Exportera OSM-format</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>OSM filer (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>Exportera osmChange</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>osmChange filer (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Exportera GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>GPX-filer (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Exportera KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>KML-filer (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (int)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Lägg till bokmärke</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Ange ett namn för bokmärket</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Ogiltigt namn på bokmärke</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>Bokmärke kan inte vara tom</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Varning: Bokmärkesnamn finns redan</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Skriv in en ny; behåll samma för att skriva över eller avbryta.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Ta bort bokmärke</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Välj bokmärke att ta bort</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Ogiltig kartprojektion</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>Kan inte sätta projektion "%1".</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>GPS-fel</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>Kan inte öppna port för GPS.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>Öppna NMEA loggfil</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>Spara mall för taggar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Merkaartor taggmallar (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>Öppna taggmall</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>Olösta konflikter</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>Lös först alla konflikter</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Det är starkt rekommenderat att spara dina ändringar i dokumentet efter en uppladdning. +Vill du göra detta nu?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>sista: </i><b>%1</b> av <b>%2</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>sista: </i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>lager: </i><b>%1</b&gt; </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Vägpunkt</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>koord</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>beskrivning</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>kommentar</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Nod</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>höjd</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>hastighet</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>storlek</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>medlemmar</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>Övre vänster</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>Nedhöger</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Relation</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Roll</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Medlem</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Längd</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Storlek</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>%1 noder</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Yta</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Väg</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 m</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>Vy</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Projektion</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Nytt bokmärke</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>Uppladdning av inställningar misslyckades</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Duplicera nyckel</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Mer än 150 preferenser</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Ny server</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Formulär</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>Taggar</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>Valda objekt</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Namn</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Okänt fält</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Fel!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>Namnsöksservice kräver autentisering</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Formulär</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>Utdatafilnamn</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>namnlös</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Alla filer (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Bildfil (*.png, *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>SVG-filer (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation>Raster/SVG export</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>min lat/long</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>max. lat/long</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>Visa skala</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Formulär</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Användare:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Redigerare för kartstil</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Global</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Bakgrund</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Propertionell tjocklek</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>fast tjocklek</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>Filter</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Lägg till</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Ta bort</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Duplicera</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>Taggurval</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>meter/bildpunkter</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>Synligt upp till</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>Synligt från skala</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Rita med färg</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Streckad</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>av</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Fyll yta</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Kanter</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>Försköning</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Rita trappsteg</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Rita ikon</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Etikett</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Teckensnitt</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Etikett tagg</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Halo</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Yta</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Rita med bakgrundsfärg</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Etikett med bakgrundstagg</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Alltid</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Välj färg</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>Ingen giltig geotagg</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>Textetikett</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>Ladda utan associerad nod</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>Hämta info från streckkod (Walking Papers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>Ignorera</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>Utför för alla nuvarande foton</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Dialogruta</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>Utdatafilnamn</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>namnlös</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>SVG-filer (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Alla filer (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Bildfil (*.png, *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Inställningar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>Visuell</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Allmänt</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Ogenomskinlighet låg/hög</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>Enkel musknapp interakton</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>Använd skräddarsydd Qt-stil</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>Relationer valbara när de är gömda</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Färger</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Bakgrund</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>Skriv över stil</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>GPX-spår</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>Bildpunkter</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Gränssnitt</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Sväva</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Relationer</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Fokusera</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Framhäva</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Språkanpassning</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Använd språk</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>Översätt standardtaggar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Kartstil</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Mapp för anpassade stilar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Aktuell stil</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Mall</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>Taggmall</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Inbyggd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Anpassad</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Data</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Dokument</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Autospara dokument efter uppladdning</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>Spår</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Värdnamn:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>Spara NMEA-logg</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>Sätt systemtid till GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Nätverk</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Proxyinställningar</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Lösenord:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Användare:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Port:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Värd:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Kartanpassning</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Verktyg</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Namn:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Sökväg:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Verkställ</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Lägg till</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Ta bort</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>Engelska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Arabiska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Tjeckiska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Nederländska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>Tyska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>Franska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>Ungerska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Italienska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Polska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Ryska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Spanska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Svenska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Ukrainska</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Merkaartor taggmall (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Välj färg</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>Verktyg finns redan</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Ett verktyg med det här namnet finns redan. +Välj ett annat namn eller klicka på <Apply> knappen om du vill ändra den nuvarande.</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>Kan inte ta bort snabbväljare</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>Kan inte ta bort snabbväljare "%1"</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>Kan inte modifiera snabbväljares namn</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>Kan inte modifiera snabbväljare "%1"s namn</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>Välj verktyg körbar fil</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>Välj mapp för logg</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation>Inställning av projektioner</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>Projektioner</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation>Projektionslista:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Namn:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>PROJ4 textsträng</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Verkställ</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Lägg till</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Ta bort</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Dialogruta</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Egenskaper</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 valda objekt</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 valda objekt</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Valda objekt</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Egenskaper - Flera element</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Egenskaper - Nod</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Egenskaper - Relation</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Egenskaper</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Centrera karta</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>Centrera && Zooma karta</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Välj medlem</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Kaskadrensning</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>Flytta nod %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Avbryt</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>Importera osmChange</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>Importera NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>Importera NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Ogiltig</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>meter</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>Otillgänglig</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>Fel på GPS-logg</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Kan inte skapa GPS-loggfil: %1</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation>Kan inte koppla upp till %1: %2</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>Fel på GPS-logg</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Kan inte skapa GPS-loggfil: %1</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>Textetikett</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99''</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Longitud</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Altitud</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 meter</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation># satelliter</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Fixa typ</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Ogiltig</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Hastighet</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 km/h</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Latitud</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>Inte en riktig resultatström</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation>Verktygsfält</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>Ny</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Ta bort</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>Byt namn</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation>Återställ alla</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Verkställ</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Avbryt</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation>Upp</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation>Ner</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Formulär</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Medlemmar</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>Taggar</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Formulär</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>Taggar</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Inga satelliter</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Urval</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Tangent</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Värde</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Namn</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation>Fråga</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Stäng</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Stilar</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Stilar</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Ladda upp till OpenStreetMap</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Avbryt</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>TMS-servrar inställningar</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>TMS-servrar</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Serverlista:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Namn:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>URL till server:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>Hämta tjänster</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>Tjänster :</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projektion:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>Mercator (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>Lat/Lon (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation>Referenspunkt är nedre vänster</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Verkställ</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Lägg till</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Ta bort</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>Adress och sökväg kan inte lämnas tomma</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Tangent</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Värde</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>Ändra detta för att lägga till...</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Formulär</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation>ELLER</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>OCH</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation>INTE</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation>är</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation>ärenav</translation> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Odefinierat</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Odefinierat</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation>Husrad</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation>Ingen husnumrering</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>Antal hus</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>Lägg till husnumrering</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation>Intervall</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>Till exempel "1-9;15-17;19;19A"</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation>Mönster</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>Alla nummer</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>Udda nummer</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>Jämna nummer</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Extrahera - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation># av spårsegment</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Totalt avstånd:</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 km</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Total varaktighet</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1:%2</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Extrahera ritlager</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>Zooma</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Stäng</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>Spårpunkt</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Latitud</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Longitud</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Taggar</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Dialogruta</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Webbsida</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Lösenord</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Användarnamn</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Använd proxy</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>Zooma</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Töm</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>Ställ in WMS-servrar</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>Server för WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Serverlista:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Namn:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>URL till server:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Lager:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Projektion:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>Zoom-nivåer</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Stilar:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Verkställ</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Lägg till</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Ta bort</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: GetCapabilites</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>Adress och sökväg kan inte lämnas tomma</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_uk.ts b/translations/merkaartor_uk.ts new file mode 100644 index 0000000..6720906 --- /dev/null +++ b/translations/merkaartor_uk.ts @@ -0,0 +1,7369 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="uk" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>Про Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>Ця програма ліцензована на умовах GNU General Public License v2</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Версія Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Версія Qt</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>Версія GDAL</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>Перелік змін</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>Так</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>Опис</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>Комбінації клавіш</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>&Імпортувати</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>&Експорт</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>За&звичай</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>&Так</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>&Скасувати</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>Редактор комбінацій клавіш</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>Завантажити схеми комбінацій клавіш</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Схеми комбінацій клавіш Merkaartor (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>Неможливо відкрити файл</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 неможливо відкрити.</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>Зберегти схему комбінації клавіш</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>без назви</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>Всі файли (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>Неможливо відкрити збережений файл</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 неможливо відкрити для запису.</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation>Створити Міст</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation>Нажаль, я не знаю як створити міст з ЦЬОГО. Будь ласка, дайте мені тільки дві точки.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation>Перетворює відрізок на міст</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation>Виділений відрізок вже позначений як міст/тунель. Переконайтесь, що ви знаєте що робите.</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation>Не підтримується: Здається міст складається більше ніж з однієї лінії.</translation> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>Немає опису</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>Вид</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>Вид</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation>Точність (метрів на відрізок)</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation>Тип</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>Відмінити</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>Центрувати мапу</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>Центрувати та масштабувати мапу</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>Відмінити</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>Очистити</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>Масштаб</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>ДОДАНО дорогу %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>ДОДАНО точку шляху %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>ДОДАНО відношення %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>ОНОВЛЕНО точку шляху %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>ОНОВЛЕНО відношення %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>ОНОВЛЕНО дорогу %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>ВИЛУЧЕНО точку шляху %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>ВИЛУЧЕНО дорогу %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>ВИЛУЧЕНО відношення %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>Помилка запиту надсилання даних</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Будь ласка, перевірте ваш логін та пароль в меню Параметри</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Помилка запиту на надсилання даних: (%1) +Повідомлення сервера: '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +повідомлення API: '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>Надсилання змін…</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>ВІДКРИВАЮ набір змін</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>ЗАКРИВАЮ набір змін</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>Помилка запиту надсилання даних</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>Будь ласка, перевірте ваш логін та пароль в меню Параметри</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>Помилка запиту на надсилання даних: (%1) +Повідомлення сервера: '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +повідомлення API: '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>ВІДКРИВАЮ набір змін</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>ЗАКРИВАЮ набір змін</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>ДОДАНО відношення %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>ДОДАНО дорогу %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>ДОДАНО точку шляху %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>ОНОВЛЕНО відношення %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>ОНОВЛЕНО дорогу %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>ОНОВЛЕНО точку шляху %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>ВИЛУЧЕНО точку шляху %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>ВИЛУЧЕНО дорогу %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>ВИЛУЧЕНО відношення %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>без назви</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>Шар чернетки</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>Надісланий шар</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>Фонове зображення</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>Завантажити</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>Місце знаходження</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>Закладка</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>Поточний вид</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>З мапи нижче (мапу надано проектом OpenStreetMap)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>Завантажити необроблені треки GPS</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>Розв’язати усі відношення</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 завантажено</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>Завантаження нерозв’язуваних елементів…</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>Завантажується нерозв’язуваний елемент %1 з %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>Обробка: нерозв’язуваний елемент %1 з %2</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>Обробка…</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>Обробка XML</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>Конфлікт з %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>Знайдено порожні дороги/відношення</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>Порожні дороги/відношення, можливо помилка. +Бажаєте позначити їх для вилучення?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>Вилучення порожнього елементу %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>Виявлено конфлікти</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>Це значить , що для частини елементів, які ви змінили з моменту останнього завантаження хтось запровадив зміни на сервері. +Елементи продубльовані у шарі "Конфлікти" як "conflict_…". +Для того, щоб отримати можливість надіслати ваші зміни до сервера, вам потрібно власноруч об’єднати обидві версії та вилучити одну з них з шару "Конфлікти".</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>Відправка…</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>Підготовка змін</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>Очікується відповідь сервера</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>Завантаження…</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>Завантаження з OSM (з’єднуємось з сервером)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>Неочікуваний код статусу http (%1) +Відповідь сервера '%2'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +повідомлення API: '%1'</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>Невдача завантаження</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>Хибні логін/пароль</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>Нерозв’язувані конфлікти</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>Будь ласка, розв’яжіть поточні конфлікти</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>Завантажуються точки треку %1-%2</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>Завантаження точок</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>Завантажується %1,%2 (масштаб %3)…</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>Масштаб</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>Закрити</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>Експорт</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>Що експортувати?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>Все що видно (тобто не сховане)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>Вміст екрану</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>Виділене</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>Елементи</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>Центрувати мапу</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>Центрувати та масштабувати мапу</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>Завантажити відсутніх нащадків</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>Додати до виділення</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>Вилучити</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>Відношення</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>Всі</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>Елементи</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>Тільки елементи з екрану</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>Пошук…</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>Скинути</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Надсилання змін</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>Назва</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>Фільтр</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>Закрити</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>Встановлення фільтрів</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>Фільтри</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>Перелік фільтрів:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Назва:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>Фільтр</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Застосувати</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Додати</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Вилучити</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>Затримка мережі</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>Гео-зображення</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>Центрувати мапу</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>Вилучити зображення</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>Копіювати ім’я файлу до буферу обміну</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>Вибрати наступне зображення</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>PgDown</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>Вибрати попереднє зображення</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>PgUp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>Завантажити зображення з гео-позначками</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>Оберіть шар до якого належать зображення:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>Завантаження зображень:…</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>Скасування завантаження</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>Немає такого файлу</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>Неможливо знайти зображення "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>Помилка відкриття "%2": +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>Помилка завантаження EXIF-даних з "%1".</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>Вкажіть координати</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>Координати зображення більші за:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>кінець треку</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>початок треку</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>гг:хх:сс</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>Точки треку відсутні</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>Точки треку для зображення "%1" відсутні</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>сс 'секунд’</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>хх 'хвилин’ та сс 'секунд’</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>гг 'годин’, хх 'хвилин’ та сс 'секунд’</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>Помилкове зображення?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>Зображення "%1" отримане %2 до того як була записана подальша точка шляху. +Ви бажаєте застосувати його?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>Зображення "%1" отримане %2 після того як була записана остання точка шляху. +Ви бажаєте застосувати його?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>Помилка відкриття "%1": +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>Перейти до</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>Закладка</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation>Координати</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>довМін, ширМін, довМакс, ширМакс</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>ширЦ-р, довЦ-р, ширВідст, довВідст</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>Інформація</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>OSM API Url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>OSM XAPI url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>Пошук</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>Хибний OSM url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>Вказаний url — хибний!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>Хибний формат координат</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>Координати задаються рядком: '<left lon>, <bottom lat>, <right lon>, <top lat>'</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>Координати задаються рядком: '<center lat>, <center lon>, <span lat>, <span lon>'</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>Немає</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>Адаптер форм</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>Масштаб</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>Закрити</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>WMS адаптер</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>TMS адаптер</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>Втулки</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>Мапа - Немає</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>Мапа - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>Мапа - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>Мапа - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>Ліцензійні умови: %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>Ліцензійні умови не прийняті</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation>Ви не позначили прапорцем вашу згоду з ліцензійними умовами. +В цьому випадку ви не можете використовувати це джерело як фон для мапи. +Ви це мали на увазі?</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>Сервер</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>Розмір квадрату</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>Проекція</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>Надсилання змін</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>Специфікації</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>Розділювач</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>Крапка з комою (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Табуляція</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>Інше:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>Немає</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>Поля</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>Імпортувати</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>Рядок</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>Ціле число</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>Довгота</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>Широта</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>Помилкова проекція</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>Хибний файл</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 неможливо відкрити.</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>без назви</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>Всі файли (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 неможливо відкрити для запису.</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>Інформація</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>Розмір</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>Елементи</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>Показати все</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>Сховати все</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>Все тільки для читання</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>Редагований</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>Закрити</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>Шари</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>Всі</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>Треки</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>Подвійна дорога</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>Видимий</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>Тільки для читання</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>прозорий</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>напівпрозорий</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>непрозорий</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>Непрозорість</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>Не питати в майбутньому</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>&Довідка</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>&Створити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>П&равка</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>&Вид</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>&Закладки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>&Файл</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>&Експорт</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>Інстру&менти</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>&Стиль</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>&Точка</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>В&ікно</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>&Панелі</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>&Елементи</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>&Шари</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>Від&ношення</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>Ви&хід</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>Про &Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>&Відкрити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>Створити новий документ та імпортувати файл</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>Показати &все</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>Змінити &масштаб</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>Змінити масштаб</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>Від&далити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>Набл&изити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>Наблизити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>Звивисте з’єднання</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>&Відміна</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>&Повернути</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>&Пересунути</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>&Імпортувати</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>Імпортувати файл до поточного документу</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>&Завантажити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>Завантажити дані мапи для нової ділянки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>Зв’язки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>Створити зв’язок</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>&Виділити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>&Відправити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>Відправити зміни до сервера</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>Ви&лучити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>Вилучити виділені елементи</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>Створити нову точку</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>&Змінити напрямок</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>Створити кільце</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>&Новий</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>&Розділити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>&Приєднати</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>Від&окремити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>Відокремити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>&Відношення</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>Створити Відношення</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>Ді&лянка</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>Створити нову ділянку</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>Експортувати усі видимі шари до файлу</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>Пошук</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>Знайти та вибрати об’єкти</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>Експортувати вміст області перегляду до файлу</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>З’&єднати</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>Об’єднання точок</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>З’єднати вибрані точки (залишається перша вибрана точка)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>&Зберегти</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>Завантажити ще</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>Завантажити більше даних мапи для поточної ділянки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>&Властивості</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>&Інформація</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>Ви&рівняти</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>Вирівняти точки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>Вирівняти обрані точки. Перші дві обрані точки створюють лінію.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>&Копіювати</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>Копіювати виділені елементи та теґи до буферу обміну</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>Копіювати теґи обраних елементів до буферу обміну, якщо елементом є точка треку — скопіювати також координати.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>Вставити теґи (&перезаписати)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>Вставити (та замінити) теґи з буферу обміну у виділені елементи..</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>Вставити теґи (&об’єднати)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>Вставити теґи</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>Вставити теґи з буферу обміну (Об’єднати з існуючими теґами)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>Об’єднати теґи з буферу обміну з теґами виділених елементів..</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>Вставити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>Вставити елементи з буферу обміну</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>Вставити елемент з буферу обміну; якщо ідентифікатор елементу вже присутній у документі — переписати його.</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>Перенести елементи на шар-чернетку</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>Шар &зображень</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>&Старт</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>Розпочати роботу з GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>Відтворити інформацію GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>&GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>С&топ</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>Зупинити роботу із GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>&Центрувати за GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>Показати підказки</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>Запис</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>Записати інформацію з GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>Пауза</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>Призупинити запис інформації з GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>G&eoImage</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>&Додати елемент</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>&Вилучити елемент</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>&ніколи</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>&завжди</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>&Від’єднати</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>Векторний малюнок (SVG)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>&Стилі</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>Камера</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>Обертання</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>Елементи</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>Закрити</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>Властивості…</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>Завантажити відсутніх нащадків</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>Стерто теґ '%1' для %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>Вилучити елемент%1 з відношення %2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>Відношення %1 змінено</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>Створити Ділянку %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>Ділянка: Створити дорогу %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>Додати отвір.</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>Бажаєте додати ще один отвір до цієї ділянки?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>Ділянка: Закінчити дорогу %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>Ділянка: Додати точку %1 до дороги %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>ЛІВИЙ-КЛАЦ — розпочати; ТЯГТИ — зміна масштабу; SHIFT-ТЯГТИ — обертання; ЛІВИЙ-КЛАЦ — закінчити</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>Створити кільце %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>Вилучення елементу %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>Вилучити нащадків.</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>ЛІВИЙ-КЛАЦ — виділити; ЛІВИЙ-ТЯГНИ — пересування</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>Знайдено точку у тому ж місці.</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>Чи бажаєте з’єднати точки у цьому місці?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>Об’єднати точки в %1</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>ЛІВИЙ-КЛАЦ — перший кут; ЛІВИЙ-ТЯГТИ — позначення ділянки; ЛІВИЙ-КЛАЦ — масштабувати</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>Формат обміну GPS даними (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>Формат OpenStreetMap (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Формат Noni GPSPlot (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>Формат GPS даних NMEA (*.nmea *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>Файли KML (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>Малюнки позначені геотеґами (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>Шейпфайли ESRI (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>Підтримувані формати</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Документи Merkaartor (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>Всі файли (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>квадрат %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>прозорий</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>напівпрозорий</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>непрозорий</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>Елемент</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>Точка</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>Відношення</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>Завантажити зображення</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>Відміна</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>Шари</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>Шлях</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>Інструменти</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>Хибні дані буферу обміну</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>Буфер обміну не містить відповідних даних.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>Не збережені зміни</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>Поточна мапа містить не збережені зміни, що будуть втрачені, якщо почати редагування нової мапи. +Чи бажаєте скасувати створення нової мапи або продовжити та втратити усі зміни?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>Точки дороги</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>Трек %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>Велике жирне попередження про Авторські права</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>Ви намагаєтесь імпортувати KLM-файл. Зважте наступне: + + - Ви не можете імпортувати KLM-файли створені у Google Earth. Ви вважаєте, + що точки створені з GE ваші, насправді це на так! + Вони все одно лишаються похідними від GE і тому, чорт забирай, не можуть + бути використані в OSM. + + - Якщо ви завантажили їх з Інтернет, є шанс, що вони захищені авторським + правом. Будь ласка, переконайтесь, що у вас є дозвіл від автора на + їх використання в OSM або, що вони є суспільним надбанням. + +У разі невпевненості звертайтесь до оголошень у списках розсилки "legal" чи + "talk" від openstreetmap. + +Ви впевнені, що цей KLM-файл може буде імпортований до OSM на законних підставах?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>Відповідні файли відсутні</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 неможливо відкрити.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>Виявлено стару версію Qt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>Ви використовуєте Qt версії %1, яка містить деякі відомі помилки надсилання даних до OpenStreetMap, починаючи з коду 401. Ви впевнені, що бажаєте продовжити (але ми не радимо вам це робити)? +За докладною інформацією звертайтесь до http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>Надсилання даних OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>Ви не зазначили в налаштуваннях ваш +логін та пароль до OpenStreetMap. +Бажаєте зробити це зараз?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>Помилка завантаження</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>Неможливо завантажити мапу</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>Створити багатокутник</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>Вкажіть кількість кутів</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>Швидке надсилання елементів</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>Створити перехрестя</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>Багатократне перетинання.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>Ці дороги мають багатократне перетинання. +Ви все ще бажаєте створити перехрестя для кожного перетинання (небажані перехрестя після цього можна вилучити)?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>Додати номер вулиці</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>Вирівняти точки</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>Від’єднати точку %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>Додати елемент до відношення</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>Вилучити елемент з відношення</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>Створити Відношення %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>Зберегти стиль мапи</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Стиль мапи Merkaartor (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>Завантажити стиль мапи</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>без назви</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>Зберегти документ Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Файли документів Merkaartor (*.mdc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>Неможливо відкрити збережений файл</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 неможливо відкрити для запису.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>Хибний файл</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 — не є вірним документом Merkaartor’а.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>Експорт даних OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>Файли OSM (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>Експорт GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>Файли GPX (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>Експорт KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>Файли KML (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (int)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>Додати закладку</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>Вкажіть ім’я закладки.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>Помилкове ім’я закладки</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>Закладка не може бути порожньою.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>Попередження: закладка з таким ім’ям вже існує</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>Введіть нове значення, лишить теж саме, щоб перезаписати або натисніть скасувати.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>Вилучити закладку</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>Оберіть закладку для вилучення.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>Помилкова проекція</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>Неможливо встановити проекцію. "%1".</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>помилка GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>Неможливо відкрити порт GPS.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>Відкрити файл журналу NMEA</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>Зберегти шаблони теґів</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Шаблони теґів Merkaartor (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>Відкрити шаблони теґів</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>Нерозв’язувані конфлікти</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>Будь ласка, розв’яжіть поточні конфлікти</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>Ми радимо зберегти зміни у вашому документі після його відправи. +Бажаєте зробити це зараз?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>ост.: </i><b>%1</b> от <b>%2</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>ост.: </i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>Точки дороги</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>коорд</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>опис</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>коментар</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>Точка</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>висота</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>швидкість</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>розмір</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>Верхній лівий кут</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>Правий нижній кут</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>Відношення</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>Роль</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>Член</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>Довжина</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>Розмір</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>точок - %1</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>Ділянка</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>Шлях</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 м</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 км</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>Проекція</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>Нова Закладка</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>Невдача завантаження параметрів</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>Дублювати ключ</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>Більше ніж 150 параметрів</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>Новий сервер</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>Подвійна дорога</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>Теґи</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>Обрані елементи</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>Назва</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>Невідоме поле</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>Помилка!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>Сервер сервісу пошуку назв потребує автентифікації.</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>Подвійна дорога</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>Ім’я вихідного файлу</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>без назви</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>Всі файли (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>Файли зображень (*.png *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>Файли SVG (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>мін дов/шир</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>макс дов/шир</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>Показати Масштаб</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>Подвійна дорога</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>Логін:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>Редактор стилів мапи</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>Загальні параметри</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>Фон</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>Пропорційна товщина</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>Фіксована товщина</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>Додати</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>Вилучити</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>Дублювати</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>Вибір теґу</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>метрів на піксель</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>Показувати при</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>Показувати при масштабі</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>Креслити кольором</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>Пунктир</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>проміжок</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>Залити ділянку кольором</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>Межі</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>Підказки</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>Креслити кроки</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>Показати піктограму</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>Мітки</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>Шрифт</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>Теґ мітки</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>Ореол</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>Ділянка</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>Залити фон кольором</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>Мітка з позначкою фону</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>Завжди</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>Виберіть колір</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Надсилання змін</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>Ім’я вихідного файлу</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>без назви</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>Файли SVG (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>Всі файли (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>Файли зображень (*.png *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>Параметри</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>Вигляд</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>Загальний</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>Непрозорість мін/макс</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>Миша з однією кнопкою</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>Власний стиль Qt</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>Зв’язки можна виділяти, коли вони приховані</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>Кольори</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>Фон</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>Замінити стиль</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>Треки GPX</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>Пікселів</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>Інтерфейс</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>Під вказівником</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>Відношення</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>Обране</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>Підсвічування</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>Мова</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>Використовувати мову</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>Перекладати стандартні теґи</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>Стиль мапи</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>Тека власних стилів</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>Поточний стиль</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>Шаблони</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>Шаблон теґів</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>Вбудований</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>Власний</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>Дані</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>Документи</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>Автоматично зберігати документ після надсилання</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>Треки</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>Послідовний</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>Порт</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>Хост</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>Зберегти журнал NMEA</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>Встановити системний час по GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>Мережа</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>Параметри проксі сервера</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>Пароль:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>Логін:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>Порт:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>Адреса:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>Адаптер мапи</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>Інструменти</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>Назва:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>Путь:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>Застосувати</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>Додати</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>Вилучити</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>English — Англійська</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>Arabic — Арабська</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>Czech — Чеська</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>Голландська</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>German — Німецька</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>French — Французька</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>Italian — Італійська</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>Polish — Польська</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>Russian — Російська</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>Іспанська</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>Шведська</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>Українська</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Шаблон теґів Merkaartor (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>Виберіть колір</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>Інструмент вже існує</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>Інструмент з таким іменем вже Існує. +Оберіть інше ім’я, або натисніть <Apply>, якщо бажаєте змінити існуючий</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>Неможливо вилучити предналаштований інструмент</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>Неможливо вилучити предналаштований інструмент "%1"</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>Неможливо змінити предналаштований інструмент</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>Неможливо змінити предналаштований інструмент "%1"</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>Вкажіть виконавчий файл інструмента</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>Вкажіть теку для журналів</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>Назва:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>Застосувати</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>Додати</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>Вилучити</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>Надсилання змін</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>Властивості</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>обрано елементів %1/%1</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>обрано елементів %1/%2</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>Обрані елементи</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>Властивості - Кілка елементів</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>Властивості — Точка</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>Властивості - Відношення</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>Властивості</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>Центрувати мапу</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>Центрувати та масштабувати мапу</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>Вкажіть членів</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>Каскадне очищення</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>Пересунути точку %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>Відміна</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>Імпорт NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>Імпорт NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>Хибне</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>Метри</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>км/г</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>Недоступно</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>2D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>3D</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>Помилка запису GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Неможливо створити файл журналу GPS:%1.</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>Помилка запису GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>Неможливо створити файл журналу GPS:%1.</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>TextLabel</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>Довгота</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>Висота</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 метрів</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation>Супутники — #</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>Позиціювання</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>Хибне</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>Швидкість</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 км/г</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>Широта</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>Не відповідний потік результатів!</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>Вилучити</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>Так</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>Застосувати</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>Відміна</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>Подвійна дорога</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>Члени</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>Теґи</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>Подвійна дорога</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Ідентифікатор</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>Теґи</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>Супутники відсутні</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>Пошук елементів</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>Ключ</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>Значення</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>Назва</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Ідентифікатор</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>Закрити</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>Стилі</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>Стилі</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>Надіслати до Openstreetmap</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>Так</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>Відміна</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>Налаштування серверів TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>Сервери TMS</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Перелік серверів:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Назва:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Адреса сервера (URL):</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Проекція:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation>Розмір квадрату:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>Застосувати</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>Додати</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>Вилучити</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>Адреса та путь не можуть бути порожніми.</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>Ключ</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>Значення</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>Змініть, щоб додати…</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>Подвійна дорога</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>Невизначений</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>Невизначений</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>Видобування - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation>сегментів треку — #</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>Загальна відстань</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 км</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>Загальна тривалість</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1г %2хв</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>Видобути шар,що редагується</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>Масштаб</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>Закрити</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>Точка треку</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>Широта</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>Довгота</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Ідентифікатор</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>Теґи</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>Надсилання змін</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>Сайт</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>Пароль</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>Логін</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>Використовувати проксі</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Порт</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>Масштаб</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>Очистити</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>Налаштування серверів WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>Сервери WMS</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>Перелік серверів:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>Назва:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>Адреса сервера (URL):</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>Шари:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>Проекція:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>Стилі:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>Застосувати</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>Додати</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>Вилучити</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor: Отримання властивостей</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>Адреса та путь не можуть бути порожніми.</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/translations/merkaartor_zh_TW.ts b/translations/merkaartor_zh_TW.ts new file mode 100644 index 0000000..41d2706 --- /dev/null +++ b/translations/merkaartor_zh_TW.ts @@ -0,0 +1,7392 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="zh_TW" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <location filename="../src/common/AboutDialog.ui" line="14"/> + <source>About Merkaartor</source> + <translation>關於 Merkaartor</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="99"/> + <source>PROJ version</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="159"/> + <source>This program is licensed under the GNU General Public License v2</source> + <translation>本程式以GNU通用公共授權條款第二版授權</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="59"/> + <source>Merkaartor version</source> + <translation>Merkaartor 版本</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="89"/> + <source>Qt version</source> + <translation>Qt 版本</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="109"/> + <source>GDAL version</source> + <translation>GDAL 版本</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="152"/> + <source>Copyright Bart Vanhauwaert, Chris Browet, Ladislav Láska and others, 2006-2021</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="185"/> + <source>Changelog</source> + <translation>變動紀錄</translation> + </message> + <message> + <location filename="../src/common/AboutDialog.ui" line="228"/> + <source>OK</source> + <translation>確定</translation> + </message> +</context> +<context> + <name>ActionsDialog</name> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Description</source> + <translation>描述</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="21"/> + <source>Shortcut</source> + <translation>快捷鍵</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="46"/> + <source>&Import</source> + <translation>匯入(&I)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="47"/> + <source>&Export</source> + <translation>匯出(&E)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="48"/> + <source>&Default</source> + <translation>預設值(&D)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="49"/> + <source>&OK</source> + <translation>確定(&O)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="50"/> + <source>&Cancel</source> + <translation>取消(&C)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="77"/> + <source>Shortcut Editor</source> + <translation>快捷鍵編輯器</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <source>Load Shortcut scheme</source> + <translation>載入快捷鍵設定檔</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="121"/> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Merkaartor shortcut scheme (*.mss)</source> + <translation>Merkaartor 快捷鍵設定檔 (*.mss)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>Unable to open file</source> + <translation>無法開啟檔案</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="125"/> + <source>%1 could not be opened.</source> + <translation>%1 無法開啟</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>Save Shortcut scheme</source> + <translation>儲存快捷鍵設定檔</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>untitled</source> + <translation>未命名</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="148"/> + <source>All Files (*)</source> + <translation>所有檔案 (*)</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>Unable to open save file</source> + <translation>無法開啟儲存的檔案</translation> + </message> + <message> + <location filename="../src/Tools/ActionsDialog.cpp" line="164"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 無法被開啟用來寫入</translation> + </message> +</context> +<context> + <name>BuildBridgeInteraction</name> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>BridgeBuilder</source> + <translation>橋樑建造器</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="106"/> + <source>Sorry, I don't know how to build bridge from THAT. Please, give me two nodes only.</source> + <translation>抱歉,我不知道要如何從這個建造橋樑。您只能給我兩個節點,拜託了。</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="111"/> + <source>Convert segment to bridge</source> + <translation>將線段轉換為橋樑</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="131"/> + <source>Selected segment is already tagged as bridge/tunnel. Please, make sure you know what you're doing.</source> + <translation>選定的線段已經被標記為橋樑/隧道。請確定您知道您正在做什麼。</translation> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="138"/> + <source>Unsupported action: The bridge does not seem to be a single way.</source> + <translation>不支援的動作:這座橋樑似乎並不是單一路徑。</translation> + </message> +</context> +<context> + <name>CadastreBrowser</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="14"/> + <source>CadastreBrowser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="57"/> + <source>File</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="77"/> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="80"/> + <source>Quit</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="88"/> + <source>Load</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrebrowser.ui" line="91"/> + <source>Load a city from the cadastre</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreFranceAdapter</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="132"/> + <source>Grab City...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="135"/> + <source>Tiled</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>The city cannot be loaded</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/CadastreFrance.cpp" line="210"/> + <source>Only vectorized cities can be handled by this plugin and the selected one is still in "Image" format.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CadastreWrapper</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="209"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="211"/> + <source>Downloaded: %1/%2 +Remaining time: %3:%4:%5</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="214"/> + <source>Downloaded: %1/%2</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Command</name> + <message> + <location filename="../src/Commands/Command.cpp" line="25"/> + <source>No description</source> + <translation>沒有描述</translation> + </message> +</context> +<context> + <name>CreateDoubleWayDock</name> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="13"/> + <source>Form</source> + <translation>外形</translation> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="25"/> + <source>Road driving on the right</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayDock.ui" line="40"/> + <source>Separation distance</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CreateRoundaboutDock</name> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="14"/> + <source>Form</source> + <translation>外形</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="28"/> + <source>Precision (meters/segment)</source> + <translation>精密度(公尺/線段)</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="35"/> + <source>Type</source> + <translation>類型</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="56"/> + <source>Roundabout</source> + <translation>圓環</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="61"/> + <source>Plain circle</source> + <translation>正圓形</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="70"/> + <source>Left</source> + <translation>左</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="75"/> + <source>Right</source> + <translation>右</translation> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutDock.ui" line="83"/> + <source>Driving side</source> + <translation>駕駛方向</translation> + </message> +</context> +<context> + <name>DirtyDock</name> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="67"/> + <source>There is <b>no</b> dirty object</source> + <translation><b>沒有</b>有問題的物件</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="70"/> + <source>There is <b>one</b> dirty object</source> + <translation>有<b>一個</b>有問題的物件</translation> + </message> + <message numerus="yes"> + <location filename="../src/Docks/DirtyDock.cpp" line="74"/> + <source>There are <b>%n</b> dirty objects</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="194"/> + <source>Undo</source> + <translation>復原</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="195"/> + <source>Center map</source> + <translation>地圖置中</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.cpp" line="196"/> + <source>Center && Zoom map</source> + <translation>置中 && 縮放地圖</translation> + </message> +</context> +<context> + <name>DirtyDockWidget</name> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="14"/> + <source>Undo</source> + <translation>復原</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="37"/> + <source>There are <b>no</b> dirty objects.</source> + <translation><b>沒有</b>有問題的物件</translation> + </message> + <message> + <location filename="../src/Docks/DirtyDock.ui" line="56"/> + <source>Cleanup</source> + <translation>清除</translation> + </message> +</context> +<context> + <name>DirtyLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="642"/> + <source>Zoom</source> + <translation>縮放</translation> + </message> +</context> +<context> + <name>DirtyListExecutor</name> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="345"/> + <location filename="../src/Sync/DirtyList.cpp" line="598"/> + <source>ADD road %1</source> + <translation>新增道路 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="354"/> + <location filename="../src/Sync/DirtyList.cpp" line="632"/> + <source>ADD trackpoint %1</source> + <translation>新增軌跡點 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="363"/> + <location filename="../src/Sync/DirtyList.cpp" line="565"/> + <source>ADD relation %1</source> + <translation>新增關係 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="372"/> + <location filename="../src/Sync/DirtyList.cpp" line="729"/> + <source>UPDATE trackpoint %1</source> + <translation>更新軌跡點 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="381"/> + <location filename="../src/Sync/DirtyList.cpp" line="667"/> + <source>UPDATE relation %1</source> + <translation>更新關係 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="390"/> + <location filename="../src/Sync/DirtyList.cpp" line="698"/> + <source>UPDATE road %1</source> + <translation>更新道路 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="399"/> + <location filename="../src/Sync/DirtyList.cpp" line="762"/> + <source>REMOVE trackpoint %1</source> + <translation>移除軌跡點 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="408"/> + <location filename="../src/Sync/DirtyList.cpp" line="789"/> + <source>REMOVE road %1</source> + <translation>移除道路 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="417"/> + <location filename="../src/Sync/DirtyList.cpp" line="816"/> + <source>REMOVE relation %1</source> + <translation>移除關係 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="451"/> + <location filename="../src/Sync/DirtyList.cpp" line="458"/> + <location filename="../src/Sync/DirtyList.cpp" line="474"/> + <source>Error uploading request</source> + <translation>上傳要求發生錯誤</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="452"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>請在偏好設定選單中檢查您的使用者名稱與密碼</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="455"/> + <location filename="../src/Sync/DirtyList.cpp" line="475"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>上傳這個要求時發生了一個錯誤 (%1) +伺服器訊息為「%2」</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="457"/> + <source> +API message is '%1'</source> + <translation> +API 訊息為「%1」</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="492"/> + <source>Uploading changes...</source> + <translation>正在上傳變更...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="518"/> + <source>OPEN changeset</source> + <translation>開啟變更集</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="545"/> + <source>CLOSE changeset</source> + <translation>關閉變更集</translation> + </message> +</context> +<context> + <name>DirtyListExecutorOSC</name> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="64"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="71"/> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="85"/> + <source>Error uploading request</source> + <translation>上傳要求發生錯誤</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="65"/> + <source>Please check your username and password in the Preferences menu</source> + <translation>請在偏好設定選單中檢查您的使用者名稱與密碼</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="68"/> + <source>There was an error uploading this request (%1) +Server message is '%2'</source> + <translation>上傳這個要求時發生了一個錯誤 (%1) +伺服器訊息為「%2」</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="70"/> + <source> +API message is '%1'</source> + <translation> +API 訊息為「%1」</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="86"/> + <source>There was an error uploading this request (%1) +"%2" +Please redownload the problematic feature to handle the conflict.</source> + <translation>上傳這個要求時發生了一個錯誤 (%1) +「%2」 +請重新下載有問題的圖徵來處理衝突。</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="102"/> + <source>Checking changes...</source> + <translation>正在檢查變更...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="184"/> + <source>OPEN changeset</source> + <translation>開啟變更集</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="304"/> + <source>CLOSE changeset</source> + <translation>關閉變更集</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>Changeset could not be closed.</source> + <translation>變更集無法關閉。</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="311"/> + <source>An unknown error has occurred. It might already be closed, or will be closed automatically. If you want to be sure, please, check manually on the osm.org website.</source> + <translation>發生未知的錯誤。它可能已關閉,或是將要自動關閉。若您想要確認,請在 osm.org 網頁上手動檢查。</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="359"/> + <source>ADD relation %1</source> + <translation>新增關係 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="373"/> + <source>ADD road %1</source> + <translation>新增道路%1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="388"/> + <source>ADD trackpoint %1</source> + <translation>新增軌跡點 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="404"/> + <source>UPDATE relation %1</source> + <translation>更新關係 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="419"/> + <source>UPDATE road %1</source> + <translation>更新道路 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="433"/> + <source>UPDATE trackpoint %1</source> + <translation>更新軌跡點 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="447"/> + <source>REMOVE trackpoint %1</source> + <translation>移除軌跡點 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="461"/> + <source>REMOVE road %1</source> + <translation>移除道路 %1</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="475"/> + <source>REMOVE relation %1</source> + <translation>移除關係 %1</translation> + </message> +</context> +<context> + <name>Document</name> + <message> + <location filename="../src/common/Document.cpp" line="91"/> + <location filename="../src/common/Document.cpp" line="103"/> + <location filename="../src/common/Document.cpp" line="113"/> + <source>untitled</source> + <translation>未命名</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="173"/> + <location filename="../src/common/Document.cpp" line="501"/> + <source>Dirty layer</source> + <translation>有問題的圖層</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="176"/> + <source>Uploaded layer</source> + <translation>已上傳的圖層</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="373"/> + <source>Background imagery</source> + <translation>背景照片</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="390"/> + <source>Drawing layer #%1</source> + <translation>正在繪製圖層 #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="399"/> + <source>Filter layer #%1</source> + <translation>過濾圖層 #%1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="593"/> + <source>OSM Export</source> + <translation>OSM 匯出</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="603"/> + <source>Exporting OSM...</source> + <translation>正在匯出 OSM...</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="897"/> + <source>Document</source> + <translation>文件</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1227"/> + <source>History rebuild: Create node %1</source> + <translation>歷史重建:建立節點 %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1233"/> + <source>History rebuild: Update node %1</source> + <translation>歷史重建:更新節點 %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1239"/> + <source>History rebuild: Delete node %1</source> + <translation>歷史重建:刪除節點 %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1245"/> + <source>History rebuild: Create way %1</source> + <translation>歷史重建:建立路徑 %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1251"/> + <source>History rebuild: Update way %1</source> + <translation>歷史重建:更新路徑 %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1257"/> + <source>History rebuild: Delete way %1</source> + <translation>歷史重建:刪除路徑 %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1263"/> + <source>History rebuild: Create relation %1</source> + <translation>歷史重建:建立關係 %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1269"/> + <source>History rebuild: Update relation %1</source> + <translation>歷史重建:更新關係 %1</translation> + </message> + <message> + <location filename="../src/common/Document.cpp" line="1275"/> + <source>History rebuild: Delete relation %1</source> + <translation>歷史重建:刪除關係 %1</translation> + </message> +</context> +<context> + <name>DownloadMapDialog</name> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="14"/> + <source>Download</source> + <translation>下載</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="32"/> + <source>Location</source> + <translation>位置</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="40"/> + <source>Bookmark</source> + <translation>書籤</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="62"/> + <source>Current view</source> + <translation>目前檢視</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="74"/> + <source>WWW link (OSM/Google maps)</source> + <translation>WWW 連結(OSM/Google 地圖)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="88"/> + <source>Xapi selector</source> + <translation>Xapi 選取器</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="100"/> + <source>From the map below (map provided by the OpenStreetMap project)</source> + <translation>從底下的地圖(地圖由 OpenStreetMap 專案提供)</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="112"/> + <source>Also download raw GPS tracks</source> + <translation>也下載原始的 GPS 軌跡</translation> + </message> + <message> + <location filename="../src/common/DownloadMapDialog.ui" line="119"/> + <source>Resolve all relations</source> + <translation>解決所有關係</translation> + </message> +</context> +<context> + <name>Downloader</name> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="64"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="470"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="585"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="708"/> + <source>%1 download</source> + <translation>%1 下載</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="340"/> + <source>Downloading unresolved...</source> + <translation>正在下載未解決的部份...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="347"/> + <source>Downloading unresolved %1 of %2</source> + <translation>正在下載未解決的 %2 中的 %1...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="356"/> + <source>Parsing unresolved %1 of %2</source> + <translation>正在解析未解決的 %2 中的 %1...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="460"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="397"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="534"/> + <source>Parsing...</source> + <translation>正在解析...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="466"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="404"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="541"/> + <source>Parsing XML</source> + <translation>正在解析 XML</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="474"/> + <source>Conflicts from %1</source> + <translation>從 %1 衝突</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="544"/> + <source>Empty roads/relations detected</source> + <translation>偵測到空的道路/關係</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="545"/> + <source>Empty roads/relations are probably errors. +Do you want to mark them for deletion?</source> + <translation>空的道路/關係可能是錯誤。 +您想要將它們標記為刪除?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="553"/> + <source>Remove empty feature %1</source> + <translation>移除空的圖徵 %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="565"/> + <source>Conflicts have been detected</source> + <translation>已偵測到衝突</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportOSM.cpp" line="566"/> + <source>This means that some of the feature you modified since your last download have since been modified by someone else on the server. +The features have been duplicated as "conflict_..." on the "Conflicts..." layer. +Before being able to upload your changes, you will have to manually merge the two versions and remove the one from the "Conflicts..." layer.</source> + <translation>這代表了一些自您最後一次下載後,您所修改的圖徵已經在伺服器上被其他人修改過了。 +那些圖徵已在「衝突...」圖層中被複製為「衝突...」。 +在上傳您的變更前,您必須先手動合併兩個版本並移除從「衝突...」圖層而來的那一個。</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="141"/> + <source>Uploading...</source> + <translation>正在上傳...</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="166"/> + <source>Preparing changes</source> + <translation>正在準備變更</translation> + </message> + <message> + <location filename="../src/Sync/DirtyListExecutorOSC.cpp" line="168"/> + <source>Waiting for server response</source> + <translation>正在等待伺服器回應</translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="164"/> + <source>Downloading from OSM (%n bytes)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <location filename="../src/Sync/DownloadOSM.cpp" line="166"/> + <source>Downloading from OSM (%n kBytes)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="286"/> + <source>Downloading...</source> + <translation>正在下載...</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="296"/> + <source>Downloading from OSM (connecting)</source> + <translation>正在從 OSM 下載(正在連線)</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="327"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="339"/> + <source>Unexpected http status code (%1) +Server message is '%2'</source> + <translation>未預期的 http 狀態碼 (%1) +伺服器訊息為「%2」</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="329"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="341"/> + <source> +API message is '%1'</source> + <translation> +API 訊息為「%1」</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="330"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <location filename="../src/Sync/DownloadOSM.cpp" line="342"/> + <source>Download failed</source> + <translation>下載失敗</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="336"/> + <source>Username/password invalid</source> + <translation>使用者名稱/密碼無效</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Unresolved conflicts</source> + <translation>未解決的衝突</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="354"/> + <source>Please resolve existing conflicts first</source> + <translation>請先解決已有的衝突</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="412"/> + <source>Downloading trackpoints %1-%2</source> + <translation>正在下載軌跡點 %1-%2</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="524"/> + <source>MapDust</source> + <translation>MapDust</translation> + </message> + <message> + <location filename="../src/Sync/DownloadOSM.cpp" line="547"/> + <source>Downloading points</source> + <translation>正在下載點</translation> + </message> + <message> + <location filename="../src/Utils/SlippyMapWidget.cpp" line="76"/> + <source>Downloading %1,%2 (zoom %3)...</source> + <translation>正在下載 %1,%2(縮放 %3)...</translation> + </message> +</context> +<context> + <name>DrawingLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="301"/> + <source>Zoom</source> + <translation>縮放</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="306"/> + <source>Close</source> + <translation>關閉</translation> + </message> +</context> +<context> + <name>EditInteraction</name> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete</source> + <translation>無法刪除</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="279"/> + <source>Cannot delete the selection because it is outside the downloaded area.</source> + <translation>無法刪除選取的部份,因為它在已下載的區域之外。</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="282"/> + <source>Cannot delete everything</source> + <translation>無法刪除任何東西</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="283"/> + <source>The complete selection cannot be deleted because part of it is outside the downloaded area. +Delete what can be?</source> + <translation>完整的選取部份不能被刪除,因為它的部份在已下載的區域以外。 +還可以刪除什麼?</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse way %1</source> + <translation>反轉路徑 %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="328"/> + <source>Reverse %1 ways</source> + <translation>反轉 %1 條路徑</translation> + </message> +</context> +<context> + <name>ExportDialog</name> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="13"/> + <source>Export</source> + <translation>匯出</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="25"/> + <source>What do you want to export?</source> + <translation>您想要匯出什麼?</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="38"/> + <source>All visible (i.e. not hidden)</source> + <translation>所有可見的部份(例如非隱藏的部份)</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="45"/> + <source>Viewport</source> + <translation>檢視區域</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportDialog.ui" line="52"/> + <source>Selected</source> + <translation>已選取的</translation> + </message> +</context> +<context> + <name>FeaturesDock</name> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="465"/> + <source>Features</source> + <translation>圖徵</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="466"/> + <source>Center map</source> + <translation>地圖置中</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="467"/> + <source>Center && Zoom map</source> + <translation>置中 && 縮放地圖</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="468"/> + <source>Download missing children</source> + <translation>下載遺失的子代</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="469"/> + <source>Add to selection</source> + <translation>加入選取集</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="470"/> + <source>Delete</source> + <translation>刪除</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="477"/> + <source>Relations</source> + <translation>關係</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="478"/> + <source>Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="479"/> + <source>Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.cpp" line="480"/> + <source>All</source> + <translation>所有</translation> + </message> +</context> +<context> + <name>FeaturesDockWidget</name> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="14"/> + <source>Features</source> + <translation>圖徵</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="72"/> + <source>Only features fully within the viewport</source> + <translation>只有完全在檢視範圍內的圖徵</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="75"/> + <source>Filter by viewport</source> + <translation>由檢視區域過濾</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="104"/> + <source>Find...</source> + <translation>尋找...</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="122"/> + <source>Only show features intersecting current selection.</source> + <translation>僅顯示目前選擇的交叉圖徽。</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="125"/> + <source>Filter by selection</source> + <translation>由選取的過濾</translation> + </message> + <message> + <location filename="../src/Docks/FeaturesDock.ui" line="151"/> + <source>Reset</source> + <translation>重置</translation> + </message> +</context> +<context> + <name>FilterEditDialog</name> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="14"/> + <source>Dialog</source> + <translation>對話框</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="20"/> + <source>Name</source> + <translation>名稱</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="30"/> + <source>Filter</source> + <translation>過濾器</translation> + </message> + <message> + <location filename="../src/Layers/FilterEditDialog.ui" line="42"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>FilterLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="689"/> + <source>Close</source> + <translation>關閉</translation> + </message> +</context> +<context> + <name>FilterPreferencesDialog</name> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="14"/> + <source>Filters setup</source> + <translation>過濾器設定</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="20"/> + <source>Filters</source> + <translation>過濾器</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="47"/> + <source>Filter list:</source> + <translation>過濾器清單:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>名稱:</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="93"/> + <source>Filter</source> + <translation>過濾器</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>套用</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>新增</translation> + </message> + <message> + <location filename="../src/Preferences/FilterPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>移除</translation> + </message> +</context> +<context> + <name>GdalAdapter</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="65"/> + <source>Load file(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="68"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="473"/> + <source>Open GDAL files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="499"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="500"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="660"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GdalBackground</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="487"/> + <source>No valid GDAL file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoImageDock</name> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Network timeout</source> + <translation>網路逾時</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="78"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation>無法從 Walking Papers 伺服器中讀取照片的詳細資訊。</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="98"/> + <source>Please specify Walking Papers URL</source> + <translation>請指定 Walking Papers URL</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="99"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="113"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="997"/> + <source>Geo Images</source> + <translation>地理圖片</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="121"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="998"/> + <source>Center map</source> + <translation>地圖置中</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="122"/> + <source>c</source> + <translation>c</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="123"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="999"/> + <source>Remove Images</source> + <translation>移除圖片</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="124"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1000"/> + <source>Copy filename to clipboard</source> + <translation>複製檔案名稱到剪貼簿</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="125"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1001"/> + <source>Select next image</source> + <translation>選取下一個圖片</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="126"/> + <source>PgDown</source> + <translation>PgDown</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="128"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1002"/> + <source>Select previous image</source> + <translation>選取前一個圖片</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="129"/> + <source>PgUp</source> + <translation>PgUp</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="131"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="1003"/> + <source>Save geotagged image...</source> + <translation>儲存有地理標籤的圖片...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="339"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="465"/> + <source>Photo layer</source> + <translation>照片圖層</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="383"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="509"/> + <source>Load geotagged Images</source> + <translation>載入有地理標籤的圖片</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="384"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="510"/> + <source>Select the layer to which the images belong:</source> + <translation>選取圖片所屬的圖層:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="397"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="523"/> + <source>Layer is read-only</source> + <translation>唯讀圖層</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="398"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="524"/> + <source>The used layer is not writeable. Should it be made writeable? +If not, you can't load images that belong to it.</source> + <translation>使用的圖層並非可寫入的。它應該變成可以寫入的嗎? +若否,您就不能載入屬於它的圖層。</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Loading Images ...</source> + <translation>正在載入圖片 ...</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="531"/> + <source>Abort loading</source> + <translation>放棄載入</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>No such file</source> + <translation>沒有這些檔案</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="543"/> + <source>Can't find image "%1".</source> + <translation>無法載入圖片「%1」。</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Exiv2</source> + <translation>Exiv2</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="551"/> + <source>Error while opening "%2": +%1</source> + <translation>開啟「%2」時發生錯誤。 +%1</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="553"/> + <location filename="../src/Docks/GeoImageDock.cpp" line="945"/> + <source>Error while loading EXIF-data from "%1".</source> + <translation>從「%1」載入 EXIF 資料時發生錯誤。</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="726"/> + <source>Specify offset</source> + <translation>指定偏移</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="728"/> + <source>Position images more to the:</source> + <translation>位置圖片多為:</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="729"/> + <source>end of the track</source> + <translation>軌跡結束</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="730"/> + <source>beginning of the track</source> + <translation>軌跡開始</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="734"/> + <source>hh:mm:ss</source> + <translation>hh:mm:ss</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints</source> + <translation>無軌跡點</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="792"/> + <source>No TrackPoints found for image "%1"</source> + <translation>在圖片「%1」中找不對軌跡點</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="799"/> + <source>ss 'seconds'</source> + <translation>ss「秒」</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="801"/> + <source>mm 'minutes and' ss 'seconds'</source> + <translation>mm「分」與 ss「秒」</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="803"/> + <source>hh 'hours,' mm 'minutes and' ss 'seconds'</source> + <translation>hh「小時」,mm「分」與 ss「秒」</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="804"/> + <source>Wrong image?</source> + <translation>錯誤的圖片?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="805"/> + <source>Image "%1" was taken %2 before the next trackpoint was recorded. +Do you still want to use it?</source> + <translation>圖片「%1」拍到了 %2 是在下一軌跡點被記錄前拍攝的。 +您仍然想要使用它嗎?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="806"/> + <source>Image "%1" was taken %2 after the last trackpoint was recorded. +Do you still want to use it?</source> + <translation>圖片「%1」拍到了 %2 是在前一軌跡點被記錄後拍攝的。 +您仍然想要使用它嗎?</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>Specify output filename</source> + <translation>指定輸出檔案名稱</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="859"/> + <source>JPEG Images (*.jpg)</source> + <translation>JPEG 圖片 (*.jpg)</translation> + </message> + <message> + <location filename="../src/Docks/GeoImageDock.cpp" line="941"/> + <source>Error while opening "%1": +%2</source> + <translation>當開啟「%1」時發生錯誤: +%2</translation> + </message> +</context> +<context> + <name>GeoTiffAdapter</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="67"/> + <source>Load image(s)...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="70"/> + <source>Specify "source" tag...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="232"/> + <source>Open GeoTIFF files</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="259"/> + <source>Please specify automatic "source" tag value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="260"/> + <source>Value:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="421"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GeoTiffBackground</name> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="246"/> + <source>No valid GeoTIFF file could be found.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>GotoDialog</name> + <message> + <location filename="../src/common/GotoDialog.ui" line="14"/> + <source>Go To</source> + <translation>到</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="28"/> + <source>Bookmark</source> + <translation>書籤</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="61"/> + <source>WWW link (OSM/Google maps)</source> + <translation>WWW 連結(OSM/Google 地圖)</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="80"/> + <source>Coordinates</source> + <translation>座標</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="92"/> + <source>Show projected</source> + <translation>顯示已投影的</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="107"/> + <source>lonMin, latMin, lonMax, latMax</source> + <translation>經度最小值, 緯度最小值, 經度最大值, 緯度最大值</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="134"/> + <source>latCent, lonCent, latSpan, lonSpan</source> + <translation>緯度分, 經度分, 緯度範圍, 經度範圍</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="156"/> + <source>Info</source> + <translation>資訊</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="176"/> + <source>OSM API Url</source> + <translation>OSM API Url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="203"/> + <source>OSM XAPI url</source> + <translation>OSM XAPI url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.ui" line="225"/> + <location filename="../src/common/GotoDialog.ui" line="244"/> + <source>Search</source> + <translation>搜尋</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="97"/> + <source>Invalid OSM url</source> + <translation>無效 OSM url</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="98"/> + <source>The specified url is invalid!</source> + <translation>指定的 url 無效!</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="106"/> + <location filename="../src/common/GotoDialog.cpp" line="117"/> + <source>Invalid Coordinates format</source> + <translation>無效的座標格式</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="107"/> + <source>Coordinates must be: '<left lon>, <bottom lat>, <right lon>, <top lat>'</source> + <translation>座標應為:「<left lon>, <bottom lat>, <right lon>, <top lat>」</translation> + </message> + <message> + <location filename="../src/common/GotoDialog.cpp" line="118"/> + <source>Coordinates must be: '<center lat>, <center lon>, <span lat>, <span lon>'</source> + <translation>座標應為:「<center lat>, <center lon>, <span lat>, <span lon>」</translation> + </message> +</context> +<context> + <name>ImageLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="318"/> + <source>None</source> + <translation>無</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="325"/> + <source>Shape adapter</source> + <translation>外形接合器</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="408"/> + <source>Zoom</source> + <translation>縮放</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="415"/> + <source>Set view projection to layer's</source> + <translation>設定檢視投影到圖層</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="420"/> + <source>Reset alignment adjustment</source> + <translation>重置對齊調整</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="425"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="433"/> + <source>WMS adapter</source> + <translation>WMS 接合器</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="449"/> + <source>TMS adapter</source> + <translation>TMS 接合器</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="465"/> + <source>Plugins</source> + <translation>外掛程式</translation> + </message> +</context> +<context> + <name>ImageMapLayer</name> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="80"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="173"/> + <location filename="../src/Layers/ImageMapLayer.cpp" line="288"/> + <source>Map - None</source> + <translation>地圖 - 無</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="207"/> + <source>Map - WMS - %1</source> + <translation>地圖 - WMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="210"/> + <source>Map - WMS-C - %1</source> + <translation>地圖 - WMS-C - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="213"/> + <source>Map - WMS-Tiled - %1</source> + <translation>地圖 - WMS 圖磚 - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="228"/> + <source>Map - TMS - %1</source> + <translation>地圖 - TMS - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="240"/> + <source>Map - %1</source> + <translation>地圖 - %1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="265"/> + <source>Licensing Terms: %1</source> + <translation>授權條款:%1</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>License Terms not accepted</source> + <translation>未接受授權條款</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="272"/> + <source>You have not ticked the checkbox expressing your agreement with the licensing terms. +As such, you won't be able to use this source as a map layer. +Is it really what you meant?</source> + <translation>您尚未勾選方框來表達您同意授權條款。 +因此,您將無法使用這個來源作為地圖圖層。 +您真的確定嗎?</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1025"/> + <source>Server</source> + <translation>伺服器</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1028"/> + <source>Tile size</source> + <translation>圖磚大小</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1030"/> + <source>Min/Max zoom</source> + <translation>最小/最大縮放</translation> + </message> + <message> + <location filename="../src/Layers/ImageMapLayer.cpp" line="1034"/> + <source>Projection</source> + <translation>投影</translation> + </message> +</context> +<context> + <name>ImportCSVDialog</name> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="14"/> + <source>Dialog</source> + <translation>對話框</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="26"/> + <source>Input</source> + <translation>輸入</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="75"/> + <source>OSM Preview</source> + <translation>OSM 預覽</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="93"/> + <source>Specifications</source> + <translation>規範</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="105"/> + <source>First line contains headers</source> + <translation>第一行包含標頭</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="112"/> + <source>Delimiter</source> + <translation>分隔符號</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="124"/> + <source>Comma (,)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="131"/> + <source>Semicolon (;)</source> + <translation>分號 (;)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="138"/> + <source>Tab</source> + <translation>Tab</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="145"/> + <source>Other:</source> + <translation>其他:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="171"/> + <source>String Quote</source> + <translation>字串引號</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="177"/> + <source>None</source> + <translation>無</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="184"/> + <source>Single quote (')</source> + <translation>單引號 (')</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="191"/> + <source>Double quote (")</source> + <translation>雙引號 (")</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="214"/> + <source>Projection (in PROJ4 format; leave blank for latitude/longitude)</source> + <translation>投影(PROJ4 格式;緯度/經度留空)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="227"/> + <source>Fields</source> + <translation>欄位</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="254"/> + <source>Field list:</source> + <translation>欄位清單:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="283"/> + <source>Field Name (= tag key) :</source> + <translation>欄位名稱(=標籤鍵值)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="300"/> + <source>Field Type:</source> + <translation>欄位類型:</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="310"/> + <source>Import</source> + <translation>匯入</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="336"/> + <source>Import range</source> + <translation>匯入範圍</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="342"/> + <source>From (0 from start):</source> + <translation>從(起點為 0):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="352"/> + <source>To (0 to End):</source> + <translation>到(0 到結束):</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="367"/> + <source>Load settings...</source> + <translation>載入設定...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.ui" line="374"/> + <source>Save settings...</source> + <translation>儲存設定...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="32"/> + <source>String</source> + <translation>字串</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="33"/> + <source>Integer</source> + <translation>整數</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="34"/> + <source>Float</source> + <translation>浮點數</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="35"/> + <source>Longitude</source> + <translation>經度</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="36"/> + <source>Latitude</source> + <translation>緯度</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Invalid projection</source> + <translation>無效的投影</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="376"/> + <source>Unable to set projection.</source> + <translation>無法設定投影</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="395"/> + <source>No coordinates</source> + <translation>沒有座標</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="396"/> + <source>Latitude or Longitude field missing. It will be impossible to import the file. +Do you really want to exit?</source> + <translation>緯度或經度欄位遺失了。它對匯入檔案來說相當重要。 +您真的想要結束嗎?</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <source>Load CSV import settings</source> + <translation>載入 CSV 匯入設定</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="433"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Merkaartor import settings (*.mis)</source> + <translation>Merkaartor 匯入設定 (*.mis)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>Invalid file</source> + <translation>無效的檔案</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="439"/> + <source>%1 could not be opened.</source> + <translation>%1 無法開啟</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="452"/> + <source>%1 is not a CSV import settings file</source> + <translation>%1 不是 CSV 匯入設定檔</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>Save CSV import settings</source> + <translation>儲存 CSV 匯入設定</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>untitled</source> + <translation>未命名</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="544"/> + <source>All Files (*)</source> + <translation>所有檔案 (*)</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>Unable to open save import settings</source> + <translation>無法開啟儲存的匯入設定</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportCSVDialog.cpp" line="560"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 無法被開啟用來寫入</translation> + </message> +</context> +<context> + <name>ImportExportGdal</name> + <message> + <location filename="../plugins/background/MGdalBackground/GdalAdapter.cpp" line="200"/> + <location filename="../plugins/background/MGeoTiffBackground/GeoTiffAdapter.cpp" line="202"/> + <source>Unable to set projection; please specify one</source> + <translation>無法設定投影;請指定一個</translation> + </message> +</context> +<context> + <name>ImportGPX</name> + <message> + <location filename="../src/ImportExport/ImportGPX.cpp" line="173"/> + <source>Anonymized trackpoints</source> + <comment>OSM trackpoints import</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>InfoDock</name> + <message> + <location filename="../src/Docks/InfoDock.cpp" line="24"/> + <location filename="../src/Docks/InfoDock.cpp" line="96"/> + <source>Info</source> + <translation>資訊</translation> + </message> +</context> +<context> + <name>Layer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>Size</source> + <translation>大小</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="416"/> + <source>%n features</source> + <translation>%n 個圖徵</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="433"/> + <source>Features</source> + <translation>圖徵</translation> + </message> +</context> +<context> + <name>LayerDock</name> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="243"/> + <location filename="../src/Docks/LayerDock.cpp" line="352"/> + <source>Show All</source> + <translation>顯示所有</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="248"/> + <location filename="../src/Docks/LayerDock.cpp" line="356"/> + <source>Hide All</source> + <translation>隱藏所有</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="255"/> + <source>Readonly All</source> + <translation>唯讀所有</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="260"/> + <source>Readonly None</source> + <translation>唯讀無</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="267"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="395"/> + <source>Layers</source> + <translation>圖層</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="401"/> + <source>All</source> + <translation>所有</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="402"/> + <source>Map</source> + <translation>背景地圖</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="403"/> + <source>Draw</source> + <translation>繪製</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="404"/> + <source>Tracks</source> + <translation>軌跡</translation> + </message> + <message> + <location filename="../src/Docks/LayerDock.cpp" line="491"/> + <source>Reset Layers to default</source> + <translation>將圖層重置為預設值</translation> + </message> +</context> +<context> + <name>LayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.ui" line="14"/> + <source>Form</source> + <translation>外形</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="173"/> + <source>Visible</source> + <translation>可見</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="179"/> + <source>Readonly</source> + <translation>唯讀</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Low</source> + <translation>低</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>High</source> + <translation>高</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="187"/> + <source>Opaque</source> + <translation>不透明</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="190"/> + <source>Opacity</source> + <translation>不透明度</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="215"/> + <source>Layer CLose: Dirty objects present</source> + <translation>圖層關閉:存在有問題的物件</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="216"/> + <source>There are dirty features on this layer. +Are you sure you want to close it? (no Undo possible)</source> + <translation>在這個圖層上存在有問題的圖徵。 +您確定您要關閉它嗎?(無法復原)</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="221"/> + <source>Layer CLose: Not empty</source> + <translation>圖層關閉:不為空</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="222"/> + <source>Are you sure you want to close this layer? (no Undo possible)</source> + <translation>您確定您要關閉這個圖層嗎?(無法復原)</translation> + </message> +</context> +<context> + <name>LicenseDisplayDialog</name> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="14"/> + <source>Licensing Terms</source> + <translation>授權條款</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="20"/> + <source><html><head/><body><p>The content selected is shared under a non-standard license agreement. The full text is available on the following URL. It is your responsibility to read, understand and agree to the license.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="30"/> + <source>TextLabel</source> + <translation>文字標籤</translation> + </message> + <message> + <location filename="../src/Layers/LicenseDisplayDialog.ui" line="37"/> + <source>I have read and agree to the licensing terms</source> + <translation>我已經讀過且同意這份授權條款</translation> + </message> +</context> +<context> + <name>MDiscardableDialog</name> + <message> + <location filename="../src/Utils/MDiscardableDialog.cpp" line="24"/> + <source>Don't ask me this again</source> + <translation>不要再次詢問我</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <location filename="../src/Main.cpp" line="192"/> + <source>%1 v%2 +Loading plugins...</source> + <translation>%1 v%2 +正在載入外掛程式...</translation> + </message> + <message> + <location filename="../src/Main.cpp" line="238"/> + <source>%1 v%2 +Initializing...</source> + <translation>%1 v%2 +正在初始化...</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.ui" line="14"/> + <source>Merkaartor</source> + <translation>Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="32"/> + <source>&Help</source> + <translation>說明(&H)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="38"/> + <source>&Create</source> + <translation>建立(&C)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="70"/> + <source>&Edit</source> + <translation>編輯(&E)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="92"/> + <source>&View</source> + <translation>檢視(&V)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="96"/> + <source>&Bookmarks</source> + <translation>書籤(&B)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="127"/> + <source>&File</source> + <translation>檔案(&F)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="131"/> + <source>&Export</source> + <translation>匯出(&E)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="175"/> + <source>T&ools</source> + <translation>工具(&O)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="179"/> + <source>&Style</source> + <translation>樣式(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="190"/> + <source>Ta&g templates</source> + <translation>標籤範本(&G)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="215"/> + <location filename="../src/MainWindow.ui" line="667"/> + <source>&Node</source> + <translation>節點(&N)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="224"/> + <source>&Window</source> + <translation>視窗(&W)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="228"/> + <location filename="../src/MainWindow.ui" line="993"/> + <source>&Docks</source> + <translation>Docks(&D)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="247"/> + <source>Fea&ture</source> + <translation>圖徵(&T)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="259"/> + <location filename="../src/MainWindow.ui" line="1018"/> + <source>&Layers</source> + <translation>圖層(&L)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="282"/> + <source>Rel&ation</source> + <translation>關係(&A)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="290"/> + <source>S&how</source> + <translation>顯示(&H)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="51"/> + <source>Wa&y</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="104"/> + <source>&Projection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="109"/> + <source>Area &opacity</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="141"/> + <source>Re&cently opened</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="146"/> + <source>Recen&tly imported</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="294"/> + <source>Directional &arrows</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="340"/> + <source>Main toolbar</source> + <translation>主工具列</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="389"/> + <source>&Quit</source> + <translation>結束(&Q)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="400"/> + <source>&About</source> + <translation>關於(&A)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="415"/> + <source>&Open</source> + <translation>開啟(&O)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="418"/> + <source>Create a new document and import a file</source> + <translation>建立新文件並匯入檔案</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="430"/> + <source>Zoom &all</source> + <translation>縮放所有(&A)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="438"/> + <source>Zoom &window</source> + <translation>縮放視窗(&W)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="441"/> + <location filename="../src/MainWindow.ui" line="444"/> + <source>Zoom window</source> + <translation>縮放視窗</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="456"/> + <source>Zoom &out</source> + <translation>縮小(&O)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="468"/> + <source>Zoom &in</source> + <translation>放大(&I)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="471"/> + <location filename="../src/MainWindow.ui" line="474"/> + <source>Zoom in</source> + <translation>放大</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="482"/> + <location filename="../src/MainWindow.ui" line="485"/> + <location filename="../src/MainWindow.ui" line="488"/> + <source>Curved link</source> + <translation>曲線連結</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="500"/> + <location filename="../src/MainWindow.ui" line="1088"/> + <source>&Undo</source> + <translation>復原(&U)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="512"/> + <source>&Redo</source> + <translation>重做(&R)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="527"/> + <source>&Move</source> + <translation>移動(&M)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="539"/> + <source>Import using &GDAL</source> + <translation>使用 GDAL 匯入(&G)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="554"/> + <source>&Import</source> + <translation>匯入(&I)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="557"/> + <source>Import a file into the current document</source> + <translation>匯入檔案到目前的文件中</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="569"/> + <source>&Download</source> + <translation>下載(&D)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="572"/> + <source>Download map data for a new area</source> + <translation>為新區域下載地圖資料</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="580"/> + <source>Link</source> + <translation>連結</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="583"/> + <location filename="../src/MainWindow.ui" line="586"/> + <source>Create link</source> + <translation>建立連結</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="601"/> + <source>&Select</source> + <translation>選取(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="613"/> + <source>&Upload</source> + <translation>上傳(&U)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="616"/> + <source>Upload changes to the server</source> + <translation>上傳變更到伺服器</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="631"/> + <source>R&emove</source> + <translation>移除(&E)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="634"/> + <source>Remove selected features</source> + <translation>移除選定的圖徵</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="649"/> + <source>&Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="652"/> + <source>Create new way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="688"/> + <source>Reverse way direction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="700"/> + <source>&Go to…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="708"/> + <source>&Parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="711"/> + <source>Create a parallel way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="740"/> + <source>New document</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="755"/> + <source>Split way into separate (connected) ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="770"/> + <source>Join connected ways into a single way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="788"/> + <source>Break apart connected ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="825"/> + <source>&Edit…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="833"/> + <location filename="../src/MainWindow.ui" line="949"/> + <source>Save &as…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="841"/> + <location filename="../src/MainWindow.ui" line="1508"/> + <source>&Load…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="849"/> + <source>&Curved way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="858"/> + <source>&Preferences…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="869"/> + <location filename="../src/MainWindow.ui" line="877"/> + <source>&All…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="889"/> + <source>&Find…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="903"/> + <location filename="../src/MainWindow.ui" line="911"/> + <source>&Viewport…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="919"/> + <source>&Add…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="927"/> + <source>&Remove…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="964"/> + <source>Save as file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="982"/> + <location filename="../src/MainWindow.ui" line="985"/> + <source>Download the current view into the previous download layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1004"/> + <source>Hide/show property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1007"/> + <source>Hide/Show the property dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1021"/> + <location filename="../src/MainWindow.ui" line="1024"/> + <source>Hide/show layer dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1038"/> + <location filename="../src/MainWindow.ui" line="1041"/> + <source>Hide/show info dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1091"/> + <location filename="../src/MainWindow.ui" line="1094"/> + <source>Hide/show undo dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1105"/> + <source>&Downloaded areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1163"/> + <location filename="../src/MainWindow.ui" line="1168"/> + <source>Selected…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1177"/> + <source>Paste feature(s)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1202"/> + <source>OSM (binary)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1207"/> + <source>&Force upload</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1213"/> + <location filename="../src/MainWindow.ui" line="1216"/> + <source>Commit the selected feature from a non-uploadable layer (e.g. \"Track\" or \"Extract\") to the dirty layer, ready for upload.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1240"/> + <source>Toggle toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1243"/> + <source>Hide/show Toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1246"/> + <source>Hide/Show toolbar</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1254"/> + <source>Hide all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1262"/> + <source>Show all</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1286"/> + <source>&Nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1297"/> + <source>Na&mes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1316"/> + <source>&Replay…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1333"/> + <location filename="../src/MainWindow.ui" line="1336"/> + <source>Hide/show GPS dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1372"/> + <source>Track &segments</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1383"/> + <source>&Scale</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1394"/> + <source>&Relations</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1405"/> + <source>Show road backgrounds</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1416"/> + <source>Show road boundaries</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1478"/> + <location filename="../src/MainWindow.ui" line="1481"/> + <source>Hide/show GeoImage dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1489"/> + <source>World OSB manager…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1500"/> + <source>&Shortcut editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1516"/> + <source>&Merge…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1524"/> + <source>&Save…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1562"/> + <source>For 'oneway' ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1588"/> + <source>Detach node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1591"/> + <source>Detach a node from a way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1606"/> + <source>&Work offline</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1625"/> + <location filename="../src/MainWindow.ui" line="1628"/> + <source>Hide/show style dock</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1636"/> + <source>&WMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1644"/> + <source>&TMS servers editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1652"/> + <source>&Reset discardable dialog status</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1664"/> + <source>GPS menu</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1678"/> + <source>Create &junction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1709"/> + <source>Equiangular &building</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1717"/> + <source>Add new &image layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1736"/> + <source>Add street &numbers (Karlsruhe schema)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1754"/> + <source>Subdivide a selected way segment (the way and two adjacent nodes) into equidistant segments.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1765"/> + <source>&Virtual nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1776"/> + <source>Lat/Lon &grid</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1795"/> + <source>&Projection editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1806"/> + <source>&Photos on map</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1822"/> + <source>Force delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1830"/> + <source>Add new OpenStreet&Bugs layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1854"/> + <source>&Filter editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1874"/> + <source>&Join areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1877"/> + <source>Join adjacent areas</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1880"/> + <source>Join areas that touch each-other.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1892"/> + <source>&Split area</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1898"/> + <source>Split selected area between two selected nodes into two separate areas.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1924"/> + <source>Toolbar editor…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1942"/> + <source>Align edges to a certain number of regularly spaced axis.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1950"/> + <source>&Print…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1958"/> + <source>Print preview…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1963"/> + <source>Properties…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1982"/> + <source>Add new &drawing layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2002"/> + <source>Add new &filter layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2052"/> + <source>Save as template document…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2060"/> + <source>Create multipolygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2065"/> + <source>Add to multi&polygon</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2089"/> + <source>Bing road detector</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2097"/> + <source>Rebuild &history</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2105"/> + <source>Add new Map&dust layer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.ui" line="670"/> + <source>Create new node</source> + <translation>建立新節點</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="685"/> + <source>&Reverse</source> + <translation>反轉(&R)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="719"/> + <source>R&oundabout</source> + <translation>圓環(&O)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="722"/> + <source>Create Roundabout</source> + <translation>建立圓環</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="737"/> + <source>&New</source> + <translation>新的(&N)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="752"/> + <source>&Split</source> + <translation>分離(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="767"/> + <source>&Join</source> + <translation>加入(&J)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="782"/> + <source>&Break apart</source> + <translation>分開(&B)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="785"/> + <source>Break</source> + <translation>分開</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="796"/> + <source>Re&lation</source> + <translation>關係(&L)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="799"/> + <source>Create Relation</source> + <translation>建立關係</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="814"/> + <source>&Area</source> + <translation>區域(&A)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="817"/> + <source>Create new area</source> + <translation>建立新區域</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="872"/> + <location filename="../src/MainWindow.ui" line="880"/> + <source>Export all visible layers to a file</source> + <translation>將所有可見圖層匯出到檔案</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="892"/> + <source>Find</source> + <translation>尋找</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="895"/> + <source>Find and select items</source> + <translation>尋找並選取項目</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="906"/> + <location filename="../src/MainWindow.ui" line="914"/> + <source>Export the features in the viewport to a file</source> + <translation>將在檢視區域中的圖徽匯出到檔案</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="935"/> + <source>&Merge</source> + <translation>合併(&M)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="938"/> + <source>Node Merge</source> + <translation>節點合併</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="941"/> + <source>Merge the selected nodes (first selected will remain)</source> + <translation>合併選定的節點(第一個選取的將會保留)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="961"/> + <location filename="../src/MainWindow.ui" line="2073"/> + <source>&Save</source> + <translation>儲存(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="976"/> + <source>Download more</source> + <translation>下載更多</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="979"/> + <source>Download more map data for the current area</source> + <translation>下載目前區域的更多地圖資料</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1001"/> + <source>&Properties</source> + <translation>屬性(&P)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1035"/> + <source>&Info</source> + <translation>資訊(&I)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1053"/> + <source>&Align</source> + <translation>對齊(&A)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1056"/> + <source>Align nodes</source> + <translation>對齊節點</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1059"/> + <source>Align selected nodes. First two selected give the line.</source> + <translation>對齊選定的節點。前兩個選定的會繪出要對齊的線。</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1071"/> + <source>&Spread</source> + <translation>展開(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1074"/> + <source>Spread nodes</source> + <translation>展開節點</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1077"/> + <source>Align and spread selected nodes equally.</source> + <translation>對齊並平均展開選定的節點。</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1117"/> + <source>&Copy</source> + <translation>複製(&C)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1120"/> + <source>Copy selected features and tags to the clipboard</source> + <translation>複製選定的圖徽及標籤到剪貼簿中</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1123"/> + <source>Copy the selected feature's tags to the clipboard; if the feature is a trackpoint, copy the coordinates, too.</source> + <translation>複製選定圖徽的標籤到剪貼簿;若該圖徽為軌跡點,也會複製其座標。</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1131"/> + <source>Paste Tags (&Overwrite)</source> + <translation>貼上標籤(覆寫)(&O)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1134"/> + <source>Paste (and overwrite) the tags in the clipboard to the selected feature.</source> + <translation>將在剪貼簿中的標籤貼上(並覆寫)至選定的圖徽中</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1146"/> + <source>Paste Tags (&Merge)</source> + <translation>貼上標籤(合併)(&M)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1149"/> + <source>Paste tags</source> + <translation>貼上標籤</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1152"/> + <source>Paste tags from the clipboard (Merge with existing tags)</source> + <translation>從剪貼簿貼上標籤(與已有的標籤合併)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1155"/> + <source>Merge the tags in the clipboard with the ones of the selected feature.</source> + <translation>將剪貼簿中的標籤與選定圖徽中的標籤合併。</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1180"/> + <source>Paste</source> + <translation>貼上</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1183"/> + <source>Paste features from the clipboard</source> + <translation>從剪貼簿貼上圖徽</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1186"/> + <source>Paste the features in the clipboard; If the features'id are already in the document, overwrite them.</source> + <translation>貼上在減貼簿中的圖徽;若圖徽的 ID 已經在文件裡面了,覆寫它們。</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1194"/> + <source>OSM (XML)</source> + <translation>OSM (XML)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1210"/> + <source>Commit feature to the dirty layer</source> + <translation>遞交圖徽到有問題的圖層</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1224"/> + <source>GPX</source> + <translation>GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1232"/> + <source>KML</source> + <translation>KML</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1273"/> + <source>&Image layer</source> + <translation>圖片圖層(&I)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1278"/> + <source>&Raster/SVG</source> + <translation>Raster/SVG(&R)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1305"/> + <source>&Start</source> + <translation>啟動(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1308"/> + <source>Start GPS</source> + <translation>啟動 GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1319"/> + <source>Replay GPS</source> + <translation>重播 GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="269"/> + <location filename="../src/MainWindow.ui" line="1330"/> + <source>&GPS</source> + <translation>GPS(&G)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1347"/> + <source>S&top</source> + <translation>停止(&T)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1350"/> + <source>Stop GPS</source> + <translation>停止 GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1361"/> + <source>&Center on GPS</source> + <translation>在 GPS 上置中(&C)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1427"/> + <source>Show touchup</source> + <translation>顯示修改</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1441"/> + <location filename="../src/MainWindow.ui" line="1444"/> + <source>Record</source> + <translation>紀錄</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1447"/> + <source>Record GPS</source> + <translation>記錄 GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1461"/> + <source>Pause</source> + <translation>暫停</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1464"/> + <source>Pause GPS</source> + <translation>暫停 GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1475"/> + <source>G&eoImage</source> + <translation>地理圖片(&E)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1532"/> + <source>&Add member</source> + <translation>加入成員(&A)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1540"/> + <source>&Remove member</source> + <translation>移除成員(&R)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1551"/> + <source>&Never</source> + <translation>從不(&N)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1573"/> + <source>&Always</source> + <translation>總是(&A)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1585"/> + <source>&Detach</source> + <translation>分離(&D)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1614"/> + <source>SVG</source> + <translation>SVG</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1622"/> + <source>&Styles</source> + <translation>樣式(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="542"/> + <source>Import a file into the current document using GDAL</source> + <translation>使用 GDAL 匯入檔案到目前的文件中</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1673"/> + <source>Camera</source> + <translation>攝影機</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1693"/> + <source>Rotate</source> + <translation>旋轉</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1701"/> + <source>&Polygon</source> + <translation>多邊形(&P)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1728"/> + <source>Features</source> + <translation>特徵</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1748"/> + <source>&Subdivide</source> + <translation>細分(&S)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1751"/> + <source>Subdivide segment equally</source> + <translation>平均細分區段</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1787"/> + <source>&Lock zoom to tiled background</source> + <translation>將已平鋪的背景鎖定縮放(&L)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1814"/> + <source>OsmChange (OSC)</source> + <translation>OsmChange (OSC)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1835"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1840"/> + <source>S&implify</source> + <translation>簡化(&I)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1843"/> + <source>Simplify road(s)</source> + <translation>簡化道路</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1846"/> + <source>Simplify way by removing unnecessary child nodes</source> + <translation>透過移除非必要的子節點來簡化路徑</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1865"/> + <source>&None</source> + <translation>無(&N)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1895"/> + <source>Split area between two nodes</source> + <translation>分離在兩個節點間的區域</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1910"/> + <source>&Terrace</source> + <translation>梯形化(&T)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1913"/> + <source>Terrace area into residences</source> + <translation>將住宅區梯形化</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1916"/> + <source>Split a selected area into terraced residences.</source> + <translation>將選定的區域分離為梯形住宅。</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1936"/> + <source>A&xis Align</source> + <translation>對齊軸(&X)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1939"/> + <source>Align edges to regular axes</source> + <translation>將邊緣對齊常規軸</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="404"/> + <source>Properties...</source> + <translation>屬性...</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1974"/> + <source>Highlight dirt&y features</source> + <translation>突顯有問題的圖徽(&Y)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="1994"/> + <source>Cu&t</source> + <translation>剪下(&T)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2013"/> + <source>E&xtrude</source> + <translation>擠壓(&X)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2016"/> + <source>Extrude interaction for ways (JOSM style)</source> + <translation>擠壓路徑的交互關係(JOSM 風格)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2024"/> + <source>Select toggle</source> + <translation>選取開關</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2029"/> + <source>Include children in selection</source> + <translation>包含選取的子代</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2044"/> + <source>Scale</source> + <translation>比例尺</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2081"/> + <source>GDAL SQLite/SpatiLite</source> + <translation>GDAL SQLite/SpatiLite</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2116"/> + <source>Wireframe</source> + <translation>線框</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2124"/> + <source>Select parent(s)</source> + <translation>選取親代</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2132"/> + <source>Download missing children</source> + <translation>下載遺失的子代</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2147"/> + <source>&Bridge</source> + <translation>橋樑(&B)</translation> + </message> + <message> + <location filename="../src/MainWindow.ui" line="2150"/> + <source><html><head/><body><p>Transform way to a bridge</p></body></html></source> + <translation><html><head/><body><p>將路徑轉變為橋樑</p></body></html></translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="716"/> + <source>Clear Tag '%1' on %2</source> + <translation>在 %2 上清除標籤「%1」</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="724"/> + <source>Clear %1 tags on %2</source> + <translation>在 %2 上清除 %1 標籤</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="757"/> + <source>Set "source" tag on %1</source> + <translation>在 %1 上設定「source」標籤</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="780"/> + <source>Remove member '%1' on %2</source> + <translation>在 %2 上移除成員「%1」</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="857"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="902"/> + <source>Reorder members in relation %1</source> + <translation>重新排列在關係 %1 中的成員</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="795"/> + <source>Relation Modified %1</source> + <translation>關係已修改 %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="37"/> + <source>Create Area interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="105"/> + <source>Create Area %1</source> + <translation>建立區域 %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="140"/> + <source>Area: Create Road %1</source> + <translation>區域:建立道路 %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="168"/> + <source>Add a hole.</source> + <translation>新增洞。</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="169"/> + <source>Do you want to add a(nother) hole to this area?</source> + <translation>您想要加入另外的洞到此區域嗎?</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="173"/> + <source>Area: Finish Road %1</source> + <translation>區域:完成道路 %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="188"/> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="199"/> + <source>Area: Add node %1 to Road %2</source> + <translation>區域:新增節點 %1 到道路 %2</translation> + </message> + <message> + <location filename="../src/Interactions/CreateAreaInteraction.cpp" line="269"/> + <source>Close Area %1</source> + <translation>關閉區域 %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="36"/> + <source>LEFT-CLICK to start;DRAG to scale;SHIFT-DRAG to rotate;LEFT-CLICK to end</source> + <translation>左鍵點選以啟動;拖曳以縮放;Shift + 拖曳以旋轉;左鍵點選以結束</translation> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="41"/> + <source>Create Polygon interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreatePolygonInteraction.cpp" line="90"/> + <source>Create polygon %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="59"/> + <source>Create Roundabout interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateRoundaboutInteraction.cpp" line="89"/> + <source>Create Roundabout %1</source> + <translation>建立圓環 %1</translation> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="59"/> + <source>Create Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="241"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="301"/> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="312"/> + <source>Create node %1 in way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="285"/> + <source>Create way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="293"/> + <source>Create node: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="315"/> + <source>Add node %1 to way %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateSingleWayInteraction.cpp" line="354"/> + <source>Close Road %1</source> + <translation>關閉道路 %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="52"/> + <source>LEFT-CLICK to select;RIGHT-CLICK to pan;CTRL-LEFT-CLICK to toggle selection;SHIFT-LEFT-CLICK to add to selection;LEFT-DRAG for area selection;CTRL-RIGHT-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>左鍵點選以選取;右鍵點選以將攝影機轉向;Ctrl + 左鍵點選以切換選取區:Shift + 左鍵點選以新增到選取區;左鍵拖曳區域選取;Ctrl + 右鍵拖曳以縮放;雙擊以建立節點;在節點上雙擊以開始路徑;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="54"/> + <source>CLICK to select/move;CTRL-CLICK to toggle selection;SHIFT-CLICK to add to selection;SHIFT-DRAG for area selection;CTRL-DRAG for zoom;DOUBLE-CLICK to create a node;DOUBLE-CLICK on a node to start a way;</source> + <translation>點許以選取/移動;Ctrl + 點選以切換選取區;Shift + 點選以新增到選取區;Shift + 拖曳區域選取;Ctrl + 拖曳以縮放;雙擊以建立節點;在節點上雙擊以開始路徑;</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="59"/> + <source>Edit interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="291"/> + <source>Remove feature %1</source> + <translation>移除圖徽 %1</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="293"/> + <source>Remove features</source> + <translation>移除圖徵</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="303"/> + <source>Delete Children.</source> + <translation>刪除子代</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="304"/> + <source>Do you want to delete the children nodes also? +Note that OSM nodes outside the downloaded area will be kept.</source> + <translation>您想要同時也刪除子節點嗎? +注意已下載區域外的 OSM 節點將會保留。</translation> + </message> + <message> + <location filename="../src/Interactions/EditInteraction.cpp" line="329"/> + <source>Reverse %1 ways</source> + <translation>反轉 %1 條路徑</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="42"/> + <source>LEFT-CLICK to select;LEFT-DRAG to move</source> + <translation>左鍵點選以選取;左鍵拖曳以移動</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="47"/> + <source>Move Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="154"/> + <source>Move nodes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="158"/> + <source>Move node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="211"/> + <source>Nodes at the same position found.</source> + <translation>發現在同一位置的節點。</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="212"/> + <source>Do you want to merge all nodes at the drop position?</source> + <translation>您想要合併所有在點選位置的節點嗎?</translation> + </message> + <message> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="221"/> + <source>Merge nodes into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2753"/> + <source>Merge Nodes into %1</source> + <translation>合併節點到 %1 中</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to rotate</source> + <translation>將游標置於其上以選取;左鍵拖曳以旋轉</translation> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="44"/> + <source>Rotate interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/RotateInteraction.cpp" line="139"/> + <source>Rotate Feature</source> + <translation>旋轉圖徽</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="39"/> + <source>HOVER to select;LEFT-DRAG to scale</source> + <translation>將游標置於其上以選取;左鍵拖曳以縮放</translation> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="44"/> + <source>Scale interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ScaleInteraction.cpp" line="139"/> + <source>Scale Feature</source> + <translation>比例尺圖徽</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="27"/> + <source>LEFT-CLICK to first corner -> LEFT-DRAG to specify area -> LEFT-CLICK to zoom</source> + <translation>在第一個角落左鍵點選→在指定區域左鍵拖曳→左鍵拖曳以縮放</translation> + </message> + <message> + <location filename="../src/Interactions/ZoomInteraction.cpp" line="30"/> + <source>Zoom interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="193"/> + <source>GPS Exchange format (*.gpx) +</source> + <translation>GPS 交換格式 (*.gpx) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="194"/> + <source>OpenStreetMap format (*.osm) +</source> + <translation>OpenStreetMap 格式 (*.osm) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="195"/> + <source>OpenStreetMap change format (*.osc) +</source> + <translation>OpenStreetMap 變動格式 (*.osc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="196"/> + <source>Noni GPSPlot format (*.ngt) +</source> + <translation>Noni GPSPlot 格式 (*.ngt) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="197"/> + <source>NMEA GPS log format (*.nmea *.nma) +</source> + <translation>NMEA GPS 日誌格式 (*.nmea *.nma) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="198"/> + <source>KML file (*.kml) +</source> + <translation>KML 檔案 (*.kml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="199"/> + <source>Comma delimited format (*.csv) +</source> + <translation>逗號分隔格式 (*.csv) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="202"/> + <source>Geotagged images (*.jpg) +</source> + <translation>包含地理標記的圖片 (*.jpg) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>ESRI Shapefile (*.shp) +</source> + <translation>ESRI 外形檔案 (*.shp) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="204"/> + <source>Geography Markup Language (*.gml) +</source> + <translation>地理標記語言 (*.gml) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="206"/> + <source>Protobuf Binary Format (*.pbf) +</source> + <translation>Protobuf 二進位格式 (*.pbf) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="211"/> + <location filename="../src/MainWindow.cpp" line="215"/> + <location filename="../src/MainWindow.cpp" line="2969"/> + <source>Supported formats</source> + <translation>支援的格式</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="209"/> + <location filename="../src/MainWindow.cpp" line="212"/> + <source>Merkaartor document (*.mdc) +</source> + <translation>Merkaartor 文件 (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="213"/> + <location filename="../src/MainWindow.cpp" line="217"/> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <location filename="../src/MainWindow.cpp" line="3336"/> + <location filename="../src/MainWindow.cpp" line="3351"/> + <location filename="../src/MainWindow.cpp" line="3372"/> + <location filename="../src/MainWindow.cpp" line="3407"/> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>All Files (*)</source> + <translation>所有檔案 (*)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="250"/> + <source>tile %v / %m</source> + <translation>圖磚 %v / %m</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Low</source> + <translation>低</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>High</source> + <translation>高</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="431"/> + <source>Opaque</source> + <translation>不透明</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="601"/> + <location filename="../src/MainWindow.cpp" line="1092"/> + <source>Feature</source> + <translation>圖徽</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="610"/> + <location filename="../src/MainWindow.cpp" line="1093"/> + <source>Node</source> + <translation>節點</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="626"/> + <location filename="../src/MainWindow.cpp" line="1095"/> + <source>Relation</source> + <translation>關係</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="742"/> + <source>Load image</source> + <translation>載入圖片</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="744"/> + <source>Add node position to image</source> + <translation>新增節點位置到圖片</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="746"/> + <source>Geotag image with this position</source> + <translation>包含這個位置的地理標記圖片</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="748"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1084"/> + <source>File</source> + <translation>檔案</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1085"/> + <source>Edit</source> + <translation>編輯</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1086"/> + <source>View</source> + <translation>檢視</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1087"/> + <source>Show</source> + <translation>顯示</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1088"/> + <source>Directional Arrows</source> + <translation>方向箭頭</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1090"/> + <source>Layers</source> + <translation>圖層</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1091"/> + <source>Create</source> + <translation>建立</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="618"/> + <location filename="../src/MainWindow.cpp" line="1094"/> + <source>Way</source> + <translation>路徑</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1096"/> + <source>Tools</source> + <translation>工具</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1097"/> + <source>Windows</source> + <translation>視窗</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1098"/> + <source>Help</source> + <translation>說明</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1255"/> + <source>Cut Features</source> + <translation>剪下圖徽</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard invalid</source> + <translation>剪貼簿無效</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1387"/> + <source>Clipboard do not contain valid data.</source> + <translation>剪貼簿不包含有效資料。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1548"/> + <source>GDAL import warning</source> + <translation>GDAL 匯入警告</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1549"/> + <source>You are about to import file(s) using GDAL. This feature is rather experimental, and may or may NOT work, possibly causing a crash. Make sure you won't loose any data in case it doesn't work out. +Please do report bugs in case of a crash, but don't be surprised about it. + +Continue with import? +</source> + <translation>您將要使用 GDAL 匯入檔案。此功能目前是實驗性的功能,可能會也可能不會正常運作,也可能會造成當機。無法確保您不會損失任何資料。 +請在當機發生後回報它,但請不要對其吃驚。 + +繼續匯入? +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1569"/> + <source>Import file</source> + <translation>匯入檔案</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1595"/> + <location filename="../src/MainWindow.cpp" line="4309"/> + <source>Unsaved changes</source> + <translation>未儲存的變更</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1596"/> + <source>The current map contains unsaved changes that will be lost when starting a new one. +Do you want to cancel starting a new map or continue and discard the old changes?</source> + <translation>目前的地圖包含未儲存的變更,當啟動一個新的地圖的時候將會遺失。 +您想要取消啟動新地圖或是繼續並丟棄舊的變更?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1603"/> + <source>Unsaved Style changes</source> + <translation>未儲存的樣式變更</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1604"/> + <source>You have modified the current style. +Do you want to save your changes?</source> + <translation>您已經修改了目前的樣式。 +您想要儲存您的變更嗎?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1629"/> + <source>Waypoints</source> + <translation>路徑點</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1646"/> + <source>Track %1</source> + <translation>軌跡 %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1691"/> + <source>Big Fat Copyright Warning</source> + <translation>超大的版權警告!</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1692"/> + <source>You are trying to import a KML file. Please be aware that: + + - You cannot import to OSM a KML file created from Google Earth. While you might + think that nodes you created from GE are yours, they are not! + They are still a derivative work from GE, and, as such, cannot be used in OSM. + + - If you downloaded it from the Internet, chances are that there is a copyright on it. + Please be absolutely sure that using those data in OSM is permitted by the author, or + that the data is public domain. + +If unsure, please seek advice on the "legal" or "talk" openstreetmap mailing lists. + +Are you absolutely sure this KML can legally be imported in OSM?</source> + <translation>您試圖匯入 KML 檔案。請注意這些事情: + + - 您不能從 Google 地球建立 KML 檔案並匯入 OSM。雖然您可能 + 覺得您在 GE 上建立的節點是您所擁有的,但它們並不是! + 它們仍是 GE 的衍生著作,所以無法在 OSM 中使用。 + + - 若它是從網際網路下載的,有可能它是有版權的。 + 請一定要確保作者允許您在 OSM 上使用這些資料, + 或這些資料處在公有領域。 + +若不確定,請在 OpenStreetMap 的「legal」或「talk」郵件清單中搜尋。 + +您確定這個 KML 可以合法地匯入到 OSM 中嗎?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <source>No valid file</source> + <translation>沒有有效的檔案</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1831"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>%1 could not be opened.</source> + <translation>%1 無法開啟</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1876"/> + <source>Incoming Remote Control Request</source> + <translation>收到遠端控制請求</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1877"/> + <source>Wanted to load object '%1', but don't know how to do that. Sorry.</source> + <translation>想要載入物件「%1」,但是不知道要怎麼做。抱歉。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1922"/> + <source>Remote add POI %1 %2</source> + <translation>遠端新增 POI %1 %2</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Incoming Remote control request</source> + <translation>收到遠端控制請求</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1977"/> + <source>Unknown action url: %1</source> + <translation>未知的動作 URL:%1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1999"/> + <source>Old Qt version detected</source> + <translation>偵測到舊版的 Qt</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2000"/> + <source>Your setup uses Qt %1, which contains various known errors in uploading data to OpenStreetMap leading to 401 server response codes. Are you sure you want to continue (which is not recommended). +For more information see http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</source> + <translation>您設定時使用 Qt %1,其有許多已知的錯誤,在上傳資料到 OpenStreetMap 時會導致 401 伺服器回應碼。您確定您想要繼續嗎(不建議)。 +更多資訊請見 http://wiki.openstreetmap.org/index.php/Problem_uploading_with_Merkaartor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>Upload OSM</source> + <translation>上傳 OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2008"/> + <source>You don't seem to have specified your +OpenStreetMap username and password. +Do you want to do this now?</source> + <translation>您似乎沒有指定您的 +OpenStreetMap 使用者名稱與密碼。 +您想要現在做這件事嗎?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>Error downloading</source> + <translation>下載錯誤</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2024"/> + <location filename="../src/MainWindow.cpp" line="2083"/> + <source>The map could not be downloaded</source> + <translation>地圖無法被下載</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>Error downloading MapDust</source> + <translation>下載 MapDust 錯誤</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2072"/> + <source>The MapDust bugs could not be downloaded</source> + <translation>MapDust 臭蟲無法被下載</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Create Polygon</source> + <translation>建立多邊形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2411"/> + <source>Specify the number of sides</source> + <translation>指定邊的數量</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2580"/> + <source>Force Feature upload</source> + <translation>強制圖徽上傳</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="1987"/> + <source>Open file</source> + <translation>開啟檔案</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2465"/> + <source>Join Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2479"/> + <source>Split Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2493"/> + <source>Break Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2507"/> + <source>Simplify Ways</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2593"/> + <source>Create Junction</source> + <translation>建立交點</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2597"/> + <source>Multiple intersection.</source> + <translation>多重路口。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2598"/> + <source>Those roads have multiple intersections. +Do you still want to create a junction for each one (Unwanted junctions can still be deleted afterhand)?</source> + <translation>這些道路有多重路口。 +您仍想要為每個都建立路口(稍後仍可刪除不要的路口)?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2615"/> + <source>Add Street Numbers</source> + <translation>加入門牌號碼</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <location filename="../src/MainWindow.cpp" line="2637"/> + <source>Number of segments to divide into</source> + <translation>要分割成的區段數量</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2632"/> + <source>Specify the number of segments</source> + <translation>指定區段的數量</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2641"/> + <source>Subdivide way into %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2664"/> + <source>Axis Align</source> + <translation>軸對齊</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2665"/> + <source>Specify the number of regular axes to align edges on (e.g. 4 for rectangular)</source> + <translation>指定常規軸的數量以供邊緣對齊(例如矩形為 4)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2672"/> + <source>triangular</source> + <translation>三角形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2673"/> + <source>rectangular</source> + <translation>矩形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2674"/> + <source>pentagonal</source> + <translation>五邊形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2675"/> + <source>hexagonal</source> + <translation>六邊形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2676"/> + <source>heptagonal</source> + <translation>七邊形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2677"/> + <source>octagonal</source> + <translation>八邊形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2681"/> + <source>Align onto %1 axes</source> + <translation>在 %1 軸上對齊</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2683"/> + <source>Align onto %1 regular axes</source> + <translation>在 %1 常規軸上對齊</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2690"/> + <location filename="../src/MainWindow.cpp" line="2693"/> + <source>Unable to align to axes</source> + <translation>無法對齊至軸</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2691"/> + <source>Align to axes operation failed. Please adjust any sharp corners and try again.</source> + <translation>對齊至軸操作失敗。請調整任意尖角,然後再試一次。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2694"/> + <source>Align to axes operation failed and did not converge on a solution.</source> + <translation>對齊至軸操作失敗,解法並不收斂。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2710"/> + <source>Bing Extract</source> + <translation>Bing 摘錄</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2725"/> + <source>Align Nodes</source> + <translation>對齊節點</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2739"/> + <source>Spread Nodes</source> + <translation>展開節點</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2768"/> + <source>Detach Node %1</source> + <translation>分離節點 %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2782"/> + <source>Add member to relation</source> + <translation>加入成員至關係</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2794"/> + <source>Remove member from relation</source> + <translation>從關係中移除成員</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2806"/> + <source>Add to Multipolygon</source> + <translation>新增到多重多邊形</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2818"/> + <source>Join areas</source> + <translation>加入區域</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2830"/> + <source>Split area</source> + <translation>分離區域</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2845"/> + <source>Terrace area into %1</source> + <translation>將區域梯形化為 %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2873"/> + <source>Create Relation %1</source> + <translation>建立關係 %1</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Save map style</source> + <translation>儲存地圖樣式</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2947"/> + <source>Merkaartor map style (*.mas)</source> + <translation>Merkaartor 地圖樣式 (*.mas)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2968"/> + <source>Load map style</source> + <translation>載入地圖樣式</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2970"/> + <source>Merkaartor map style (*.mas) +</source> + <translation>Merkaartor 地圖樣式 (*.mas) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="2971"/> + <source>MapCSS stylesheet (*.css)</source> + <translation>MapCSS 樣式表 (*.css)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>Rebuild History</source> + <translation>重建歷史</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3030"/> + <source>An attempt will be made to rebuild the history. +No guarantee, though, and no Undo. +Are you sure you want to try this? </source> + <translation>將會嘗試重建歷史。 +但是,沒有擔保,也無法復原。 +您確定您想要嘗試這個嗎?</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3126"/> + <location filename="../src/MainWindow.cpp" line="3323"/> + <source>untitled</source> + <translation>未命名</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <source>Save Merkaartor document</source> + <translation>儲存 Merkaartor 文件</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3142"/> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Merkaartor documents Files (*.mdc)</source> + <translation>Merkaartor 文件檔案 (*.mdc) +</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3152"/> + <source>Save Merkaartor template document</source> + <translation>儲存 Merkaartor 範本文件</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <source>Unable to open save file</source> + <translation>無法開啟儲存的檔案</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3197"/> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>%1 could not be opened for writing.</source> + <translation>%1 無法被開啟用來寫入</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3213"/> + <source>Unable to open save template document</source> + <translation>無法開啟儲存的範本文件</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <location filename="../src/MainWindow.cpp" line="3275"/> + <source>Invalid file</source> + <translation>無效的檔案</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3230"/> + <source>%1 is not a valid Merkaartor document.</source> + <translation>%1 不是有效的 Merkaartor 文件。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>Export OSM</source> + <translation>匯出 OSM</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3336"/> + <source>OSM Files (*.osm)</source> + <translation>OSM 檔案 (*.osm)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>Export osmChange</source> + <translation>匯出 osmChange</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3351"/> + <source>osmChange Files (*.osc)</source> + <translation>osmChange 檔案 (*.osc)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>Export GPX</source> + <translation>匯出 GPX</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3372"/> + <source>GPX Files (*.gpx)</source> + <translation>GPX 檔案 (*.gpx)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>Export KML</source> + <translation>匯出 KML</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3407"/> + <source>KML Files (*.kml)</source> + <translation>KML 檔案 (*.kml)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3499"/> + <source>Feature extraction</source> + <translation>抽出圖徽</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3509"/> + <source>Extracting features...</source> + <translation>正在抽出圖徽...</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3592"/> + <source>Hide tool buttons labels</source> + <translation>隱藏按鈕標籤</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3703"/> + <source>%1 (int)</source> + <translation>%1 (int)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3755"/> + <source>Add Bookmark</source> + <translation>加入書籤</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3756"/> + <source>Specify the name of the bookmark.</source> + <translation>指定書籤名稱。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3759"/> + <source>Invalid bookmark name</source> + <translation>無效的書籤名稱</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3760"/> + <source>Bookmark cannot be blank.</source> + <translation>書籤不能為空白。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3764"/> + <source>Warning: Bookmark name already exists</source> + <translation>警告:書籤名稱已存在</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3765"/> + <source>Enter a new one, keep the same to overwrite or cancel.</source> + <translation>輸入新的名稱、保持原樣以覆寫或是取消。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3803"/> + <source>Remove Bookmark</source> + <translation>移除書籤</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3804"/> + <source>Select the bookmark to remove.</source> + <translation>選取要移除的書籤。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Invalid projection</source> + <translation>無效的投影</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="3864"/> + <location filename="../src/MainWindow.cpp" line="3873"/> + <source>Unable to set projection "%1".</source> + <translation>無法設定投影「%1」。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4005"/> + <source>GPS error</source> + <translation>GPS 錯誤</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4006"/> + <source>Unable to open GPS port.</source> + <translation>無法開啟 GPS 埠。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4015"/> + <source>Open NMEA log file</source> + <translation>開啟 NMEA 日誌檔案</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Save Tag Templates</source> + <translation>儲存標籤範本</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4131"/> + <source>Merkaartor tag templates (*.mat)</source> + <translation>Merkaartor 標籤範本 (*.mat)</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4140"/> + <location filename="../src/MainWindow.cpp" line="4154"/> + <source>Open Tag Templates</source> + <translation>開啟標籤範本</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4231"/> + <source>Warning! Could not load the Merkaartor translations for the "%1" language. Switching to default English.</source> + <translation>警告!無法載入「%1」語言的 Merkaartor 翻譯。切換為預設的英文。</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Unresolved conflicts</source> + <translation>未解決的衝突</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4289"/> + <source>Please resolve existing conflicts first</source> + <translation>請先解決已有的衝突</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="4310"/> + <source>It is strongly recommended to save the changes to your document after an upload. +Do you want to do this now?</source> + <translation>強烈建議在上傳放儲存變更到您的文件中。 +您現在想要這麼做嗎?</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="142"/> + <location filename="../src/common/TagModel.cpp" line="173"/> + <source>Set tags on multiple features</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="144"/> + <source>Set tag '%1=' on %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="175"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="36"/> + <source>Build Bridge interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/BuildBridgeInteraction.cpp" line="158"/> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="112"/> + <location filename="../src/Interactions/MoveNodeInteraction.cpp" line="261"/> + <source>Create node in way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="49"/> + <source>Create Parallel Way interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="173"/> + <source>Add nodes to parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateDoubleWayInteraction.cpp" line="224"/> + <source>Create parallel way %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="33"/> + <source>Create Node interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/CreateNodeInteraction.cpp" line="121"/> + <source>Create node %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="43"/> + <source>Extrude interaction</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Interactions/ExtrudeInteraction.cpp" line="133"/> + <source>Extrude way %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MapFeature</name> + <message> + <location filename="../src/Features/Feature.cpp" line="1058"/> + <source><i>V: </i><b>%1</b> </source> + <translation><i>V: </i><b>%1</b> </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1063"/> + <source><i>last: </i><b>%1</b> by <b>%2</b></source> + <translation><i>前次:</i><b>%1</b> 由 <b>%2</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1065"/> + <source><i>last: </i><b>%1</b></source> + <translation><i>前次:</i><b>%1</b></translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1069"/> + <source><br/><i>layer: </i><b>%1</b> </source> + <translation><br/><i>圖層: </i><b>%1</b> </translation> + </message> + <message> + <location filename="../src/Features/Feature.cpp" line="1093"/> + <source>Browse</source> + <translation>瀏覽</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="375"/> + <location filename="../src/Features/Node.cpp" line="639"/> + <source>Waypoint</source> + <translation>路徑點</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="640"/> + <source>coord</source> + <translation>座標</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="380"/> + <location filename="../src/Features/Node.cpp" line="647"/> + <source>description</source> + <translation>描述</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="376"/> + <source>WGS84 coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="377"/> + <source>Projected coordinates</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="382"/> + <location filename="../src/Features/Node.cpp" line="649"/> + <source>comment</source> + <translation>評論</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="384"/> + <location filename="../src/Features/Node.cpp" line="651"/> + <source>Node</source> + <translation>節點</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="643"/> + <source>elevation</source> + <translation>海拔</translation> + </message> + <message> + <location filename="../src/Features/Node.cpp" line="645"/> + <source>speed</source> + <translation>速度</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>size</source> + <translation>大小</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="705"/> + <source>members</source> + <translation>成員</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="708"/> + <location filename="../src/Features/Way.cpp" line="918"/> + <source>Topleft</source> + <translation>左上</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="710"/> + <location filename="../src/Features/Way.cpp" line="920"/> + <source>Botright</source> + <translation>右下</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="712"/> + <source>Relation</source> + <translation>關係</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="774"/> + <source>Role</source> + <translation>角色</translation> + </message> + <message> + <location filename="../src/Features/Relation.cpp" line="776"/> + <source>Member</source> + <translation>成員</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="910"/> + <source>Closed way</source> + <translation>已關閉的路徑</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="913"/> + <source>Length</source> + <translation>長度</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>Size</source> + <translation>大小</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="915"/> + <source>%1 nodes</source> + <translation>%1 個節點</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Area</source> + <translation>區域</translation> + </message> + <message> + <location filename="../src/Features/Way.cpp" line="922"/> + <source>Way</source> + <translation>路徑</translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../src/common/MapView.cpp" line="339"/> + <source>%1 m/pixel</source> + <translation>%1 公尺/像素</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="345"/> + <source>Align: %1m @ %2</source> + <translation>對齊:%1公尺 @ %2</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="351"/> + <source>%1ms</source> + <translation>%1毫秒</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="384"/> + <source>%1 m</source> + <translation>%1 公尺</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="386"/> + <source>%1 km</source> + <translation>%1 公里</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1160"/> + <source>View</source> + <translation>檢視</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1161"/> + <source>Bounding Box</source> + <translation>邊界框</translation> + </message> + <message> + <location filename="../src/common/MapView.cpp" line="1173"/> + <source>Projection</source> + <translation>投影</translation> + </message> +</context> +<context> + <name>MerkaartorPreferences</name> + <message> + <location filename="../src/Preferences/BookmarksList.cpp" line="20"/> + <location filename="../src/Preferences/BookmarksList.cpp" line="27"/> + <source>New Bookmark</source> + <translation>新書籤</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>Preferences upload failed</source> + <translation>偏好設定上傳失敗</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="412"/> + <source>Duplicate key</source> + <translation>複製金鑰</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="415"/> + <source>More than 150 preferences</source> + <translation>多於 150 個偏好設定</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Preferences communication failed</source> + <translation>偏好設定傳達失敗</translation> + </message> + <message> + <location filename="../src/Preferences/MerkaartorPreferences.cpp" line="418"/> + <source>Communication error</source> + <translation>傳達錯誤</translation> + </message> + <message> + <location filename="../src/Preferences/TmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/TmsServersList.cpp" line="38"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="20"/> + <location filename="../src/Preferences/WmsServersList.cpp" line="40"/> + <source>New Server</source> + <translation>新伺服器</translation> + </message> +</context> +<context> + <name>MsBingMapAdapter</name> + <message> + <location filename="../plugins/background/MMsBingMapBackground/msbingmapadapter.cpp" line="243"/> + <source>Terms of Use</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>MultiProperties</name> + <message> + <location filename="../src/common/MultiProperties.ui" line="13"/> + <source>Form</source> + <translation>外形</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="33"/> + <source>Tags</source> + <translation>標籤</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="53"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/MultiProperties.ui" line="73"/> + <source>Selected items</source> + <translation>選定的項目</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderTableModel</name> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="69"/> + <source>Class</source> + <translation>種類</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="72"/> + <source>Name</source> + <translation>名稱</translation> + </message> + <message> + <location filename="../src/NameFinder/namefindertablemodel.cpp" line="75"/> + <source>Unknown field</source> + <translation>未知欄位</translation> + </message> +</context> +<context> + <name>NameFinder::NameFinderWidget</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="91"/> + <source>Error!</source> + <translation>錯誤!</translation> + </message> + <message> + <location filename="../src/NameFinder/namefinderwidget.cpp" line="93"/> + <source>Name finder service requires authentication.</source> + <translation>名稱探測器服物需要驗證。</translation> + </message> +</context> +<context> + <name>NameFinderWidgetUi</name> + <message> + <location filename="../src/NameFinder/namefinderwidget.ui" line="14"/> + <source>Form</source> + <translation>外形</translation> + </message> +</context> +<context> + <name>NativeRenderDialog</name> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>Output filename</source> + <translation>輸出檔案名稱</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>untitled</source> + <translation>未命名</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <source>PDF files (*.pdf)</source> + <translation>PDF 檔案 (*.pdf)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="179"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>All Files (*)</source> + <translation>所有檔案 (*)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="208"/> + <source>Image files (*.png *.jpg)</source> + <translation>圖片檔案 (*.png *.jpg)</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.cpp" line="244"/> + <source>SVG files (*.svg)</source> + <translation>SVG 檔案 (*.svg)</translation> + </message> +</context> +<context> + <name>NativeRenderWidget</name> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="14"/> + <source>Raster/SVG export</source> + <translation>Raster/SVG 匯出</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="35"/> + <source>Options</source> + <translation>選項</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="58"/> + <source>min lat/Lon</source> + <translation>最小緯度/經度</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="99"/> + <source>max lat/Lon</source> + <translation>最大緯度/經度</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="183"/> + <source>Show Nodes</source> + <translation>顯示節點</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="190"/> + <source>Show Relations</source> + <translation>顯示關係</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="200"/> + <source>Show Scale</source> + <translation>顯示比例尺</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="213"/> + <source>Show Lat/Lon Grid</source> + <translation>顯示緯度/經度網格</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="223"/> + <source>Show unstyled features</source> + <translation>顯示無樣式的特徵</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="241"/> + <source>Print resolution</source> + <translation>列印解析度</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="255"/> + <source>300</source> + <translation>300</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="260"/> + <source>600</source> + <translation>600</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="265"/> + <source>1200</source> + <translation>1200</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="273"/> + <source>dpi</source> + <translation>dpi</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="304"/> + <source>Export to PDF...</source> + <translation>匯出為 PDF...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="311"/> + <source>Export to SVG...</source> + <translation>匯出為 SVG...</translation> + </message> + <message> + <location filename="../src/Render/NativeRenderDialog.ui" line="318"/> + <source>Export to Raster...</source> + <translation>匯出為 Raster...</translation> + </message> +</context> +<context> + <name>OsmServerWidget</name> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="14"/> + <source>Form</source> + <translation>外形</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="25"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="35"/> + <location filename="../src/Preferences/OsmServerWidget.ui" line="46"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="74"/> + <source>User:</source> + <translation>使用者:</translation> + </message> + <message> + <location filename="../src/Preferences/OsmServerWidget.ui" line="84"/> + <source>Pwd:</source> + <translation>密碼:</translation> + </message> +</context> +<context> + <name>PaintStyleEditor</name> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="14"/> + <source>Map style editor</source> + <translation>地圖樣式編輯器</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="20"/> + <source>Global</source> + <translation>全域</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="37"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="456"/> + <source>Background</source> + <translation>背景</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="53"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="96"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="273"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="340"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="486"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="681"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="791"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="997"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1289"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1363"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1608"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="80"/> + <source>Nodes</source> + <translation>節點</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="142"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="532"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="837"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1043"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1216"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1457"/> + <source>Proportional thickness</source> + <translation>比例厚度</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="162"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="552"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="857"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1063"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1236"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1477"/> + <source>Fixed thickness</source> + <translation>固定厚度</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="206"/> + <source>Filter</source> + <translation>過濾器</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="230"/> + <source>Add</source> + <translation>新增</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="237"/> + <source>Remove</source> + <translation>移除</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="244"/> + <source>Duplicate</source> + <translation>複製</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="330"/> + <source>Tag selection</source> + <translation>標籤選擇</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="357"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="413"/> + <source>meter/pixel</source> + <translation>公尺/像素</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="383"/> + <source>Visible up to</source> + <translation>可見達到</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="390"/> + <source>Visible from scale</source> + <translation>從比例尺可見</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="470"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="775"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1347"/> + <source>Draw with color</source> + <translation>利用色彩繪製</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="614"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1125"/> + <source>Dashed</source> + <translation>虛線</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="628"/> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1139"/> + <source>off</source> + <translation>關閉</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="665"/> + <source>Fill area</source> + <translation>填充區域</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="730"/> + <source>Fill with Touchup icon</source> + <translation>以修改的圖示填充</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="761"/> + <source>Boundary</source> + <translation>範圍</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="913"/> + <source>Interior</source> + <translation>內部</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="923"/> + <source>Exteriror</source> + <translation>外部</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="967"/> + <source>Touchup</source> + <translation>修改</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="981"/> + <source>Draw steps</source> + <translation>繪製階梯</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1176"/> + <source>Draw icon</source> + <translation>繪製圖市示</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1273"/> + <source>Draw Traffic Direction Marks</source> + <translation>繪製交通方向標誌</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1333"/> + <source>Label</source> + <translation>標籤</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1370"/> + <source>Font</source> + <translation>字型</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1417"/> + <source>Label tag</source> + <translation>貼標籤</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1533"/> + <source>Halo</source> + <translation>光暈</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1543"/> + <source>Area</source> + <translation>區域</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1592"/> + <source>Draw with background color</source> + <translation>利用背景色彩繪製</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.ui" line="1648"/> + <source>Label with background tag</source> + <translation>利用背景標籤歸類</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="50"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="51"/> + <source>Always</source> + <translation>總是</translation> + </message> + <message> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="313"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="331"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="372"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="455"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="543"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="574"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="650"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="756"/> + <location filename="../src/PaintStyle/PaintStyleEditor.cpp" line="803"/> + <source>Select Color</source> + <translation>選取顏色</translation> + </message> +</context> +<context> + <name>PhotoLoadErrorDialog</name> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="14"/> + <source>No Valid geotag</source> + <translation>沒有有效的地理標籤</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="20"/> + <source>TextLabel</source> + <translation>文字標籤</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="27"/> + <source>This photo does not contain geo-tagging EXIF data. +What do you want to do next?</source> + <translation>這張照片不包含有地理標籤的 EXIF 資料。 +您下一步想要做什麼?</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="44"/> + <source>Try to match with a track node</source> + <translation>嘗試與軌跡節點符合</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="63"/> + <source>Load without associated node</source> + <translation>不載入有關聯的節點</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="73"/> + <source>Extract info from barcode (Walking Papers)</source> + <translation>從條碼中抽出資訊(Walking Papers)</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="89"/> + <source>Ignore it</source> + <translation>忽略它</translation> + </message> + <message> + <location filename="../src/Docks/PhotoLoadErrorDialog.ui" line="99"/> + <source>Do this for all current photos.</source> + <translation>對所有目前的照片做這件事。</translation> + </message> +</context> +<context> + <name>PictureViewerDialog</name> + <message> + <location filename="../src/Utils/PictureViewerDialog.ui" line="13"/> + <source>Dialog</source> + <translation>對話框</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Output filename</source> + <translation>輸出檔案名稱</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>untitled</source> + <translation>未命名</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <source>SVG files (*.svg)</source> + <translation>SVG 檔案 (*.svg)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="40"/> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>All Files (*)</source> + <translation>所有檔案 (*)</translation> + </message> + <message> + <location filename="../src/Utils/PictureViewerDialog.cpp" line="56"/> + <source>Image files (*.png *.jpg)</source> + <translation>圖片檔案 (*.png *.jpg)</translation> + </message> +</context> +<context> + <name>PreferencesDialog</name> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="15"/> + <source>Preferences</source> + <translation>偏好設定</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="28"/> + <source>Visual</source> + <translation>可見</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="34"/> + <source>General</source> + <translation>一般</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="66"/> + <source>Opacity low/high</source> + <translation>不透明度低/高</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="97"/> + <source>Single mouse button interaction</source> + <translation>滑鼠單鍵互動</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="104"/> + <source>Use custom Qt style</source> + <translation>使用自訂 Qt 樣式</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="111"/> + <source>Allow node/way creation in select mode</source> + <translation>允許在選取模式時建立節點/路徑</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="132"/> + <source>Relations selectable while hidden</source> + <translation>當隱藏時可選取的關係</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="165"/> + <source>Colors</source> + <translation>色彩</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="171"/> + <source>Background</source> + <translation>背景</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="199"/> + <source>Overwrite style</source> + <translation>覆寫樣式</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="221"/> + <source>GPX track</source> + <translation>GPX 軌跡</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="252"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="317"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="363"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="409"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="462"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="529"/> + <source>Pixels</source> + <translation>像素</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="287"/> + <source>Interface</source> + <translation>介面</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="431"/> + <source>Hover</source> + <translation>停留</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="484"/> + <source>Relations</source> + <translation>關係</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="491"/> + <source>Focus</source> + <translation>焦點</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="498"/> + <source>Highlight</source> + <translation>突顯</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="551"/> + <source>Dirty</source> + <translation>有問題的</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="575"/> + <source>Locale</source> + <translation>語系</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="590"/> + <source>Use language</source> + <translation>使用語言</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="625"/> + <source>Translate standard tags</source> + <translation>翻譯標準標籤</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="646"/> + <source>Rendering</source> + <translation>渲染</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="652"/> + <source>Options</source> + <translation>選項</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="665"/> + <source>No anti-aliasing while panning</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="672"/> + <source><html><head/><body><p>If enabled, wireframe rendering (View-Wireframe) will use the current style for colors and fill. Only the fixed thickness will be used for width. </p></body></html></source> + <translation><html><head/><body><p>若啟用,線框渲染(線框檢視)將會使用目前樣式的色彩與填充。只有固定寬度才將會用於寬度。</p></body></html></translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="675"/> + <source>Use current style for wireframe rendering</source> + <translation>線框渲染使用目前的樣式</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="685"/> + <source>Editing</source> + <translation>編輯</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="691"/> + <source>Quick editing</source> + <translation>快速編輯</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="698"/> + <source>Wireframe editing</source> + <translation>線框編輯</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="705"/> + <source>Full render editing</source> + <translation>完全渲染編輯</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="715"/> + <source>Map style</source> + <translation>地圖樣式</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="511"/> + <source>Custom styles directory</source> + <translation>自訂樣式目錄</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="757"/> + <source>Current style</source> + <translation>目前樣式</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="803"/> + <source>Template</source> + <translation>範本</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Tag Template</source> + <translation>標籤範本</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="817"/> + <source>Built-in</source> + <translation>內建</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="841"/> + <source>Custom</source> + <translation>自訂</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="890"/> + <source>Data</source> + <translation>資料</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="916"/> + <source>XAPI</source> + <translation>XAPI</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="924"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="956"/> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="968"/> + <source>Documents</source> + <translation>文件</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="979"/> + <source>Autoload template document</source> + <translation>自動載入範本文件</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1004"/> + <source>Autosave documents after upload</source> + <translation>在上傳後自動儲存文件</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1014"/> + <source>Tracks</source> + <translation>軌跡</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="42"/> + <source>Zoom out/in (%)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="118"/> + <source>Separate move mode</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="125"/> + <source>Use virtual nodes (new session required)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="186"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="236"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="301"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="347"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="393"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="446"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="513"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="746"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="864"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="995"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1219"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1555"/> + <source>…</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="259"/> + <source>Simple GPX track appearance</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="581"/> + <source>A restart of the program may be needed for these changes to take effect.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="658"/> + <source>Anti-aliasing</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="723"/> + <source>Custom styles folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="779"/> + <source>No styles for track layers</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="809"/> + <source>Tag template</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="945"/> + <source>Nominatim (geo search)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1022"/> + <source>Automatically extract opened tracks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1029"/> + <source>Track layers read-only by default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1040"/> + <source>Don't connect GPX nodes separated by more than (in km; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1059"/> + <source>GDAL</source> + <translation>GDAL</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1065"/> + <source>Confirm projection</source> + <translation>確認投影</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1089"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1095"/> + <source>GPS input</source> + <translation>GPS 輸入</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1101"/> + <source>gpsd</source> + <translation>gpsd</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1108"/> + <source>Serial</source> + <translation>序列埠</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1130"/> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1168"/> + <source>Port</source> + <translation>埠</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1158"/> + <source>Host</source> + <translation>主機</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1196"/> + <source>Save NMEA log</source> + <translation>儲存 NMEA 日誌</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1237"/> + <source>Set system time to GPS</source> + <translation>設定系統時間至 GPS</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1258"/> + <source>Network</source> + <translation>網路</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1264"/> + <source>Proxy settings</source> + <translation>代理伺服器設定</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1270"/> + <source>Use proxy</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1365"/> + <source>Network Timeout (sec):</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1403"/> + <source>JOSM-compatible local server on port 8111</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1424"/> + <source>Background image</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1430"/> + <source>Tile caching (not active for Yahoo! due to legal restrictions)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1436"/> + <source>Cache folder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1446"/> + <source>Cache size (in MB; 0 to turn off)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1277"/> + <source>Password:</source> + <translation>密碼:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="902"/> + <source>OSM API (URL is, e.g., "https://www.openstreetmap.org/api/0.6")</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1300"/> + <source>User:</source> + <translation>使用者</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1307"/> + <source>Port:</source> + <translation>埠:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1314"/> + <source>Host:</source> + <translation>主機:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1465"/> + <source>Map Adapter</source> + <translation>地圖接合器</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1471"/> + <source>Automatically add "source" tag when creating features over a background map</source> + <translation>當利用背景地圖建立圖徽時自動加入「source」標籤</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1500"/> + <source>Tools</source> + <translation>工具</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1518"/> + <source>Name:</source> + <translation>名稱:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1528"/> + <source>Path:</source> + <translation>路徑:</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1577"/> + <source>Apply</source> + <translation>套用</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1584"/> + <source>Add</source> + <translation>新增</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.ui" line="1591"/> + <source>Remove</source> + <translation>移除</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="167"/> + <source>English</source> + <translation>英文</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="162"/> + <source>Arabic</source> + <translation>阿拉伯文</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="163"/> + <source>Chinese (Taiwan)</source> + <translation>中文(台灣)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="164"/> + <source>Croatian</source> + <translation>克羅埃西亞語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="165"/> + <source>Czech</source> + <translation>捷克語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="166"/> + <source>Dutch</source> + <translation>荷蘭語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="169"/> + <source>German</source> + <translation>德文</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="168"/> + <source>French</source> + <translation>法文</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="170"/> + <source>Hungarian</source> + <translation>匈牙利語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="171"/> + <source>Indonesian (Indonesia)</source> + <translation>印尼文(印度尼西亞)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="172"/> + <source>Italian</source> + <translation>義大利文</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="173"/> + <source>Japanese</source> + <translation>日文</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="174"/> + <source>Polish</source> + <translation>波蘭語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="176"/> + <source>Russian</source> + <translation>俄文</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="175"/> + <source>Portuguese (Brazil)</source> + <translation>葡萄牙文(巴西)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="177"/> + <source>Spanish</source> + <translation>西班牙文</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="178"/> + <source>Swedish</source> + <translation>瑞典語</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="179"/> + <source>Ukrainian</source> + <translation>烏克蘭文</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="181"/> + <source>[less than 50% complete] Chinese (China)</source> + <translation>[完成度少於 50%] 中文(中國)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="182"/> + <source>[less than 50% complete] Estonian</source> + <translation>[完成度少於 50%] 愛沙尼亞文</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="183"/> + <source>[less than 50% complete] Finnish</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="184"/> + <source>[less than 50% complete] German (Austria)</source> + <translation>[完成度少於 50%] 德文(奧地利)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="185"/> + <source>[less than 50% complete] Portuguese</source> + <translation>[完成度少於 50%] 葡萄牙文</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="186"/> + <source>[less than 50% complete] Slovak</source> + <translation>[完成度少於 50%] 斯洛伐克文</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="187"/> + <source>[less than 50% complete] Vietnamese</source> + <translation>[完成度少於 50%] 越南文</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="520"/> + <source>Merkaartor tag template (*.mat)</source> + <translation>Merkaartor 標籤範本 (*.mat)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="528"/> + <source>Select Color</source> + <translation>選取顏色</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="601"/> + <source>Tool already exists</source> + <translation>工具已存在</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="602"/> + <source>A tool of this name already exists. +Please select another name or click the <Apply> button if you want to modify the existing one</source> + <translation>這個名稱的工具已存在。 +請選擇另一個名稱,或是若您想要修改已有的工具名稱就請點選<套用>按鈕。</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="621"/> + <source>Cannot delete preset tool</source> + <translation>無法刪除預先設定的工具</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="622"/> + <source>Cannot delete preset tool "%1"</source> + <translation>無法刪除預先設定的工具「%1」</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="640"/> + <source>Cannot modify preset tool name</source> + <translation>無法修改預先設定的工具名稱</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="641"/> + <source>Cannot modify preset tool "%1"'s name</source> + <translation>無法修改預先設定的工具「%1」的名稱</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="666"/> + <source>Select tool executable</source> + <translation>選取工具可執行檔</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Select template document</source> + <translation>選取範本檔</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="674"/> + <source>Merkaartor document (*.mdc)</source> + <translation>Merkaartor 文件 (*.mdc)</translation> + </message> + <message> + <location filename="../src/Preferences/PreferencesDialog.cpp" line="682"/> + <source>Select Log directory</source> + <translation>選取日誌目錄</translation> + </message> +</context> +<context> + <name>ProjPreferencesDialog</name> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="14"/> + <source>Projections setup</source> + <translation>投影設定</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="20"/> + <source>Projections</source> + <translation>投影</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="47"/> + <source>Projection list:</source> + <translation>投影清單:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="76"/> + <source>Name:</source> + <translation>名稱:</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="93"/> + <source>PROJ4 string</source> + <translation>PROJ4 字串</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="105"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="127"/> + <source>Apply</source> + <translation>套用</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="134"/> + <source>Add</source> + <translation>新增</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.ui" line="141"/> + <source>Remove</source> + <translation>移除</translation> + </message> + <message> + <location filename="../src/Preferences/ProjPreferencesDialog.cpp" line="48"/> + <source>Please specify projection</source> + <translation>請指定投影</translation> + </message> +</context> +<context> + <name>Projection</name> + <message> + <location filename="../src/common/Projection.cpp" line="233"/> + <source>Document</source> + <translation>文件</translation> + </message> +</context> +<context> + <name>ProjectionChooser</name> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="20"/> + <source>Dialog</source> + <translation>對話框</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="28"/> + <source>Predefined</source> + <translation>預定義</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="35"/> + <source>Standard (EPSG:...)</source> + <translation>標準 (EPSG:...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="61"/> + <source>Custom PROJ4(+proj=...)</source> + <translation>自訂 PROJ4(+proj=...)</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.ui" line="71"/> + <source>WKT</source> + <translation>WKT</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Error in WKT string</source> + <translation>在 WKT 字串中有錯誤</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="82"/> + <location filename="../src/Utils/ProjectionChooser.cpp" line="105"/> + <source>Cannot export to PROJ4 format</source> + <translation>無法匯出為 PROJ4 格式</translation> + </message> + <message> + <location filename="../src/Utils/ProjectionChooser.cpp" line="97"/> + <source>Invalid WKT string</source> + <translation>無效的 WKT 字串</translation> + </message> +</context> +<context> + <name>PropertiesDialog</name> + <message> + <location filename="../src/common/PropertiesDialog.ui" line="14"/> + <source>Properties</source> + <translation>屬性</translation> + </message> +</context> +<context> + <name>PropertiesDock</name> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="341"/> + <source>%1/%1 selected item(s)</source> + <translation>%1/%1 個選定的項目</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="364"/> + <source>%1/%2 selected item(s)</source> + <translation>%1/%2 個選定的項目</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="428"/> + <source>Selected items</source> + <translation>選定的項目</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="437"/> + <source>Properties - Multiple elements</source> + <translation>屬性 - 多重元素</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="454"/> + <source>Properties - Node</source> + <translation>屬性 - 節點</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="469"/> + <source>Properties - Way</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="490"/> + <source>Properties - Relation</source> + <translation>屬性 - 關係</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="502"/> + <location filename="../src/Docks/PropertiesDock.cpp" line="1161"/> + <source>Properties</source> + <translation>屬性</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1052"/> + <source>Error reading template file</source> + <translation>讀取範本檔錯誤</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1162"/> + <source>Center map</source> + <translation>地圖置中</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1163"/> + <source>Center && Zoom map</source> + <translation>置中 && 縮放地圖</translation> + </message> + <message> + <location filename="../src/Docks/PropertiesDock.cpp" line="1164"/> + <source>Select member</source> + <translation>選取成員</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/Commands/DocumentCommands.cpp" line="132"/> + <source>Cascaded cleanup</source> + <translation>層疊清除</translation> + </message> + <message> + <location filename="../src/Commands/NodeCommands.cpp" line="17"/> + <location filename="../src/Commands/NodeCommands.cpp" line="25"/> + <location filename="../src/Commands/NodeCommands.cpp" line="111"/> + <source>Move node %1</source> + <translation>移動節點 %1</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <source>Exporting GPX...</source> + <translation>正在匯出 GPX...</translation> + </message> + <message> + <location filename="../src/ImportExport/ExportGPX.cpp" line="46"/> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="370"/> + <location filename="../src/ImportExport/ImportExportPBF.cpp" line="565"/> + <source>Importing...</source> + <translation>正在匯入...</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportGdal.cpp" line="419"/> + <source>Imported: %1</source> + <translation>已匯入:%1</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportExportOSC.cpp" line="60"/> + <source>Import osmChange</source> + <translation>匯入 osmChange</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNGT.cpp" line="21"/> + <source>Import NGT</source> + <translation>匯入 NGT</translation> + </message> + <message> + <location filename="../src/ImportExport/ImportNMEA.cpp" line="46"/> + <source>Import NMEA</source> + <translation>匯出 NMEA</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Bing Road Detect</source> + <translation>Bing 道路偵測</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="794"/> + <source>Cannot get output.</source> + <translation>無法取得輸出。</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="804"/> + <source>No valid data.</source> + <translation>沒有有效的資料。</translation> + </message> + <message> + <location filename="../src/common/FeatureManipulations.cpp" line="809"/> + <source>Cannot parse output.</source> + <translation>無法解析輸出。</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="329"/> + <source>Use empty changeset comment?</source> + <translation>使用空的變更集評論?</translation> + </message> + <message> + <location filename="../src/Sync/DirtyList.cpp" line="330"/> + <source>The changeset comment is empty. It's considered a courtesy to your fellow mappers to provide a good comment, so everyone knows what your change does and with what intention. +Do you still wish to commit empty changeset comment?</source> + <translation>變更集評論是空的。提供一份好的評論是對其他製圖者的尊重,這樣其他人才能知道您的變更與意圖。 +您仍然想要遞交空的變更集評論嗎?</translation> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="66"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="74"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="188"/> + <source>Set tag '%1=%2' on %3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/Commands/FeatureCommands.cpp" line="314"/> + <location filename="../src/Commands/FeatureCommands.cpp" line="400"/> + <source>Remove tag '%1' from %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/cadastrewrapper.cpp" line="114"/> + <source>Downloading tiles...</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QGPS</name> + <message> + <location filename="../src/GPS/qgps.cpp" line="91"/> + <location filename="../src/GPS/qgps.cpp" line="150"/> + <source>Invalid</source> + <translation>無效</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="93"/> + <location filename="../src/GPS/qgps.cpp" line="165"/> + <location filename="../src/GPS/qgps.cpp" line="222"/> + <source>No Fix</source> + <translation>未修正</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="94"/> + <location filename="../src/GPS/qgps.cpp" line="170"/> + <location filename="../src/GPS/qgps.cpp" line="223"/> + <source>No Time</source> + <translation>沒有時間</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="135"/> + <source>Meters</source> + <translation>公尺</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="140"/> + <source>km/h</source> + <translation>公里/小時</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="147"/> + <source>Unavailable</source> + <translation>未提供</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="153"/> + <source>2D</source> + <translation>二維</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="156"/> + <source>3D</source> + <translation>三維</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="162"/> + <source>Fix OK</source> + <translation>修復 OK</translation> + </message> + <message> + <location filename="../src/GPS/qgps.cpp" line="221"/> + <source>GPS</source> + <translation>GPS</translation> + </message> +</context> +<context> + <name>QGPSComDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="692"/> + <source>GPS log error</source> + <translation>GPS 日誌錯誤</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="693"/> + <source>Unable to create GPS log file: %1.</source> + <translation>無法建立 GPS 日誌檔:%1。</translation> + </message> +</context> +<context> + <name>QGPSDDevice</name> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="974"/> + <source>Unable to connect to %1:%2</source> + <translation>無法連線至 %1:%2</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1120"/> + <source>GPS log error</source> + <translation>GPS 日誌錯誤</translation> + </message> + <message> + <location filename="../src/GPS/qgpsdevice.cpp" line="1121"/> + <source>Unable to create GPS log file: %1.</source> + <translation>無法建立 GPS 日誌檔:%1。</translation> + </message> +</context> +<context> + <name>QGPSMainWindowUI</name> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="14"/> + <source>GPS</source> + <translation>GPS</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="22"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="29"/> + <source>TextLabel</source> + <translation>文字標籤</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="63"/> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="80"/> + <source>99 99' 99"</source> + <translation>99 99' 99"</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="70"/> + <source>Longitude</source> + <translation>經度</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="87"/> + <source>Altitude</source> + <translation>海拔</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="97"/> + <source>1000 meter</source> + <translation>1000 公尺</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="104"/> + <source># Satellites</source> + <translation>衛星編號</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="114"/> + <source>00</source> + <translation>00</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="121"/> + <source>Fix Type</source> + <translation>修復類型</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="131"/> + <source>Invalid</source> + <translation>無效</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="138"/> + <source>Speed</source> + <translation>速度</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="148"/> + <source>000 km/h</source> + <translation>000 公里/小時</translation> + </message> + <message> + <location filename="../src/GPS/qgpsmainwindowui.ui" line="155"/> + <source>Latitude</source> + <translation>緯度</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/NameFinder/xmlstreamreader.cpp" line="45"/> + <source>Not a proper results stream!</source> + <translation>不是正確的結果流!</translation> + </message> +</context> +<context> + <name>QtToolBarDialog</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="16"/> + <source>Customize Toolbars</source> + <translation>自訂工具列</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="31"/> + <source>Actions</source> + <translation>動作</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="46"/> + <source>Toolbars</source> + <translation>工具列</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="53"/> + <source>New</source> + <translation>新的</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="60"/> + <source>Remove</source> + <translation>移除</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="67"/> + <source>Rename</source> + <translation>重新命名</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="84"/> + <source>Restore All</source> + <translation>恢復所有</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="104"/> + <source>OK</source> + <translation>確定</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="111"/> + <source>Apply</source> + <translation>套用</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="118"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="143"/> + <source>Up</source> + <translation>上</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="158"/> + <source><-</source> + <translation><-</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="173"/> + <source>-></source> + <translation>-></translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="188"/> + <source>Down</source> + <translation>下</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.ui" line="213"/> + <source>Current Toolbar Actions</source> + <translation>目前工具列動作</translation> + </message> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1798"/> + <source>< S E P A R A T O R ></source> + <translation><分隔器></translation> + </message> +</context> +<context> + <name>QtToolBarDialogPrivate</name> + <message> + <location filename="../src/QToolBarDialog/qttoolbardialog.cpp" line="1247"/> + <source>Custom Toolbar</source> + <translation>自訂工具列</translation> + </message> +</context> +<context> + <name>RelationProperties</name> + <message> + <location filename="../src/common/RelationProperties.ui" line="13"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="14"/> + <source>Form</source> + <translation>外形</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="27"/> + <source>Landuse</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="46"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="31"/> + <source>Members</source> + <translation>成員</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="51"/> + <source>Remove selected member(s)</source> + <translation>移除選定的成員</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="88"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="54"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="84"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="100"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="167"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/common/RelationProperties.ui" line="68"/> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="122"/> + <source>Tags</source> + <translation>標籤</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="148"/> + <source>Add "source" tag</source> + <translation>加入「source」標籤</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="151"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRelationProperties.ui" line="164"/> + <source>Remove selected tag(s)</source> + <translation>移除選定的標籤</translation> + </message> +</context> +<context> + <name>RoadProperties</name> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="14"/> + <source>Form</source> + <translation>外形</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="34"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="41"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="61"/> + <source>Tags</source> + <translation>標籤</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="87"/> + <source>Add "source" tag</source> + <translation>加入「source」標籤</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="90"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="103"/> + <source>Remove selected tag(s)</source> + <translation>移除選定的標籤</translation> + </message> + <message> + <location filename="../src/Docks/MinimumRoadProperties.ui" line="106"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>SatelliteStrengthView</name> + <message> + <location filename="../src/GPS/SatelliteStrengthView.cpp" line="50"/> + <source>No satellites</source> + <translation>沒有衛星</translation> + </message> +</context> +<context> + <name>SearchDialog</name> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="14"/> + <source>Search city</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="22"/> + <source>Department</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="56"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="83"/> + <source>Search</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.ui" line="97"/> + <source>Results</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>No result</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MCadastreFranceBackground/qadastre/searchdialog.cpp" line="84"/> + <source>Your search gave no result.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SelectionDialog</name> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="14"/> + <source>Selection</source> + <translation>選取集</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="25"/> + <source>Key</source> + <translation>金鑰</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="32"/> + <source>Value</source> + <translation>值</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="45"/> + <source>=</source> + <translation>=</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="55"/> + <source>Name</source> + <translation>名稱</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="81"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="88"/> + <source>Query</source> + <translation>查詢</translation> + </message> + <message> + <location filename="../src/Utils/SelectionDialog.ui" line="106"/> + <source>Maximum returned results (0 for all)</source> + <translation>最大回傳結果(設定 0 會顯示所有的結果)</translation> + </message> +</context> +<context> + <name>SpecialLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="607"/> + <source>Refresh layer</source> + <translation>刷新圖層</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="612"/> + <source>Close</source> + <translation>關閉</translation> + </message> +</context> +<context> + <name>StyleDock</name> + <message> + <location filename="../src/Docks/StyleDock.cpp" line="102"/> + <source>Styles</source> + <translation>樣式</translation> + </message> +</context> +<context> + <name>StyleDockWidget</name> + <message> + <location filename="../src/Docks/StyleDock.ui" line="14"/> + <source>Styles</source> + <translation>樣式</translation> + </message> +</context> +<context> + <name>SyncListDialog</name> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="14"/> + <source>Upload to Openstreetmap</source> + <translation>上傳至 Openstreetmap</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="28"/> + <source>Comment</source> + <translation>評論</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="45"/> + <source>A good comment should concisely and adequately describe the edit.</source> + <translation>一份好的評論應該可以簡潔但充份地說明您的編輯。</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="59"/> + <source>The following changes will be committed:</source> + <translation>以下的變更將會被遞交:</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="81"/> + <source>Added</source> + <translation>已加入</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="94"/> + <source>Updated</source> + <translation>已更新</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="107"/> + <source>Deleted</source> + <translation>已刪除</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="120"/> + <source>Ways</source> + <translation>路徑</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="133"/> + <source>Nodes</source> + <translation>節點</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="146"/> + <source>Relations</source> + <translation>關係</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="215"/> + <source>Sum</source> + <translation>總共</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="269"/> + <source>OK</source> + <translation>確定</translation> + </message> + <message> + <location filename="../src/Sync/SyncListDialog.ui" line="276"/> + <source>Cancel</source> + <translation>取消</translation> + </message> +</context> +<context> + <name>TMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="14"/> + <source>TMS servers setup</source> + <translation>TMS 服務設定</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="20"/> + <source>TMS Servers</source> + <translation>TMS 伺服器</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>伺服器清單:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>名稱:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>伺服器 URL 網址:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="111"/> + <source>Get Services</source> + <translation>取得服務</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="133"/> + <source>Services :</source> + <translation>服務:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="146"/> + <source>This is a standard TMS server.</source> + <translation>這是一個標準的 TMS 伺服器。</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>投影:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="175"/> + <source>Mercator (EPSG:900913)</source> + <translation>麥卡托投影法 (EPSG:900913)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="180"/> + <source>Lat/Lon (EPSG:4326)</source> + <translation>緯度/經度 (EPSG:4326)</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="190"/> + <source>Origin is bottom-left</source> + <translation>原點在左下角</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="199"/> + <source>Tile size:</source> + <translation>圖磚大小:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="220"/> + <source>Min zoom:</source> + <translation>最小縮放</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="230"/> + <source>Max zoom:</source> + <translation>最大縮放:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="247"/> + <source>"source" tag value:</source> + <translation>「source」標籤值:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="261"/> + <source>License URL:</source> + <translation>授權條款 URL 網址:</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="288"/> + <source>Apply</source> + <translation>套用</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="295"/> + <source>Add</source> + <translation>新增</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.ui" line="302"/> + <source>Remove</source> + <translation>移除</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Merkaartor: GetServices</source> + <translation>Merkaartor:取得服務</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="231"/> + <source>Address and Path cannot be blank.</source> + <translation>地址與路徑不能為空。</translation> + </message> + <message> + <location filename="../src/Preferences/TMSPreferencesDialog.cpp" line="284"/> + <source>Error reading services. The server probably does not support this feature. +</source> + <translation>讀取服務錯誤。伺服器可能不支援此功能。 +</translation> + </message> +</context> +<context> + <name>TagModel</name> + <message> + <location filename="../src/common/TagModel.cpp" line="106"/> + <source>Key</source> + <translation>金鑰</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="108"/> + <source>Value</source> + <translation>值</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag editor</source> + <translation>標籤編輯器</translation> + </message> + <message> + <location filename="../src/common/TagModel.cpp" line="129"/> + <source>Tag with this name already exists.</source> + <translation>這個名稱的標籤已存在。</translation> + </message> + <message> + <location filename="../src/common/TagModel.h" line="22"/> + <source>Edit this to add...</source> + <translation>編輯這個以新增...</translation> + </message> +</context> +<context> + <name>TagSelectorWidget</name> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="14"/> + <source>Form</source> + <translation>外形</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="34"/> + <source>OR</source> + <translation>OR</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="44"/> + <source>AND</source> + <translation>AND</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="54"/> + <source>NOT</source> + <translation>NOT</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="64"/> + <source>...</source> + <translation>...</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="76"/> + <source>is</source> + <translation>is</translation> + </message> + <message> + <location filename="../src/Utils/TagSelectorWidget.ui" line="81"/> + <source>isoneof</source> + <translation>isoneof</translation> + </message> +</context> +<context> + <name>TagTemplateWidgetCombo</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="196"/> + <source>Undefined</source> + <translation>未定義</translation> + </message> +</context> +<context> + <name>TagTemplates</name> + <message> + <location filename="../src/TagTemplate/TagTemplate.cpp" line="911"/> + <source>Undefined</source> + <translation>未定義</translation> + </message> +</context> +<context> + <name>TerraceDialog</name> + <message> + <location filename="../src/common/TerraceDialog.ui" line="6"/> + <source>Terrace</source> + <translation>梯形化</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="15"/> + <source>No House Numbering</source> + <translation>沒有門牌號碼</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="27"/> + <source>Number of houses</source> + <translation>門牌號碼</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="46"/> + <source>Add House Numbering (Karlsruhe scheme)</source> + <translation>加入門牌號碼(卡爾斯魯爾方案)</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="68"/> + <source>Ranges</source> + <translation>範圍</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="81"/> + <source>For example "1-9;15-17;19,19A"</source> + <translation>例如「1-9;15-17;19,19A」</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="88"/> + <source>Pattern</source> + <translation>模式</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="99"/> + <source>All numbers</source> + <translation>所有號碼</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="104"/> + <source>Odd numbers</source> + <translation>奇數</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="109"/> + <source>Even numbers</source> + <translation>偶數</translation> + </message> + <message> + <location filename="../src/common/TerraceDialog.ui" line="123"/> + <source>Optionally you can also select a node in the area and house numbering will start at that end.</source> + <translation>(選擇性)您也可以在區域內選取一個節點,然後門牌號碼就會從該處開始。</translation> + </message> +</context> +<context> + <name>TrackLayer</name> + <message> + <location filename="../src/Layers/Layer.cpp" line="633"/> + <source>Extract - %1</source> + <translation>摘錄 - %1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source># of track segments</source> + <translation>軌跡區段的編號</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="724"/> + <source>%1</source> + <translation>%1</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>Total distance</source> + <translation>總距離</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="725"/> + <source>%1 km</source> + <translation>%1 公里</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>Total duration</source> + <translation>總持續時間</translation> + </message> + <message> + <location filename="../src/Layers/Layer.cpp" line="726"/> + <source>%1h %2m</source> + <translation>%1小時 %2分鐘</translation> + </message> +</context> +<context> + <name>TrackLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="563"/> + <source>Extract Drawing layer</source> + <translation>摘錄繪製圖層</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="568"/> + <source>Zoom</source> + <translation>縮放</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="576"/> + <source>Close</source> + <translation>關閉</translation> + </message> +</context> +<context> + <name>TrackPointProperties</name> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="14"/> + <source>Trackpoint</source> + <translation>軌跡點</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="34"/> + <source>Latitude</source> + <translation>緯度</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="44"/> + <source>Longitude</source> + <translation>經度</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="51"/> + <source>Id</source> + <translation>Id</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="58"/> + <source>xxx</source> + <translation>xxx</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="81"/> + <source>Tags</source> + <translation>標籤</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="107"/> + <source>Add "source" tag</source> + <translation>加入「source」標籤</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="110"/> + <source>S</source> + <translation>S</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="123"/> + <source>Remove selected tag(s)</source> + <translation>移除選定的標籤</translation> + </message> + <message> + <location filename="../src/Docks/MinimumTrackPointProperties.ui" line="126"/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>UploadMapDialog</name> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="13"/> + <source>Dialog</source> + <translation>對話框</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="36"/> + <source>Website</source> + <translation>網頁</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="49"/> + <source>Password</source> + <translation>密碼</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="56"/> + <source>Username</source> + <translation>使用者名稱</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="63"/> + <source>Use proxy</source> + <translation>使用代理伺服器</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="88"/> + <source>Port</source> + <translation>Port</translation> + </message> + <message> + <location filename="../src/common/UploadMapDialog.ui" line="104"/> + <source>99999; </source> + <translation>99999; </translation> + </message> +</context> +<context> + <name>UploadedLayerWidget</name> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="662"/> + <source>Zoom</source> + <translation>縮放</translation> + </message> + <message> + <location filename="../src/Layers/LayerWidget.cpp" line="667"/> + <source>Clear</source> + <translation>清除</translation> + </message> +</context> +<context> + <name>WMSPreferencesDialog</name> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="14"/> + <source>WMS servers setup</source> + <translation>WMS 服務設定</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="20"/> + <source>WMS Servers</source> + <translation>WMS 伺服器</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="47"/> + <source>Server list:</source> + <translation>伺服器清單:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="78"/> + <source>Name:</source> + <translation>名稱:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="99"/> + <source>Server Url:</source> + <translation>伺服器 URL 網址:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="113"/> + <source>Layers:</source> + <translation>圖層:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="139"/> + <source>Title</source> + <translation>標題</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="167"/> + <source>Projection:</source> + <translation>投影:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="198"/> + <source>Tile it</source> + <translation>將它做成圖磚</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="218"/> + <source>Zoom levels</source> + <translation>縮放等級</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="240"/> + <source>Image format:</source> + <translation>圖片格式:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="264"/> + <source>Styles:</source> + <translation>樣式:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="294"/> + <source>"source" tag value:</source> + <translation>「source」標籤值:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="308"/> + <source>License URL:</source> + <translation>授權條款 URL 網址:</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="322"/> + <source>Apply</source> + <translation>套用</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="329"/> + <source>Add</source> + <translation>新增</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.ui" line="336"/> + <source>Remove</source> + <translation>移除</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Merkaartor: GetCapabilities</source> + <translation>Merkaartor:取得功能</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="367"/> + <source>Address and Path cannot be blank.</source> + <translation>地址與路徑不能為空。</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="587"/> + <source>Unnamed layer</source> + <translation>未命名的圖層</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="600"/> + <source>Untitled</source> + <translation>未命名</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="665"/> + <source>This is a caching WMS server.</source> + <translation>這是一個快取 WMS 伺服器。</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="668"/> + <source>Could not contact WMS server: %1</source> + <translation>無法連絡 WMS 伺服器:%1</translation> + </message> + <message> + <location filename="../src/Preferences/WMSPreferencesDialog.cpp" line="671"/> + <source>Could not get capabilities: %1</source> + <translation>無法取得功能:%1</translation> + </message> +</context> +<context> + <name>WalkingPapersAdapter</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="81"/> + <source>Load image...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Network timeout</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="152"/> + <source>Cannot read the photo's details from the Walking Papers server.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="174"/> + <source>Please specify Walking Papers URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="175"/> + <source>URL:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="265"/> + <source>Open Walking Papers scan</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="438"/> + <source>Filename(s)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WalkingPapersBackground</name> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>No valid file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../plugins/background/MWalkingPapersBackground/WalkingPapersAdapter.cpp" line="277"/> + <source>Cannot load file.</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file -- 2.30.2

      29Ric13*J1mJ*D9Ca#(KAB0(Kp;%qK$nHrx%@!2|eJNP{}4UY^7$Ht3OLOt~L%&dd**PaiA7~8gS z#k=Phuhsws-kM)QhIWiUHZnRsH9tQyJ0qQ0Tv-~gp_$p*Qhk~^-MtfiFyVspw5Ctj z#LEl56E%NfeUCuEt}iWOOwCV9rzVHTq*D_UGxJkZ3$p;)FG^!~$uw&#hp_al z?7YIlU=$}J{;J9A=j(Hll34!s@l({#9^m!zx;iC;T!9!7Me*3s*z^q6UBvY28DM}o z#iXYs<|HTk=xTrn3ms&))+TpnkHqRHg5}lY^NTKaBZ~zgNci<`%K~ zNdnEZ4GqmbBI08~5@Fiu!)}L25x_(cFcx)P4d;Ns=!AqJR#SazM@wBpKbR3?paxkhS(r&-{Z{&xFtPX&3#p*5yQ{yS z$L;Cw9e}IK&-?oMQ?pC+bF;&?`gRO^YX=Ho%uoh`S_Dv?@PZ-I6<9!lFeKnO+=(U8 z^!&g8XK-j@h|B346oMpy9Tb~RfrXQ`u@P2Hh5J^nMaqY|kiztPYEm-X&zCMNt&ms#DD-nfHl6~Xaz&WL{QoM-VV-1t1I)90^#J?G*NhIX(ZW~rmsc7*one#RJDxhVauC4TN`Ur zqT%6ekKiKiFspZMW&d#hV0&kEWoc|sG&MCz>^m0cM+##Y&`$(F2@1_*rSCx!N!L2D zW)r&n)isD!>>>5BwXwdrzjwTIaEuF(R{kQH#-tyc7$c4SY?N0>}&@c-F>{R_KvoZoh7aO)8y3nkWeHV z9~X_(_&WJ8J@pwO@Y!Q{G3>0ZXf{r9<%>_Ru5T{3Hc6X*-nn>nadEc0e|SPV`SNgo zK|F;U!V)kr3e!W<*e?e=^3&3bqC68Sv&*6byxiQJF%}&HOGMAENLNo!@S@*8d4)Ig z>lZKP4^B>wcNT;rlgrCkN<@D8RTd~vvG+R?n9vP z;ON=e^Ovu2sJR{4Iow^Hni`#$#gLm7i)Y4Ad_>UKmKXUXsj8YK=&jDrg7ZKi!;aw_ z+qZmid5OIwQT3h6+o|={)#?VG+MDh#6bo)7{j= z?eA@=j`Q~ki%c!7Y8l;me)0Snmd)2!&6i_7y%IPpm*1tY-J^2f%7!z1n4 zVZO=9`9cju);z5E_FZ*l)X?%?ka zkB;WU7+$`mS)JWI)g2|3^&Rc7&Cbs#ZputAukPaZaJg)jcw&BebN>)Tm#_EMcJ@z> zj}8yW2c*NRgTv$F{nbWCPiB5z-vFm7F*32Fupkdw_IVXZGd5H=b?`Xs?ygbMqJbUrt;^O=Wq#x4Jj}DJd&kk2v@zHU`CGG6~+9x^H_1SqvZ7gf^l!~T?iWVM+ zSJc+q)!Ey`=|S}p;mnLwz-sGiuP)BwPVesTk@s#64o^-Y0B~}2_WbE7NCQWG@X~ye z*5vp4{F)VWvJkKR-Er4(8t3 z+3{{O(?24vsI<1Dva_YKqO!E1hQl8f;Z!(E8vTQ4c(SLN&Fx{g4v9sJdw2G3_K!}_ zo`Ej{;^NuK>2`Z;aCj;!>`4uajp3FM7LnUIIF3CyMlZjAY^1B3D;Vfw@!;wR;R{)! z_z5UuDE|EX>FKGoEI+@rebwJTqN1<7tuQJsKC`x+ClX6UqLHCN0jsXDcW`8Y)iXFI znkR~X4L~jUVt@sc&cE~Y*;2uit37#i&BX1C&2 zcwOBC0-khh7oGP*JVOx1PR_u#I6at84NWW^UD?dfz$5Q%F09Io&(5jlPLd{ngA0rf z@_X66qc9$u=;{{m#&H9ry(_GAhexL%?VX*ToE-ENCuetwHg@Z}I@sO){Lc2qqO9x+ z&II-!eR{UtiAml&vv)Wg6rBUF zU3N_yJZ>7h&;=920^zJ!G$fvz0>6S)S<}!Z#fxGObLQyq_z}jZLo88$zsN;?bg_VDO zMWgxk9)zB}viSjWS&wXd_=MG3Z5KL+Y~YHolYy14yR`J3`?QZ-6xL>pu1b5e(ejnKh3 zb`Nyb)pYO$18mr3xAjS9=jSG8v4a#1@kqQ6+<}2!j%a-cC+Y284HN)82@cqRiX!4~ z3{noBP=9Al&!AW==xhX3NHDRqI76EG%fuwyLvj1$fgg0|*3NFA{Yxo;I}y5f>JW%D zvCy~kO^DA(6OM_xI%?ShlHj*}-3_(1%{{}2SR)F9WoT@WxP|Nf@~{~8Ct#`S>JSki;ytNUg*gu|?+<}Q9qV|zWjskOPbzFo*0UYG-wKm@^E(g2%0)L)nA zVng?CoEqe4~(hu;Ttz04AzwQK4-283cv{VB0z zn9m#NX-{-DHLk*a*EhBI z@&<%btQ_M&cl0zA23zUtSK35=nqa;x;0_BXu$AfS>L`!(Fw@sHqSGBRQ(__u`}sWZl-(_y-Mw>CD|?!F8yzfm zQ+r2OOJ!|CZDW0NO+jOiP}n2j@rH*7p;J`oY6^icBd;eJNihl0Q6){~sWD+dA~-tv zI=ctb9V=_=nugyQl>zZeD z_HAIK|^2&f~P!M;n=h zCuJ5jclUJEWixHTWYp8qQX?EjKu@I@8d$NrfxROQ+s>(D9-E2 zh<7x$$*iiZ?PPT~*GJgs0+pqw4<;UrP2K4+X|-LQ_`XOoJjxvr@oQj-0Rx?WZZD@D z9nI^@v@o zx$GvuLOMEoxf~AkA_T*{ZYE@~%}kgvG4UBWUIwa!E)Sb@_n~Iez}EJBe^)9G$8?-# zTHBjDYpYm&+@5w$PY;I;%kdr#U`F5^cLkf97+HCQMnp!(#km0rMOa5Gg^aF^4|F9k zn*>YPJ2>2*O#yMu+BYmXFfusE0bD}BQXV{} z73P6m6_gg(Fesc~+bk~5Dk?+F1#byWRAmVySQE>F?{}?dD_w zWDcP=^#CA0h#f1dtJt`@`iF)!6lG=P7UZO7R@Aqn3!xU<(B9R@9q4re{szb;S6@#C z#m*KoYlPJ!%0naV(;AK_09J9F6zfWgU@@OroL^d5SzXgqUs2J;0rZ>GsR4(3T`f?G zP4!K!DeA>a79@G2w9-l}MWKvux%>@IJp47M;s$V1h}!`TgiDyevCd}J7E0Ci35wjQ1Uh54<) z40CAc0Uv%Jh5r%QR7(#~O+}+Z4sVG&Zo*daMdCr3R>ehET{gv2{-1&tUuU&4C!3`!B^yD@$VRbETj~ zOwLT8Ii#U~>O$tVxxKxut-U$jk?P=Rr)lM8VrWRAQ=kE0ZboG$@s{@w4mU;Pr13wC zH+MESmyjF)bMVU<=>Us^XU^$rtZwOOBU({k5EB{}=VKp`9FgebLbs(+!Nj+6ebT2&2 zA}G+$g`4JwBpx~JJ#H@n+l7gfFcQf~h$k@cB8VMrHAOh?`1Ct1#?EODyYq||B zB%vVQ-^PnUH-0StSmA-{gGVZsPX4Bk%}jL7tTZ&K;o%`(t~4dWEJx=05i`G_xRl^0 zlrc#%GUoaw##ClnMx3{=J1oBLkma==JdnF@NcV8lzpLo&AK>TbpOurE5aVg5MVO!b zm%$UDiGe3BuPDpX#V?CKQ|kzQDV=t4;;f+_GKtt>48&7}-`hq5FDQbrSbX{#(Fq~Cnu7MxYp<2Ng z1Ww@)jzyvfehLA;-cHt5RcU>5LtATeRY_T6Lw!wkO?9p=@Jl!M z)zlto(adOfwJl5xE!51+b#_ho2L`i&Xwf)2QNo|a}6WVn6()`UafzAt-6-Y^Ll`H_;Pyfz?XGGrxPnio{+y__8! z>1VqOUuhDYU&!Ann}%nYG{gAf%ojj?!)->Pfuy8tPyVfarxQo9QRaDnC zH`S5qy6YS2at)O3DBCCI6?rHt8ksxUnVDM}$;+uZGhuV;>FN>?=)!Pe`h|uE+o&k2 z8AZaPub`;7vZA)R215QgujU%uzprW;T3F_UJ27##Gg8t=j#Aac!_UXZ$=*5K$IHPd zBG50$$4KFkig7?@VL?H0IgHn;$}35guWRb-OVj{{G)ylpvw-24IYmtkL_P~`T}{BB zT__ZWw}+E!V5nD6fV(}M7mfWAb20nM;R;<@Syfd-s=2Pq(g1tYFTc3N#>mss5qLXQ z1^Gvhz$c{9txV0GeHb=g%pm`O0B>(gWkYMPsN~#|^4hw3Sj<(Hk;<+rs>{t)l(fV1 zii(w~ZqCkB!-sIj!5W|i+AdU4814=fKN#zIyZJC(%v`A+p;3uhRrR%Xl@%4GC8UzK zrIl4o6(zNx%z|P)3wIYg8>>gK{gRbeRC%lp;d`n*&BZ?qdYQO@1H;b6#w9c`Fr~b< z2KWChF{eqTH)R1})2YVf7u!(%-0f+UhmWlp76zYk7FtF$Co6Ymh@-u$ySpP5l41rl zW?)!URtZKyCB~9m$&K%$yRxMFb{S4K){ZW82Mt}ivxAAcy1u5WE7QZ=z|I2=XSmX> zfrT^Bb7V$6NywAi0U2y*-K+5S5Gsz z7SXJ2%yjfD0;3Xhun_pWRG@C+_P;5%hdA7K0;2=mDHI!9I^bZ|khXLQ3=Dw6ri%j& zv{-nV+F2SHnfs;YmIq}Z^bbRDElroD#)ASWNm4MgQz@oU+{YYmZrAG%8Gh+_BO^kdJv)xfLo@2SdgEe zCxeFlg^i7cnO9nFL4JOYC%*qP7js97fugyCudkf}G*xu$ed1$7LqdG~{9NtqX||}~ zkERdQBGPj5^W(KiGLK|_EGMs|>g3^NtgC2bPsi8=pGe)@DI_X9BHWMZ%XFg?g??|X zB15(gev%b$DyN~QtV#mNTju*DW$W-XCr3jy4P$#vH9b{Bh{!4`>p0mu#YFmJG4gV> zMH*C<09k)UG75KlplU;-S;0u~p3FaM+Qg^lxjGx@nb9om_0?tWKGM~F^jP1<+1D5F zKwqYloh=?cffxUZY)w`32y%~dfcvT#-iILKPnDH)bYQ*;bzxYoK6`Cm@#9p@FM&kGP@lkz~D73~)gOCDXv< zjBIDX*S)C@wsv$Kp!YSkO{s{-SQ=Z<9PD-E@%_Kb-B)<1uZXGnJ$1v(42q1*eH)j+ zbU@5OK{2(`r5c-<8L0sU3KK+YB=#&RkS;R4gD(Dtgw2=C_Y`cia-t|k3XIUmsMM?+ zeLW2WrH6)AR0};bb2BqTZBzVBwV~1-ZH(^`T_Nw59O7tpmt^J>9-p3-bLXMTeHiH& ztHQp`+}KcGTSXgEi&Sg6BSn#r`uqp7nu@$E`L2S3u7h)Aa>gBbGUy6`*2~}5GcwRs zRRDIIVvD|@U{9te^Hb7YIl{0TkDm;cPVhA#lBTV6_pS=$(Wo|*J3teE@fdD;WI*a= zaaEiNl@%0>%`6BteDEE(Bt-Ac)L4SQ|f9H_|r8_w4QLjPbpHwD<7wa&tB{z_u1MK}GYClCxuANMNuxRyaFt zWjzQ2K{w2fM%6^G{ypiQqiaBL0Gz(<9qHyex>R=triEWbkdM0ucu^DsD+@~#Jw#+o z^)Vvx*p!@o(~2^~9GzV~eFD6_JiJ_8JOcg0eS^Y184S7uP|aq9WeB)<*w(1PmeDS( z9Pb=o5VgMajY|NT+s!pFJTlx58sH>4$>A#_Gabkfz~4d_YOiWCKcGD+DlN-|R)D8Z zMowl%JTovPDk?fOz{b!FooH&T`anZhTZ^Ri)#G~@-8f5p`lBH8J+f|MabaOJ-Xeif zIR$wId1-0X;K;}bUt3~_QzRXu@f%*A)!C?t;DOtpZ z@t64;KA})qFxS+#bf8lx5cDIc&#+J=K>sAt-|i_9y0(9O2ua)g=!DGN{5)(^zc6)m za)N3SB$u2S6mv`HSnCsPe6y7jg<#kg6u?l6 zhLy=&PuIj)NrNDxYJnE1LAbesl7#=r-#{l;Ugkel{NfUlva&M^iz_v~X?O?v`FKZU z6&B{jc+=gn?0R%fCF2T<+2yT#>FMR=t8=8NkmET!zko2?s|$b+0XqfM7$42F)n*cHcuA1aPAH3KCax2SnBb`v*$-^#0Qrlk9$Yu{njxMi>@-Lsic=i%_SKy6F@4f*} z`p#RRwqG6!+LHr4eSQ2AD{IO!f?b>(9o+&$2c9>wAt5E4UO&ISMne4)&=vq|0w^r^ zsWkcR4{k5dW{0~9!u&kklA2l?OVeWUiu4E!kMDcaCEVRuIX-*!`udW5`A6LB8v^AD zp!B;t@5paSw?BGwK0gA?T2xSge=!kX%g>H>cXjoQisfI9?OhX~GvQ$1=^hYSb#MkaH437==%lYuDFC^j$`K|1 z9su2Q>8P*?j%wa+X_fV*rNzHYWK0_1u$BWw@za`j_jI_m10X!M5 z@<;MV^5_49T0i?J_mTYJ`|n?G%rCMcsWwbU*YfUOG`YJY(#?Sp7L_J_52!zG_vQ+% z26Fs=Q0GU~O8Siak@Okq<3D_Oe|tRJ+gudoL8JMFrD8AxaZ=L~%JfQ1e-bxNbS%+Z zZ?9h8yp?@R`apX3w-2b7C@uT($M25&DpL}3qkS3fKGA&>ql1H-^32k3e>bA-f`VoNzbP#(*d;F5P}efOa^mnQKsyBQ1=`WCUpzlQJK0+n)D{L> zTF@*F%xNx+ps1YcuAV-my;`a>a*A@QxIOiuVGL6{3r!_B!6vqCKY#IxfbpY8UcPvC zcDS=TS{2VQF*Y(bFlIzX6;#!?aX36aB9cYf`4uJgZJnjw{^kT7UP)O~*XYS4RuMq>xNr=z`Vh*w)!S5sb5-OTC}wD>Tf#Sh#f5)sDv z>(8EFynb~J2f_ckzIuJSzcM+)&GMj_7?X`}9Mj7?csxOST{pkk&5juvUfnj#BkhGa_;EF@L+#KH#?Pzld@wj zAf$7gS|6GLL@`yuY&5j#RTI+2t_@Vb+SJ&@IkkHfxGi2=d3^%I z)|%?!lRhjK4YX&&mJVu|s+^hPf>s_cKOwaIf?%Rx6?=8MC>tU{IfVcRo*PxlNa_!toN;~H+@KV6adxCtic$6Q{uyt?< zDMl*0zpMU9Fp~~8yrXAcT?MPXFq+9Q)rVe+`sMjC6bpv(Q^yBA(&x_cLIje3b$U`X zBFKW&w@-Rw7mwf7l;`6}v$us>mPc4YOI=$$&B@x>)CiEr*DsDw5B4?(q~lHQbb9vg z8;pYUtqEZ5_?$R|7t&h$xva(vFKlcnG=@D+(UC<3S%KKafk6sksMoJvoFDCOu1@7T z;k<2~xr-Ow={#_9LS9d{y^VcpYgb28Ni^M-LZLgkyZMBAc*QcKnKW#CHMJq84bU7G zs71+G6&(`g#ckar$t3F?XhD54-W5GI@K}I!=FJlgjgX- z=id!aE?$CbAnor;cZDXonXx->VP$6?*#OSiNUJrpJ3R~Yq5}hcoy?7ltvsSaTuF?eXcHU}jxdp@jiHXU ze?m-{XQ-tKvYo+@*HYJpf~FNrdwuNOv^Dh145>~bo=$Elz2l?g(VHDm3-rjC-zCqG7iy8eSBh%f}$;L=u)4<3O``uU1Bo$8T zz=X187M0B-2p@)wsu6y3Srx0lwxA%^(cacEHq4#r?O{*#jmRkuW%~IBIM5yK32ioH zvLCCzdUZM;4r?0ZuuOd-(~7HGS-h^8%)&NKZeC#`gF$ojb9D}lPxJQ-2#SvN^I|yQ zDCFQ^g$G~=n>~$Jug+^J;FBVWr|OhYP+L>Rsw+=OujpvcFDWZdN%HpzPK>CoD#=X@ z@+5iw&B@u$o@D_+wW+uy*bHK3`ns^rf~*_rB|z`is95gN zZ;-!LhxVmo8(@Ij+(fU)2s+GiNfv*#V#HTev>o0o88dV(o$EOL^p-j=obb?I$Dsz z1yMm=!)*EjEDBu%BM4Qgs>!NJb-Y{Fm!xBr%y2il1x}*oHV%+Euc$=6tRy$o#snff z&|b#j5gIDmdLd`;e1c-UoEVsqgq{Y3b98-M`$Us@t^r|A(A6?Bwt;}Ne`0ECTBN@l z!%!EJt5CEf>2e?}W^C-oy8W2dKPW5?q&rabAhCxGM^$7uC1QpCFVJ$1SA3tvF9-PAXZU6Wn7eENv$3G`* zGgLL9PzzMM4g`AbaGZ{g3vz&Dt0o3IS&8)c*D5-ckf!Np*x_y*LX`CB$KB0D7{@8^V1EzEBi1Te_29c+8VXx`{R@282QuI8G}1uAK`zuR$9ZT4zX7%%FL*6G1`ecj8+%W0H(O&Z4Uz^~^-oy%4bAAI2glE` z>o|M^F4&7_r@I@|{bBm(Bw}Vf#$Rv{#1d&@@9gO4U`wSl7!Vo5WCz{~APW^uJ-ex6 zaDc&I#7peO(ek{YG{H#+QlQ@wqG3PB6oG;j^g%5t3>TayEiEj}4Rj&t16fF@fRmJd zrK+fDI(0$3afwU3I1zO=RHcO3>Y`h>y z3Q;OZA~9;_z`jKJo6FaS((dZGln5`1Hp>52%Q!AQt_BHIW_(^|TnOC^GY+l#m6icE zb}#`XG`iGu47@rPhyw@cmoI}t5K@k9SOmjz1B8LO+3AIa$;qkNu^~Pi6S$^hNGcX_ zTC?K9pmXWMaC8k04~>clba!P~SySv=r2*lj@IOX8DQugZ+uqw=o`I^@cV}kj=9d;` z=9cHi0Gi%C1hHUeQ&^M{%5-;ka-e%f#KlJYI#}9SQz>?(oM2pGF)}H)u6tn*WV^)$ zutnyVRyS8xH?~37C6KD8Cx`f`FE1^^!^_Fh-YGmbIhaPVvZB(k(3FLQheyPvFgUoqwk!4Jl@}$sml+7>!E{FU~*bQm>V<# zD7LQd_3K$h5P@py8Cg5{U%KP&-oY`zrGN&@eJV{x>D{Hi#^P8HCp%hDc1~78D3fkO zg><2R^>J~NWNdhDaU0xL$PL55;fTPso*`s$=Zt(xI{A3C%55%9jq!GMc8br>OnDL$ z>4OA?y*IOAuT6RY#t5W&F^6!cM<76wyzzY z0B3Lr{wq-!<lm`7r6a0#g~Ocxh7S8Dtc z#>4@-djAM407j9=ifa)T7$Pl5X08ig_)97URqvWm7fyo@97m9 z!r2F2`s@gfwt!xL>hALw7vu}_3%TcV=RbP7Asy`swRNzjI>zP{RhE~R6$N{F(ENO( zikG3te+a1c4r%AV_lU>zocx@8@js~b#dEpmq-Wnbf3`cy?}OL{?mPI^Il{ti2b`Tp{pcyFNloIFAyXjWOC zo0bC?#lSFsKh{%l3sC&{bbklq^5pd7{2Z|~)JznYeg5O8b5$w9fl-j>vUBhO^1r^m zG%-BE!0Jg1oGZHhwr^7>1>?X2AHutdTvy zd4CrdSX!7ItV@q`F)%PU0*cp$;_4Hb3M5TMQGQNpcvO63N_AO=y9Y(j+(6}_qPA9G zfp~o#;u%<>4nZ-4q=0z1HN}sj2Slruu9dfUY)VF6X=zPuSzcy*L`>2XKmZfy&IZ`n zs1WuiIsx6#?cCeh1@L@tZ*zWjQqbR$Oou}|VTwTu%PJ@?%g-xrs7a4YPfJWn%_*#? z%XOe=5$*}Vm#XT-jjXJ}0r&un=Kng_-&v3jv3si`>`VwL{2NMGVt!3cU4B|gZ4S-C z(aSR}udxb1SO*irXBg^Xz}Kbph)2gzJvd?~h!%|VIi0PA-h>oC&ilrUq^g#V#`?<4 zlHw2umRMOw12x)TmhND#MQB@km@2DTrgm_$N=0}I$B1k1uSwwi(9jTViYDmVgp>jY z(p;05m=S;tq^TVvw2{?OT@Ybsp$8j8r7B)(d_iq(Y=B3~<{s!e|DUAyfNtzQ&%6P! z_fD{Yy@0)Ua@c$C1UmqdAc@{PKoA5$f+R=~>{G~ToL)4Vkw%)4G_sl#OW9@@YHnp8YhtE81%PoH%&$ToBBBR)hRm#I=hEpt zCn)=QGu58#Ds*Dbb4`Nadm%hR~htr2)IO0BOX1td+QWS z%}Otfsc8vaCm0sjZIH&PB)qQFq|{dS!Yp&J2DQlvSd?=LDs%JeieS<~0D(fWZ^uG$ z?~-$KNjpXlr@;ed;P}>!%PV@VMlENg!_>ZoInh>KU6cxw0%Uy43UbpDGfH!d0keji zF*)p4k=O6t-(O!d3%TvtAdAODA(mf#gf z^fDC)Rb&*F!7Ud4HE?k$FDWWa%?Syj#zZD&l;>sSvislpTJfk3nN`tHsTbn$z zkErSIX>M)p>n{w8&B%|#>kAI0hL=|sWG2Er6@xLgsIsFpudJ4*qNx76d||L3j&Uj3 zP7YRr~sUFKk^GrYHI6gD#>Y;t5gvF zaEE&PYO>PkC9U=O*l)(irgsl@7S%MgcjV?}Bt=F9!|?;Pt`E+aMl%B8#&ql#d!fCz zx37InEoF_2%?l^``sy-Llhf-ebBo|JmsEJ6d!VAIxUd9(_f#BmL!u)>{DK}lxNfKl zf?C+umsWV8ZD5QwFIlYZ?3>|r_w+TTr>CSBXJ=N_w?XJrR#RJ?pGGIsKTb_ci-!wM zB%WgMg9o>#69NdkZJ&UQ#=h~fA$(Q|1_p;m zx*J;tC;D64hg<7#XvCQl+xDciq@?(09B_gIe7)LZe7)Vgf9mTWp3yeXS=NX<3d-u* zd)j;Zy4tGin(7)#>T6q?ySr-QqQWDi(d__cMzD}LnfQ640@s~r8yb~Vx&gdGQ)yWx z)Md@}HL0nY*=>U*lYPSzJzXvFIBi7{=VWvn!to@~-wS9yeD7yIevtXclxiC7G;yj0oK1A`SYI6DHq9vL0tANcxv1N{>4#jf68A<7a26;nFr)~&N6 zNmG9H1$uH^EIIc3`1Jab5f+=wK4nei$A*Jz5grwZ;%pST;7k_MD1%xWuN>{c)(s5} zkDtDR(i&rLc}-3drUx3RsAaWXK+3TuCYsY|K&3{Y#}YhaoY;b5EccMY4U33Gu}naq zOW>Wb0*-UbtQ{??%BG_=@r1!CXTWo%ErIk?ZVDU=ArnIC9c&o236lbU7dxCLQQH@JfL?IvnZMr`mpnm{N z6;i7f9>07+RKo2!);AsUC=jZNfLA~Wz=1I#pku;VE1Z^;nOlkW71`)E!LNn+kfi&= zA)|`D{p{sSm=j$;yLxu<>g55TamjvP;u5%iKrj%o0eIE;6{*>!RWiLV8FP&FF6}@@&=;U-O7E<>=6Odtw|Gy)Mg#Qaqpe55Yi>qoHs_D^0 z^B-{sWZz#vU{B3j+&Fyn&dZmVubrRYzH##k%8BYg9YDF^;&d$QlJ@Eah;$D9}dW6A8S zbUJGM3)3TU2M9^{e+dhD*!}dQmKz+Cx9$OdbAI*s1ipitutN+0f>(fp~-&@@C~L}?mflEi@3&}s|L;#qooq_8YTGSKpODj z=><8Nu}SGEshK(HDd5Zoglq~&Tys$V^MZv}Y z?1fMNA6M^$vH1n=?D)`NUq54t33q4?AB83osf+YGiEx(H3?60>=@%Z^um*+*$UnYg z4$|<2xvA0d;ika&qBp9CzKFI z&%eTF@oBk&5Le^dBmnq#(nEdl4Sxb-5$ccMkjq(oA?^u>2Ce`l>#q%>zeWT66tu$T zf~@#PsSqyAOw^}`6ZiJV0B;~Bq3Uw&nBp$r1)voVGM;%ZG|VcM8ntIcGnHC{ot=_9 zGu~RBNhtpQ=-~+mV0WMegP<k4k*} zdk;4c4}7I7>EB#4=W&h(uV)5QQOK0>Fw`jQB`;A7u38t(cWUKiQ+Xnxb^8O^#mmFP z9d6m^_<=*vwWA?-hCK5%hj{c_omRKBWF#AZYtZYo_%Dqbb_lcOnYdM=v73jxrzZr8 zZltdYl{%#iZ=63rJ2Nj=KxS@$*q^fWe~}K>YV~@pR-+R2WP7{g!#}zbHMBqCS9*~C zBTWG`IYiAu>HG{&Dut%`E44-;(-`n0by_|Czg8pfhUChF^nG9qH87Cyj)pTi$$wNK zmqCL23$BblxGBZW3l`6WyouuG7dpQ<+toL{h+g|!sZ1>7 z&QFbwjzbc-Ammk&d`RC>Af5Ao1`9vV#RuQ?pH)pDM3wZThy{fnxXZ7ZW1}O8C{-0k zlS#g$KZ2d>OAZ_sJAAoX(kjxuk+0tRgB%6(75Znu9dYcO4Q=ue; z6qW3T9T7eYvZ@O_-`zrB7EK7iz6wmOt*D;m@}O)NOXr8Ga+7Eg9{6=%yZA=XLV_>? zA--}!-$rINgZKwvfJy)68Jp_v*MNADNGcL8FzPcCqJv+HJ-_v(f_46mjjwk7lu5jVTE&q}|GjgG@ zID$lS@rcZumdbHpUFbvDYJR`!t+>`X>ECbux3v?1GHI78iVMxU& za~Ug2M$!h3e?~@5>59MYA71K*5W3gG)JF)iLv7Z05v85(~iZ zy&6UaT2l~54?{mlBz-eHHGLr?J;@jUg)ZZtT~L!nkoO@MOhgw9kMs8QB3|t8U0}Z( zj}3VY74vH$UYu_fA@_@Pb0rm%{_GF0kRS1?lSzL{j&w!;`U52t+t0v2PyE#%nM3j3 z_=(?oga^30xw?D1fTH^Yi`kb%jD*Yp zUw#+W4ncez8EVrX=~JWt()ZNz{A6@Z{CB^c6bRRMujmBg7k*2L6ln=qvis{n^e3Mf zU;ORw+=tYf-2D8!6sngCB$8hE;oijGhs6(|`fNd?XPTd!h~R#RTr(%VJu z`eS2PXBd#{zahJ346AjT^0vXjk)dv!Pb=`ZzozEa%qq3omR_9U1_s;eY8$-34*xd2 zei-YbW|UyFf8W*7g3=KJDehC-G{_eVB~w!%Mt9dW)RhF_uYVKQ+A+rCaj^+tjSuzK zm!}02e@jm7nq1&>d7`~P~XF0I&saDe#l@KDVeoHg;~il?9b#XYB9YLtw0U+8Kt&PYj1FP(E79tjtDW+we$b@WTmUd*^U}Uot<8rH(87zI`}jSl!F~wQ$iBnAL$u#QneLj^w(i_N06}zh{SZ=u`EixN@Z_&vs>i$Q z>t^-h>1rqv=-Gw+Z+!guPoEuZ?gF@Ya&!n#$~KNkf46~B>5UD?!O^ZopjqEtlTM4I z@}=jWeDRT>HZ!xhpHVi@pGHTFE3@~5FUVh*NdNrl^#fquu3Q0RYD2GP6+tlT$qQlfU{awBNA9e)IU! zwVT(kY}<+UOFCdbR`o_WL+|hHS$VS}p7FEKfA)bcCIGQa|LAmj9_mSIYMPEAUHj>i zEvxPD_~;6_muI^WU?8lh)x+-1wz0jviwf6c+jMKIXz9ZTXGh{Vc$&n)qc9r^uk!Y$ zI`*s2KKx9fxhYrD@jsfkP}E8OsceOiIhi z%r8ZW%1BR_;3+g*@9znf`{x88(nNZ7;)Iv;`m$b!I^fk!ht2NT+1WNrh9(!)KY8`8 zqeiJH3J;>uL0lXdnd8pOmL9(Q-pjk@S@y;~Q0A^)J$CLn0SnP8mMkl)TXvKo@9u8u zbW2hW^(htC%<*YCdh_`$~T(1O?s8}Ezci+?`a zqwIaNy=pY!2Uu|d@)mjZZy_g=D(w&se)@EEs4zM6qrJwfsd!KX>c= z?W>ahQGwWYbbNTck1Oo%I@Zi+Zw157MA`+(Xv1n+T~bMex=%m*dJ4gp@?2FH=8{kK?95N(nwm)Fg*`K6zJ_MtTo5ddGm zxC@=i6@yB`9q62x0D1C`erChDe|U7X>u@?T{++vU_dal1trlef}E8wMb@e;yu z`u;RHvyZ{ksxV8z!^V33ohR?yUp3(E?K>UYyYTacvHCi2nEM30#c0`BUvjLlCnv_< zyBfj44onx%U{^@OM@gjNAL$m`k?pP*R~A?1Ndkv$?u# zRw&8JuXQUbuE<;v7xtPtxE4x}3P~%B$*3Db5w3dW_D3Im_`$wTw+UzxYW6XW9qjJ| zVYvr-!}_XLrcxO6Ybu#>lgO~+aPIBxPo<{C(-JPQgfr8IovTk?ee}VDO`UlMrRf+( zdj|)H$H#aUU_foGDgo26tXj-VOB;v|kwZTT3GhN)IyF8zCb2wqpi5I^MR~54Kj8tz_$W7L(Czg%pQy}+j=zKp4L9ld%3k-G4xq`cCK z@`ek2d^H#|1f$4#12X?ZW$*mv-Vyoew+8?cZGkkfyLWIAdP>ag#PaZ$!oUlJ;xSE%@4NbjYjJc<>)0k5$06Kw)5a3M%31Zea*6g@_5Yf z)@{NiEi%5MuA#A$A+$MH*VbSpz2mrX@9E=1*~!it*f&Rq;HNvtj<2w!9Yft{1K-GI zx7$|MH|$$`R2S;+A`9vp8U|MEn>$!EwlG~k+Btvgtv9yyI~NH{?xQ0-e=H(dMNJUM5v4ZMVO8!1gfUcGe*PyrAxb*T>x6&Uo)A_>)}y!}$YZuS1-MD%4#gogoAHDtJ;Z+6T8Aj{z z$(7yB{mVD7xwv+=k2w+DkG%5(dJveHWanRCRBUTy7OS^k%HFN(=XY=2y!qfMK%Q^E z`|OZ4HYr@%KDh+;;y$)k*AV;#)Orp zYv-pAAHR6-CTn`kCeB7k_fb^O7ejkp?Sro%lu7-7K;NX$Na^X|o? zv)hmF-?@G7`I)n=yq>YX1IvMx&7-r^v(qb=A+RPI6HHF$3EspW5P4W4)-77zbqGP= zj(Ku&^%NK&@IYqrpx^C86~KyN4clZi2gVH}2se$p*gJG$Z*vH$+{wzjSV6zQLO~Il*$d zv;Nc1zxe5^2Uo8E-hJ%`G&%QeTF$_%+Pq?1)6I@qz+uMj2&)MN4{pn`i*5hzo^xY! zbKSau^~tv5uzUeChmRq{zkc)D<(qFld*|M&af)Sd*fynNEpx(ncmnDsrjWfufLWb; zM<;lUn}@roC|TbD;cdtIISMI0eR}iejcb?B?mvF|?AoSqP`|xv08R@f2s$`(AM76D z62RzTk~@G@-M;BO#DxCN+TJ#?M4|}eFF(9TT;S5}2grDzoUDk=&P|;Z8(M|XxaPca z@!$a3GJ;BIKiJ(fFI!e{4;wIF+p}9%w|_?Y*+(DT0ju{M0;YBJ-uYss@Cjl zW|?B^%JtLBm(R{Ffl9cyy|b~bP#O%|K<3ysVE(pl-~Ab?W}g29@~x{k?%)ECZ(Z5j zx^m~?F}6=@7PV4+Kv2|)o_xG_u)A(E>y-+<3F|95(zb1Nb=&dz&%XHCCl9Y)zIgf8 zLqJu2ecQ2N+`9Ah&Mm+n*Hk*w{!L;o`WX7Mvx`ofb$xXSx3Gf6AKU+JOo;2-cn5#^ z$>Yl)&)s|T-M5}x(J5K$58r-z_XJo|y~40_6D;9>CED*DtfReIt6c`P?`Z$h-j>Z` zCY%5H^Piy>;EgLsM>n24eeur2ojLjB{=4s<-#^tZt%GfK`P}9Fmp8FZKfQvVjkOqH zylosJ5B5-PuwvGrwCxw4e*7j7gEv8&dwBo)&3P*dEe=m@N}X-fvT+IDZz63F6A?f+ z$Jk+5tso8(Z}Y%$cyZIRVjy&ZAHR5Vjga6$eE0nMokuTTeDv1Yl5)vx)tGj#5ib}_ z@5`6YF5A%_WGp+*Ne*ZRuN`4+{giM=`QR*O8(+fUU-7?>~R`_S3gseDdni*4foZ zM7hDWb&b%7<{z01?Z|1uSurfOco2}Ul_eaRv9umty?*KB^68D!BV6Fa$2U)JJ-YY) z%VQ^(eIIhq4_^X>e*pfZKgkYM-RPC^xenC3_M8?xZq=h21{iGGt|h+yxLk zbOy3vOTDDgDv^Y4Zyz4gK6vvQufLgVM6y#~}pDTxcn zWYByG#JH;7s8jHP&mHO=Xk(5nUVi@$tF5}IsCRa}Ge0RNCN4R>{_>NTZ(lV?)yu0Z z@W)XjI|1^@-$_Jbq;XVwqnba$5@`ezoiG`jzwzdKZ;Ta!7g*nt-B2G7H=~%u`up#Z z-}{$mn|h57rEs8?z2n34&tAT`&!PH) z{N)ptfI5@Z)PjPtHR#{oz9bijjY~_bh`Fq(q2fR#CVOT9(H@CHp~g=*7I#)ujB*~G zY%EViB6lAdhGOd+fEubwi~8W?^2Xh@$!TobF?u&vR7mkG&U4r^vx@?$LLyaalqzv& zS!u7}zHVX?IugGST6}UMJ*(tGbyH0>KhuEm_I@Z+a9;KN4mdBSa_n}KN@c`2?pj zD1kI;@gl)<;UUu{lPkqg;<5UA`ENXX|6TJKt05*D2C^kJef`73BV7{bm6HQmQ{%vx z0G{61e=Q+z^o@c)%fbC4Ziim=Hv;~`?DY7Q{LQCtKRpvQriDi&=fcNoc&M+vr9rlR ze8tItVsT7vH0h1lYoprXYmEd6LoN?lMG>y>nPgGO8J%Pa0GWMqd6^y(6iCgi>KvM8 z4G*@|4=c8>*(T~+M#dya3gH?{1c^vU`~U&4cZeAXken29`18y$#>~^V-h8k;91I~x zKzi*sJR?CNZ*6Gg1Cq??;)1GcSi&M{1g=>@;2%XGb@8|ag?4H|v^def`1V^5Wpqey zyu2gxtERcL%(20S3+-)2P^CG&5{(Xrb2X|h3v_AxD}@uaff-dD1H-LLO&! zmcxIrW>OA&x?aWTi|YhaL<4K)14_ zR!Vsbi&N86(=*)Z!O_LE$iUZ}LTf-=Xh3{AHL<9%e_)Ww+kFETEykG{sRomYLXL?H z&^VwkvGtdT`0R;k6ypn-6LV5R%>pTmCje6+@sZT%{BA~1=bX}Z`N8A+N79)^CA`fs zjI;(o-%NNIDydMypB^7)^Y}buIVC}Xlt2^dS%8lR%mzZD!l}_EO!4BNP_+TepgX21 zwopTK0HjUz8h{%SEl`VvQZAdxn!~$fPcr9l13@8#UXB&@Ks|t81zQy!Zp0PMPx}Arx~LhG!F_61?L2^9BNc@#h?nKR;}8;|M-D( zu3wd^FI!v?kOeQeoVi5-p`Qr~i%E=xL?$Ysa&Q7aStU0( z??1e;J=ZXc-4wEu3aLOKlq+FLYg)!ar2bBgopMpz(@ z$u!7kZe6)~)i_-{Ak`ANRlS;+O_egWR&PdH7jrvV^uNS1VA2+O512&oMOJ-<1#L-ZP=j!W=O`C*MH0D88|)JNyU?_v zlHvxQT&jfJR))FykLul@a#@2>Y&7EGLm8>n<63%^M66Ir2soDnOO*$6gqcs>cQVB+uXr9BBB4Hp5MaC~Q zHZeE9uy|y#yO)72fgZ>}r)^C;KQlKsFE;{xs?(wUA2j-<)QW1B4kqre3ch!y%rro~2 zYQ&7F!&AiM4ufHkWKAM2a?Ge>N*|w1G1kV<@wZHR!+nl}Q$j`)Fz z^u)e}CNbUK@=1g%QWHKh=AA1g5GA^wl8S}e2fvP9?Pj# zzhXz&ABRJe1`J7JR?_Lz=#)6^Yeht+%P%lbN+cN8t&XGhjm^D_R}PoC95Uy(^L*Xf z+A^M+9pSz$t4XbLSA7aS2hkcOg$f>o-kx5?mJRc|4QZ!amsTCe*KQxJPmi)@=lG`O zRgF|{+1duMc1@4z5WSDA`~e*Z98I$3FSPn41$%-g@br$=?`&*4ckK4VQ=Eyfou4gr zx3)7l3Yf|ZBsy4KAkw&^gTNRQ>FcXtSN8)Rg+^~MD0#C2g=b{1^LQ8ge#9qj+iOP` zZ{OYSZffch>deauk#q_Bk~OOZ08h*Z#2>j*Ph1W2qCqQ1UM`?y@8s<4@}7BV&4Ie< z-Tmw9`l_7b7Lih~7jvaXBG9>NSvJ0IPhdPX%Xk&oXrsd`L_9WQ>-KF}D(#_Ltr6k& zljD9mXge1;Tp@Q377`XTUj<2(c>h>m@$fX**BFqMSXRnpl9}_jo<6*N{9oBF`_A#v zsbiufzqomDj;Np*L+w784J#(#18@Nq2J~NQ6ex(q=5iVB6-v?DFW-CX!QuLha{%I!r%{8Z~HnBD_LC zvIzr*kM28>EZDXqK6-3fUp1)LEL`@qP$68Ln3An-S}hhNRdp)8R-u$EOijGk$7=-dTJI^ zB&-QE3NfFrP`!MCI`|`ua?8#U3>$v!P)RuQ-P7G235O?~o|)IbPVIiYg}!Lkh_Q}x zCZ}h)Son=5qe8%45Gn8y-g$D-f=J!|<@2kTt#eb|lB4UV&gF##(d^W$$`1bUCq#Rl zUWE3GEcSvBaABQUD-&af#6{&1yg$I2-MVxNGaq&TWQXzme0$$IGcS@X3M|_$+rPA9 zi*8-Tuf|dgQIi4(NWB*23fu)2O5=XWSK(dpFLmonF25 z=7SUYy6qVI(t9=$n*qS(JZH9&P_5$>7LnNiVGox>9GErgrS(m`__Zyo5$zwH*sXAw zxqElTINW>q_{}E|Z?C8oY|cD+{yTO@>gx-TeaU`bMbtxOILlj58)RBD`07h*E34*} z-;W7qDiS;?kS<0ALaXy9-&l7@VSW)x4e^6FH=%tF4T6m~lvqLW5y9?$@w6BZ2tNJ{ z`4H*b4zZ#Ve(ylrd69lj3D1jzK+HEB${RmFYp*^lR6SMZK&i1_I<%)TYuvL??8+zx0FP-On#HI+hBPbiYVIcwJq|?t^^8qAyzg znNaop=skmg#or0@Kmtfkr2`=m4t+T8*vHGu$2*8h^>%Uhp+-}IdGz=8ldJXOIQ+)1 zgIL7&ZZJ3m?#UGTuQHROpq32?@P%^E%hQ$Y2BmB`H3Ikg2Ux4=j9PIzTK%^`4k){t z0l%P-=)}0Bto$504ijkQLIyL|!^JfKK!}J)s83-|E!JzMgVE^kDGku<$y$QFeNpkB zl9QL4jvD4bUjloKTSG}zP&iabe)z8MD6X^J@3}w&fWUtzxiO~u#LI;>jSYO8y^#g>LxC<=61B3kF z78Vu&m>$r!b9|*R-HYskc7N}Z*Id_J;sUKw7@dxaqeP;(In2im5<53{Z(rho`<*oJARCItp_$0)~CnhAuMo=QY3HC&%cJlyg4=?|ZULFuZ z;pc^5u@m$_vO}nwf(z@~%8Bm&Ejc6>EHqkdEKqM>Q~lgrU18bog^Ch#!0-GC`5KAr zBLqFZH6MeBOojrNO#0G;TG*QfEF6Ur92-ZAi;9VbqAtwa4Q-*2^Y{(W?0!Bjo_Ihc zSCNFr0whhJ^sT_*%CIO&)$s5a~bgO8v?f5LKajxCKyy0Sx$U zAo_lERAe9^)d3-XKKL={&twXacrF1@l>I+w>K>BS&f-kh29n)zcq7UiB9QZoiwg}3 z5B2x*CFXIJEi{c%cliNKpn(RjL3CEkl7zmAypvA{WgoTIsdimpq z$P_$!+z%m$`)dmF$T-**^iL0zkSTugN%1svN7zz?ghxkG@nx97s6Zoo;|D=}=lZ%0 zE)^CYS~xw&Du?PXGCl!3k#JvcFQ4F`sECNz*bv{K=m0ktFGzY_$nKtmu#f!LE+{Do z4T>(GW)Bp4kUT=7X=56D9|IA7X5rs&;u4_Y#hdFU@(Bjo>(N@J$?Mp<-c(Cfb>5Ar92UN?StJhAg%_3 z0uUQb)X@Zl1mJ>+7~`1le7t=EyxrVfJ&0z%h9d=5s^EyQ!0f8J8Y;=x%_o);`(-p0 zPcb+&m>Lb51U0}f$lKjNG{nop-ODo=O9q+z%K)mUmvy4d;^1g-Msw*10&G#4?aQuA(%V^PzCcpLJNAjTS6#di3DLL zHWu7+BgNTJRCEYFRg#yR;7#)K38E4M44s`4 z@fDR88y7>PLS+Noi3`OYW<4JG4CzY*qDU^(#Mr2)5L$UwdIZ)Mic1g;98yffl!!lo z4HF*=(h2VSn-EByy*%AqD1>7AH_&&x`hj4Ynh_c9A6Z_WMJQFjCcD7bA~g~BOYkGV zj{>IUb>pwYs6pth9++d?iPnCQ;}RZm#qWcl4+&2U@x&bCPc#mS4DwDXM_mUZ0HJXG4e><3|CSO~T#%KSl|lpC{kQSS zs5YZw`Sg!K5gq#6*^5d`&8w=2a|@;Cq@p?nyC_fhU|K>1 zek47&5LIm1nRJwmg@&UDCn+gBJSHC4@hEQ>S6AZse&n8zS6EbDRFvuo*>%m!R8U|r@4+Ai(E(~qVoHP$rW9hu_)S1sF3M}tO6xLnaw{6! zsuMl1$NDW8>**PZQE>?c@PW*u$A^cyhyF(xHIfKV0QMb>Wu4d~{U#+lF(WHCuYl2# zT2j}`sLdq)_Sg9N38~@!(J8nz(6UkCsCXlX0&)UI43MC>L{w}DRs!M?{3fX=r?9*z zzo4eQs-nDis567@--rKMGU+3{%a;u{7^HHsvGM3u`GV#>gJ7q3xXCf4O;*VRW!nSg~tcDY#=Q;9(M5vkW8e%bqS1w>YmsjCnV4S z`yuwNK>^el1iZZvYW4LFK3MWrW1(-IN@ z=Zy*sj1G@IFo?2K?1mg$v$MV4<>T#JLoxd z+5DEvLL7FEg*~LR~|BF+DPnURImrB-2V-EBQf*eW7ZAyuYO{i=g>TXGc z;61Fauf06M%>`vTpVLj|}j2cXjp9sueO`Gd(6Y zzqw;%us+7qg`7AvTvU~YUf}2MlU(3Z@XNfcjLbB8$m^BV*V`jFIyyW$0_7hN`Xin5 z3*llLJt;B2thS-{LSD6}U-|G@Tv{NR;^Xfdl!UMUG9S|fu=w$q;XFM9{Jp3s8Hf&x zN%F@g@AbL!K(IK{nw6PbRMFVn(cf3sG|HIo0W%tN9mPF73)1*(ptqBg(^Gl+k=q>f;2y1TTXptN;rc%%WOj`w6;eg`j6GW6r zd--B6qD6#7=j9~>?@f(?0|g-1s&PLEsPcr zkqB}*oXF{k$tJS5P+)>gZri>onnY2bny1rEHFl3N1{ez?uV?J=n7lMpoQ5P$zwrU$ zw@N$Yd3GIFsWAyeD*144$6!;>goK3x?#TG$s)4pt97&RyZ@iD%9iGv$3PFNiEt893 z7%3X7si>-*R0$IzXladI!>ndnh+kOc(%DPX=DKYManP+3r&c=8kuI5e(={bkZF6(X z)C5`@n>Rg}g?Tcd%W?j`-RXpd;`-*{m0c4o^0*4)B5S0-cc_coS(2QdHLx&JK~ISa z4O)Ek&IfyYPzE}z8#j*}2DO|y*)uRc%3$%QM%h&jWvPYv^`&{aNthI--}&Ix-acjD zMEZPhedT0Rhwz|iVrr_dp`~j|G*R2pUP4RBPEJii!Dd*9{rRg`(01)P99GGSS~$gK za)dG=liS@nsW2@o#*>nxi76@?``d8UJFi~t>>uuLY_7xO%Q(BhV#@VK(NtIWybd`m zWY7~19UW&%6;r*nQxcs?ሸT4ax9jT!$ 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

    -G5Dl5N6kwzM_sh9HEyOd6 z+c(WP{MI#Tw^%*C5liQ(Q|IHcQ!l)JDXML=qlX%WJ|>nJdv7KhnGeBe!ywGhMb4wL z8U%pw8~C!^Q*O|EE|2VZ^lyIf%Xuh*6|&Uw+?dHA9tkw65#x-flt7@dzY z3%_zlVi%V#Ku_d%PX_`sZo3a4Ma1n4oPX(?-+SY4-hiF&@=~{3P!NSa3Ujp`o z%5=m8vCqGR-2UjrYtl(5*{xvUtFFG2mOIbzkAX-3HWf*7yi=Ue&+|sRKEMhYuZzB z=5c<3r&9s9!y*4%Br1=7JRk9gy?(Mg;>+^_LgfFM&*cX>WVV{k8u#+@HwF9G_x|Sf z*R1vJ&R`JP0WRl5fnb<==9m*P2Jb~@e9;Tb7sHFZF9m#)F8lO3tIYa!SdIn)mtKTQ z>wDjRn$GqE(=51gq6b?->0bU5A%r=X~?hh=# z^h5a5zW*&IV)~rj%cZw$?zXt&pM!KT5L$xVNFI~LKa2#u7*@nT2m4zf;I;AM`7UfJ zbD`MsO605G78GvZT#8FpyA%<`IuUv3j~u7QBa1K-VMBmV{Ge~bepbW#v%Yf-q1j@y z&xIqGURt{J)$hr^_s+LpU4U4|I)&wj0b5}Tyj;zKIFUtu41DE6Y(5$S{1cvo!wxbw zr_~}^t#-FBvi!oW*Z-E=(bv2dgWDa9EI_Bk=VakuFqol0NH~O8Ja$o38$Sn4mhx(4%W&m!WthmGqjGPY!XBhIIO!@pFMlS|_EWUIx zcAkm!1{q6opE-b7T)O`Czy02K|K_h>UG@!~*z0yjq6^XF=!1EG!0(g${xB89BI5D+ zI9?_$0C*7}q+jG-Q}uh1h3NIK2~oyxyn4B>zJ7PRClXDHzQc4y<^lk=rlw|s3}9?^ zSQvjXsBcftMf}ql?4W@ttqP&-KQ0Sd{)?5!PzO-rnQt!GR>lWYHf9FU+Ew6)O)n z8H-)P6Ghn_0K`ms1MVP~27Z71<*(j&^_4GO9vRSZFah#p4NYh6#aC!H90`W;kMY%_ z(Fkpxn{)e}PX7XC?q7+&@cgT@ z7QG+zdHiCP{>~ei#l9oqFI|7}m2bTIYHZP9y?HglZm^8C%VUqAMw3VGNBM|=9^Rg3 zi(869G&WBQSfg+Gz2V^OynkWk#n<0Jp6d#Z?fi{}^L{AB*biCt(R=J7Vzyv`*iKORxiF1*7n-_2M|7sMNCe(~iS@#U*QuVBY?x~y*8CvJx-=|jrAEOLkGN8Khy zKje`|0HI{z4`##A1Wx;xpMPoj>I+xHuuH-%I!O}Woyoa*yuc-PGI=yvlxAaPT;nWz z8KooP{$KA3P$`dK^k6kUoh&~TnEpT8qKd3*^cxLP{2 z>SKS${IR8kBi{fCbJ0050nHFRx=!a@VCm|LY~|k7E28IAkTicg!X|hPX`6uXiNL`A zZT{T+-@rmHe1<^?8{$9LH9aXqw7~0^`z+S*viFA(WNVwE=B|3UuA(i{yoz*%h*bFZL0OE&7=8`rO1Ta3jSdinC(@$ll(@-pFM7y}CW z~&hW1CT6sDRv!P2vD!28}gM0@r76fX!*j$i(#S!|MVm%RzG{`eXHb_7O%;!-4iuDFF;zqzP7T0xj+pmyw&*_ zt2#ah)ge4g^3++ZfItSm3g6AsJS z(r?EX;oDqU!6&dVmJ^rX4bIImf8J1h;gZ-f*=3hv;M+i~iQ?CgdA@XM)d>pp^@r>} z;mFdp3&Nw!Ga!ucBcGoL{R7|3{KboxRxYx(BH;y4HH_h(Ubwkh149NmrdVuZJ14M; z;G78Zs3StDWiKNLGI(Zw?$VXz3zy zOG}f^MCXUzY5&p+%VL?sZ$?)<_S5Th{@SJG%Q(J70Xtv)CJ)Oa4`SzOxLmkGJ9cxA zh3cA$t;kn?zdRihF^(AcYu9hk>Pz%g_{R|JhEyRBCq*8LaS(+iJ1M+xI$aBx)YavS ztO$w%Z@YPogUf4IE;9o3^M4k7EDFlzA4FmL!?V2Sbn~LacoVG6#;#nY!8fkTuHL`I zniDZ|YWQw2Kw$Nk#)`)#M*ibOPiLQf!YRV}i*a^c|Li;qRXlU$%9TsY5SYqgaZHTd z1tKaMK$%4P{AR54gsR@|npqGrbU5IinF?H3VR>R0tjcBF3!i+%3lkAv_@3A*$qtZ5 zlEUv`3}_+OdwuNh*hU!4|6CY}Zv2w`itN&ZxjYFRiXa-aPpx=b4q!~YuND0?@I#{qA6 zDg^eG@C)Gg#g)sKFI~BE8G~5Hul}W=Jo0$;C4<+eNaU*MHrxF&2DfwH{sSjG!m;~t zFMj`A7zZMHEWh-Kr7VlxrNDnT{71Bc#)|iqU@#iM8#Aj*d#m>!)r$8mpL@bQ>GaRU zq8PXsYS92fVp=W_zsbsC1Xnl4$ilSG6Pyw;&c)c_{hGcWFzcR4t_c5V9gsXr7cOGo ztHm$yp3IIYr?(GzMWEa70Zj&z3U|^B!6?72Hwe18kEi^w8jWax1w=03cjU`=nQDeD z7Fk2#$BX#KpYVbZj`^o%Jw75VqQnuab%N`t2?&o3aB!Xq#v$ot1~2e>9gohRCyGyu zyd&0MlrSSk92<_Dr{Vrt;&Pw=K0;@q>-fD-?RERg_Z&FX-ahD%IsW8=?irRFm%}+O zL3JVCm8F-~gwEUvMI5ZP~d11=gtZGzgTlHL4JDe`) zSzIo&1Fjvg4rc+am?@K}e{3+yjK4C#TL&54h|yviF*Q`zo6RA=$*HS5+I&QBHnlsP z5U|-jF8c94{TQPLb{yz#R==p=%^|~Sg8^{~9UOVAxTCdSzDY(PJTjHmVb)qWd?8He8v3?e^%+Su7$-_UT@ zXis!}!ZoYF{5b3m2i768{X@TzYc!fFg98gu0Gt6#Zw z>-k%^f}T#7ZWX9w`4r+Wn{AX^T!}XPI}wY?I@E7+xjY`X$7-{f%!4NVVE-UM!a<|$ z{EIJt6}`@PZ(Tmt;9?%f#(6pwaMwF(vP#4(ACE~Uo5AE^3_N3uqs;U(>R>()x6zP-yx4K&|sww$qA_=5V#F3ibdoUmgUR_Yxc9y0WDD+7a4 zcMmS$mA{50PWI~8o)3>$nvG`jS(?x1My*yZ!&yj>2GNc&y&mab^U$bmbchKsz#rAs z)7`BznLW|hpjZ3K3rxgtpU%J)w#<54+}K;;Bs7mYVLp;OWUdb-ivh!uOjgL@%w|JR zm#phu@>Q*)4$ri-{E}dJd*12NYIIsjujzM z8rQC_?jD`hCV8Vy?=t6o@4OTrhjm6Xgyjp|8m0hr;S3-Wne<~2DU*&d`zSabn-z*X zxZ3(P-B7>k^hU`O1}@BP=Ve28hhA@y#^GAxb28g67|c=gsBj1lmxIGKo8&qRrH&p< zfaNr)e!co$!>G|QwY-A%+Xq+u)7@RVp<&5CEtVl`2>gaEHfn;tfksU*H>>`|#0Nd4%HdJFmQO!86*jr)LBh1`?A_R-km&Vi{q`e==k=jWT);pkO4aLPuq? z8Z3;ZK|gTXV483SufGU6|E0Lcc(U#py=2d_fyf9pov*HT?warCrgPqM$mba9FV_6n&d3j^p_9Tvu44C>p% zR>?FxVl)_x(x~K}yT!wAL|l64xEjR=?2m8&GRF@^;BTZ6W|LSJP`yHhHi2oLVKJLc zCZlD}@)E@g5pEYHSc=Y5^6YN@9m9LXA*&fJTy(K9y5V#7bWR*RymFk-S=^``!Q(>P{s zns$Xl@ynM(mQLN-iQ!>0vyd3j-NHbH^zR*s<+=`7ZI~9lOE#Z#WpM9ma!d+@N+gA@h&WOW+^ng za(yXw)n*(#X|cgqh?U4(YyybG(&ERf`!TjWhCh=ze(hvl#w0U~z;ecBJ8k0b0I$6` z!}-nZw8^OHWL5<9>Ej7jAzLfFY3whFV-K-s%75%~I)s3#X=uo}itV(T%tM1V$q|b9 zJsy|UqSxubZJ*YknHYCXx@pNnx;+NTj6_)RW5|B7WQS`EelH8lN_51~+b4~BA`7!F z&y2+&$TRx~G)zLBwfaG1s{U6hye%OEu*J--D*bI7lt+CnJ5T_7#XF0-}aJU$Hx#w+{ zZNlmC5Kh`KAdAW6g)A6aOUsaP0J_-+Ms2SKeDbGAJ!`$ZvChuTCeA(%dSsq|Wcaxv z@{En!U7iVtWz^$vvmbI(GRa`#*&zwW0~`9gyEGat3{Vcv<>xqgNSc*TKX8pZB#iGP z`YO;{c+UwNgTg({N1jQy+eVaN8Xg3YYGN1oUb=1AeK z&N^7tE-Orwj4Nh6?VV))XoJl3p20XUifmQ4-4XG)cpDMtpRzgGtjsTWJ(?0D{Zo7Z zfK0a0X$L#%m;+$Y^rU;3JpqPgs-KXI8lxi|wu0T_B`ZYvPiC2kscFyn7~!y-E&aA@ z!VQdR8lS+z@FaTPwOFmppJCKB?iD*GyR6dzS`GY}DDFq^+Us3)f&xYTA-j)Fa{4EQ zM;T*47~w}o6A}6c#*s0O38vkwEy*?xPKGi3Q+RH*28K*JySmuKc1~a=;hYHas6(QZ z$G`{z@*NqodZ#>-UYCtU>Io%D7l-3Z6yWjIZ*rSldf+%q!{x#i>ad%8EYyJ^$FzL<_nzTV z5#xw~_XlTbwU?d>|2PWuAyvq2Nzy|x4x+GD*DLRRvwvV5lbS(5#bl-^P_;S#%*-q= zql^Ik{GUZ1i-NMT2X<%x@htE4>v_>(yb0FMI5<3Kx@TlF_fZ7#h?qImc9-)eDp`G= zcxb)TshLu%?F};uu5(=z4~Hiw3iW;MX~3>(`h}W^_-c zr{q&|?|lJM7Oj@qQl$IrA9fFINVNT{!!_=zfDqYiunmoZWF`Cp#qFN<`MewmV-Ozv z>R$@VrN^r;8N5D8(v0Xf+r0;aD37E~j>~+b|jDa7LrQU&B9K=^iv|0V4f)mLd%%uH@AYr>k2YD)>7h08*0wLSFwTXg7EC<%H zgxpM(N(U^Zsj)CYo-10M3w4-6k)eP-FNf|t%!5xvrubE|qM*322s*9w_(Purn|`md}oAz2{@7xj_IG$1!AyD*OlfuD*DrR?PNykfx`tWcy6gR=c$XaLp?IE%Q@&*>ZBSfhj3y!@uX}<)vq($rL;q)~sAXJ!_VwLt?iGIOXUi#ZV^@Lt}!)V!jS;+*{S zoUDx0Bt$UjLc-r?lvYEm*7rrN_89-mtU$+wwsuD52C`H#c{(c_$3_VRr0kS2_x-DR0S%S7EyAUEVd4Wv%ks>n%V^XAN!LyeEV^?y* zM_JhgCFP3xFA5&L6NO5K@v%a1fGOnJf6U5OC`lcGMNC-&sxBSKUQRmJ|8PU9=->C4HswED2kcK-pe$s$DK=$hu4BZ1k(QdC&G;37-c%MA!vU9`m6FM5;?mZn zq~{lIZSCsQbv&yo`ES}mI8ySG^B&|vRRu2o4{4cLgHoBR#H%O;(o~TOlU>@HWaJz}lP3VxiY$jC~i1sUmL9gyt<4PQPsNy-D>G(9zQU3y9?iCoHq zZ7OX~n{pF$dVnpnALWSRALL{4bP@0%R^t5$r)`57f zs#YERe4DBW2F!#9i3vE1SMu=tz+6E^t||DTFhlVLiH{`+0n1715i^j#dc!PF^l8V2Qq!o{~c*O8VyV>SNk3 zHa@onFScp>=1uS#U}R#!=iOt|5R)xaJj9`kJyn4Z#&$A=Tg#yl??RZEp{Uw^to3m1 zb2*@&GjrgZ#7JaHJU(*8wD|Gr=8G|t2*$kpx{!&^45nHB+l{Wzb6$W97bA)85J?nCUE@*gV;3xqguI;pn;{ruak^o+Em97RD@b!AD3 zGKvZNvt zYET*IS9UhsCZ2~n=|oB{NskzSlBd%Vx#AHxS~k)RIgn4TO)sgcDXG|9kt1kKp$C*D z+)2vH#SfISZOQYJMPYVP##PC}mr+=elbj>Vkfq;I6zq8RU`2Ux5)SD@c~Uy-CYNG` z%FQ&I2g`Hs21Dz=C&Q#vX4 zwt}rru*_!&hX^+Kque4;&-hnX^qz{sLbib0kSy*fDn`5-#H%tdCGXS1&3RkESC-`E zqvHN?dUi%uCP73&K15dXoO`9pl0x9bxc}rN?5C2HNb*NZ3YGYbKQQVQP_45+vg%lQ ztd&9p(D7cBB$$AK6+HdzlEYO1&w=1>tzdwY@@^ND7nkN0ZYeF!%K&LE%ea%CktqhE zP?;^uh7~n=Eu5HO*Awn%)gm5^a?0K9TPrGIV`hZqC2uQp@(W8!2oH0xlgxBwDfGec zlV+x+CX(*}5+CNy(yj17@7SKW{qa^3fquylla*Ei!G*FUzaTTaq@b9su6Rpv5o3n$ zPE8dq7K2!maKB(Hpi|(1&hZ zOeYSJl!E+9S>-)ZzDmH6e_e?L3?5psNjRcS1*}(P7G$N29|nt}0~5s42`y4m6NTdS zCwT?cCCbW5D%ie5wnMgERw-9L+9F2ur>t%O>THqa1?-l&1pt7{i;CCc?V(ww`g}yc zQww(Q&I0qiwQ5Hdf0(j1y%0Ki96~av!O*9+^)!e)UOyynz&rK^RmzV#(WNo$xUc|sxZrx6+OX;cb zeAy77QiVJxN${?U!jDBV!khBM&6pAbP1rpJL5J_CtUzINOBwxVGx(ncAB$qLT;6t) zNNz~xRfVA@_}WmgrGmC@7ZMDmEGrT9rsmwu%phL+OFP9A6JdLOTP}j}VkO&X`i5NA zp?FyNmM!RF2p1*KNmSe=A3!{r&nME=#|0SV?-JLEjPH`1jO2A`8KeONyxvmI$}7QZ z@WDsC?-0P{+!K2rX()0&lP2}&A#QV_g~ z4dafOMUgE~!VmAVi_(9QI`Kh9CgE#gE}k+yJ)@|!ynKs%i@fx{NW2hjmgT^c#&(cb zLM4eg4+@l<#dCj~k&=^^O_~Go6uBS8~JaR=~+4W3DI8?B3Zn$0x04B@@bjkk2Hd&idT)y%)AWzD|0E{>wYKR zl?2Cfl01D~K^`_OhFLtG@RoMVbKYSwF?_4LoMQ9Z)HRuDB4jBRBYvNpl{F%t>iso^ zMa7u&YSALzY}wl6^z$L%J#GJxd=RoCAirHlV99SOaz8D7UA74GAHkC#E0&ksWqKK` z0>v5%KF-Jcu>g6+N>AIcCY3;mP>&J2yEb`Ef}osEOn5(22?sN?R>b?TGB0-%fq0_g z9kJ5#2o(y5Mq#v}z3Cf>u2a*U3I9BKZpQDi>N)+e*(1x#z;%R*l$+bs39EHPKh&rJ z=MBr|06d{qOw4&dKHxpazpT$TexZ|Vu{M}+_gh9JUl8f|p$UzCC4QOA zL{LLFB0jHgBoH=4C(ljxwdzN}WrBeK+~FP2b)OO}?^5R%+6_&ITP+4Fi2>Z#XbcAL z$};esn+&2qFtRWh8EB18a-M5#(a1Ev8qsuHrXtgBU32{@gH`_p&4Fi|_p3VFhYS-_ zPP4vG)7{>#@m&Rc7PxvdJ|CE#G_gxwkq^s(K#*@)%c++3 z#@16kpVM@AwjK_i16e6)QZ&Dfg_aki3z6lZ+ubTnwN3)2?t!JY+agW-VC|HVY}9)I<&bjs7;^Bi%X(~Jgx;GNP9PoFBy#cL(+xWJ=Rx4`XPQdrR zIZI1tQ{%I3&GmbC9;mDR+)j=_0YE$ZG=@IA+dk#-yIo-*$}}GokuPv=BIrh&)xxp& zSDk+7-z>hC)@R#J9Nvp=CSs92pEFAnV)!7XwK^eLv`;R%-Qk6}z~h9yL3jB4f;ZsO z>-+pch#%*I7GDpgP8{8fFs2)bOMgI^0Gs0}g_sc-P5 zVdS?ZEqt5);JjO!a}P8gZme&FlEInq*Sl-0%Rcv%)9acF*uC~ir#(PYHCQz68W&0on3d% zI}Pw3OmD>R3!eiC0MmtQL?Z>=`Vl8N1d%DL)`~Q0Ute2OYi-+!_JRFn^#Cc6X19#! z`$jCjDR7?r0o@q#2b>zS!8ds>FdrGx4A_F_N#kf6wCD#%dJLLV&o;H3Xd2M%-zR{S zfIyrRHcnC9!MPc?pK*7FTwFkChQe;(kMkCbdxXc&`Fc)hHCltD>uzm%w%!_m5;)-I zKxy^c=g)9fFwy#ar_PhGJ0UADk zl|-BADd&XQPHqZUYf}^5lup!q=hTT4=(m|C=iQ+85xgIh z&jORD-BV7FcN$oG2&H)Z$tkFcHK$IRtnsx;S^r!kd+uE8` z&3!XVOK#G0Jk&A6&73cU_w(6(X5?r!-IV`+`>8&?b;=GnIqWf8+;&(S`~m5lrmeB% z*~SCUHlA>K0zp3rFjzfYOh9-+Am$?xHxnuv@XL1X2$#T;Wzx6cv`jedR`*1B&TVfS zXl$vkt*vitX+CU@%#y4mbHB$;pw|O@Js1LO9ts*XlbY2&^qAWQtX3}=JG9vi^Pt7$SkWLK7Q_O;5YqrXcKQ>uKrk>$3rM#T_{l z-ts|6?lc2;w)-Zm&5gBRXnFQPWr^SCcFjcxN5(^q<&Jpz9EcEcWS%K4h$| z2D>jbeqJQR?(19H_O~`p*gX(af(irD1hzN|F48(N z=^E%m1bEuTW*5JDKH{Dvau8_=FU+~;Ce8K}FyJ@0HMO@N-B<0MBz4Z`o^(516XyaX zqy>pFe3C(LV+S-uroy4C=fhsESbgE(`EX!z&S%%O)qkO-y}j*3OWTPPkwAzWKWy<4 z_oy=W+jFxKy9F6wyLEv3NiVp5@-ZUkmp$ z;num5;i{4jA|z>_u*$7aU0H)r(A&L!tRx1KGvc;8K|X3u7&J(`x1W%oxT6{9fgh0z zF?W*t=e{XEz$NMGeU{zkCUwnX*W2d33mz}YD1u1Zz_T@dr*x+@VyXU_zb;>kOij7h zxPMJU=R+bdV2W!jtJdbhdvMPeiTfcm_s#p=a~iEE^d2&gr|>o>nlz^_0j0%~7PxUb;aHNn#S^ z-}ib1X>lYpJ;8;X-7S&3CiDI)#_633PI{*1FD>|@0p|!sPju7nwo^S#^{2quviAyP z2rZZb;0ngpBeFUGtCMWPW)lq2`l+c%Y-JH7ZODtnCJi`oLR*g{Ks^xPfDhvrclqD) z2V!Kgkj(>-(PML4$t4YV+`%vc-oCl`r7JiZVIgJ%dtw^|di96vcVD^4Z{5H-+)gHs zEDm{8MheK!>|WcTXTs|9uzHu{Q&V$5sKL+%;fD^podhOz`|3{|-nR4N)g|&z?L7X^ zE?>Y8$~s08$DhaqVAv)9IY3fwFSh$n)4u2u%+Mq=1n1|20gt}*@S&soTbj0SzqA}D z#YmVii_jT~5|B{EkLjz~ZubSa>1VI>`lm@hBV|+MMuxBjuTE1}eQMV}$dImrYi5{c zytLxJ$37pNCQ0;<;fT#VLsA%cOEyh{qNy3;5?SP}`G|)AYsz|VLQ{XZYWL3V+kp6E zUSbukuEH7e%|t&Ukx6HO8m8s~kmPWi}UJdcB76Ypz9-qc0_>9fxUBD4NrEHtHeA|%^ayMO1-{nZDm$+@Dn zUa!S2QV)Ji7Nzr?JM6a8_mJD}LU6C`#I<;2nN>U)3e3#=7R+|7&)R24RAc`>)xJYZ zpv~`)t2T3PIvnydQbKOjCE~s5$zWLW8QQzM+eZA6YmwjzdnR8}#5Le^TfGKqsIRZu zcVX53g8||9marhVkGC3;I5@=)>5dG*xJIl5jytwYdeBnbAMt7I0jtl@b^=+G18t;z zeFQZO@u=7ChrOSoPPtR&{-HG-utc3m>z?5C$sP1vUcQ2e?^WdO&-r|wa7fd0sJd}~ zbu4xv2IgW0OR(@N!Ls;E`CmDQW=4>{7$F+d^ikvzxeP1UmZOt|VC-&wUkiK6zG|@K z-&qO=X2PW6I$=%|fwHIt7cWU8LnpMIeFkq|pC{rMSwG|*5n;?uvoVd-pE`VK_wLqZ z(q&dRLy@W%usSW0#0qj^mn6=FXU|Ez2H3n;FJ}wqNnNop(OX@kWb5~{MzN%g9 zqJAO<@|tn1L?q!*fO&LJhvGM0ym@tbae~csrVd+ z1%rJfrqi1Ct{#1lPV#ub{>+jxpdTC@=*920pR7>>8i#+g6#`L>TGez?Z#Jk}^u0AL z$M!t^RKb&4!20^u?v5^PXRikCrXc_My%QsP{kU#mu*V`b^tPyVU23(E`D{^l8Z-yg zO-CAdCz}*}59hPy2`hX530~BY+kg@FQ z?NO@_wW#*h54RsxZ>!i<*`@C_0qyN?p>~JeMdSj8io*iGG>j~?rB~;2^o@4tI-1*? zo9IG24w-*x_SGD$Z$GI~L6N(yyHjhlAX9&`SKU7C@{tz`1Zh?>8jPK0TZetHZ?NS^ zdnX`I02Lrb46V(L4J{`-JGJ!(k9HiWI?~;tA zU_WcA7V-37b*dY?hooVB^P%d74o&+(_4a*-w(Y7vda|Q;sK2YdMcsJxsMDjp_r{ht$<-Rp-uawW@}Os=;1%;bz9Tp;4t) zJ11ZcBd5YLV63eZq%r18)}c%9BF7OQa9Egsj~C|)6}X{ z)W3C%lDs@Fc`SPU5$({CL6F%^(APG0Yln^Sc*?BP#+teV2Wx6~!sdHm@AgAwdY#_c zr*Cf*4?o_o9kLAp6_#8+v#H)@FdyqU)}mIm9MPaG-Vc)BXzi}8KTxwzb*TE8vh90! z7L{pw1e&|QMcvWDfzHrrlYYPk-kIhDNiv%IdM$cXV7mdleYM{NFR1i{5s2++ZGPZ*MVKAcVA9x{Xbgs@wAn zH0^HiI;y91FkB96yF0r&^(GQNdiZ8B4*{1O1AT4LOCI}_Sr0-SaF#S`G)vkeO;A}L z+*ww>rQ&I>N_q#igC>jaxUPS2bX4DC1Y7R6Al?nk5?OJ;sy3v)wa4J$G+D;_4Ff}Fok2I)uQQtlMgg_~q91oSjD)vFqsHJG9oDsXHxFw^ zK|>?B)3UFsrM9YiM+K_O)!UT${U&R#aR3M_m?LskEF^AVspFO*)Jl!|b_vi}duvmN zz_ZgU^FYgiZ4CzwR3RI?ZSR3S%0g6NSVOwg-F>?5{$ZH+hB!eRvWyYC9`ERE)pEYl z(%jx*`b(0{r%)U3#0*rmmDTcU4h!}^ldnV*+i2FhQR0UG5GP{~n~ zxnJGYVI1r;k4Y!htv!~rcefw!Z0b-q>^o3fcc8U-+g5?fJUuwr-`m5fhTg(K zr-^az9~~eFRG+lz!BUQOck4TOyw%uLcT9b(L)+YVq;_Am#td1oSr4xGG+7$JufQ`| zERfE2_YbzWn=p^=R^u5^q;~1duyG6!UER@R?dt9>)-!f|pr?D#+TsOVH!`f(Y5Rvs z-GM!|->5@i6_+Pd|GrtxE3J_=Hfc3>bZYfo?ake!OlXd^fSCGS_1;z*J~l(v&hSuw zZ9P?;0G_lLDaA5?dhi+cRv`wl^I|&7-=e<)qPd2FyL} z9_l}B7zQIhiYh(+qyZLVbwi!3?g!0?5fAA-!=1=?cXsHyy1NFAP+qi(=OOl=m6%F|1(PN!m+EH!ypmDsvySHDb(f8V{dY!7Z zrnVYUjhfm+RbA2?8VR;Auk1uc5b&N6Zjj6j)B51r;v#tB4C=X4C&I_n0R23f<`*hX5~`zFR57UNlF zK|iE3wH()UHLGh`kVg(2DtQX!KrslGGmuAunT0-9atsgaRYSbMvGvq8wzTwso5dY* zSYU*yyuSbMyr_?fZ=yefV;H}Yjx_L=A-Ss8U&5? z!_K+rg5TE5bPo?;Xqv8LEyrrAxv#3L-BJ1EkV$76l0Z$8Qw2Vr#2A}Rt24B#RVOuF z?L9*lhlLbEhgDBX5d9o6vv(aix@*VIZPiC>YqsshRhtCB-7shd`psbh=zkia8}4mE zFk921GmegVN3Dasy|(^-awN!WunqT^8&oyB&dynu$lscK(HqujT6?tp29g9w?)d+CdK0jwu62DpI}CzALP7>$XJE(7#E_6M zgh7H(qLFIhq8`-3!$VOIB6X%L5 z&#ATR-bF~vCWIBPUcL%Bix8N)ZdK*_jYt)~dc)QoyP#-@ge+ZzH8Cf}Zns%&hF!Jz zwQ|LBh%g2ZAtCHd6yiz#US3uDAFJLdS-lFgcl*}r>J7kS1CYBO^wAqDm%}hgO|a!z z)!N$kw;-6c9Jhb8V)eSUIFKXJoxdQg0Nq};wxWE+81&IC+o^@$?`Ra9VR3eA~7T24IWkdWY3AB70 zvQV{PUaE0Ud_sa!`946>=%zJQXvNc2F}UIV*? zs=4t_%_{wXS-E^2Y9P)}=dKYS)ke*fh4qOB5j5{^U0zvIx}p+6l;u-Fo-kzAuH5(*qU9-@XeAUx}>jT_gj->~+b%2mjRSTZkOt1+2$I<)xRjmwu}2EZ^~jqZA@dNo2K z{}T!di+I6ohhsr049L~xZ>_6&Ywh}X->zP`{OzjB0*gtjH37JR04}t)s%lv|iDUR5 zgk&zSsN7gtj%RK*m=cl_5(#wu zAp+mlRJ^(I?X~Es2BKDoz4zwI^&87pFG4o9oZ_`Lbv5gEW6i{$vYHizt8w_b2sPMj zx`b^coD?HL^xhUoP~~duYDg4fHCD*VnnI*lfUN{j_`BN?YqVwS+M3n#%GZ^wUX+uE zd?)6dciHd$3`&34qgCZ=!RL>n%h}7R$_phM*Dc$${11y3gtNst5FzU?75UExLC-EWNcTO@;x>!{)m8 zH<#qDtAnXF$62y)H;F3QPUa(6<;#oHld|Gf8l4%TtQ%M18Q!UeWe(Ma?OherTg%3k zI}tOpbz>c5J}-CPqLR1Y*-9q=MubkSTTzy8)&fkEpo_;Ux)v4#f~28XVUcWndmYBH z^3Aume$ce{{q39Iz~X}~=E4QoeeJGC<4FMWit@t5nI!XzQt>p93XcdTI1(T!#Hi9} zFefDFf&u}87J{`Fm|~#HLI@!&uol6r??J$rfR|A%2@eXQLEFjViji#|nE41K2Mz>! z2iM;ZSH}aL16YtTDgv;46y?$~RESK$!Gr}g0=Qp-%zGk>iAyjN2-X9mI1HJ)0lEaz z9?6MW&pFd5aKSze;SxkUn{_WfP7D15q>@>T6df#%fE5!+1(LP_RWc2iK1cWf;2C$P z#jAh~O2mUiaFAFS;M8)dlo827GtC%4kZY(7a<0MSu-TYMRURkMDPjC3W}LV z5N*#w0Sp2$@6$jaPx<)bH@O7#mxz1d1`w<>@__RJ_W{O_#|i@)9nE1qivNi8)q+p}c*SvAgeeH7ad0n+{g}lD zkUoS@$aI5%p$%Z&4Pu1`M+5~3fH+1Y03ib5CJV?)^kT$gb_A$Gap!+OSpe%c8?>ve zKzUFQGD#5djbIu#NFbu8aR~M9!w4?eT=@W{gU$Cva2TrpIw%716D<70j1sH9L^*i`z zBe;bB6r;_$!k!ioN}dfFEr3Meu_(P^11L=5QwnQvTF7#`&z5=jGA%;g56Kd-PO z_(;YLupbaUi0a@XzyTvoa{;ku;T~c@vq%|&21kSOXdKq3Puaihu}^P<%Wwx zxzXtBFxImOf<8ymFNh;Jfu{k{Px|&3YFZdz^?=QaBS1}y@tR^N{(TC!3UI!da1uWO zXpxLqAnWIlP{1hh7m&iJ2yo3pa6$qp4#<1i5CRdRAaMO7f>jI-#Pd?DUxGl*%MTBV zK-aLN0&vTp1wp_WMw7XP`XN3bL+0Sh+nk_K#FSw20iOim4;O<3j^RKS`Vb8b;Q>mC zys=>+(ZHACdG7`CS!!U-!XegpUWB56_ZMli!x3@fW-#`gw2ftVmb4UbF()b_m<&CFs_^e~qyi#i$esoiIN-#trLFESF4uPQv z!62$5kaYBvhC!1Q=Kt}XSKu`ce#n8+!Ao+-JOhdLO;KTu`CBhDh zbg=7&VBHH0dJ+oh9HB12o^zw4xtw79`Y*th5%NK#1+vUWc+FHm-E;CV(8D1B(*v%JWi$*CK?s;5 zk!evFHY^&fhX#OB(FNhtaO?E3P;orX}4G$$mXDMD4&CfLPXmk5Qh@~77hF<9TyM~8Wf1a-y-Zl z76+XICVa9APKCf>O^XN=@DP_21lD?r^#i76Fb6Rq5oDSG;Y=10SXu-Y8;0NSu(>RL zxB$UA2q8ecMQ9LWz#ztC)kax9f>{s+63*pEL!^=u;KrU%hAnW@Gu~E#8 zhmyx179<|ePqgGU1qrM}9}`6(hb#nz!2H8dhlWDI2a#3!K2#VmwlWo>FywI&Sg@zm zHxeVreg?TeEDV^l5HS>Dv(e-yECGiVL)N{21#v^PDqVs~Vc>*>QXwJ1ppZw;$$nJG z5KtJ7afL!)L!AGwB+0OVI|i}7$Hi*k$m5Nwm_RJkP~ZryL6~FQUAcf0E0x5+ zkm68%c$)iU4u~U2SOuavu-5Uypo{U4&r}FZfUXx z(1?T@kye`QtR3>7JXcXvRJf$b%q%EgtjtJKB9hLMY_c>Db{`u)m%VriAV~>DuP#}p z(Wn@q1PO608@4tcIC<{Of~;35?saT}JYn zY-HrtBEW}^l_aNG9D8=3%T6lEguBOLHR}tfENyW+M)s_UMMyIf3B$;dmi%y7ez;FaHKp{)dsVvDx4W*%&ej{Vl zYE=SW*!1vlWaiT=yUwX}wj^5`qcoc`O-7ZL;c=%=j}X#I!_kRJz0Q_VUMAO>lkM3? zgC>EGpE!Ib>&V39q`stf*M>D3#+;NzW&J~MV))a;!loA#E*zdXeHL!q`rUbBc_LjGJE|2{ySq6A2hda0sX#6rqDTd#U>-Br)>XFD-n#AOq zl8h2w==7;7UydQ0=$!V>vof-<;Wirw$MMTula7{)qL989!K<32B$E+Y0@sX= zPXtWdQD-1_Nf@t}#t5WwG9`%n^*LKwM@Mn1yB3v*mdF%XxumhQM1??&?25{vG5qxW zxY+{nqLeSS^N{_6eQ zE-5H1FR3UiQL7lG3=@Zr;i{3E`1J9UCre6m93_C)FF|%_DKfLigijBNbnN&Lsb$YB zD{?rOlo#5ZR)sWHCYACqy3^ltjhtqm{$>fVj7tDuNkvL?#Ah)=2zSY#|Jdo{r%o0v zbY|sR4VkG}gDBw{F(bqB*o-8}$X0v0pr9~Sr)Sg&G9_{YR00~Dv^FpnY?cOkrDFKq`_=f zDxo$Rvn7L8al@x4ulu0q$O%&Aq|s>BCg@d+Or5NWl_2GJ_vpO)!Un~$70cmBe;^XDd$lYlMRlrPsyNj9g)0-?~7(Q_09e*t@XhHYi-nwmJAoG{jE*!haxC(9BV^^E5cuOMp*%0;bK}SOG79 z_l=mxi(;w<#?Fq8ot>=Rh!}uvwUu_{!bVZBoy+*QjtWzF5f>sHimoym5##qfbLmSkt&Q+ z(`pQLP3_Jh|FKixkRMy%SPUdnUB$L6i@~Nfnl(vj4GV`yMo6F9osPoFZMB=Lb7_l3 zZ_w*iQd!(ek9X|&7^vH@H?fcs%v86R7O@-Ztjv=oP8Tp zZH!h5D*<~Pxl~qFdt~G|KU$!WgNwqNql;JbY2<$8M2ezRn;MZhU80rC6gFC7*Um~& z3Z)T|9HjVWG7Gl5y7~aiNVI1;=GbN{(~?vYq&>v4$cYRKS10UswGYfT&Q8zEGZ&<* ztP;>TkdhG*wDyfH9bJP6(6nXE%8?muiAI%D&X1Jy;CSN}Oes@w05knRCoi zfmmTg26VB>p8lt8{$cZc#-LR&CPT3mp<8h=Bqf~Kkf61#d(&@?pJ&#|;o()T=45M`rmKYCO)r6SWB&)7`H6s?vC zhw}dmoJu^N*l6%be#L~Dvy8 zIz1vP7R~ZYwJ^&lIYsxYXv7LiBe6RQ4Mlo*g{0muWsHdAqa_-(S*?=B(GlSx$V(}d zD4V+m6^zleV15jvF<7kVRTaDz)5AD);=ZoILB+gEgb~SUO*}$F|DjORurxzM?6Y&- zU3~+K{$t_#H)kU`ZFEdxqK@W-hhVe8ng56Sj^4iQaAu$R!|Z4wdPkL}KtO&-aBw&? zzj}RRSI@TXZ>@jR7>lr0NsKZv5@aXA(`3%#O^y4!T{}S0Ri@yJC5jl0MuL6eli+Ez z^KHWHe%I5r15R#6Eab;%WNM{`HytDa^afXe>yD@Et#@meBZDQMQN+whRLR0&IOn#I zV)(6Fp;(uuz+@B0(<$nBl?dDbQ&qn7Aad%CN@SD>B4T5sXz+17g$#h4xJa>BX~I20E;6s)(-qkDvy$e=hKD0Z8!uXsXi8L3s%IM2AuoQqt7e2T zd@fDW#|h;KhecW=bunOu0bO@wCO$u!Hv{3Yk>c2BNt`lHk+i(FqXYN4t3~!`Bwkd4 zM?)YKW8IWl3l_F`@YC~dq+h3ml;mX`kux~mL{xOw6;{6kOzjj6}Gmn3l=4s;W)lX zqBVbN?w|TiWlNitIEOJp)zY*^j3t%Uni@Ub{XM?H+}X42^Kxg-&QVZ`4q6GvVKl8u z^LV?uyL$Wbk(7PGyn^}jWKtSD7vgB4AY6tVeSO_N-@N=J8?t53n}ZCA*c^)ma4|;M zs@i&cef`cHTl$;@vyJIGWR65R4xxak*xKI5?)zpAj_v2*tY)T=WQP^e*!6|ZJLEdt z*WK&O$xTm8(J9R{;nb#hXZUpV^zevx5tHZZ_4V29vu832TBbrGVLoh_i0R?ny!Q6K z-oD=M%oMwfmdlk&xxxUC31oYE_{zriu0E>opS{)@Dq13y$P#3-nF^JJgWqIpnp--2 zeSHHmrHrN}lw=F5RS}0N83(6uc(i3*eRE5HU;k0L97%a4#30au>jS?@3`>{oYbQSq zDk0SpC{9|VH3_BRp&^E)Z|&XJLuwsVsWfpag_Mq#8L*X%#8&04y?Zgh1A~Kpg*Fk1 zpye_2%xJzKispsIE+xP96Nb!qoz0SJ(?uDhN#}@>2(|iyw|c=r`;Vi3oo?nr=YMGU z@z`BJnMNySzPqo-KRn_e_7583?e=-)nK24*Rzz^1iJxgrdz(@20a!;(#{Z}+E?cNo za5(`SD)K2US+t@LCg|^jws|q7(ZoLRl+MF3>=Uq4r3fN9Y|hu% z_H(%OqJy4+4$r_~Wht<3D=QaTB5|__q_~dc3FEfa_w-Z!502*LflafjvV5VA8;RRZ z!Vj^ktR0l<{YP{2%GbWRwz{A=5o;xQcK9O2(o7dP-oeqk&^EgQhgii0GkLKxp$x-Z zR=K*xb+{M2tBqN|JKX$+G=^h+RG1+Ei<}WQwXBeYeDOHHWrz8KUdQp8>SFb5CF(qYAWfo@iOe4-S zkfnY4bP!N1s@&HuVm*yXp1*i0ON1?PPT|!5i8;!l=ScWsFr$N~{i!0#Cd?K4= ze#J5ME4F6nU^-&i{Y^{E@ty`X!-)TxLg=BG#jn z!m_d{FEXF?%u%?s6#MTNaOvW>Dj~mksS5isK0M&uebM4F7T(T(t+1%Dcqw^{tYb?Nc0+n| z+T7ye#joSb=Tw{%q>BR9<5@YcEG;TtOsbM0aoOTx3=9}>oKKemhe_J;EHK$w2#Um) z#pIfBdv^X}kQbBpoCJIJ>q}oRCpSrPl6O*ob^k_{L=jSrDZrQ;=+>)KhASS!lKuy*B_O`9n2-i z4q>cE!7QiUo`ZHH&0<6t4peaTlJna9`5?U_Us3R#z|;REC?q@Qm0}PZ;mi|`ARNxY z%keOZ<#0O51Hn`C0=K}?V7y^|5k5mQ6ABB9aT!{SQ@WrO=cAwQfA!~!=g&``WuLuq zdI6(TgHVIfs})+cl9AAi6fyF0jZvWx!leEkK9LwKS5m2xo<=|a@rTd;O#PXf{PyhR z*|VpYSzx9m8Po}StzOHhWDImQ6RXzgRf;L2TliQUBb3lmDIG#T{pr^I&pw`HPqNS6 z9CR9!E!wm+6E>=_q2w^MP*kS0U@r3lr)+$IFea7`rJw$I|Mv9@lYx`h&Yareuw+=0 z)2s=4eY}=YN~I_zk5w8_mM_HCfFyf|{U-u9O)&jL^27ZfZv4+=(Bv1#w{FOGsFcY% z?1~L~Z0KlMb}|v8*Ql*RYyiMU#lyiQNxe%4(Ug?>;o1GKE?j_R{*QB$XV2{1;8;u= zs*jI1>ap4|2CNRzO1)a2Es7QLutRP+XeQo|^ul=Ln<2g#PyN*FvaN_hh8%OVA_QW18|FQxeBaqJJ@|8VK!b9n5} z&;8e2X|Ba=(CO5Ay#_rgQgfojL6rtg$KuE_jr0ieO-QxQ{+`0KF_FU)A zPM$k|q&$s0cf47zgi|6$EM>^jElJg86!XBjBou=53VP-OkB*gM8_l3!WAESp?)t^E zr_UTeeSG5Nk!8m0cwM|T*Pt~@X$D3JIXg_&F^(ky37h~TV%zZgx$uEW)iS9h7UFX6 z&aH3GojHZl$0tVi6dSXX?Ab|q&a6C{OaYQ0u|y?JFef<|N~O6HZ4A;L<4lPsq$P1Q zEDOlr-P`}X{Q2qACy!IdznmCss{o`O@b~s9S!5*&aLZL|NFw(<0wBdwmu&z5R0<2v$FDYWl~+NR3_19 zSOI)~wIIL1nQT`g@2^Nni={BNVrYptR!!f#b@i)@r%#=PL*e-7g8bwh=s9~3 z;6upD$+Hml6J@MYt2P$q6=cxa*_kCyjGWAja+s_!vEaE7i@y8r!twEcm%lIq_h)Kq zaY3##H_5J2m}q2Lm+O`G3>`!BXk~K6tArd)uM@_KX$HPUF>+AfyLV#}4^JIupZuve zBO@uv=6tnqZdy`?L2nYWh4cZ$%Q7rhOO7KuIXNjwFO!1$=Sz{ql4{9_)T@NF(Ok4FZ-FDN0P|WbhMd!4 zMlQd1@6PQDBjclE)Yy;ypAB-PtqizO+?nU|YmVwl({QvQ-q%+1t_^?FfKnl4{! z%5gZe&2jKi(KMrCGBX_a@7??2!o;zmVfOHY!K&<}B(ozYGfORvhO7ldeIk$wL?#}# zph8-x6bl_0Qm0udMfP-=#ggSHbbNpB>eataz+5{vd~9${s?BNwLgjIifsPUKL{R}z zUkjpQgj^Mp0Av41MEd-res^V8!axcj4HeH#ig(u_%{;1fNL z`lBRJcFPX{FL^&XQsZ!C&NbWUnaH+_`h>+J*C|f#d@?v!x&_J2S(U z1Q@bd6h$i;r2NK)If^e7iSQoENEahCFot-EPH!wNa8{=#-??}D+SljLjSLSD4IgdG z&8D(H%d*+53?miNI)!s&>EgdOlLFZY#HK*3J@xvZ@YKz7IkajtB?H0 z&b(P)UHi6mHLFVG@CWatYsiIj8tos8|?bjG`UHyfKzh7f*y$yC>cj#veRM9%6N65 zS#{^m{d+gBO!|Cnu7Y@@TB}uC%;qGWE+I*(HzHil>CAOHwAmJ!mX_!-AOfLA<|xd~ zDo9H!T39^S@E!Ht@3*ghG}7zyE!JwV)%;AYRO!unJ(Db#>*Jlyx#VT0Q!TOBKj^WU zixucq8O2#e1&-py#Y>6`QNyjfm1%62xz0f6&1|AM)#4bH zP^=WlQuWDM1(}5zi%W`^lr2H=2e)rspY-=_vS>A=C|gNMAL3kup>rM1d?)3+p6kqv z&lC!kkbQVzX=OgGcNmOL=c}(eE9_aQ;kVnjZe1A}$h2rtK0q1BJdKr_@^YO4PRemT z*`OB+CD5J%0i!i!t7T>;$!0Hf6fc|Wxc%L2>h|Mne;)B~U#M3GDqmpTrkIBy+7jm2 zFk^A|8*`Ir6LAa*MNu&ft=A{(O-568Qno!8lnA%kw;$d5^1?A+Q-Kk8e#s~)mv1etcnv;@WEh=Ae8!f;3>G6r7_V+ECseWUW zN*QMG&rt#iFWZsp$kFDS#gKhU_z!rfGN);1}`;)WC2beXCE!iH=&m_)mO4!7Yk_tuA7$|YZq_rfeve3b=7Tmh^&#ylH z^ZC&MZ-+A{N3B#!WpW`VFcvOeq~4&*OjDb6LMaRhtjJiPg=A9c)h1e=m7V8s+HYRJ zaryIe|2;A?wAq=L13LtZEhH5;q&ifV4iFm!ysx(V^VtjrQB^DC9gcAM_ z(d3L)Z`5bm9Jg-W_~whxFMfDz=);kr4>FP&X)GuVfqwxFsvr_pqF$P8gdq^XBTf>$ z;UN!qEVk-8MsG4_-MDr0#;1R|Fp9&H8^cY`R24(hv4lmDOKRZhrP>@_a;C~mlLrvv z=3f)L4t6BgI;m1;HJff-zkcoVXQ#(TMvo1CkZIC0k{FSYIF;GlUwP4Xl{F`CE}Zm6 zRPf7`DC0*lu|s2FSbdzV*ImDP>*n=u|2#1^?DsZ-`b&wG2IQqv_ZP-m;*yhXIdhX! zwZx?3;S7>kSK?SyK+zXvv_xz9?#}HS*FX9A!?EF^Lu=BEYB^jK;#k}UC*?6Q*sogj zSvhJo_VW>N>YxHrJ}~wg=C)j-y>sX0t*V1SmACwox#0JGal}NQJ&0Xs557)1Lc6N05*g*GsheoS1gT{N3;F-u~jVv7-aN{_ZwyygJE>PQ(ZY z&<}*Muq}mBNv2dNp8^k&&W8xb!Yrm@uf|CADy_r_5%}lV7bcDz8R$LI(EtlD*`$}n zDW!BQ75fwV3AU@ym@#G00ys!<|ICXLg1Ighs0NW#DVHh@w{HIP+Sh-X==b#<>1l3(_Gk&MMNdAxeqmy00KTT% zz9Ws58A)b+0(i?{`-!1}i1j2ADj`Rd@HYZ^n(B-g8jYX?UlacyefR#|&rhEk{qWd8 z-_fC#$~0qw9=v@x^knd;BD`Q>T_8IP(6ON%n3hls5=<+M35-Pf{rk7RICp$vbbRzf z|A23UEg@d7*I^TeMNLE|KP7xQWtR(ni4xFLI}9EdtG!4VAY_ZbGZo&sb^Egu6BFa( z6XU~vUsDEJkDXXN6!S}=h%I6Z(NrNNcoG#Y#O&g-xi4TP1PcF&#>-cD@7%lj5sdo@ zn3rQ?gX>apnuGmcf+miE?L>)!Q1UVC33Op3ih_tx_|sIw>2@7??E+~o0zaccaB zv5~Qn^=VqAR0)_b1EOql>p&EKhQdN{f8XO{NN`|?lSap;u`~DY-v43}Tat11_|Id0 zw?1CYmHr46mnO_p|p-=%8@g?}Hg&7)&#%!)VGC6q$ro_E}UimwD z^1;EzRLGuHZ-|GNob)Sjeq_`@A3CK{UUD!Czlx%@*^ZKy%|}k+kn_wvl)rQR?lA9EL92_$G!}uf@V6+;I5Flj>G=Te4?xjyc_LGO)r9}}G2H(2*)xys-~1c& z*YMx~d*F+{ESizYlyNi|{^Dd3EWdz6fs0nIl1L(1U^D4f{J_$wJw6V3PXfX?_a+8(T9WV zLH59Rhd`*RjY~*S!(@vCDgXuXik4{MlchN9h(~ZP!rdtl2t$QW@7}y}X=E^P@LGRw zl}&5X8WO-53GP>HvB*@65lECM&56Vf*_?pL=lqyxVX*Lt=+4bMU!5Kd8ob)QqQr`A zt${%?C63<3Lbz|E`LseV)A0oGWCn0va^XFFfz3GNR!rS_cJpr|Bk)1~!#_CCzq-Vh zM;Z$5PnAM~Z3PS@ag;n@MlOi!! zC!K*qSfxacMpNRuI3F=+XD$@+IFXU~%KP3!|~sfFb~(qZDU$5s`ef{1M#OkwO7Rj}l(NeBs}`bM>1^c$WPGgZ|-t z3lhkK&(J8ayM(nNrul6CFXEYTCI?3p$>H%p0E_djEv$nPIEXT$SMd_uy!q{=v4Ot+ z?!N9W-#(|xI)j;^OHszDAR>GrP~8H)fuU`4aIhi}q9r^6tcLso&xS9=;u}{lf9mh= zMd9wQ_H_=GHQr*4PfbrujgFQ~@zqPkDouQPu2`HRiW6{nkwCI>cv$SP?(!jm*RFj2 z*~fi-zA0|MmtBW;6qt>P=_x6h_M}V^ZJ_0hK&n!hQxk1@skRh_Nroyo(fB8lPh$rF ztuMZD<*P47M*4id?r!hl&1)=4sadAB+vXu5KhoJ>R`b7oT8t;;1AsDOD>~Nu?42W~^#KQ@|7@P4Jwnw^#qZ&E7MkXG7p$ro#9 zYE2OeX{1o4$#JFvE@j8GCI?;U4tODM+_-vWq#bEPDbJ6tmg+2x(P&FCCTca3XaQMR z&PPfVS^+FOuGNkxXzKwA%Qj^wg9jH4XBA zQvOmTKinM0S19;celp|KNw##WCRP{;vkexP*<`zU|;i>&eS8tgq2 zWn$Q-r2Hq5;z+)lqk`ZGBPIMun@OCmk>EQ~v{svFn{B&wwxBRNr|28l$YNrVaz;$SS@W-Xj8zk2oZmm|Zd zf^t)?Ys>9mpEVidHBxjE7p~bzxE>>s!2;F=-lMjwjDV-4l{3VQLX~e%|HDkf)f-p7 z{AAeQ4uT_h^Ntko?S7VMH0t1>i4XjLp13JvPXN^7jq2nwWE{<77zrG?;z)MnB|2Se$&ALi zkI|x;6DzxkZus)=e()o@n#<-}z_g4fn5h;kpiRLEi+d~JdlbT$W^j^;hq%a%ggjVH zsw8W=)u2_$QNy=ieRdIX(Ob*Q7AjPLLFwW(AfToBG+4A_lorLzgc!9#0!w{Bi$38- zN@&|`L%PkFXquI)kzT!e^Ts!SA8csYvDFSzW}vXN8cjUIAVY#eg&?@}^ptd4oK+hg zClo7qP|G}dv~6}uqCFuYC)bgt{FeIm_bXo_%&F(W-a zjl49%nOcEFEL22B(t=2Z)Z|FavD-i|H792_YPfafvabcn-EDDFoKKR!FKj(r59KdQNwRnE?@q8`$4ld4&?(R zf%H@4c}Pu34@jqMj|@sYxEKf3ROG+tIHgq;pZYrNHx0;Yp2>?@Bh|7GNG zLycX9TfhAG0d6f(+1yClm;$FxdRm$hr`cEvf#ifkOaObtl4zZ&i8sv3Sx|TdjsIe@ zyQ^jA8m)Y)>xds8D+V`G6k)Zc*plK>G<-&YX@%p2m}r9i5u_^;<5i}_lpOoQE8krH z^5f$^&!P9XmnFf?Eu{sxJDD>VxI8q$V41-&;~XC~Vsi38j0`V68MWWGm`SMqvUi^5h?Qlz5d&^rU1BprjFc>xro;m`ig960N2rvnN0eKr{ENm-) zmGGbptx#(czqYn2(dnuTj^2xb($G14w&*@PlPGd7KnyQZ%+LKcS1T^745idWH!RL7~&B z>5s+X|1KSXdkX}r88kEF+PBxPT>Qw>e6Zob2Rp!l4Yutmt2#jV09GvKo>*)a^J2o# zosUW1{cO7VG0)!K0p6u|ox zfPP497@7d+9mV;KC&Chq7mUN0n>R0C^mli4cstr$2OCO^su>EPIHwk}srimp^00#b z3pnkmjRiUaJ`gAfOhStPoqG1w%U3??0cp3l3lQdp8WWn1J=hE=~10tVr zqaq>8;q357q$y-KhSJw!3g5qaIvz$$8%`uOrTY;_fz4-2M!8~AIKwxi6E20 zfssFvZsW(qS9agH@vVOlTx*o~2MRLE-l}1nfk* zU1Tfw^xwR8^Wq@3AzrrkXOC;UVup;?D3Pp#%v*BkOZ~efxgizy3^OPa)%_xj(#`Yq z_ussEG5sLQvVf0RBr}WI*I6kW*kmFxkSw`8<%WWt$O*^I!*MKV+WP)(S08Rp z^?!HcDip;h7Y5rsJF1s45}8UF$IQTN1q)8Wl!L1izB0`QUg^x4Ih>T2K*o>r8Vz8*65)ywf} zs`_OGDxpeWI`Gw#Pyh1ip;Z;AEgvj zMX$Xg31=m+9-JK?>RVS`T7<6(=i><;oFDINS+lfwG2kUd`S{||*;8%*xwNpb2sEcJ zih{}APd%wFdhOreymaCc>io0eGSom7u@}Egp8DeHxf7cg7Z$OLUgW$o^~IC3C#s#V z<9Ph-wBqD{?aIId)be>o%a zJ;R!AR--&=MR#j;VMe<tDCS2Aq&Y&pJx(2qA%6cy&bmOnQq!-{WyK0AJ* zc2QyBYp)f)=Ey+@8(BXa&YmAF$22H}fX<&k3tv49Dms7uR7F`);cL`u&*meUAin&4 z{_7XdU2G`B{CSQ2+VlB2DwctK`TE6+=LffzEdt8x>1+8pDWNPqg3VIO%3g<%obT@3 zNot-oOTf~y?#o#zivizy{XBj-JG65#ZfK@i8rI`DLwwFs6ro=K_54}%W@~+!bG|wh zWgZsh6up8XOG{tB!o(|S9BVLIV^S85WixZLi#FEocQv;hXavPz?fUia5fayqtvh$^ z+_z^({f74%>)zYEZEy47gxlYEXsCG)O%Bq8i0Y6@bk3a2%&fUp8*0Ga>T214X#dXI zx*BkH)^6Pa;#W`rgM@R_-fdg9z29>D)S%CU?A8aRM!2-d8Q5)FuEW86W}c&JO>I*% z=%!m-je8FqYTi?~gT3Qs)9!7c$J|s?wt4+~@3l0wj1PNSJT1PidYO_OV%^08FT`na zS!R}FZdu9Z15Nv}*FDsPZTE8!@$aN|-rQ7E=XTZC)@<9jX~X`O?e38Ye^aBkv*Q5G z2%-X`J{GFWOXuR8ZedyNmd1kzT9A#w)!}V%b+pv)1#9QVI#>Pf=1uGCcJFGb-`;S1 z^uqyfug}#dfmsR|!hZ>bvDqt}uP$*q*MmqM$VpdYhuh3k`c|+qcTIcq9Jss?hi(XgrK&OAOxxc%qXU|SgpS!-(KQxAyx1&!3$GJcN#2WBs z$hEu+fnK#cUF*DKW21gIERA1bCZQ8u1ILDk`vHu-)aP^ecMkgfBjY$nJvun3(l8Q{ z5MjyyNUbO;tE*kNx7O9|8paXhvmuYygF2p&e)Rf*pZE(941Gua-JVYWa9Uh@f@sJwM`HvkLJUZ0ZJJjbN z8%5!v5&!roT=1v_o^5-UJ>OYzsJf3U-Hc|U0y&U9U^~pPrOmY$uBlpg5LDcC&2YN4>~94Z@%;n) z545;_NBV}2q2--}gXqU00_u4=K1z-LHrUpq6w5O*agqtG8u9bU*jRs0+Y%a(IQ!fzI|vl9X;Q3u_*B0vCmIEy=@D;cEdiw@F^=-YlqH$mpqC7l0<~nq2i9)e3)9wKB#%9mh z-ab%M*R*3tW9^P6s5Ja_9X<@L(uAX!WBo@*{T{Ec>0tAIA4XvqQ?=ocXPrfnlV&f> z%CbAM3O05e*|^iat*!<9(g)gFLD+r3jbTK_nwHV=5lC?7(IcDMn;W}FMuz)ZJCO^* zRb^2)ESXyzS(PiQ>q>U^);HAeXoMnZZ1%P_w>BSggCzKHi>uo|HVzp$>i3np+}-F0 zPrn=bqOLhZtzV|e*zsQVnq_4byQ&T%9m$SeEiE0MI;ere%}wss!){lT$LAj&n;7ft z0vM&Z%j@xM_Oek84>={Q=+JH6QdtzM9**7N+X#mKidqgdD^_ac7@(%vzO@Wc9(400S5otx`TVcT-@5> z_O`XSTHOKek6nkoNBtwfe-9k=`+dEg8^C*|Vk)z%=X@@{PL z4m7&jJYH{WtIHkezUXRe?i?Bz9O>^J^!K#6sy1xe>2?nc4)qQCvc+1*iu|(D-8;*- z?gYto9kL(PyK47$csikluncTredBVsZg)2{bPsfX*w;5Qu*X$fwQg^_&pUJkhhaxj zrCE9Ug33*Gb>QlTBHP)x9|OOu-Rte{>h5l9>%b80+T(Js>)gM8w8`sl-qEsg&Gy3{ zUr+y$zD{4iUYDD%uh|CMf5)!cEqjm&qIti&y#@J|dV0EguvzmqfPKEDVeh^V>RX#y z2Zj#y?Azw`x;uM(zWyV1uJcwBVX9cSY{v4NGd)7iDCac41%rrR#vF zqphc>)935)^>lkWT-_~oo-LIdHdZ2O!f<~-a8Ni_=;?H|P%TH%O0TP`xMW3T@fxkk znpNBE>coR}w)NnWo-SWktLIQtCvpU>U%zET)#gn*`=A;J{W#X?>1u9isqg9WHg~Km zDP2=oWK(G^mfd9O+uq~q?rH7rMs}%I%$}~!ZFN@3;r?0c4 zr2`9FTYVea-@UV8n=`j~ebv@o%PLFfy1Xtg2CmE7(*>vh*&Q87^5sPZd%HW4_krY) zXmfe{np+OHHM&}ATU_<~c5Pd;VL?t&N%flg+A8O=J%<}zZkM+gmAJi!n^4Km-cEN< zr`OwZpb2RZwypsy{YxLwsjR=(BjbsyaaZGZq+vcD~+aL~yz3xWOz8&?=+xBcnM>fJrLIbeEw7VJ_Yf1UMyyC^#HHAxxoyE1=c0l*H zG_*p9TU((bI$Q@^4>r2n>-O&1)3~LUWJ-aV)Qqe>wVsCB-L;?=L~^4dGXe`7*h5yV z*?Abb1R8OT$I}Kw%H!Dv!SuTJx?J_{JxKD>1Va<%QFCLh8w~hOdp2wU9T{k!x2I*~ zmx4&HWFrXJkt)N5+1u6uTgv0w{ei2~<#D+hIvRF1AH<^C(&6sxZgq9K5AAN;vULl} z<7G|*rFP|-Wu-`p)6#gr)!GLAg$aaqG&Oaif|dhq2V5@nXIpDqS94d#q0TO(PN~|w z!I;2K=rx&>inoJ2uSs}h+^yR^gDpRwssj0o8 zcFmggo8pax$BZ(cEi5it;4A`_F3A|u0sTpC2$4dQQNFX)+ksK_bar5RLw>t=?uOB` z0U6V9s-sUxFq;-T+0M)P%c_X|-t5M+wz>|xJ3EQnsI#-9&E1YU($(DtuhtE%3#dCU8a=sb)w`VZ3z2HArSWL!f#y5P_0^z=|Y zRQE3~Pshf_z3VscG5|qj#tGG6&W0sR)-S+rViR&OH0)}2Ln+{%XoJ^_C8gWb4f`6^ zK!G9xuLr%l&E-P64^)8QXRCEdO+`&@$tKV}Zr)tG%Y|jE6DOhHLzklvCU!?do7>%n zPVkZ@+{1M3#C&WKDSD@Yo#1*u1N?W{+d1)Su549$imrM|wQ z2G#%+7}1eE_|4PlYjf}2S-=0(@e`*`ovXkBW zTv+bdzH8kbeXVVMoqa<--@wtqp=J+^dT(o6TWkIPhW*WF5Ltiz3}Ww31E=HdL|O${ zQb-Nq^6qG;JLvJj^l;Vp@2flFJ92ceZ?JoC$kpa+>uANUtI^eTaQ{J20T51u(+D0p z;rDv#krtwkWMcE|-RIfi@*VLu?{4hdU3Jes>7`BINEKpO`mf`%tNy_!*=3S?Ro5$C-2B8E)WVu`sm*Y33k$BfBo&l9Iv&woyP9!JM@LXl)& zUCmLeWx!>34Ov_i*U!+}?;-d6S>3L8IgFb2?l!e*z<$g%e=cG%`}`j3b{wNe(|+|l ztG;$0j_j)HG@a%_s~v_54v)_c^Dd(a!kle-hq2eDZq@hd?8amLOJ`0``9eWQn2E!t zDB69LfLKvncA&Vp6;kOoJipoF^7R0#1db(Lh4_m()b|!t2b997BGQy`N+QSJU$N!(J^%r zW-FMz{3~p6CjHZq$owKsRA;8Acc!QANP0dKp=i5yE2MRLO^Zq67x0%H4N9nF(@OD=iWORCT1a1SeGs?%+F)KbY^~T`}P!2F`_-$dHDsU1r^Y$ z(5YQMe*}(5PK(_Mx#Iy`#)Uvz%E`Z*MfuN8p2R3}W&tyac}y~axbDdo6y)cL1!5@g z+grN_d-`4dcDMvOjnJaD5lYctxdY?40zM~aXQyT{JE1K64kIhFi3_BF^eHY7BH-%q;(X-O%V zM(vXbD1s06SCqe^=or*=8yg1D5!m2^29amTHrpq|GeNwYhp14KK1a|qi%fity_U&< z`@nWEa{2p2`LO5yYn4=w)&>s;bBor}kLPz#9M}%P$mXy?YaXkeX|K^8!Z*xQXHc0j z5;=xW9!N{866Q+);t2Bdj*U#U>n&P1v1u*n(D2(aJd94of)(4z$(b_|uPcVS;Cyo8g;yh}wf98aG z#AY6!pNFlJA8rqh=BzYHmatPIYEm55*Yt#p{YI@B{fOD-bK9J@A$TUbhV71V%mYvd zuvb*;aE+rJypt~U7kXPBYnMDdPup==DX(kLH4nmYM60vgJzhOJf?=D*o8}oU+M}zKxL7UkWC{Hiv@HsX6n>uS0ZcQ6Rw9UtiLl%##-!%-+$6?4A zyPUQl(w{j4>)C)qZiiu&N%`s|>X*$uR`m-g%M=Jo53Bd949!P7;jv*fqT-2dko zc8Ajy<+|?}_RU1*r>3W;1~DTK`Bm!9c8B-bUxVVb)cpkqYTERAnNHKL?bY>KEqbfj z;r0@aQVv(N>wSmY=AWIKo}Ua&M*?m~vr66La!pOohNpw#B(_9RT36fKQ{UAC8EZXZ zvf$7Rz{3f>5JmxP2RK~LW3K-G@hLwh_488(ho-s3G!pd9o|vARI`IppXz#9yCbeD< zHEwidJ>~(tc-@E()<5IpZnp=oNM~@kTKoe8XDq&mO>1vc9vk)s1Cub@3Qq3IC@S66 z-rd#LtJP^b4e)xf4Y*(>2eYvNoKDAlzJBP-+xtz&Uo|={&Z*g67Kc)315{FCtU_{VHM$1A;Bt;5)P+%Y~oWA}`k#!xse zUyvO9aNK`je_eYkVJ0G%o6PWuF#B9y7#G33h!P+N-^Z2w<4p~)uXE@%^OMt)ewQ~0 z6H}kpVHywmf{vPODZC(*3aKy;MlYyPE}v_B+&3PG4p4k#@4p0(HK^K~p)b9767y~! zv9mFT1(Y4%8FMuhRjUrPw@UN!xH{;O|BJ)w^|%88e-Kv40Zecm<95Bbvq{y~1Y3kT zIEI3%LeBhX)b>lrrO(kUt5Gz`l+cG1X>1NZ9?b6!;41;_sX1W_=!XkXYip;f`KY=l zjIMDy5=6O-+3a>>AmFokT54*Q`=x@N?5wO_V(@bX9OD7!_&EHdoM=5`{%(D9Q!|vp zH9ZSn=S+BZk|&p9y|f3yD@ycfq>VoD&^Ip=#~3R+xEdQiaho%@`jw-P+P`bj&V1N!R9sh z_H-RRrs=`l&hN2%FtE9eZsdQwr@yiirIR<+?sNDYKD;=>!_Gx^-PU?AANSz` zrg1-<9SD~Qx5F2<*@xX`hh1ZL7?10^m8$XrY0Y7!QPW&3Hw>E{E{89Ki@1El7F^_O zIEV-QKA+ucfzd&i61wwGgG8T7`rk%)nmEil^D!7Mf&Qy5J8bHzZ!T-sH0xdcPR{_E zug_(J*{csa?k=RBK_XIvTAYr{sXdNnWkHdzTe*O zL?w1Q(M5P1gU&&-Yea7{7|fj-!V3k{BpZBrG~RwquLj;UurHGC$u20BNcUGaD0_zC z7GTDAyk2-O!=|kp71QT1IUGip0X8lcOfxY-vY9n5Xxv+1V7?o|FJ!JeH?Oo7239p~ zkXVNqh6AnF?ZIry>*#&e;dgi)j($&nk8KcxsvU0D<4%X)HPmbF?CL~%eD>t3+MAk` z@>BhuSvg!J-}JD9uMzoG8wH?jD}3yS}ML zR;yAS!xR?DEjA+m=&D@~|2TRSryI6%zHu1DdB?|GHruSnc)U%mK8irYk3i6I_f$8R zmL906fxid5RGdy?8i*GV<@*oF;lmCVy^+h~bD~pu*7_`#k$#O**{aS&oEw=#-gA4u zOj=$nt!ai$jNXFHP2|DlM3q98k>2n0dGJ=De1+zX`a9m!i%E|Po@l#w0|(>m;Z_$@ zivPV--b~EiZ7#y$)iI0}A?oB9jHlsMiZ(Jf?ndVp75G2nu3nf9XxduZc4s7UxVc%s z$lnk1onm?OVfE3@K6pB!@3f)((5x^a`_=hV3!6GsSo)AV$!*`G719xI&>`=+L+ z!Y9r{s>cLh71%;_!dyhxV}y~yIA#1kdNvFxMq__FW&`NJh(0oapLzX3x69OH95}zU zjNMu&1g*@PbuhI!cFd?brq`QocC5`G<5odD!52QW&FjD%e;nf@`tqR9>+;~|WXEH) z((@}(E9CR!m7kVQ5bj%K{kQN)fCrep)9gmBF=CMeUyW;YA@A4}=7QrVPGFINy74!( z6T1s;-j>z#vFFL>o|=2fz2E2wgQ(-MGwD6vX40)o8mU4Z1!Do7rmAI1roNx}TV;nVi(2faZ|Jsif#GA1V zhdYQ}e5||74$I)c;3{SHCZwEJ5lylj@p+9fe$W$MYhKfFuhtPf;j{Ic!@Zgl*wLJw z#OEa-WBC*1Di@FeN6Ia>5^ zJD;5;&iaTy{AeHum4-`JyXxXv{Mvt>KNoV?%)KxkGr~T?VRqo}2Dt5MT8*LLiP>rF z!+$k1i-T*o-lf;I*6x?rWpU`FuVa$gtn?HHHGz;CCP&ARV?K(Ci;vrp7z+_>aH^!} zBvzS%BW0vjvJ#=#^3Mc~mY$rJ90#Fz$k)b1#X`y$n$(0eZBjHPdTV;4vP{flAxIx$ zFJH$%-j%~nXETyg(pZU9$fZAGCPV`bgANLr{9QUT{bd<1otG}orQzy7K9iyW z)sm=eS^^77`U&yrv@P_;+JhzhLNQzNECBXjtsTDU?f=sGA zD3c=9SC9|NBE`nDfKV=J;sR98o>#}rGOd2VPUnZ=O;T&07E0>lb z*%xG3OT@&`;*(e;h76hDV3#+WlKp2sn}rzrGFGvWDN2mvNjNk_+}Gj5&z9iHzKJK% z5@O=mBz|38t(3zj^S{gHXQNcuB`?Zk#Zrp&D~Xs>EGUEXLHaddSDCL zG5|l1D|vh#5>$c$qY4>^u_+|B5RTA{jm}R#ui&*4EZh z>VABg(6Zq1AlUO=DiuQYEZ(lH^yExvS%02Fgy)HiB$Y2BSAw!K6h|cir9FMQmR$RD z8CL{ZsE^61F>pXhMq6UhvNE9x4!v&#gj9%8st@t5i}`GEb|vogNM2W0EaIXBzow#6 z!!?3Iie=LAIBW|0kLfAt2r^=4iVG!WJQ}wUKWCKGqDIMT>)2^8Lbm9CZpkVkQJJx^ zjF?!6EVA&My=xa*BoheHi^UbSQXXFn#h7F9sG*QHul>MWieiLkPVVNu~gH6Ku3l&~Z_uzlS7yA&pLpWuRFySbQ!k zla&UaP0p@#woqF4GTv8(R7_%Xgm_3^F;q<$R2C9HfeTC&>3_zPQeiL>8=sz@&7-2N z?P4*(&~n&Jo>(fYQ`8A^fyt3_5u`*CbCXlCr6hu`^snLDz=e)B#LBnO(wNyCI%gL% z6X`NJoJ^J&No#ARxoi=eluk<#Cy}-lqdKs-xoAIsNhFadFzKMtP(RQ}GqF1w!}%~% zT!xYql(B@x#UxP-C!Iv1NuX}X`FxH*Bo-GJ6@pD9{RZAW@YA3sCL}Uxh=#$t;|pLJgip30m&Iq3 z5@KW7G|CRPu(ARI(n+}}5Dp)wL{EeQB>V=7dB)CE+G)&6_816 zYK*+NtXRO|i8En~%ws1B#e6Xv3BQHU3u*{9NrXbaP!uhq@X5R8VW zM0{2@5F28q9j*g{dJ5P_7!Ow{~bK{ORL;A5nWiL2vfR!Ay~iE?A{c#Yg%iAwpD9%VMIrY`%n*zKhFXr^lqTX*=Qx!;L2x%E_d!6L&G# z95%lYSK#n>F>!^j`2vmzuGZ-(Ot?-&kq{Q}RLrKZAJSmH!e+$7UlgAY#(j~)YW7#isx;}C_+WZ<76Gm7Z~j~9(P#b+n6 z*)#~3LdgX4A9Ha!lCn8-yo zMX$5cfW;0PC6rnoykQXg1U{{F_{9SN>AaYu-PaVZYDREm7AR=$c2{+ zUf|PcjEn!g1rsYIVzP+Lp-<$n1wu6JOfDxglP}E1`xYX6g;kkN+W{p%Lh1lv(wM)X z$fEck!K6Sa;G+lNWb-r8l%F*LCNm3`4Ghx1!0RL%{St94yk}$qUlwHYvr*_gK{gr` z>XI-n0hOBpXPOUUSRCXu6H!D09CPz?5rW9&WTATI3c2VlqC`ImISDXyAin-JWh(;@ ziqgijqW)qI@h#L9hD=Ee;PK&1S>GB;mhYSbmI&XQNveK$GbUbawb6T1hsYSoPx}_{41L2^pm z7R=shxkyYA-bb&1UY16qlQ0OP?GrtV2tVTq#9U5N94%Sd*sMHsNQvK-jCfdlY}rDK z*+QiJ@#Ii(Qe1^PTOpU26@&&lk^XbZ|iQHRJ%@}Zv^iwGMl zGWA;+O~5rPoxy}m29q{O^( z-h@DA3qmEDrF3A8`ZGgzzP*H?hoMrNl* z#!mU?X2zBm7QmVT!&n0OTwXva__kV7Sg>m=jR*q7YuifubUXVZ)Y(^-=fY<_V?fjc zfvM%iGsNA#UIJTlc2Uu|PgnpgwOy#|kEldE6Xx`^PY}4azViC(3+GNF+`<`}n_CK> zTto^a{BnWd3+K!_7(u3@dL$wSDS?vk1aJ5`8hQI;=9{k*w8rlj17W`h?Cj#HiN)D@ zU_78cmd>3H57jr-Rxx%a5b<8*t&gAGF`o7aG6XxAZvfNyJ;V=i!_eaV4A{wq@C1mt zrIT|@bCVNJ^^wwADFP(XsDIp=Kz%L&v8=JQAE9W8V7-e-4Dj&W?@o;^odv&k>I@EB z!-yD-oSK{p4-dF~tl#6&1$Z_I}T*=OwxG5i9vQusJI-@Ti|FW6fG86GZ$`zVLM01I z0}Pp&#zDyplDnEDl07*MDUA(K3CnNb%ZgANar;T9KB87Rx&E&kIi znQwr&jRg^WF-suS;Ysr3KZm^&mM&$xLg9313g!7Z?d^t_tmeuiC9;G0ITG={JQ!>U zg=2mYy~x3L08=JIK|s(mlapae_`yUN`=$=FxvlY~`j>Rw`6`Fq+STW@ywq4-E|%Aq zRF;(CLZ=o^oWZ8$^4Zg8W)Lh31R6mdID8A77zvG;h7QSu`F(v_ zixF@XHZXtmkJ$UPx(*dtMQ(gl-ykb5iQq}Uo5RNEGC(ODDHCe;KJejZ8vvR?+oe)9LQ_;xnU9lT`viKSb3pimr+`5tFa%E#3IzjzA5E$w zGOUl)_94&6h}}Ah{dm8_WrYi_0;Um&pQ;Sc`8;!r0JW#d(+@*n#KWP9X(C&8(!*c~ zRx~5J4h2_s@SsZT9vLy~bXE`W&{3BYWg@RA7w1FSbSkpwonAyL$7DD#F*zC>8<`-W zg#eI*puJ1gB+ZklR7y>^$M)`Thb#SNXR2(&&p^h9B>Y4Iy4=J>dOl%lM_Q4-@1+J=Lt}fnqOH&F4TNUiSbP2a@}+h3Xc3$m1p1?RX0v@c-$ktvq<-P#caTj8>07yd1f> zdhWvN+J&i^;8-}aH07Nf8$ppDA$FX~OZOGz*N=`GPjqxOX}VgEkdKg6A88I+jx?#p zLx^2-_Ki%8EUzrCuA(l4CxB4jj$FAoeZgUBQa~%TLMkmSD9A5AJ-r<4!pSzO_L0V> z#wJyxT%krFgwABrXv0>MH*|ItQ7B_$qrSP*2%cG93!3}T6UZv7Dys7f@(mYPR>qAg z6hYgOBaMwsO|2bfvjLDP-iJ;Lg2g^GadrmDaY7YbxC%3*wV@N$5>0JWRdsoJo?`5E z9Mss2YV>f8(T$(Axu+MPVYG5 zghFto>g3vTBslV#L#ZOt-;ZpZ1~|Ten`*Co3t=+0M=+MSY?okf`G>(NAF08-1asA5d z`tp1@^peJ@HI3QK8?AY}3 z#%(EQ6&J9R z-t~<5r^4s2UI(cOuc`IZ3!xG8FpbzQXvjT+Dz&n{_VzV`GrfKL`nAhrqocr?P%VEuaRjko`BlP$a-53I z%mB_hId|d8`lZV&CY=vgG`?mZ9`TPZUR-|j?Q1t6bN+XC@7%t5{xxf8++;F)yoj<; zR7!IAC34kRa0Waqa&T__%H_-Nn6+N3f6Q$kL2tVH7Wu6&u5R48bLTGXq3&+pSq+VP zb$tetnPUEbMx8t#3w&{3C^Q)gBfMzkJi^^JHVk&J(HI&X4bO#Ne}`~Bdvf#6UGm*; zae;fAo6F9TK8?`?9N{yQQKuuseDtY74 zwcEGu+`hX>-u(T&yLWHC=G2(revSvh@4iAsqkUv_)QJIOA~FwmFkInp_CRELIdD4k z`rA-?yZGkYFk8BD^Y&f%Uu{0Pd-tqHZ8Y>5jYyAApQ&lcgAvIz9Ks}MVVzJ+yc(D| zcX92qXKV#Zr0W;1yuESt2Hqly;ogHgXPv_sgvf?FeTF_+XpzK z4^cNb!}a@(=s-*(SQkcSr_aLoEF3vGAHsMBt{u^)Q!7^>Mfnz9^7U(Pjadz59qxFJ z7|!iZi_t#fMQju5#%stt-ptSBZGWcWz#P_u7>!!$y;l z=xp%YVE2yr6pBH_sUiD1UENt-dw#r ziq67h(t$MotCRsSFo1HKr+Erx^hrfIcn5b_+;ow;Mn_RudCbpIG(n zfWyE|*(`>m8cnasGVtm+K{gNo!iZWVfJP>^gtOCAA$5^Pteq2ymEup(C7}``k)PUo z+VlemkZ{=hkM$fqYBb}VnII6N0$+kM5<^vKA6#4bjHImzSV0quOsE7s)B2!(pO{3Y z+O(PhJt$7HUdh8Qr=Ylq&)fRUFY;N^KhRQ>!GIE!(h%_1I!_w8OBE~Lf7QwYBx<+1hCZ7)oDv0e$dEPkC42)fBM81Q+B zyL~;50nqQ;FU{S@9Prsk0O^3~7$0+6 zj+R%I7Cq05e-6JWu&jMbIHNrx^j4Big2DLxcrb{YnSCQRfRSFy0C2eRVb{3JI-sdP zAS^AQA|d%Xa{Nzl;M|t9HFoQhL_${P$@VFv239!sf1Sp0Kj<{4#{nM8Jp$0vI%w(c zE>25LMi!AxJmhnzH_s(*jmC5S2)Q37GZH}Zr^M6UccJcqV{#0j7FlqK0n5O^F^vWy zHJqeW2m(Eia^04&l}3HxdC2F%5giv!PTe^T_?4)zE+gnpABq}yuVu(GU>z7Rn>(e1 zF6n1=&u7!=&$Ai3QGcPHwww2hJe(V{D6B`jb_YStApL!(H2}U$uLt#E8?p{rZAgBs zN+3wzRl$%}Ak;mpVkd_R^~c>jUJ-9MP6JtNNWl4gs0ft6x8tC3(NiL533#)WV*O~y zYU!`V$&2_G`xV()tnJywkOP4S$F5z({x$cztW0c(@5$u2Y;K~#d;@;X*pCH_o#3M_ zXt4im=^bcS$m;g**K{@Ui?eps)wPtV+r$U*B>S><39@r>9x2$f$EXLciyV9h>cnd9 z2jOh9S}hdIg8@sQQQy_pRx2$lFFX87R!vu@TA|dmmr3`EvWv^}#G<@CoUA?Oz5&Z% z09DcgHWMt7(>8!v#uGE~=dXdv=+)|)nu>}nWpihpM%&Y^=~BH?FDc$HmF|~F@-i}Z z?;!?D573`6fK{#`o7v&9#8|EjSbEHQL!0`rtQE2GfK8;@9z&l--7Gm!U5&($!`zdR zx!Z_lOc0IZVCt~`bP!w}UjIP9rC)Ex3aL#}oVUM%TyaCGQZ*ZlCY@Sw_^?8DpsKp+ zK>0r5?pg$`2F-oo8eTB=lc0f6e!>w$8E zE^BF4)YM2JAi7_i<+5lx2hanJfzR)Ef^kOF2cE)g?l*yKRMi}i>?tm;?>wsO>FLBe z7lqn&Os!Nl?S~oGzGAW1;_B16e4wz=!#^|w0JoS2hKOuot>15kyjOn1m*E{4xsxGU=G+;IK8+!(ZY$yqn#nIoXsHrO8 zN@{9kO|Ph08dPmZJKHFckLEe)MJeA9r2spE?vJxXEx*I_2`YJ0i&hg z&}(d~t*MgimDETi#TC^BuN*$y)``V2R*GtQbu@Xp_FbLsmrYXd>|kxuW>H@7y`)YR8jm+d9?_z+M~qpWFYz$NY}n^i!G zn`^`e_DW>+^|lapg8VK|0EDI4qSf_kj`j8!&AJv`09h#BpI?OWl$Tx9&`@2~L}|iW zUjZw}rsjs7xpn*^Nkh$05HSFL3}@gXEf%xB|CqMdFre#JD-;K6WyPfxY)PrNkbp6M>RqC$#dP0K- zBDy%)=GV&(w4e&q_sEf6Sq9MsX`N_)t+KP%WVW50J`oDcM9`x-^g6A{)+|>7~N`rTX{fgiWG!MocIpCORcB8}9o|9%JPjL4#rqCa*BW2#Z&mB`mVjd_JT{4m@u02W zXmN}W_F9cSDDneXqZf#TxxB1$gQ4|!gQBWQAwNJqK(6_yXMC2|i1`V}>`RjAqrq*cEM8X2R518zYYmE^_P_zDw5m$p zfU_nLq<9~Po7|>JRNZK z_jGj0YKZjr9p~Jj!o9e8Q@g4eO{ComOtN3E(*qL4p}|Ry-h8pI%}^?(Y&JKWQN z8TD#qwX_;o(#0xu1pAm%es6Q9y1C^r+L#JUeu7psTD+4HMDowuBY_c%xvWXktTJ?h zptL#$^}61UnkragNNd6X#BG2`4U*t&M*T63&0;e2^k}s0M{5+aHrGWE+^BJZ=2o>@*@siVHZ?AQwZ5)LKWGUpt^mV? ze`dt(HTR&0aX1D#H3s7lVuCbX8ky|CVVgJXN0s+_18TLt#ieU&Z&j&*tm<_7L4OFb zs!(NHySThGV6hxG8wQ+CLsLavuSTuu>e4DT8e;4U2En9;{H+c(ILjeyW2%Yd1`LZ+ z5S3fKxVp4BHe|HuyZa4xN57$_ps4!r(c1R%F60owSq@hi%Q=5Q+3x6_wn3)tqodj$ zRHMuT`xi?_KO9(cIOq>82fF2U6F&a$o%Z= zLR)jMT5r^L_MkTnpC+IFV)5MhwY5v@>+nim3!4qShm|cV=+gba*2BeF98N~I(riYc zGh&B=A;hwsJJ-_L+uDl7r^RJC@yyNj$?DoA@}+Na0jSOdG(E~DZ1R%ZK2xo{QcJ>$y8Vnc%juAMX;tGH3G&uqRliPga3?xr4&LQId{Q1?3mtg6+4%26U zQ+;cTvb7cI@lmR(j_NQXsk+UW1bHKbNaCVtU<^S;I%5!mqmjw^Gv^l1<1L~X-n_Er z*K}hLBDdU8wkUCd7S$^)s>3ZUhuhUXgEmwJ+-*M6Z$9mHVlrX|XFEO~44@bD17tN}c&bF2oRhJH@)(=~I%!8=PzBydskAoIBo~XxU^@cFN z8MK7Yor5&^+S2)p^G3b86_2pltW+T{2&sW=m|owC4n)<1b)myPuyg-Ug}nbQ2**0!E*?6e^K!JzBIKN8DfG-4Ml0+znBRRwd`dQ4M#HEoFAAgjM> z@9u0r)_F{;1?`U2#K7PuDO3^;?7@}6Y!|R?0z!qi2?>HFO7ujKMM@`qnjS}@CPQ7H zolf5p2cVGwa)4k;qC`Ifzrr_uWW~lLQ-PF{+27NXwo+n}m>e!&Alf2&%7+5r=jp&E z08gX=Iik}O;+g4SafHNA1^DSVVme0*ap06(5p&y)B*3tbf!qj*wUF>J0iNJHA4r%* zFk8%Ir>DlzGN~LE4U;7RZ=hO)0GEk-l<>q7v53PI#M6L-L-$<7&n7PNNQh;>;MrHC z;-Vs6E|;4|k6~~)Lgp?k>Iv575s$zUIk?KtvLXUr`GlXuq{f4h`iPE==$UoO3GtY8#*Zi#<(ml@iM;wlSZS1;ZG;XVkR7Zer6^l6O3(46l`vPqEUgq z;zHj6Wl3Ss0S2>DQkWFxqhu!5-cbYy1uE^oJygGBY)xjSict1UV35F(GT|XXWcrV&kH5d6?QVzDiAW%Co#`1oE_ z3NtA=C6P{xOHO0qfs&YPIt3)*PXM~2V{rqr;6qwMmVm+K#M7Da3 z2{b_H0I%UojK~Kts3I|k4xEpZ9+yD4$;T$dVZ#atEt+!-Op>2Q;ey`^#Q@iY98PKi z72hH@i?HpJ2&w)U(r(g6LUCp)fUi_$B9j^uABUP2mq?|vwxtq3{VQJ#kPG~pfX?Dj z>51`7plFZdscb5VOZtRW2);|e$rb?`WH4jn6JoX`#L*b>#Lv>i0KQ@8mkZDjYRpvn zme_>EWMH9O(#OEknfwZVu7oQp6zpO$sj;zJ;^;I~s3g+USUlo~43r$JqLMG+6;^=M zMk#FB5>MX&wm1r9^{fP*qI)BKL`i_V$BSh}g`x^68UmXdADfiK=M#p#2x^IXW(@q{ z)@`I1Jd#u@5m&reA<1ROGvaAUX%aRJd7mf!OhMoYmGmc=gn>S!GDYkXNp7*EtT>fL zr!m>W)PxieR$IY;Kf(8Dq%XEH5C9WHic5|YiTM%OFQritkI z=Ffn|k>RhHa293=Any(CJaH?Bi`alCWpv_;C1UY5;){R`QQN+tkdg%~e1}HeO6R={ zgXS{aF`o2@RwNdu6Cmi1v1vR>p_mVw;m65rIvtAC-){vzuc&QSRPu>${IIJ`#HPoQ zqtN(%WGlE>+wpLT&v?Ld=+t;BI6=AM`v5D~nqDEu#ilxnpL-KT~C=0PXNJ2`a0Gmr;r&8k+$oT(nBw%e>zy?WpCKM(G zZxQw6_aGkAX=x%wV@HcZE`O1eOh=ebN-B-IC5FXJN{ow(i6w|gP8%p$ygU)g>giVe zL5chK_&91Rv+(6Z0Pf&dE#>kUaj3j(b}}Uk#rYI|FABaCo%FcOn9Gtpy_{tVnVCMqfx!zR%QiN&A~LGH6j zAnMX^QKEf(oQUqM1bVD3Z7q#2=cdt^)M$EQI-5>(YM)0Ta|jt>b0ktpnE} z^5fVzymGO$thSK=1>4#VHC93mpYmUXb25_tJ8)4r?y^A67R#j-l?ZRxifaKujgF%x z@=HXr+D2tNrTwA0y{)B?Okx0rCH)+q0J@v>XBwRaj1jlZl>#WKL#-lFX|a?zG+oI- z^1-iOR$$(Vvv!=fw@Vm_2}BcMe3$}%oOHIh5HT|f1&M-K21a5clfx`}W;y<(r5zKD zhe!h}Z4v0!MAEkmIx{t42Vi(*Eopm^TfEC zTuNsg4g|wQkfEk0s__T zjmkDTjfzJ1EFGB|P5QSuOv&KrA%IUhlMOo@^oziQ5f%nE46?%T7KNhrLBc%z2Oc=tS-33&b1>=Mg4Q7^3kA-_WHBMPqZFLjB7Zi&?~z{bx*cB9#JQ7)3~m1wNdF z0fv()5@WT;PogIi27(zah>-T1gpQA8N0e;-GqV$_R`PJGr4d>=(e7!qa%Y-TjB_c*Dnwgt=J zhaJCcspBO^M^Vwwd>a#;faZ)2iI2{5-1bB&L(X{`~;_eotVgQAEM-~UJ zSTNd!xf`7hmonzI7q+powhIdj#CwIrMF_Xagl+H89I43LKiRcYfH>yT(TL0ApB`y-j=rYh=cYjnpPWRYFEf(!atimANaQl7 zCu|rC%M^lacp~n}NKM+d9Y-Hfh04kiiWPxXDDb|%dO9)z&|`FOsfoi#g5~b^Gm8ZEpZ!t8$Bbd(B9=d zzr1>J{mr$@@Lj}F@cDC#gvnR%lq)iS_Tn1EJTG3r^8WIr)z#NmmLe-lxKu8TDDkdo zyYm_vI~G@Q_}-+%uB<-z0kkW0iT|9%aE#2XuLVrv4C&MU~l+i)$v zdK32FZ(hWv&9#lU2s_R%w$bt`E2~td>9tGmJ-Gh>pUumw(W_rxc;ou58yk17U~gy@ zYN+Rl!*uesr#JA&M-X~`a{zY5AKui|Hr*sh)-U{=fdS% zn|DCMT)T!Hnv3geSFT>a_U`p(4)EkRe??f?y*;;U$2K}WM_8fgFohR4?%dzJcklk@ zI<~bSND37*kR&&6-Pyc*ef{#r)wegUUAw+(?JynSagZj*e6a_f&k5w7332CeO@>z7wA zy>%K+H}DM;Go~*pG)iiqY@_U<<%^z>Pv2pXx=I#G_(yg0OcfP{?Hm+hf>+HEP zcV9JZP+<^S!I!_JJ_6aol{fBe-nnyQ%`wSqc_R-;y3>aQsf#`R9Dw#tl$)d zJCl*>b9rThLJfj0xU_a<^DcOZYu9iy%AKdTk?hHP_cpg|{so-OJL{Liz@@aRLk+b8 zEORN$PoY++(SjchES|r1>&}haH?Cc~dFRG;01Xt}@9E|}^1ay2zh1v~HDdRAMvPsm z2Khnw*1&7@-w+?qb#!rK>kDCI{wYO6~NGG0g_oKF9!QX;vot=l}h_|DaLk^av6n~>jo|G|BHkP>hCUi9YQ zUte7spE36J0Z(p}mG3La+K~z;pdE+6W*(_;kk=jwo?QombN$-;n>X&D4ihcwUi7`F z&40VQd1Y>1lS4eXx!%fYECTJB^*80^rz)h!X|k zR#d}*1vI}0@BjMOzj}cCzDK;ddv|Yd+`M(&QkjthShE3vx;r!C%gHL_^K-H>AAs$#vZ>Mh`r4(X)i>UK z{o?6Rsf4+e`6I^KBswxlNhPQKj)@2moaYGyS%q*(&f(?2G#YXEs=mgNS&d53c0zlw za2GRy`Ex1)dC82QQ}M1*IJ@(9FPxs8od|d2=TLIUxu56ZP32aVR)I8bK>r~>C_7S{ z@vLNigBk%(J#^1-{(J$3RJ(;jKwf~pN2P=jJ@y3)ge8UL`}S4rD=n{8$cO-@`WKi{ z%&%Tx?!+6#)Df51o&@7_^7fBm5-YBX0P`9fRqTU(dSL;=>nf@nDoV&D+aQjSv^U;IW!ItX5N3Uy~Hk zCBl*dNp`M8T#%cUhFAMua_a7!tewO@9+#Vw0}pP1H5r_YtdeqBpVo8f;-w32ztak; zzPm$(rJP*I%Yh~#3ZpO;1dP5v_LEs#SNX)JI@ZlEV?~1@SM;K@Wo0TrO*n6Tuqwvg%T)EL!#i;?3lO z-yWJed-2r9>degAg$1YIYUu-t-`>$Ala^q5F4>2-pG{aEa}FZR183J{#m{n?R2C!q zEe4kI@`f<9x8J&o*pq3;klhMw8t2^VRv8FuB+kd9<`D0zxG{R6Q7g9W5kWxKd}`FH$7T;wK>cGTFhHga0C{ z){WoX#9ZL&#q%@6;6^~t0#G(uHAfo2F4q|X(TItY*gTZ>knda{^dao zdn(u3-K$r@V88iB#0lV#V*1o#g$h|;1Cad6YS^(<78Deg$mf2W@PS~vm+}8k$7@)6OL{#8`TA^N7S^`rHxx6vH@e^eumh`PE z4FXjBn8B|tp1QOUc3CZkD8t7VvkAgWtZX4V9;gK%029Y8L zXs7$VQxF9|1?A5WFcpV^$gsic8g@H}jEJ68wWz&;I@Int)vd+!!s{JA zy8)d}aGPP!oFmSmVS&zTp_5~F@Bv1XL91z$tK{{E zUQ!J^?WpsHp$qE>+3=5!zOym65P^s~;W;-pabXoUAS)Z!uC8J+cmDO0BZfXZ4$i>a z>JUj%TV2~R^csSqw2=!NSiD?4AG)xPNUWuWxzj7lh~FYp0S+R5^V`HEEVB`LNJKhr z#lB<|^_k~-)YdB4a^{dJ&FGztTLb3eJ4?|aQ!Bg_-CMnNI=D+ zJ%$>+^&gU>m+XgQ~Dz^04+x9>e;}?4f(`zDrk(x+( zW`FtrSvnJ_sE>5*^KU>=*`aBKW|dV4`(oRONE=ZgC>_8M6b=V*0VN1-Xi!m9Fbc{5 z(hjl&gaC~#5SA#4MgiBk-`wxcy)$!@naNCM$t0Of;=XadUy<(|0s;H2z22&N>#66F zEbgL0iLNrw?;?Bx{Q~^}2%={!M8+vFMX+|ZvPO#AVR>q1WKxJ+Y3qsFrM(qJpP5Yr z-e4QYz(sF`FHyy(W<&-Bz7@{wVPUc{r|^8)z+L3y?;BcDQCPIId`DtINq)MQw*y*# z2&Y^9+1k#>GcY(LNUbU;D$6P@Q^k9Gpib!KET=KhjJs_sclY%5kKbJf@9o*TV-@>B zV3fQSn(cyQDGgz_M3a*kr&<*cmwWk<14nX`G=700_!!?TLo(-pO+ zNy-~ZNP6E~=@X|(t*+x>!|^A?kfo1zSVUwIb?YA<9+C~cx=bN?TlqyJJir|t%?))8^;CuewDNwo zy$2QU=7z>|I$qogS_|)vO>JI&&VSuBRuD*dDt0yKy zynu;q=dRm%!sdIr1 zVut`|%!qF<^t~NDJ>o6z%g*ku?hY_ePv9G_tG!U2f(RmX(e7SeP(hVc>h$`7enWpt zqYeUI)ROS;1~Y@Cm-YS$m_S!|Cp6dXx~95w7mj(M&uL}B_1;_R)ddx2$VTdaq=!7Y zqqn`i6M&3izTtj<7m*O8+dDg38=LA|8rtg)BrL+v+S1e0CnPv&Pel_7O(MsZEqE#7YSwldqtfj+9Rh{WuYBTbiidGfsbdJm}mGG zAdXJhOY0gB<^dt}RoG$mPjy6G{93?mdrmjD82X8Jb#{`OOh40y*_+D)hB=1sfv~jc z&Xs{=%1Bxjx6B)XQkm^PV2Mo60NS~``b=l9zPqoxv$IFv-9>DP$1(#mLd0sW;a^>y z?G>9pDB7_>n-r&B>Wu6?T9`?HNY-X#M4L$7xZb`!}Vv@&1-up_>iQsCwb zx(_zx#-(Sy2fcY1%DKk2-z003Q`6J4(+ha1#dx_0M5ed9k7jx`G&msCxL#kz+Qjf( zcWY(o2iaK(>eZ>smV^d4+vA=QCQVAf{JrFNb4se)#KY-s{jdSjyWychzObZ=2TTn2 zyXsEwI=CS-6Wp*y1z^D4R&K|VunN%R>g93jWvlm`L}!a&-msxt&j=P1Yrtf{*znta zLrdlH^a5@2>O?ip83lEBA@?e`U%hhaY89t~h*b%DYjo{^jJh5Z@X|A}$#`(U80)(J zo{F-P^a%CRFqH~CKxmM!2SZ8jEML1cR;^jWyUW=4)jQzQZf(~O&8m|P5A_esR-M9w zcdFW15bql9rdkpl3I2c!PN7&USGZ~u;VoMh9;pJ?xO!(5Jl;c>d6V>Hglg*t28U?_D0h{gw?Pa(uy=MAI@6xGA^wM!EdJnw;vFj^++100QFag6 zUUaez%0vOT!4XawMHeoxr#jco#n#OBsZhFCGT?2<^a&C5!vN*W)-HnWjTeVWlPq zGWyeX=P#aZIJP%5$kyEUIk&==RuobumlVIZgOr*l)V4xLr-}}heiW6iNk%U zm#S7TbDnJ(nc^=_3U1act*vG$xs<-XvuLxDl1QNh4~f&a0lpy+LIsBdI$9R55>Jbk z+v7lGG0ntlTf(vaKV12H)$v2QVnxDVFoHIY( z?+03m*+f7G{d!w_XM4)=dv{g57C>xeN{V*Xh7C*AOTt0|mcviu83gqe2x4b&Izy6QXg_F6Hvnpdl_36{~MS0n&d3o8|%$1S6{O}D42=ed_ zf)UAGLFayMCs%s9D}243oLpTY@AGixKFZm}**zpom6=g=uHjt$_MHWJAl~0iO;Rn3 zSNksV^!N6sIRbGBWcGXN>*F7-4r5&S`g(hKd3%9W^Fc6PwWX|RUt?|K(VZU@0+IVZ zU7Ms`l@J%^?c(k27eogLL(; z9T^#0^D@?Ilh&?A8N}1Y`z_G;zCbx>dS#d@PAwi%!0-|psWMT$fi_tR`1Ps}Pc|Iw zs5^MDvA(KcXI^e5F!_|!m8!@Pw&+2@^gsHca)rxMo?yhq#Y^$8)v8F9sp{9PEn#7C zWsqK9KzOaDe9NZIc|e*un5|7zfqur=kE(jofr=$@@pIy5;#6~0-z*`#8NRfj@hsTS zGu5Rf+^Ay)I`bbJGLqEGfUSoH1uS|?oCy@Zk@4}Gc+>cqEoJ3PDs1d; zZwDXUe7>RpFrX~^AGvv((>G_v0hf)5^@L&4_~%ysX7wOT3DotZ0BmeUaieZ=M_g*K>_IN z4`JgzdZdDMdH94X!W z-ex*4DRqt12LnsIIKoQ@X#t4*iW<)Trt> z&7C=WWJgx!X5hnMVc+AG$Fe2MQa9!EU@4=bzJt?C`$YjHjL23s9@}5 z35p0X=N{ik<_;J($kLtE;^HF0R8c`}3C+z+1q0zdAcIk1su)c|>o&rWqk?!bEGjBCHZB5YELBuA zY?sk$zGAV0c4Gywn`AH@TFm}o7ZDqql~Y)_ZDXc}jb4;WP3mta#7eP$Rjt4dk}y@Q z=50QnOc-k&VX3sVL<;(R9wpB!E-sQ4z1l)ikU;%17M5DAmdlzZWkHIN z5EC1xNz<;u@R2e$Zc9;N5nuT$aC+aV-(J5lQ=6LzYnv)2COS$)`lPg(OujvX%=hht z62)dLg(fCe zlk5%p;=1*N=#T0r&$AOhE~9NW@a%xxf`{NJj`CEWv3O&|sS zr=_v{H(Pt-Fv ze?k5WxYK}hQLLvK8a2$rL8@7>ou%iBE%~zi=b3M7v(U8vxfbU6#<`D3Te~hXE-on8 zYA#Tc?__4q5pU<_=jLW=v$Px6i~q|v$(Odx%YOn0C=Ies6)-L<7z@qpLSqy2^FYH8 z<;(()HIu_9-)z~IKPUeQ>p+SoP5~rMuwL5+Mx|}c&CJP6OUug5To1fOMv^o6+oWxC z^PjCxTjwrYFwYFa>#r>Xwc7O?v*?nv!pxjJKuv|)@IS#a}(BR78ogvel*pf zK%NF&UryG>%p9urs;F?=HtO|y3!gN}f0>!=4Slqu(KnWXDeE%$U~X|f+;YW5g?#Z5 z8haZbTdxYWaW!%>`pzy$1Jr4KT5*16E@MLs(QPK%jPsx8`B=A+T@@Q~D;N#}z zs4!Y$BzeCCZ)Ry}6m0|t<05w}OaAyOAUMd~XsOXFcE8@@XCOSM{Co+ir+OYAcs4IC zCQdz^yz3Cj8u~?Ain1Fe9GI}#_5r{cy!M{v`wC;R}#shN()2Im< zNpoL9<_fsm(dgAY`#^!hmYMzF8XD-zwOW8T&?9>g(ERn;9OxhI7m%_7p8G&o5Wa#x z*WS@B(38)yDYSzidY){qx7{2?VAvunsBD3r$>^sql`%1aj#l8D;S6>6jtEo-xGQ}e z-NPbc1A@FGe1a5FJP~-|X+=JQob!R${8ldo@0p30lVPNH_BGw9~cs`bR}5B?9$zk?39&m$lJTUV8fCif9`$%xX{DSLGHU| z#j(CVUDN5aXHKtKqDfOlsKUK{#1YiPOY-_x_~OW=@TMo`L!7a@EI(Cv)&I@Y#`!Gv zCeYxr&=y(0aLu99s3V_gK9d$66bNxxxVOI_#>O6#Ug7M6V`7#krWNIG&)J)uie5_U z@>P`|6#w2`(H2|G>qnlboAng^S!Ce4o8{VsYuAa$?5C+l$vP_Ye04Um&?j zt}+i<=!@{EWy{tiVs8A-n>8U^G5^uYK`ze24zLsos!MlBu{Pu%Iaj=O!%BB&PN3q< z%LTBrs}E{7sHUw-gqd&c+IQYbOyq8s+PldG`s=@eppgJ~-1hd1mxsTTW2Ph=3sr={%cUyB5!ccv0GoH88*;)$Gz23Xi|IOl{c4!H}tNcOOi3ydL5 z3LKa@GrIT%MMg!@h8Rn0e|%@v(qJzS7sV`sNe)TpYa!1l*?c960hrN2w21&PiZ60; z=Jwjf*^fKaeBspw&N}cu%}4m35{xNPYSl8iT^a)H1_Tx zeqP=|QK1o$%M%il6W`~Cc}0*v2~dR>3IY5SrmrxywlNjxOv&a8A{KTcNJC`;ef&Ze zhXyTWK(AP_COtJ3N=0uUtW6!B(`cfps6MbxYfABgyeSTi@)dCpJEwrfL2Ohxbw#Nn zBNJ9>R))uD{G0_CUFPtV5p0V!eIP-XN&$GaA=%QJ#v~_$d((-#E7&9@l`Q=0(2z(J z23D*HkMb2Yr`RA+>31t4P{uY-Ma4;sSh~#WkBmz}qv;Y8!P9nCWK?8$_~M|5M6OUZ z5g|VGzU1(P%RI}eZ1WPr6_@ScqpBeO0Xg`4x-x}B>T^m4lw{F z7Al?GgTo`ky}X3b6z-h?3*T(SVrRJ%kBXQ~?ygQQ#6&%ua863aLW*idH%jtfyCfuJ zu2`jneKRp;rN-CKZ~5|fmIQ@>9FB_giFCG;JA2@DK!m%waKplUdPph)A43XaBseHs zQ$gumZbO}SEZ*YfhS(T-HAy;qbU?_ z&aR=^*;^ps5s%ZM8qCfwFfRCuHZwRXbn)ycAt$C4SS9F~J zFBNMX%aieTgBW4 zCA>U)ZD*|1!AZraV3@kPYgV*Y$C#cdRTb6k*PuxIYsxVm{Qj#|DZH9J4^ zz=5Jj55J|!@24kk;SjfeRjRjx6|rI(LEzY}%whR~?8i#Zum?dVI^4#}8Q5EB;@ZU2 zExC!P!@Igf`GKM#oTgnB73IYhx-D_Um-e&mC0X1TEXL+?7Y3@0n5+zB)+YGq)@rre zx2Gp0hKhBDVMYIjMtS)xWFCuP^^BMslJ$%rhnCD=&$qO}Z~dK7C<DOjJK z9l6+x3GHIy!n;Zr;fmkDd2EV<6au{1S&Aj@FW?UN136n+dM)Hp8eqxy-_O>BdwCGY zGj)09ywHaCj#hRQaYlGInfwLUn!=d1fhfG4c#9xe{b1<@7i_|I4mSns6M{V4W{dsY znJ7Jrxq}&YuWYa*%U@Zr5TYI{mM1HV6+Ea(D?NJr6q^)p;>xZ{(O}L>_EBQ}6!TE- zV2rtm)gv*rD6Rt)umUIWr=TD|lI|;gZ+nA=ZI41QIRo=l2>3tkLMEcnG6!L6X2s&kmdJd*)dGfn@!>k%FZCm! z_8T?sY=oTLJv_-);Uwo-9Q4vukL6b2ec#}~O{``tSakl!7Cvt=P~|62H#hf#ALcr@ zZn3kshqpU0Pw}=^ZUuGsd|E_i^}-g%=ior+%x+$;GgRj>QOxGex00V|yTEPJ!05=O z;jZoA8+}{>tFj`wVh{WGd>}61S;S_E{Uht_ES5!#5gwhvr8VE`f&t)HpW({Lr-olt zczd|}d3d<+Jo*tUm(7Ct79xoSP;bpxF;IUJy=@7p8I0rii|>f^4lF)*Lw z*ROxpw{=J2zUh4Ag;@2tyE0#3!?V%(Jk~Rw_r-jRmDycA{m7-m z!8khFw=BZXgBBD5?3byT9GUt37>*XV;(a*jcvZLup$Ao`8@bb++969Jit>4 zk$v6K-I*~iHr8?%cXuzD*K791G&0B>$?}OvK=={7oU!fy1^C0GR|`w$?Bb7V44(}T zjsdv6(xp34ny+o{LzX>w&wPcxn+%w z*T=4oUmLqN+I6z(Kyhvw%ZA*=kyZBxH>C&e-$uM9Vq!A}WO8Hs{}Jm2qZX$Jp7j*W ziF)1-4EKI=_GDQ_LH;Va4O5QgR_Q1?zI1kCX`u{avnM8=WdD42^Fk7m&2O#b4xt-P zbzW@izrua1?ib}{B{>^bacUp|cSog?dnI?~KBN7m9n(kn$CtC4AGUDDc$eQhg&zN? ztGj(nyf6eM^Dw&_XF&J z1QGmP!HR^K5HC|Nna95zl{V1P;S$(N;~S{5B>$4NiC=|pWo5E)t~hn3uB)jTGR(#k zY0FeGOGCunqU1Fr&Y{l$p|VMt&HA~xh!j3ilD`(?Ub1>kCoqxzxxm7G@0l}o7d|?5 z9PH1DWH!92C=z+)#eFJchlXc^Xf3=dJ6(EPJc zWr4_V1Pc}vPQzZtUawtjMWb;>kw2%i#o~ZA?XFzDoNNL-tfk)HULw+DmgYkOy|R^66HY;S0&IJ|4$ z-d#)Iiqr)82l=_UvaU$ZGUdPgJjKpCQk@DZMs{v$oH$MY@7nlqS5Fr%DHZmX=9U(I zk@>rjHQrmfSHl}KNWuIVZX{sr{8yzPcWWUbVQS5LDH+K*NpZ`djtk>qv=c+_&-4s+ zGPig3g%{^=#j(l{(*0CR)Cg&Kx(P(^%Z2#e04@)tkk`SgWpPrRwEQmL%jM9n3cwER`!WUdPH@N;A9B`uU3WzI6+7kG`SRFU zwVK;qrtCri^m{5WhwQMpD3`3i@(lA^{ch&+IL^2BoL(Iq*fz6B5_<9t2nyzc@3lxl ziv5Q=QYl~~Y)J)yCS;0y7rPC~@=w-0XmaLlHM=EivCxRcoYoT0Jb5y|3~OomkFiUF zy_L=ialvhEX>Beu{|PEY?0M}dCKqM@Rzb?lGQOCCJa3^Y?%c!vTLhX!HKKz9mB3zT zidWVwKVaEr1eND&3yQ=dY5Cfk_$s0}v9_j*0DKCgv;? zsi=U=;>m0+W;b4xVirRBS4(RrAI@Lifxi9$VJh`9^=huCBfLGZHw8_>_yNvojtBpp zHDwk4nWRX^+RN45$J5taNC-s`5fj%^Aug!M&9TLsfS;t%W#*>Tm6geSM!@<0VgVzi zJz8?m76b*oB~G5IC6Up7A(1FjP}--~V$@J2L7XbHc!m7P&xlcTV{;nK{JDj_(svQO zkW!G$@3F5>Kx9N@M1)_Un*cUgKLfT(Z((h0@rEBjO~n`jBTF-}PqtQs_3Sw21p>BeX+m+InzQv_^imF)uokIWD+7YOd;MxnYfLY}7z_$W@IDCT3@LB{OfV*Dd02hko zO=impongUXGq!$>$cMG5wMw*gJVc)W&Wf z|LW?oh`|U$tiLCRDn}<)QJ#>9z|OE$WG4QeMbI%0V4rtJZfxvY@c-`KsqZFh zs;9TiGZ0#Z>p@l0Pdmt_0hLb;=FQj&HH00b`dVF*l0O*c+| z6raG9K(mL>i9z@iT`Yos@Tk(T;<=8+*SIzs++G>%i)eN(hs-T`dEh>{e$Rlf@Y%|c z2tVTI);!#otbb?gOw>cPSgE+~s z^?)OI-U3To5IYJ7Cp(rRTMNg9O3%QsrEy8A33++%1vtA0FI&BGnKn5kb=8tM7h3^6 zr~U%z{xhku**rE;0?hZ{wu1cE(p(N4&R4x$9j8rEBi8PSf*sfzUvJ;|C4peVtQirK z^$QUSp|Pa-Ci9-yfV#6`kzkTZ){^{31q5=-t5n{cSm!F96Gjzh70`aqXRAg!lKHPhK*rjJ)t&OrkBD3ruh~$rqm(U&3rI1l zNmFt5#%qZ!i8vYH14VckSNnisQdk?Z(7C`K$T}D#TW=L_rYOJsRFjDMggxe!-L`R6E7ho&~lWf-5jCJlemh;Ta=P~ax zH2BJx~}$C z-To~ugciiZJ<0JAixqc>9707wCA06%8IM1Y6VA3wG|B)e4aZcQGj%P8goviKb1PRK!{EH3m zdUDNZX=zJ<7mv$6l!Lgb*}qwv#ky`iZ=R*#MVcecF`oN{+5G6F+PZT+LO#5&qoW}d zK}&M50`i8dmvauEXJ%sd?R+!l6%$$PCplG{k$@=$cy6a!4bguK;^~t9+m6oCcjLkr zGUa)?inX(&y$DDk$tTK>OQZ7QU_eiPG2fgd=9tZ$vp}6)+}7623kp#Hlx7k_6ckbc zjh#&S8V^J>&&)^b?4?LTc#^r6()|CPGj|SJVo8}LyLA`aE_4FI?W(QF+mIUX$R5hc z4wxq6hp?t_MGqK4*fPWgX9sOS5zOb$nLp1uASJiFysr~>h0flN+MOTdWu|DLo3~cj zi9-Ux5ip{bvw;2%s)KLKWhpG*!x+@7gJ7{aL?T zm_z@ZH{U5|@7}UwC8awMN+?>!o;E0uG+q-a-_eTv-klu$-Aa!_z5~4py8tz^|i; zO(9II@&@V?Y4mh%OpLpmjRTxakw(uX8zhqLz3q)uMla0V5LsOSM&miuG(hYe`QuB; zh<&V4jL{ntSEEBFR|FYbtkEk#48}%kBT2SjfE^CWu7Zy;v*ItWETJ+JiCNA=C0aoi zZ|2F|0e!@(1DyrzLZ)zE6uSK-$=%FjXT|Al>;DZQtf_B}Cln8;t z@X>(Sh|#QHm#lF#2E*|vN|mSue3X@wwmwD}1VyB!flbNE$;p`gJwg?iB@`-iv|91| zE6s}7M1jW4eXUKi5~vXKloTNeCqAJt6}S;gTTMpFnlw-{>ycm%HIkH%bJ8-iHl}UV zMj)9TV)Sn-SdU_Xd!?wO9W1~=1RFiJLP|DnJy0teiBgzZMnna!TbCFc>gp$wuzYOg z1_W-MCd|>wpFjL)YNc4nVGr?T1;7pxePqmWCBhAH*hR{Dw1i~;RN;dLCgBY6>nn4G zTPWwq*H!>|$iRviM6d+`FSe)r^J`c4(EP7GTpSSlW0iNZv*(nnAik?`TJy>9o}(p|$4e8|<|-VCM`O>@XJ>2Wpv0HB zEG`+Cyz}7U!@GCy-@89Kq3=THsqN#=uC|MH?fQXFQB=9!d$RgO$@=$mj!-C(zjzvd z*U5(HxSOkY!1Daj2lwwiybJBZy?fJ>pLVr(ef;soi_LB4&UYJnNMU&NeB+6-?1bF% zV=jchpAs8!a^^+iLhj>UczWkG^xnNM-JiL4$N0{FO;1e>@pz}B4b8j@4J3Qc5t)~~u8Vs?zqHO96#o9*`*-i%e{kpK#KnumrBKkU`(<-a zH$*>B;I!6!T>TNRk&hq8jd8Qc4Wa|Lr5su%pI5$XE{Ou%!kjj^duQ@8FOSgu>*#7f z*V}u^aOo0{U(UAm=sv1AkY9aX;c73gIJj{jJnQ8X&}j@?%wuGm&E(7FE9P#7rp1(T7RMYq|YGSJUXYu6|wj7QRSEFF5VP1knWk@ ze={|5QM&kqaBTa>&;Y^zBN=|8005cc$-5Pg9Wx_aEFPxyjo-7k}BL`(@q7J%-_tYu6`6 zhc0(!YEKsACmbIfo3OU9aZ$*f| znWm=i+`f7H_LbHi)XUo1d%8a60i)FY=3?ilH2UZ6?ApdI{p6@K{=nJA&Bw`!cM}r|E~~za!=v4wA<{J3JNyX@AD1TOP7byX zP7WUa9^sX}14F}O*I{(Jb^GTcPz?BBu8kTHA8Y>jLOT>t6Q99v^I7lc&1*30z;c4W z6NrTG?3tH=Cwo5~p11`g6qHQ2rzT~Sf1SDwhs_O$lz6+{({}-PGJca=qOngdV*6J? zu5)w3LZCPZ+qqddp45-rx<&S)4l|QevMJf*>sxTKNE81YpbswhUheH0zIKfyKKTT0 zpj$VMZ+#28KQzxpZx!XW|+@ zrt^~_xSeJxkfa;0nM>@zp1GKNs>;t8CTO}hw-Hz@iP<47=UO-@fS zJ#OB(+zD6n#ZH5vtNZ4?t5<$`xqIc2Rh8qA^-K!dA92_1=HlX`+I_grAliQF4rz$~ zoP<+n^4c{+=Y`r|>iP{`7l$XVU0GS9sy?zz(>Os_!BI3ZMK8!*-4-w2y8BS=%?HzW zChy#v`ne91_a016j9+a&$5lt|xt>1#r^8o&x$0DE__0Hky|63^A}eV^viiox#Xl{# z_(1v5Qx6|JWL>&P2`Gm&HF^KRz3W#$?X5+P?eyuo?%tl^(+SWO1O~25ts0xvoI-_; zxTa0;%I$j*gSz|hR}b#reMkwg9>0C-4vWM1m;uNfWjIs!Nn2~(ky$(m!zpf2ku(5J*j4UqRecN$R5nxdnkMOgcNSyyLad2rM70N`J1L+ za-wT){6$0J_O%J2z>QMNJ{c3NKYt$U`UT@TICD3eX9rGAKK#|g`z&s>g>cN2;M<$y zedmAK+{SW(TysNReqK)YDqf?#2z_6tYZvNW-(35+mV55-_YagGK6JFwKoU5$hYw61 zNYl^m-M@YPlh)Q>w#nLl$NQlAl9HSRv{OSuk}v2kjD3oi93O9|4Q=-xK6DuVgsTr8 znm#msAW{5#5ARL%wq9s!Z)S%YSEjYK4-I}QE`Ig(oFA2YQ9w9) zyw>pG;hcxx31@nH^1;KqH;2)$ZEJ6DZDncsa!n$lquTd#^0%HJgoTWo&(HL~VEEW% zS5zE1dQx}e!Na)^@7%vTJvn{v!LKIz+7ZHT{}_Gi(a%P+x8!rFl$)<>8tOHSLsE2o z>@zDX=Wv&zBS-5Dl$b_0d3f095u@ks)ZK>BY^cP1B<9F`; z`r(xWXWxCvXC zH2Fd#Iw{sr>_G%c-_#Ty$S^QIeDgN$kV1~@t6;g=y<09nD;gc2FPnVH z8a}%On@&HPyad6cL4WP$=af~NdV2k{&MV_Luip}>znHplt-ZN?w`}(l`_xOq$%?L% zCSOu_QkU+?rtgx_=z!r;FU*G5Z{4`Xht7`;qttnGf(-&y96fay&8pqI6FSBjb$94Z zvHP4ho}Lj^|MK?4$jD^_8}PAPx2{j#?9hGGtcMwk?8)HsF<~s*{lmH8@mu%qv+tPt zdGkuvbEp4!{mSU4L!Vx|3K`;!8|QTOr3r@X3|E@^9#0L+jAk4Y6kvyEgpX zB$jigpG?AkI5sAz!|)|f8q2h+wikB`SxRa0Ipx05MYhJfzwI3wzs)v@aW0H;v|{&U zJpCoD3UAm|wo5lZZMjgMmJk{BarY1-MKqD&QuBdX>(=K1-*$J_`isfW z1m_vnkQ3Ham95WDNZ5Yy=FQtAK6zub4b-%#^YaUrZr-_nUu;ocPvP672aoxMaWg%A z`^Ff4_%GM5UcYwjD*DVhsY_$tFS&fU?f(83pR!Mz6x+N>aq_v# zTs4_|HE|v8HQB`1*TGUujD39i)YhddVh&uIxXspXQr`sY&H>CH?Jn&bqe^0doV;y( z`^6;ljcG64etz>xpMl1r>3+QS+348Bm5XHwX$N#|C@Y{Zr->)HavXeCPa)kuj1D}?XKHi+SuMcCcMJUv5UG>$5F>VaO9{k z7M;ncGrKj**mv`K@6c7q9HpDTg+CD9&U5(Sb~rSz^TC_rR~j16oIZZ!@R4%(9vO)Y zwp;UVF<-AsW4}g{bYh%s)@MWGW7ld=m6V?v{ro1AaC++VTf?0~dA_3j{RE~bgoN0c z3A>5Ejb9(S0?*)8YI|j9xckDPk528b82qCr=zXa`-^b5Zy9)YyPdT1yAJ| zoOZu}k^p-1-AOaP8BPS@KATCvV(f z*QPsKf}C~b_!Y4;pJIeRx^}Ya=+V7oxtk#@-Nn(|HlF;7ZRhpt14BKRM&P+*{!HEf z{L;|wob>GMb2zT)In&Q?-Z*poIO?C$QKQ5E;+_pK3t?b;0&rZQ2nO8e_Dj#U3Hm(g zTEmU2!vo!oH8sboP9cPO0!6V(UFU_4?xwnetil}|RLfI{f(r5oo{n>~WNynZwhGUz z<{{_~nZFQ@4(S_f(Q&FeiKJOgS#@J`D~c(7^*f7;vR185-b(yh6hL4W@7h}sN?+*c zvM4OIWBlrsYl8C?>eivw+UnYqCu?dds}3GPBb5}|I*ybVxBmF%#~5&(f=A5*0-ES*02gqykj5M!?e@Vs%vX2FZp0coGNq64v3+(7b?oZcm8;{U27OJ>^@ms!h_}= zI~+L&1Ipo=k~>v!%4m7GEo~C{-@;rFVUDsiQG(i+4aCZPMvZ@2je-DA|&i zT71OT5zZpQXjazZ?$XuUb;;`7HtfHFJM{|oSFQ{+@^rhV_VlUKXHVAZOmtt?S0I5? zSyfzg?AT#8YDDk|0>aAgtaJ~E)#jbmk6JRpnZaQ00-%9lFON=qMhxuZO_Pw%`ZKGGN&gM-6UcEBfcDkmfTB?3oaqL)a zBj;gb-Q)Vw>XWDwm!GU|B#8NixRT>iUZM2#+>)DD-=-Ia6#WW#GQRbnJ5|Y@%kzWB zE6+C2d@|jmrpAhb9YqBh1r<6Sk<9NY0p)j#Ub6PX+FG4~tpOGI-MILP4sUBDHd z9;m2>3#k=io%4;SYYN^i*rdrmc+x-#5O8JRXKAhQjHF2#be)Vo8t>}3NJbiaIn;l? zvhuKWn4>(Ra=J!%dHPz~b!9t~(l@2Vl>+k=_fuSM!A)W7nNfbWskwa=e=$Nu#;=Mq z*XYn-UCmK8rDZ4UbZzauefo};^QRNycc!PRc3kMxTP(0ta7k~?g^+{x*y(dEV9~}# zd8WiLU?vQY4C*h`A4E~J@?>KNyX;mNmWpyuYBr>+3-%BznrALhm7o#qZ5M8BJdaYf zei-_cVc1}$(Yttb5@@R4&zYpM?nG_7uBGK{N5_fE6P=ob9Yq9LhO8`@Mg*t1!%jM* zYv#Jb00oOQ`1c{Wosd@_3==A`EE|UJA&GZ56-u1O@y}cxH_H1X5 ze!yUC_(s2gfVd@BXm)lExfh_25t$DRN`o^)P}}|q_3r`0<$irndvi-`dsDBzP7gVp z{`A=v_@QQLl%#%Wt+=VQRLoNbZQ85T({gVHhbV$H_-0_3M7|mw8-}QvPKV^Dp`)X> zW1zFIp}sP&rK_x|NrdYD-LK~^OU^Z>v+BJ~2Tzj3Bf+mlLEr)!9!7Bdr{VsF^BwiN z4jp20!rwgZ>#8rvtKMTauBvUpFS`b1Z!Xh`rXLnT1JRvB5c3T6 z_UcX_+jF$yoUXQ}P2bxUy*sFQYiMM-o}Pl}NIyj<*f=iq^n5ove~)2&L{Qic|6B)7 zYeV{;?#hGQj_f%I_d;u1_t7P#aemwL3+rcf(WHJ!FPVR1q43b8Wae!uD7`ig6ZW+$ zlz?(b!;@FXuk>}d*6%@UZP%`{Gxc?CyHpS!czH#~eb5Q-5%O^QK5#{r-q9I3n>TM^ zK_0(4c8wBXJw7-v%G%J=sS}$){wq6Mb)q~wXPM6;pu%y9CoVSk>3h)y!?oJEuFlNc zyrrm-_zjt|Ch&t|z;XR`UuR>*;e&h1kVZXSb>eVl_VPFwbo`gEtnbsy^#AH@Ic8yQ zYZs8oGmp)sZR6L*W#cnfuF0-FA%(#!S4Is@Rh3fZH;0c_RGg|T-~XXHW4X!~BvM@N z*-pV6^ykjn{S0UCglrVe@=Axqu9&rrwh(@q5`1guX*hDUvWnFNA?6RuQr9LYEg>HL z!gqB=MYYi8`lk2f9`3~bR_ATnoL^9=BME%kwQ-YiY2+Cq>wRZWoH$w~tNLAaRrP_a ztYj6+s6IZ+j#V7%Y{g0T^i*>(W|^}&e=`gW-Q(9xuNjX^S06xdeMMh?;#id+4nB6G zIzA&dHD&dZ*4G zMr60@WXHvhByDPPQc6l{#o?BET@OS@eVrH0&E zE48Oj)>T)ZJaw|Z>vG?@6W1>DZj=SRL)SBU<@0M@c^YkYM#YC!9r}K}TmSjpjXM`uE8?=ZRFB(+PXSu*Fd^oyFGX~@!cJTTWZ_jZ5tdkjC3{D?=rWGjw>v0 zuVcN*Veam_Koyi9_qSSnRgaiE7;;7{2J)#Y&%|> zyTHOT@BFO!PqY3;q%bVjFlppB%-aUa->5^pz8}W>;l7?zg7K?GxR1SatOSy~Be8XU;Xi?}=w&jn(VwYxnKh zlx|_?&8c}nHt+;rH9W$E=$^%?2pXq@fogQBJ?osPV|JS$&%6IJO{y=Wloz4@6wN%`k{Nq>w$0AHb87 zoo#KsPc%9%UpDlTC46=THXV61)C5PQuCW(M1K~rS_FX*P)nn)z5UIZy?(eOx+ywp0 z6YIDp;bcYENkcEi(mTutWFvP;h#QTjde{;B2Kop1(2>rzUScA8_6Jn4qjWR!joI0% zQ$38jQF>EsK1Ym4W<=G$9MreBpVzVd?i?8C8#0`#D5-4h>FFnXGPv9+jAhwB9Bk_u zxN? z*tFs2hOnG7@&sDj-p)>DMnAsfNqKJkl8nqVgmI|bbIRRcOSZ<@-`2PE46;jNoC{+d zt=K#nk9Y`mg&yU+6ne?kasZI3gskNk7QWZm97vyghlCKg!np~A8ucE4lvOXIfI#UKY@^&<29_O}*xz6YPjbCd$Qiji= zqxv3pSr=P+I(zq&W^F3%xXktG$jI>Jfwt2^SANT;)hebZtcKW`2|NAYdiq+rAS>*q zwp}f4XO88UlxA;fyF4(&*!{j!hYosa0q-l5*=C8R!c1m(s_$t&+uh#Iif?Rqbh-6F zMRrcshKd2M%1lRoFtmKQb7#@kt()_bTj-Xdf%yYp3#Q9Xc=Xh-g5avB;yq=9*CHt=V*GM(tS>MwTmL+{SG@9WqNxl!JR_D+V9 z>Bx6OhO(U>Kr_9yAO|bPF6Emu@CSOJx3ztif3mliiNmg~q96;g>cXBbu`wTJj6Uk! z`9VQJ4q0Y1grzYY&7kqnSL{0b`kGtnn%betWd00az1-B2oxCzB=^&14WX{NQL;v0# zJJ9x&3XC?(jb28l6z$u0NILY@(f!5SGGkFi4hRm0EK9J(Y0}ncGgqjP@iT+m;r9te zyUGt8+Ouc>zWqhHv9O>A1_YsV7p4e|O-M#*DMxK#J`W~^8KD^UzuNNs`ws1aa%A7W zlA`1YfYCu=Vcr3*o>3YVA5YPG0wq9vY%YW@ubtI<_DlO`_U$s>^>s;cZel1(jRD9I z`Z%j0FhZ3oB}HjDt5o#HSTMl+HZ+fN?BBD0&%XWTyYh1(g$xZ23=LB(@>WH`s{}8R zzip7YP#%-a?2O*55Xt|R4^#L(yNcdckwHXQa73W1S}mS=v|I;uSb{2kq+V>Bq>y>buB7lo4cneKm6ybf*4C!jO} zgCJLmTfyglqD=mQ3mmMBqTSWWaG3m45tOoP-~QPQsPz7QyHbFQ!+rP?^7x3@719c0 z&11DyV33uiy)q~;7RHpnQyq0muJ|;C+P6no?a7M^7V4wVUH!bH5uQL@?9qx?cT-fV zj7;4%8h9|CIY&fj^7rj4r+9xX7eDvyDa>0D>W1>^Lia$ppOT>q<)Y>?+>1hpu9%6_*s|u2CcPw$M8$R;$shONK>io>35k@};RAEI?2r{b&;VHliK5 z#gOF`mz3<1c73s@SQxGdbVRt-Tjd|I4vwX0trm*EG#EK=(M&OEyecj%%7d8duTgFcU6{LK!cw$R;H`7D>Xc|WZdMdQobzywIw3J7EeDdT zZG}JQNxsklZPaQI(en=S34{y_rSr6m47E0YBm73J4Ajy>ot%=p4Qi}y+X|s5k`?{6 z7!~^bJb0#}A|g~VKFq?beBelF(P4tThtI*ALyk`^V%KfkMsA|4GeyO+Vp-AaZP5Qn zx&KU{P2X0(t&T|9xDngvXy})=`F#R|cV@+MCd_l;{1wvPk}7#TyeR9w7Ew(FNd2%?zF zk8{?mO^pK0qT=F;{=co6(OpaD*gVQu%mBb1mGNT6Zhqd|p{g+VuuzRAA}W7h=K4i% zM?rKmCkyVSBEi%IXU?x>3XN#b;$2vao+*M_sc7RyO{kCEBKJ5=L|95Lcl*otwq1D4tTYW_Pw^T}5gp*K6grgt83{SL8_~+c>^qt9yjaxN$pVkb z4>H{+?fZ95TCBU9E5RD@UQpm-_C}opQ`hT_i9QG|zLZ&|lpiXWmCx)uBs=s3v%-D* zcIB@K@Rq!vx-D{d=lztUGghyo)5QMgby|cYxqXioYtf;KL;G>*R8qJ$ky(CLjOQZn z0NgCqzbHT!@G3AM za3MyIecXN0lJPrP@I|39D3fH+{A89NGCgEmF75we*ShPo{n`DKKdvv$;a6<`2J>1*TOiBMi-h{UTKk`S`M25cOI zFKODze4Uw2+iCx{N!q5$FXqG)~gAN$fbj+v|UhGV`r}g!kFpSjj>_*?*0R)d>9$wY0P!HzGHvRX<#o zdh+Bj937d*;Ktg66p7fcq>^cN`p%RE3}{wt4~WmR|N42m!MGplH@E1G&lyfXXPr7- z+uV3aug8?f0%d4vsNS7P>OYD4xu?H?_ppMa4Xcqo#r|9CL<`viG$ZRK$lvV41Bdqy zv~(QTPuOSdc4K8R__Fw%$L(X_d!sD(Nr4u!7V#iy8EeOoVR0s8fmSQrLreSc@v$j* zCnz|4NDRpbyGd`u(Q+*humC34F~0qC%VBUtwj6qHYywJB);s!vij%`*`qQN72Ug>A zpf2Nc?j9!Ijtm%Oc|cY%D}Kwh{|2S>wznK^0E?pjwDB}Pw5RVla=DHfu(YCOyY`#_SwH~!7i}x^l80itV|^>JOnN_)QsXM`XGv=yvpOl zr(c-Ga&7%`ABK7b_TTGI_I7o2JvRvUMWa!v%I0ud^e|9#Yb=^l?e=@bj}X7}OVLVZd-qGhd2Y!14}4!{_v% zOUw|XlFuv0#->oN#n`LnL-JnH;j!muXUQ`E$O`X7&E3X7U?6t;l(7#E^R9kS|J-wf z$Og^l-2Q9h6iPN8KCY7DpMS~f!e+)o_COZ0*Pg*-OtCyP=s~iF9JTsEsNJXCNi6^K z!-gqre=LXc5J&+vzG&=21IV&unc_{|w_q+|PE%9&#!fc2pkvTW_nsT*?K7OLgxNn* zsfVH9-RCW}iVOkL0`oXubdY&`n#_aKeAwkr?J#Qus;d^cm2)+k zJ~HFS`YKi6aZ6?hCBkIXU|Yh|NlwEteM1Mb&tiK0CkPXJ`?{2Hq#Cet>hZy`;gdOF z^A@IXQ#c@;guTJ2PK!=sF6ybi-++C?FpT}mK*w<3bD3BXWxW$)m|=G7#OdP|Bz-%) zEaxsJA1D|hC?tZ08^ijJlVDsNL~BoW9Iq{+r0A*R6Q?aO(z|^vAX1VcgDJ(ihn)-Q zE68!j?ihyK_YXe%EEZhe*u#mgY!zDcP<49DYUkTO9qRyeU6g{9r<@LqiREC{OrD7$;i4+b=@;PsiGCkr@6d;Qz=nZdqY*nN zqeb7FL5%j)Si(4nGU}O-vQ*?8M;?Ql%1J$)0Mz zH)fP0Vui~`I$`d+bTq)8k2vW`f0Q-odM2G47uPOcy0ns5A!$UoiN`CeiIl|8k?CV? zZDS>d94c$ESac)29Ps%A0XDuKXU`_=lVj}I*w9I1cm*#V7m(x>4+E=^{?_U`{#;o{ z=Cqa7wXL<~Rpj`H`_|W1;w2X?+*r}=awQ!p#wrBq$@Jf?uAG^ff80$P|oT) z(vu*C&&7?E<#;%eIG_Lgx+DdRS=8uNg!cK?D?s0i2&o7b7$IeE4@dRiR z@JZl#k=SE%<-*3r)o?5j-&l=bSPKUNo-n%*Up>1VMYfli|D`o2%Q~F#0LwD0-DGFL z9fZX$|TFxKOwod4nSxS0qPOe`e=fz6Q1?Xo+A z(QqULLS;m=TtGsJt5=YBX!{DFYj-x0ekp=%8FA?Q?-3vPm>f>0hnb5+R@YWmR~Hli z>uZU*$g(>S@C6vRopCr907l1C8-$-+-R5pnTemTQ>#J+a!C)llrrdvEoK8FISy;rV zVq8}e-~5NI)$Op4^*{;60mR88?}cr^y6<1Rf_EoU#@kz$FK(>IBf&s0g06Bqo#3Hz zd15gP^XkUA)o=YBz_KCd93B{gNTlWSE^c1Eo^t)>)$0%^7`)3D*P;>Rg!)w|fW%Wy zhl61~cw=8i6V?+K|KS_|__dd}k;BXD4%3Ob@daj%iC?`gy#5wZdwUB2=*>tZ z6d?()g8py_SPWQQVk3cz^|kN4y!^FSu3y$!=c3U_B<_iCY+M&y|6{UJghO1uyt%m; z35J6HfIk5K>P3JGsKgDZjEps}1)`TOB^*x18Hg?gmoPyuLE(GXu3p*R2Ii64et7w% z&E*gkq5_`>As>xJeg4Gi${MxyQ9N<+wQpUyw23@xZWd#@Y@cM3;&+Mk=H*MJ$ijCRfk7)yALW}{0OEZ+6Ex36NLHZER7dSO5( z*CS-KgMmOO5|3kELdBJ}Sa|!jf5e>~!>Zq&s%9abjes@<-A4i;KR1&ldm#3perM%DMGOd~J36`fFcbW<7S3)#^>wPI)QM zgE=+ALJ{x#82C=$vvabGt8^U;0YGrR0EP$M9gZf|_+%{-y|TG|{rlfOA774I#ykt& z6z^TnoZDDRV#|;s9o&Xsy~$E_8=xHI-}N$VnDDl&6D;w@RbWeByR?p;Shl(sJm|r@ zbMEezJ!uF_9${(#AQvF{U+mm>Y|ab(mzxO&?S6RRNH`w9hyaDHZ>^nMMfU~?$N_wI z4(mimH3?S!|H%`!$F~a{b0Cd}vv9iD#g(;iJQ0gW-4`}rg(a?F4!J#;iEiiMgs!m+ zn2coIBH5iCyUGW#N`kYF>!jxXE3y)at-^V_!rQN&gB1eQw&3vvy<;Qg?ZpMVK@5-# z7k>=Jg|fF5IlWj*kkD_=?hHp0;mCR*;dPxo2eFkzARYfsldPQyMEp^}Cmuu?i%cls38=LD>7Zo-mPaW2oIrWx zdHIL!-oP@f>qZnyTX?|}++d81bbDc#(LHArRx*Tz-WMY9>@G}wOjG-|ALuugTz_khRA_%6+f4WrXjILis zdcMueQJtZ$+Z~U`mcyYY65uOH7x2;$T}kHAe*$D82WAcFT#;xbzhfkX@D}8_vi1)3 z_JoOFTMRa4VNBBnl;|NEN#ZO&hoT?`gd}0gK&`7}8BRtPUp|S+>wQSz?5I!|2k9TuK@tfdw&}9IR%D zYx*MsyE1Z`b-I&d6Jt)R7mM>mPo5IM7Eu}`Qq#Dy+prk)H`Ic)ag!2_O*)+kpSM^{ z&M~^GItKyx2!s}6tR6#~^PPsIMCAo~T7C+?ke!qswEA6j$^h4G#B9 zx-lfHhl)Iq+`+zo?hFJ-vPi~iGS)Tbga1?}OOrx`%s!C-5#%I>T?A@1)JF^pphOV7 z$sW3xg$3+z-nY(;9o`3elHHkzcO{f{LNUV9(-83uT|bfSln{!@OgX6>ARehKRrY%T z>zoh|y5V_Djf6jza0-GvD;Y8`K(C~T?n}|OBo*2d34U-Na0i41!_dHyAd$M<3>#!= zlclkOkO#{Z=s!##G*bZnH&QcK_=Q-OiOh(kUJT}A%!>cc0C~&FEU=7YVyvgVAd6(E zxe3c9@)Gc0VERD%i5LOHx5X$`j6h}?C?|Poe905if45}Vkh$k3`wO%=N+NxGH+ZL@ zX$Gi5pus)#7mQDY$a63ii4i{}2EiR@wxplRBuUXeSuVol5vT}@yhYdzLDmQ>BHSBX z5hdh;j|==ra9kt?9j&L*en*geNjRd+fn~T4s*;7{zrPen`3%SSL;~?YqW_a41^^>r zX@aGoKawdd$(r$4wiBn?8(zYl2OC9~W6p!NdY1&D&oXJ6h$s4s5Th$j2k|0IpA0pI zpRgcMX`kU=JETtgWUm?rOfU+dPBJ1Ok3#_f`@v(TgFBGS2>5MD8sTl0Ws+9$(mwj~ zr?O0m)6|~>OF|2<2tn*mq#=#tim4itT!CK+iad@D(|f6pusta-VsQCM~0g?LRb=XK%}d@7#5zsGfe>F6F>rndn;39(dEDzuo5I4J0<&q zs7$6vvX4IoQ==>gAU2pgyb}B+zKK%NQDmNSMDO-H%=DaH*MGv~ppSPppU`>Pc^pA! znOUH+7%ua8*3G0aKX)<6ljEJmjIhlkEwI-%W1cdZ&9uwoqF-Q!PxR0|JxANRZL@aL=t$<1cn^P%|}?3rAyDbM^YIoFzPNH(gQoYoDTIH5Q8c69gX z^e)Eh^UlBEa?iVGT`qSB8!eOxRVe1_yl?ge#${!uZS#!BLz_$%i{s4mcI3DLD-rSu z4fGo)?Jfo-%+8`5H`${3ygt@DJL9r3IKj;03Ee({^gfJpe%4}jnjE%yn{H%acw9eD zjsFtKc7|#Dl#2mx0X_+|EYhL+W*5Ay+vYU8yl&URyv=MLx6wG)zcAylQMQ;VFt4ML zeBNcIX#+hxFl+#wi#HnbVS_mD^)2{<3n-SHtmlHJS9xuEaADZoSLxuqOp|N&1ekb1mYHC=N)!4W&YK)8JVGU zBO?ZSe2Q_+pa~v^z4X%M)#XJb*_tq!k*>;Uq+f`}_%UjU3O`vSN3HppdDk?=e>-h9 zPlD)Jr=!PbTn?*e9%CHZzJC7vviF7Y(J9<)qK6-j8@)@h)Ywl+<>Z749c^Zd*e{O-i!|9kZ zG49!UYW^b^!@jy5_WO_s%}8TRXNFH0lHzxXv@hsi1e)<*gFff96}6kE>?A$b^bGL< z$g%DDCgAKL813j3P$IU`e%kRo28$PadohZE!pX?n5}jv!gU_O zd*BK5=8P};Rg2DHM1riYk#D7hiCoGfJhQi(b4oq0vyvIGu%m;m5oR+4MVr)7| z<3TY$nrDb_aCw$qb?AVU8HBAMBl{%&pO_eLdkUL}U6o}A_LbB#@LTYLE~nXUp0c43 zL@aR`%0tcm32Y*vr$e_Dzj-(o&%-bDd-(u`*SLa+aj#EA3lM^WucgIJK-Fv>=0i>kgCQLq=PcsK?;OC>prkY%=gGnZ2LPvNXD^EeaVS)?I z-WwY?PnvK=j;*U;St^F zu+HXSY<7>Cnb5y*24b^}*=4uEg^eC92GJ2#Vbn&d6{r6SU0%@HkEBaxodsR%wA<{@ zKR@DP=A1U#Lbm%h^JGHPHj*eZ*~ z>%!EhJ3E2cwm4?&`lr%Gso2)PB>)m&c?ND~V7P22>Pm&^FOz~I zL=+JNA^UhxBc+Qo_Ouu69-nqI{m6yVqoZwjfGrX25J8IKKS@REq9+2Jgzn>XLgaAz z+Cet`h)((=+LP{>O~H_}svVuD^d|E^6v8e>&Ow-R@5yw7@V~%9=thpVlstt^KBiKtL`a$hJAaIk;|gxVpP}cV z8xGV^GRX_aPye~jY$nMb4TA&S+H&L$-jSY8PQrw(j1Sf{GVJ)m=>umNVrZm&`0t_K zFgb}0(EEdTNE73!mbTFS1EU(HPod9a1G=_NrWH62vUTPF-v%9zeUwzonewTjP&+2*X4rtW=E2cm3&Ny z%5il-;T8qc^EQl5A|iHxqbX0wPx}P3MVyY!nsM|*Yi{8#FnUru9)m0rERaxBOrG2X z_t0CgLUNS3mo63|bO#x=AWVthNl#14wxsU{85&eZ(KtDRq!`EdBsClt@E|T|v)}}9 z{XppRo)G@8-;o0((K|hT1WR-aG$kv_e}926PzHzjM2yNmLgy!k3u`9WXm-F*&>2FU z$?g*$lP)<$ow_kWIPQoQkYU7_?!rkGe-)FP$G@b)iGnTmx*-)tvJ~e zgGXZ^2F_=gG5Gi z?M{B{%pqP3Ycgp39wa*+HGhmzB+~{&%hG*vdHN1AX_E@We#L^jqLF^E1EO~XX@4Zc zjlM>^NZX0wsW4~I#jqJF^%1dsvEY_WaH^Ax5LN}8-LWR6e*t+h93d%&O1p)7sq|e^ zq<_G0kXAk-HKwAY$Ryo}9m%;D??N;aid{m1@r(WLib4mTXA>Iy(=4f}j`# zq1j5cG86e6TA83LI^DZ!ilVsLXDJWKQ$OFGzi0|a}{}-UJQkHkwQPkPK8hiu00;-z6kfeVp9F*+&vl%fO%@bz_mcY-2sI(z+H-5IWazI zD&Qy|5^-s^GAlbfU2(WU!I5Sn-yg8#1n35^Hu9K5@JX45tD)4lF;IEg%1pQv5!&|w zpPQ17k;B+!DUKggXKN%_pHMlJc*Fx+FI9;wjsRp6>6_}3y{bGp_)E*Ooo z}UTPP**XBlfq9G!CD@q^3p-BoKktStP;W+!1qe_DrHhQl810?#FkKZszRO# zz4H`%k9Bl4RBOT4;nlfIJ1#kL6{R!pi?3N^8^rCl^Yk*oMOUiv&15iTSWGP=hNnGL^&CnGO3Z zOCUqZDCq+^R}TJcLFFHl)dJdIQc_rmYs~+?+k#i%rxMCxD6PoOGYDlxMG6e@9ieQe zXeZ`h5mdfcQKr>sfRdy%4@-&*GvU`L;pbSng)Tqc`9%t``qW6HAFH~kq(F$;Z>P)>Il=GLy6P0WVn<#iO_xAifl0Tl)pDK+(6Qxw9 zE!0##*PAO(`h^ropo(3n;t3BQf0xJMO9+`G^2EWLm1)bghN3()Clh_hB6~FM5w7fFG2C^>r^m{OV_wIoap~ z5g$-mka6ziyw6Y1Qc6hJxs0=?@DN6yP#SZ%m;p##`hheHA;54$9Es)-VfqC^ErpvZ z;&BQ&A4p^hi8N2B;Bj_?emNscAw*IjGVk|r-lLFh7K&rXgs^-#zuXK79~{bf(8287 z!}$Pwm8d62k|`Eu3OE}0RA5@A0vTAapGfh6M?7IBy6g__=rbfKT#*VNcp$?2q7*uR z$`!%`Wyms>*msK6VB~~HlxC1bBhc#sR>(}k3Vu%}7ZeF|$!{MDGcoatIG<4*uv92> zl^K~*jU=0Rl81b3S~TOy#T^Ri1+a+p<8MkLFWa@3qVvb+)`EiEh|P(MokFe4KL zpK8uMF@hAbft=+b^)Io0#N7N9=K%~*L4I~$AjF%J5VW5Ux#DaE?CJp@xu2xq<$Qu9 z<#1q_lVCpO!BcWxhQN0!Sh@G z#ChLZ(CyTZ=xdObuYweiSdYh-!wU;YzXR~W*`xwM#I0Oky%@cG$uVXe8W|hW1p`|z z>0)7L!aXuJ)YsNrTT@=4)dr&*tAGdrFaYQTIM{gqQ~R&tE1(pJzjPVc2E1C2I70rd zs4gC71EwKx|Mzrv9Byi=s0xNI;#vK67!T~AC{6$@1&}YGl#3Nc=&9>|D`lH{%$NBcgL2HnHIOhRyU!oHXh?iP0$~A(L}Cth$V;TeZ=Q|B=KO5LWpbJ<0C`Z( zJAm-L2tXoZK#b={BSSceH(yD_LyPEo0#XWl{4CTK#P5aJfXmKWON=#Yx3?*H*#|1WD}q+5!6kwfb}r%v*9%W=;ASqSv(T6n()x>I`1?&0YBo}Z#x}s zyL+ssr%z`D+V^v#Zpff(+yKl3=0LG;=p(Z5FMO$ z``l!2U(X<&%-2nta-%n~csa7U5dc2MGv|tjqtO6VNJL|>pfApu+)>uK z1nB%fn=Ed3S66Gh3Fpu;#H#9^X%B2|u3f(v4f=o!VK;)|kZ#uCNnWZ_0 z-)Z`?Cx1@RHctJqW9?1HIz|A*MXvIm)|b|=T)euq0SpvueP{YOI@a6OkIRE!8Ty;5w}6Jbc6Dnd8oso;91pIZW25o# zax|LQymVy|e|7p<0A0vv{-?>|c`*og)Y014tD6|n8&9@0R)O;ap6cq>wb;dYU^yCz z1)@~+(-^uFTEwH#MK-}&oivx`ntsCi!>n6p8R{{O=_Yi8=z*FF5NB*4oc8*)3+st+ z0?$RPKM`IIM zwS5sdSStQ88-otOk@^7a3MCe!Tj2RcYD~)Xdq9p>qRtqwYB9(+RWvo#RRMjvvHsE~ z_=&ecr}JTaWrGDbO$^XF7IV@c_C=N%69f4lne1*S!Qrf}##e$Py1}NZn%eeSz_pgP zwk~a7-@JT2aRCra&~f?UEyI{p09&$wH9T@y(f%h6H`o2I%Ynq&N^I4m@9t=8t7&X) zymV^2P;V6@CMvI$oms3A#a== z92)BCXm9UoK_Y?8>mX1`M7J-jtw+~a!a!sKs1yvc{sn-~9uoW=5F2kfoS4fNQ&Gz6c|1<51$bCC7z?Z{%;`{jZx8Z9_BS6MYD|2U`_=CPX%|df*#yt>%P(JnO>g)x zFX5Mc7)TE=#U?yYx#s3zqRT<|#53Kfy|=5ouMb$P`1UKC+w4Lpd=UgZx2|3P$}5B& z@@j~UM=*dN`}}O^MP>mh$n7qtI~tFM-6xSo<_Dw;;FU}fnEcjOU?I4W2wc3nef9eF zS6;@q#8!x13j;301_L3#$BS1i2QJ^8fkb4nAKLfzBhvBJXSz>1A`ymJ_eHlnFuF^a zi2xVBym@5>i?SQ5HR~pJ%mPdbM+l$jm}5;7eMx!L-qX|HJK`Qf)sb^^u$0912D;Eg ziC^A^l|`d3GNAqgxTk(AAH1zfB`g)J`_jh9<8ZoseHUpuk+rP+y z&S>-6)vGUI4zfYFC%E850eAxUIKz=SLP5%)C3u9;Azs1MJ!xp}X>Hc&tAc({AP(mr zSh;j*do6kq3!ew{bQpN28&4)!!W<#srvm}I%j9ynJYJXIV{tb%cQhJ1nxhld>zl!7 zeEDK5c=1wV&Bp{oPQY)m<^kb^`UuF$4nX}}&;fVkMsx7Q30taftgY|wpE#GONo<0S zYw0|8SR3(W#=$~-4wvtEJ)xX$V&q`|RxVdu`8FiqtP|S1hW7jK7`GMX{5Gv(mHb1 zrAur?H!mj={U+E8<++ExbND@Wuru=99*+N9klkXhUEAD_u~CS+-58vJd(PT3cDR&v z>shwf6-#Vgq*-0R!QzRsfkme$>~b)G?bCrddtfVZZVRq{`|5@@%DT=2W6yd5SZNPG zbFvD|2LWSy&)i%jF`?@_iI>-9*xe)zkQl_r#ukG1#Af8eHDK1?*}A&v*<_=aqJC^$ z0<2Eor5mZnY-V3PytDLVYyxI|W60z}|2r7kw8SuOBorPC2Uj-ME?q$Z)U|)Re#yJG z3GVdha?J1ZGu`cd$Ew?&>0k%jWvXsx<1tJQ7Eg>$N5DB2hV!~LMvoci!V$zOkmZVd z{ryYPwaqJA0K5V}{i3_69ZNxVbEBoXLxyA;|0lnxuWyJjaoU|88Uv4jQpEPzFUMC_ zwyr1FyX)5w1VCN=^Y*pP7;a2FeG|lg2b57p)&ZRh!7xUh zi80w}qti)8*G3ZTiwSo1$~qeV0hY}5jkUFN31_fB_{_<^+Ll3tbGMQLk}#upWflFV z{(fv$9SDl>7@43aun68Lg15^}aVg6-{1ZSC#N9Zl`ze(uX6 zq&v%Z=l2ts1mg%q=!IYaDB+Eb7qLwX#8JctSiV=tu_UtKZ0qlBLt^5Nw(jnZAwZYj z1;Qz-TxT3|`&l+(^+!Fxv2JZ|T;5n&bCUY0wVQ}RNko^t{kry!wwAUIs^j6vP+L2x zJ{{;TO7hzOQAyLIXErPbAqwN31D28Y?cU|v{Rl}nqPD7{6%n0Z*C!Gy*w}<~R zc}V*4_<1-Y>*3~ub@k0HjkWFMaUh9x{W8TWZzoT7H!F`hzrL|`d5hY5=W;B(?)G~e z4!;RoF9_qFABkqs0pwv4S4U5)yzA!)ZS}?V3xQAq z{DIh0AvO~+h3=yswgPfvkxEJkZ(J+0&z+x6Fl1%-qzx#i;A*=u#sS;673S10LrY+vFsY|6uuhA*lfH zf3q<+>j?Tsdb*Ex^mKGu%%MQ1)23sL9X&@|4peE>Mf(a1Ee@|6fGA)ifD*wDfcHPO z|H?Ic#^iMcf;dXzQNCkj+7xnhx?Hq*;Am$@YjaZrI7#*uTc%kYm2TSrB*5x}{l_dc zfARua@o&HnP20UX^THWg-_t)hK+uCdoqEUUss7`~J5k1w29!|Zboqdi18DXZx&bXG zjVIr@uJ>$?*)ziyZx9qZ!-FFuLOwW+k zV-X^q$aDQO?U*(`PrK)7dJ?g~`Vqis%)_+t#Ef$o3P6PxOo6(2=PbZNqZ1P*m+b`x zz;GhXb-nAfxs1-|k>?h;w?VwW>+~a|2AxSyn@!#Qo!rh3QTxGzhn8G!#D5aNj?Fp4 zjKU6iOp5E~3wGxyV)*m}x`9)`vrxJ_04$CHerY(~$?N>6<7o4d=BhB`nzo|r2_(xl zZlY1Kz;$n$HtUD!!2#|7HT=156nL*elYZFLeH=}uj^Ai+ZEbJY&e~vZHhOAul%CYl zqv$~bu9S4s>hDHDHM-m>^{yt{&{!j(c_)vULa~<4ix?N z#FWus1B?Wq6Xy(>h%VProky>;51#@x2=J8vBfYCwgp4W{G4^RV-PYob1(LWEIG8zva++R1)dAz%) ztLu2@p*nNOHy>jimMP$0Xs^XKJvIBnJb-%hp0gpN;rY=KlWyS4p8Poh7U{a`>+34( z8#;P=j`wtTH}5AAl+lnEh%eZ_cN%+D=d=xoDFCKC2*!lVd88jSLWTPfN35-$(%i*U7*2d#p;?E`@1Aj4+-GQq%Ql0kK%YNs#b0$M8i*b;n*TX4 zGCpR3J8Ib9a-_4jqpQ2Ero1?|gkv_SewUoA%RJ+-JIxNt@u?Ht2`yX>hm~gNK^<~; zatD4wn{2eP^VHGifu7FZ&UW;Gdf(Dg)C;cP*wTWBu`v#ZjW#j18Jpb>6raWBfMYZ2 z2Kp(8|E7P+F>Ns!Pn|N-!<}$zb(K}>eOO!_(WS*0LhM+eeks?-v=cf2H9G|u+caZ! zguofx&+DfKeh+ljtV8DnGS3P5%6*lU+G28a_5^&OI$p#P_CwdKmmW7xH~}Q2F(*wn z1c@6443PiPz_3wA@J91)*Q}+Zv%Rtyv^5$a)1D87{EIPP5J7kVoPyiS1aE1>qyn^* zHqYw~^dQ>*WW>ld{_BjHnV)sK$Ge&u4jfRI?=ScJy^h7ud^qG<48mi&90NMq=rCJ= zZJij$ZNfvZ-Z+W=kDMBzjQ}Q?9YDb`wiYyBTe*LKC4%C-iy@D9;fz1%T>vsu4~(3} zVzXgRPZErw%``p^u8RS~FA%$n3-ca_XVwP% zDF9g(3vHU5;7&XwXhYl~y)~l4Ts}46pzSWlk%{is&bIcRhK7UH-o)9(xNl~`NaJqO z=UG~Gg+pHNIK0C2^wi`8HF1wPKEOF}8Tpb)rz6266ZI|4%|{xJwAD42|5bQxHMX|w za7~Z9qWa0vQ5rM_!`R#6c!zoJ=&47#&gQ!2I&F2iW^Q#g zv1*=}H8YFhqkdnqBCGBIMjsNj~r}j zX#wWUwRqOINKa1NSlo!+TEguvp_+_N(=Iy(@Z%{HJw0ZaL`L&rz0T-xIc&zZW~%uI zqzmAc2JA5TP{=%KnPkjtbTJx>AtX8$V?xvPybb6d+G3tIjZcij0}PDlb!NtHZH4wN ztzf!(^-xpWh#mLDo+(FY97gBIOazpA*%zM0qHM%!O&f_F(}2#x5yB^qjM4+WElGLQ z-rU@Jq{Da=Rol;u!cv$;FS-!d0?UiAGKXW#Fg=N(8y!XGo5oF};{ahB2ld0JbjMp- zJ6n#_<7NsAQO7_X<1l*X^U~(GO0rW0A!BqZ1z#YXKFx80HW$V zb*g8e>BRA>=KWQjUBwpDxY-5gZ=Uu07v~);7QS(C-C^K$#$g?Rx4MyOpvBGRVf_G} z6~-s@rtwq8%BqI)?uIHyZ;8ieakyq!r-k)1^HT=Pv<_fnta*TJp+17z8b~` zI@3u1piYl98#^Alv#GeS|HKj3WV^%bL?|V8cZ`dMwNt|nagRL=`L_W?#Xe@zFmlG` z32YAIy8Gu40gPr?_|6VUyxy12VgJM_&xO9h-rKn7x_FRt_99m z=n%cM4bg;RndJk>vqUj@gClg}(>CV>Ur^X$$*{U12=|>C*Qs_62 z4x2;F8ASia7Ng!l2d$q&L;*c+#!6d#sI9nvpv&A{*E~9EXL>tZ+JGFMf!&?x2j&gp zJw20_Va8`)SOP--olw*_?xP)khY4F3Gu_#Bu(P8CvzZ>Nmh5SB_QI@h939Z3|3?h{ z1J4@_#(tDwv&?$u{b3Y9E&W@}KQZqE54&T=X__(_n(A8WOAZ`rpxf)xpK8*T<7m)I zBTs|$2sW# z;HIRRf7Pi!H8|YeIbawV?(f#=`W^Ef4BiB3ci4l*e}E;^@Z6gQ)8Sge&#?78_-0_UN#`Rv{?r&f~ zNSMzV`?T)Bh^4Ns@<3f(RYPSRk^Zs>v7`tm;*QSFe#3~_-alzE0}$=?j$xZ-cA~)cX71LEb8n&YQ)W!ebD3>2TV7#=nZ;j=XIoh zYW^l7ZWzb&6Rn+f4F_rtG*Ar>JB}WxBh`xlWTetR1HMkK+24b^GP4bRjZFe?@pp*V zanT_^9x2@3dEB;J+mF&MNA~ZpKiGYusqPfwF)7iFBp48}*s`4&`Gw^TgHsdC85eq+ zL>#>13wp4*@y@ddHVTE@r+PZu;oOhbR5n#MbX2yGfHH2{hrqnyKZG~$+Fx;S*sySh zBtl6BTTs6D#$59@J2N{EZg_^CXdWFmOxKk)G?bNBRkuO>4uJW|vo*PA`V8>U>^(W^ zGjn*Z@cKdska^cf)6VHR2BAtgUD6ihOSfA)_gB?uDzzHDh>xhYbg;Sue+(T+cy#8D z@iTa8@GS;;!9VyWO%~ebvd>toSSDQbRQr)5H5E9RRUWErBF#^R!;zysLC*pn$4mc@ zx^a4rB_S$7Y!q;67)MYB2u-nWoiUn68V;6K9KfcgL34z(o}l9Rl1D&?LiA^fx>@%b za43Me+Ur4F0X)yZI7xW!nu7}(tgfoimQ~f1YwD1Z7eGt&8(_~+pC{p^-_6W6%z3<_ zAi{Fq2|8^aqiK9(#590SvE4gKcQ!OsRa6|%R#vriASMpc07RHHnnaUQk`KrYg*>BX zd^YGMyR9?xPVdy<;P^OpWjCf~T$AJVq=2%ThKByZWI&!M4dN-}UJLhQ>A2zfI30e6{u=k{=4r+_Wy8MwQyq=aHbYzUf%>Y7nuh8l$3Fw=Ljaf<@G1%bOC<6X`7K~1 zR4VWzR;qFUUEp(WBENXqUf@3fo|6jrAdmYUU@=IFEfY#4iqs6T7-$>-P=KNXUzw(& zLYtKbV9m{(bV*?nQm2se1r)?6;X8#H2#A!V2!OvvE&>#p{6AY&atP40yz2d^4q0b~ zdsWKZoNOfl?_p%KGo-+}NV!r83BpxyNyc-6SX)s?6RiD=C5mK-%hJPKJb|AcUAAnJODdE@k#D$4vd1QNRi*$EzRHv zfI}2{7o$f23f;lE4*-%BI3OIRyt~eytTZpn0vJ8yRy&SMp z@xcR|%lWNPU8t`YZ0-&k@yRCSqOa<25 z%8EUC3W)-7uY7?*g1BTUKy^u;1j4xZAXNsCAnXSHDdgNN(`sd96`D#A)$RqdmXd$M z&p;hI2B=k)S6m3{UyX`VeJsyXq5pUpfba2Pb^=K% z;7H&OCCDjdwmeG&8LH?v>YZwJk*2b+Bv-Kq$WFk}1QLl*0xJTHlP^>fdk}K&W(pO` ztc+}KQs|E=nMSSDs^yvzOku#vh-C;xz>V^_u&9SBltKobOoMwu8IWtBp%rj`U8K>d zH0nIno}8i*)gE9TIe@ew#9IQBO(7UQi2%q$&1CQDFFXH#tap3?!wk(#Al#)eywe8sBEs5$;I5lLQRDRxY_E$93*q*refGq zPzhK@zjO+~p1}iT$S@4IavK`z8ic$op+cjruAnOZR8~}029PjM#!pqs_yY7L!JGm| z#^sALgjp$M-YDw0b-xFkPo&Tmg2K4ES_`{UrNW@$CsHv21m2g*c>t5i6hYt%Y%B^j z{1mZdZy8l~tD>@YKOvkf6Z7R#^!hzSAc-k-J0E<%h_#1a|62-EQ>%q3q7;R2Z<(g7 zvT}blzA4mVJ}}bou7qC!fI=c8Q~*B*EToj;{8wJ8OwEN66v4=W94%?PuKiZn{uUU*3^$`Nz! zgP|G-XO#Z{5N`n)#*bizd4(dGJacb`Xm621naUA~Q5+_q@ByH`$zdbNPqG~0AAbVT zsiH71N3}B-OQVV)Fp0g&2%47QzrigCv&>TDNKwltTq!=SQm9H4%00VPg{g9U5b6?j zWU|~$)Q_g}9%8j3lAi%ZEK_9^mZ-4eDqz7oI3K`pawHkr5{*oTNrkS*2gPKmz!JTi zgTiHnC0NBd7!U$me~d;6p`?hf=2uh{YBKondsrCIS7d>>g}*|Ulc7-W#Xo^J=gRm( zz-J}+*A3D+YDJD3Zc0<8A|5jrz0ZfFkYE#0I+}yU0MT}t$x=y?cL7UO6iWA00P+2q zx~z~}$d?t#1XzK9Uled210)OYltIRwnDUdIkhv!jWvP@!T8K~;H!F*H%0lpT%Q7<% zegGL5h=_b6@JvD}oyxf@kpjC<94NQ)R*_6us8s`-3V1Qa$tLBBIG>fsv$E7UVZp^# zRsi`7 zpYuQ{f%5S1Jk7_5YLN5QMI}Yq*(zlrRvu!*O3s~Bo+3vM{Rs^Fv%-=*@LH&pdl74) zR%Zi0dv{OHUM#suh&fgGXG*S=NEKO15Nj)d7)IxbQOMn#+`S+YE>r{d|8XIopCQgw zAmjqONitu#a286qvz)zqRE3%nUdbngDFP8+B9~_3nGAWykW z!NtS_3ng3&;U?aT?L~G@i5eeJtMY)0hJB)Pgl@=lf#iLVo2OEj0Qvt#NrohkOmbKh z$RedGc+)~m$*d9;Sy6J787gci;9tQ#o|-97;o`TS^73*C{qNqqJwma9gH049`3P!( zlmAyR%^q$ZGEKJQ3|dwEbUFz*mC5q*d-Dz7z%A$DmX4uzU2kngdA^b`7-3`o^!v~B z^u}MQt#9mVY3}Q5*B!1X&dDZw9&y@J)KfoE8P2~_UsvDN)NJZK)>E3V%*g>=N_K9V z?CDZ3`^r~q>gwuiE9m+IU8M!NxyS`h2wn>M#?B&d#BXZwyCQA7wyvrKcA1}(gLhG3 zZtu`5U-|mCtIMmjMfAd$l5_Hx{DNZTZt4F74Q4idx2d$Gps=J&U0hmRP*R!? zRu$}nK0<_nFm2Zl+Di)dl&GuJNLgQ^)jo~G?YBv+7dfBqd!w$jxU^JTrY@-}(w3_W zu$w_FR2njCSF!(Gp)FOHVp&GvngiPWf_xc5W@8arfNQU{aqa2|xl=gwTR9jet z>35^N4EG-OrdN<*^^G6ZRFp#k6SgovU(3^eUS3gqueEp3#Uavs5V_w;xit`Ke zVZ-=PRn@`xt4I#{+G}6_>QfDVRb5nytyWEy>)O};5g9!nmY0>6qn1yI`dFa~OACr? zbwfx7j#QmbUN7gC-@!7fDJjS=+*d#q+|4hk)m{EJvY2vT_4U_l%F8Rt3k!=1xCM`jP&Ac)zs}+Od!(c0zJ9l+x&lulMWqG20xJIw z2IfGOlgM#jzuAcKuPDXSX+c4LejX7kJz%~3O_INvdi}G;!_^1MON+@b3-a?+`1ON* z^p&Kp)axI$x6~i3E-&4;Cw~u-#aBVyH@^){kwUxucFkCIMQIU!v!@_0CGSxjWpZEp z?DaRg+Pm21_JhR*dr)W|KkuWzN9tr`X?>%6Y|QD`4etB0K*-!Me&c&ccJ#&@>}2l* z(|1@?f}t(W&o59S3Bk`y+uuYUs@L($A(OtlrL<&U5&TqsK2C35GC-%K65g{I7iPN62T+oP1{Ja7ArtY4JY%c2EA(If|^D{I2i4`Nofb zLiZgTLO$(%|I;zKB+@|Hw)%rNfBe(Nwzh8kPE&|}L61Cn8mFL-lvM_F_M0_T6>Ufs zQLZU1B27oo+r9F>#lJ_k&>E`dNiDwJ(P~JC<`?8Z?Cbf5H~;bbuf5h-T~k+GTUA#@yH38aF(^!k&snz@PF+UM}kyCGd<(2>Ewb#0uTH6jbA11%k zY6^;<&PMw_P}L^3U-`;wueBd+Za>^oPo}B5q^MMx!_E1%s*An;@+;qat)s2!aC1vb zW3yJ%TBE6W8p+mkiW}MR=GTAtdPghO>fyXs-_mlpUZd?eP~Vi7myfST-{1b=2XDLy z{OB{dra#zNT3*+Fps_T+NR?Nri+=m{AO7&o_SVDgO)YKhRrU3a^-ZmHSTXag>)-ee zl9;~P(E^x6OM7!;y|xKSDcUM3G&PaPtKWR>+u!|hGoCJ*+uLjFHN`dB^19l?6=izg z@;AQuCX(B>9BgcCKGv*0Pyw7$OPCQbF?OJ7IgRTB)2D&4~D#bA|| zA84$58dPbuODosD`}!L_HFfYzsIjyJ*(2&}%HU_kgQnG2zwv|D57*aM6&DpisH~~J zslF^1F_@WU#<9Qo_V-?IuWhW*BK}KT(NtG+ur7Zmoa}8;S(R!1e|_isx}h4>c)M7w zF0ZaTc(5#+gtmSlme#h+z4}i-(Dl`;iwia7HRaIrU|kM^Pd~_NiO0Y4z1RDOtQGr; zN=ZmwRc&2W4vB;PpvYu$tbhNFA$xy~8s5I3WM4&1bO5$)OA+xQ~iHDeF<2T$JW1Z!s@PN zPuK~2*%2d%U~H+#rI;I`DMFq+X^J9JtEE;cEr_5Z6-2gJRujN%L}W?W5+Xut`~U3y zyuH`n+G-V7thKERJJ0_&vG;r00!`jCbLPy zEIf7dhByxfQqQejv((1kYPr2fR`%(t0C?m;pB=%kZ}ec=<9uf=uGm>IIom&}rD}f) zz;`YzHY>;%bIpN)u2`|$!fx|hrz<5=KW|@_i>oizgxl^;Oh*PTjapkF&Y6H9?XOf@bl=YPFK>&SbiK`g(%+)t$w%#}z~^HfnfFv$A&81bL9l zuq;n^Uu=CnNu~~DlCWC3e2s5*pAXB!)5FWl6J>k7&H{1mawMl%w$?WBNPBlE;4EG& z56WZGjmczTjq(cWa$@N{L`bBgm#Jd@GhEIMn}(}U&g z!lGD<-uUrnP;lyL@RVt~0^nsKI)@fA@YpkNpTJN~^#!#?qxQj^ptGjk7|sl5PcKMO zzAr-$)`DY6rTXhTFMQ|c;(_mG0(=EuR5ybeYt9=xdKCGT@b0=fJ9{wQ0=K;dN=@us z7S-M~@0Y|0yE7Tiu1tzK#c&VYc1)@uoLY468J35e8+JPsbI}F8@hc?HN);+Ks2c;k zy?wl$on64_JMV&`DaK6D&ddgtN=;Kw1^D>{c)PiHFzHN+@e=*=x^E_tqpAN0LHGN3 zIHOP|gF*c1jK}NzV=aURky8I265;o{w}%_~5(kh@_iJPndAIHlu1*)P-`}_H)e;kL*3Ad1qRd6-0@L^ zT!jW|G@G_>&&=7D;QFdW2;G0XN#0Ia_Ok!JnJeT(c)6o*-B6-~Bjxx_>WLPGN}1(}iu7>DB~Y?abg;9v^Aw#z)76?BAvZlPD8kj-t~I*n#ia)?t0VviqVoWc~V0_|D52 zhJi^I?bp)RK63C)hPAr`e0|pY`S^Hyd4Lj@!B}gycG{b>uK}!E*m#@n-J*YqMHx(6 zh-nxRN1GKYRR~rzzd&CPH+Nj$hB%4wLUaFf_%sFV!9!3A!Yl(De%yV)0HX}J2adf5gAOTsi(V(hl4H6_D83U z*{3Q_%T>|q!y>{XBSXSjUQq#FJ~*(ow{;82{_v>ef;u{iio%K*92prA?8SfgV?W!craX?96h!jkg6|S=w?Snu)`wPvweeuLxRJi zf>b8_2-AqazU~h-8O{1hc~Y{36%;_;>~E-(TCJlD1zA4-Jb9XR`x?z1#wD zMi?03!%EuoaZ^h-NaDzzG<-w2=j%QQ(FLpz3Sv3DlXJSM4bxK>g(DBY^{>18`e4xy zVFw2|d-+t>U^J<_b>xz^Zy*caf?P5W@eTB4`n)GsXh4OhWBd4ddwIcIP%c+IygUMM zFWHy9sT3T@V4x0S`FVMI;cXM+$&KaB3c)c?;FdO!y6Xl4;XFJ&TyRWBxjgW2_x1@5 z^bJ_OqpU{V)unq24hVhg=1g;@+5IE`U^9pDW$LxXH_;C0{Pwa9}9E9Gj=TYMi^7Y}R`S-ycmzP2R2$^)0w z)SZP2&0FbP0z3(6w!5oOfFCX{qtKr$>?4y7o^97ea5e|9Fg+OzYvD*MY~uk)_%!c)H)8Ad~A`Jm`Wb<%^+tOY2=51 z{1B55&G#chG4GL!TmXeK&K1S~m@Ev9W^!E+!K zk`s*3=p@`tg8*2d2=RspJV$eWTrg?Sgs&}`dV`xGBv={pXaXYNG!Y&ppV374#4njJ z_)z4}Ad@)xb0L`vSxN*ZI2(LV6E29v1ur`oC zSV#i$U8&xgQhJ^b9dL zL`;AB@;?3uA>89VV z@u?Z4mt%PX(k7evb@&|r@0uYdkJ-GDM&#xw-{cJOwMP%{-TC2%@4IE^TMM)Qh8Kz; zKWr}DootZz^))O7c(rh{XW5$4m#)U8fvJ^_Z=bH#^y>7Ker_0V6_2P#llSiaY)~uC z_q2bW6cK`VM{Ie$+~7<9u(3q~T=I6}>Te5tHEqqW$X|ktsQI-jWp6)T<%acoQUdj0 zZo<&l0|wBUGdn^eapFaJQ(pgawzapjb0pcP?H!%Hy^z%tDQDN>=T6_C<}OudpVnZ| z4-M%JlPF{M{_UT@UrK>dlNTNl=^p?++!^*x5JwSkz|P+8OhTDuYis9pvPCM@f%H=` zsDlzi29z*)@8*sF#YepwWo>9s96K`5$JLpE_p z?icOdg9g0I=|Dm{2r|~eA;ZX%$4`EH{OEs2`gOXCN=d+$jS(^7{#XW40GdE^q}ji~ z;%sZf-0|hWuz_xv(GO{dOkA<|bg#sr!NaRYovvp;Co+N)!4Abnh{kw^=G)pK8!*!G z+G7=)>xI<}W`>`K^k}XY)S`F?dTi4F@#KvG?XlAEApcOj&A7W_eWn~2NhV;*ZXWV> zG`j`cOoOFiP7mGD_C+!d=7}`*_}-Jp4<7XPo)vBMUu<6kEqKfcl1FF8?)BOPz71K5r@6P0aVvo*J!wo8J}BO?ZL z!_<&Y53*OC-gE-;nD&@9N!^?3)tr;$?ZiP1| zFbfuL?O%eAsVBcrKDv8ts87>z{%EK>_9X5!cWm!4Lf5W=;7cb)Lmx&J4qIp=&+rRO z-dZjGCI5f>w_l&2r|w-F(rCM-nRp8#Z~v}LCnsB5CmW*qw6lBs`5~xG8O%qX;fP4r zr-QY0D3BVVPri6Caq~N{$7*Xm+|Ar4U9e9^ssxM^TU)n%(p@;|FcMKSh>jTaATl08 zi(iTU`sl%p@vB2Rd4dPi8L#Qs^OC*rQ)gEv$79-IoIQ}k6;sV-BQGFs&<=yhTo1MB zlg}r9{{E}0BU;r-cP0*1&|;T)RP9VTFLaC;X-1;${Hr!&MvNGSheiesBSz>;l=B>eSvg{)Lyk5wN9r1}7?~ZqY(x=s!vdxh5qt3S_uqGw z#9)8y|h@Tt+GN*WQf zLWkDw`*Qr=N;a6is>rtpg3%w*LYP?H%EgDh#`F9uMsD>M!D4GkTd z&RzrD%r8G(8yirnju#%>=S(mH(~b<+h@{>jBV}A9JwYFtCLKTy9w85_^mTQDjYgut zrVkZAxc$q|WBT5%hSGvuIB3dl+TM{F%E=lgod{j$(P@}#3;0DFxuYK%*0xC+n>th% z;j)R^*S{Vc(GPXC7O!`PN0??X1HCJy22;KBWbl|99+MI<_;kHP?Tw)51tGU#c#@iY zc>nt`d^6N_;XsTt76xbThBvG9Y6C`r`G^J1G;!=Vt?$#qv-N^Z{JFMYk8XJcjlaS- zPy1Wz{5@PeJpNV>mSapzw3jGJAF(!2!%v}Tr`DkF>+aE#xo1RubN8-)Z-nHN?m8~_ zPy)C2prTVhfT0G{Y9V^pWrtMy}JUtKm{hI6(a zf%h4DuIudR>g(zf#P|(*D#>%A036oFyP2cnjzf|T`9xM0c~HqObSiW=$|KloxFc{{Oh41 zowlb>)vnY?J2kz7+8$yx6i)sz8=)Is>W8{pTRM72bP&4#;L-huKi~M;INY!8?Q8>y zOuI&<>DTp;`W7HU8LdX1W91l9wW+#cHpo1<|KP#hYuEq%4HWHGwaeRaaH;C->Lz`U zA!#(tTK%wI2afA5Ed~H(upFUK(N8!2=ZZl;pan&BduzK~-ljjbyGCcwVbm|f%mpR;5EdLWQofd^TO2eMbbs=} z-8z|kP zs1>`c_Nw|bZ5oAAJAm%e4}&uvqhSy`iQ%5E3*E1lSM()%b5KXq%@3HirT@Bj=jzy) zesBO|UnOg8RpLFoN2fCkpoC%Y#t-9p?OpSm7xpS-oX4@2G@1wJ944G*9hMELGq3}#}MK6DJ#Gu78~ z9#gE349rFH$F_PB83D06NgWn@t4okyt z#8@L^myAy)pWOcEw`eoAw6oX~_gpmXZK2>ST7w`REQ?vE?bhKVljIO=WE>kcK7KrT z_xd+vh?r{^ddcg+;t`};A|p1TjVET~Kt)lK6SY*w1d^~yIFxUr9dvrXJCNB$68$)s6+3)~n5Sf13L9!+icVQAHDpQ8%s$LzM`s)u@ z;UwtY3m3b!E4A~wzJXzCcxq6m?}JgvruqfuG3Js&F*IU$aOanwe)#s=@un|MpLl;q zEKc%R?l{$9*sP|lp2yW%q=2184q4|lBm#~*zksSwEwkD5Nxq~-hBaQccjdNR^HZh&Z?bbCoF}w{z5)aV50NIO#l|cBe78TUiw6x(2RiRW8 zdFs~OkE+&Y+#H`dyu~|!MY6`>tks^>500I+H`f3w>B2-tV}Og1YivcL8|zp@ZGEd$ zrBce}O4S4knZ0@aA6Nt_X?GI`;WiIIP+b_dNEx@5{D*f7dl!b?DkLid?~cv>_$a@%RI^Bl0b^+;dsnxS~ zTZ-EiD!OV$DVNGkNe1r8UWudTUknsCw4k>ogXlIViB6TC9R>SPR&YtGWy%h) z8Y)e3hr6`9NRs!{REwmnC^He^5sFD;%sSYuhBR$8ea*|Y4ACK28lq;Xct+NykfF0l zkbt`X+ui$E^sje!NKT!8FWkce2Y__Ow8I)C?M1EhHBW)f$?HXgmL^$(Rail|ruWP^mT0nKtpqotrmrjC~_-d=G;X@q2Ry zWj|+YcTlaNLyo4NBXy}Q)U)!78WcfSEnqGYv0K;1#~X4&aFPLVFq%8-WN#BJ)tEzS z(Nr{qpF%<^m#LI6m8q{^N&ds2sT7CeJZ7s)FMUI za(E!M8e*{R^~V`Q&*(}(aFyv*Zj!tCE)s*HoYH4Y1s{H~vqFT&Tp>LLQqRiTMtEwX@;BOUwNl=2BKviFv~}9n z&dcRsxyn@OJQ+FWs>h@Rj67M3yrKlD3Y%KsT_>oChd0N&iLD#X?hLUd9pemUF@qFM`BEmW zuY(jOIl2+UbneG*2i5RtlQ=9mUewlj8m_ThrMak5B3?&~X|4KQseppD5{arEC7~*s z`nhIe;^x1<>At8$gpsEDqe~`L)+xKY`z~rO!Zll~;dvej#e}ruf`%t<`S$7Q`6Kh@i$`5 za;d^3X^O5x^6^hUe51pOXh&O9OAUyv&|y{NI~WYj!NejVdi#n7gl2LLDN%f;& zZr!?m*?_?#mrCnT;6_=6OoI42Ssj zCMFD_kRuz}eCyd}sW~~5S;Db^v6^9BBpORG9NZZj}N<~M9 z9HXHFn+Qd7!`UX1WC!%+K-QCKLc8vX6T-&Uvu4!tP$#9Z_ zxh9t@6ogs1qqU()BJH3$7D;9~Xiv#*kgW|YfxYCd>;LnQ%W61paQYz3E?7)!L?`%Uerf^3GPEVk~?__(^u2RC;{&4l`|0q!?)%u6DrsiyQ)#>^M zY)Ry#JN{I(qn?&lB#CUmbfvH(M4~&CK*??r{;HRuv z+FEtuSSyCSISPD2K2x-#8ASNT4Gd;t7Lo~zYMyFsK8-2XN(Sa4`SDUIYj0}66qjNQ z;1klM4mrAysQqm>Y4-wZrlik^S8oJ=EwPfyLiG|mvFfTC?E5hF(0py*qK^n*lOJ%%ux0CzYI5VW8b{e;Knju}LzpR|LliNsx)go(UnL83{AcNtpQGg-n7uzBwZ<;m$kMlD8*EVOxX&f zk{$I6%wx=@>T0=K^=#DG-&J2r28E;ABT3ewc zDbo@S-M z#sDbLM9=U`h)22jm;C>q|NHG#Sfalyox@EGCc*Kjbks}<%|*|Eec+|=&=wwqDG`1A zrM{=5n8!=xGD++{cnN?AV)CpRo)rlN++=P#G=25#)Tq8?Ur{=bjVm|LthpIL9uP!> zscbXR3p_96X7DnE0w{r!dt?>+i;$pWCD0BF>qKIjn5Z!SN@?`JNSKi>;tNG$C_)>b z8XX+$E3Zx8x?~lAAtEsyPt!zmq)?HCXf}Nh$pcIWq(V4O8=oH4%PJ}oEb;6jS8R?) z7fq!=;wc{Ert^dXG}UDCSC5}760f81xTP2+h|EQcq)ERE1-!&$F6v0fpcjeAqxzoC zvZ%y$xKOje5TIxpdDIF<=5gOhe1jv1PftpMedyy;s?G{=Ow_tS+~`;g5?hGr}gh9htmh@puo3GpD$aEs<7@KBAuQzgq4 zBqy-QJ=DbvVshv+4-;d20*!)>xhqJ|;D)(*`>u=Kis?>NtNkb!ERqR<=D0U9Zxbvu z)iY1})m-?P$YLPylG7u+*Ks(B$(Y^<>bxAR$R&15cmqOn_JTMeddys80UQm0FVlh) zE+%Jk0>JRxQ~@kI3f=bOoB32^s|QPft6MAw;~ecGYSBg3LMr1aR6{B@K}up0mke$( z>Y3}Wtq?i!tzzjk(!Al-DJ`O^dHRu%#q`98@!y-)PNg*#W zz%6xa6y`m0N$wE}fUqHEvljj?$bfdS9F8yzC7~vo=(%`&d{9-JyGH;x4^8;TZXQ<< zCqM$)J>orZF4iJU-1O(X_;m>>2?^red&H!t$A9fB&;5M22y;d(;*#ki$jI79?VH&x z<_nM|$4oQ{+hG_Aczi)pL~J}-C*HmLmFz_4C!!2~TADB&-V(zP`eo$q-jgd7reac< ziOhww0)B>&7emENv!jU^k-IbAKVBh%m*J(RC1cETQ&YJDKIHcZiODR`0~GH?a%@l- zo5Lq+SzszY+b{J*Ja|Y24J^yJ0bmD>4&iNN+<|O87F3n-UQk3{BDK zpU1x)AMD%rQF=O$o0Jk85yJ_N=OpvFNyKU>ocv=Zq6=RN(h~y%)+LL05W24)9W=^X zJ`!i7a+Bl3fZdPa#Bx%3Nu<67h)`lH(R27xq{@g*gxMhTU{J5`E32*k1d1lcMzAA* zQ;LmGNF-g4ktjCJKtYCpmjJLl7XyG2T8b$Bqrr16pMNYAq;Wayh={-lHangZhp|H! zF2jsP4ZNhJgsmxX$uyyb=>Dj_zo)EJ48Ow-W8>ON7&`%;kcS10CbT9qODN!{CveTU z3-DqTBz`mMJ3H$u_GR$XxiMj(;F!T>p}B-)uyN6ZOGOx#0v^}$ug5VU^!EmPT8ci- z;HSc)#<;k!A`$|kv2Ktl1S`YTG|@}^4JcSTH^U@J>ZU{Taer6s$NR;6erjTJ3;=-W zFgE!P219c&s|Z95Kjz6&WXYv?R62&F=#f#c?<_0A;7R9l;{$OEErQ1ZOpUB9%Y<0! zd8u40JU!3FSfUH>VJ7x>mgOP`SvoHzG0-J2*gk^86Y?P2STao(TTBch_5pv(lRpA2ncQg+X+kI95)qX$^vqWTppdbn2K+H5MdSS zYbncuRr$QcXxv?8c*n+XPKV!{v^>Bv4ipYlc$*Bq-bR&z7nCGyRvUOy-= z-$Qshu^Wi6cXbHkM8|N`&|QKIK0h6!fsf@jBPrpH#8*oi`Vzg#=h1lcX{J5Qzxun1 za&razG>rXNTz8C#j!8`7@q}q8AtOCKBLmNK`6&sB94?>YFQ!2eXixEOkkuZRz#c~5 z`Q^DX5!^HKY@&#DaS`z;X($0>h7vv!WS}kBUL1j~lcd`*k6AIv6 zyBZt66rfNl(^2J;^D_32_OSt`zn(8E^+gk()$0J|88F zc6D}^5)D$4lW~KH!{%_dVrL|PJSBLB`q8>X4ktd5d~z8DKnH;!4f>M?pt~E%^1{VF zEGcDcVl*<4r|`)pk2oFtK9{t60X0+HXT+&*WwT?6m4p_;m)P1w zvtzKM#JsQ+{t6KcP$r(Ld}NYLhmFL!yTwy`HeSr=^3sTTecx*0R zfQ5nvr!ddw@==ck{-gwi{($Upu3j1KtjINOHB(T_LafQ6ylL#kGtx5nCcy;^3L5HL zDtuy6``asnExZ(DC`8|p$LBb(3Vu&vWTj#FlKt%*tVV2zeHC#^@DXOhCmBhJe3AId z_@I!Vl9HH+jwjM&8w|BE6w{t%q+te;>Br@hHIcXrlQ2=45NVotPfR*9a@L*>{efdf72-Hc=O3sv@ zs46Y4EI*K2oRinyc22GCq;)=3pI51CYR(+b+vmGseT0t-g6;oLe;#>y%gaucpO!S9 z0lmlZs>0%<`2xYtBQD z(N2&C@=irhqofj9k#kBVDx6ldHkOrU9>V1u2$^stChP_YEiMde`^@?%?XB*MT`EoI zpdKKSZbj*lT|0{pwwylKUQ-pf&f5#uq#!wmaH$E8Mgph=htPKi;ow0;j1l)l*ng<^ z^ym3IH@F?xe{6sA7LGrzNY1%C+AT!(u;)y$@3Zi$i*vo*JI* zZYbEtMTBSCgPo9odstq$MCtD44q;Oel|ZIwhPi$MCZGWVftc(Nedw{?Fx)?&YzXjj zLkQ3(C??1Y_f*WhEEtPS2mt2=2%KRAF?*Vp-ZzWT{VOqi)Tfe)-2i*FvvctZboavj z8_H{*d;05pP5*C7$uIxy^=y?njh{e1&`eM4|b z&KF30XO6P(4;Kn(&K&^N6EW&py&v|;R0hPCIj!kLct&d%<*#OntkKU`7prF{SNa`W;x z!C~-Y1d;aHVc=)A1GIt1L>NFvpvwk(a?(Qm0B-a}28bu&p%LrZ;eq~sxO0oEmXLz6 z0T|Oy5R3&7RD=4Ve%Q)r7#!-%T^H={<>l-Xf!mkAZHPmT!N{N>znJy@{wyL$kY*3{ zKi`&;{Ir04{(- zP<&1RXkO6tR$XX4S`7s+JJ=BbsDvz2fat?Bj{wUay{<7`?>~F zflqM5kNsv@*-2!!K5~r9-4sVEv^Lz(_o&aS)c^_%0pBuW9MU9&`uK1hD2`I z^!5p`C!M5DPFEb;p7bu4V8xaiu4y~e=arq^eE^LRCAr?NzJ4KIk)aWxZ1&cK?Z?1H zfK+W|MdGB)clD-mN&s}<>EwzwMb`yD9|->1F!W`pHw$+QH*q$wX$xBWKH&_>I__CT8x>1v}BnLkHjH zClnH-GHt}daP5MoPX#4=dI=V2$e<8;*n5R6*I`vJNF1_M4}C~5gB7cc*H?5$g%?sjh4c2UmpV#0H^aL5;Biryw5M9gA6z+SKv z!O_eP4*@?1;U9W6s?Rq#v)mKBwq|B-&lThp=M@*`<)tMYKXtq$i!VqcE)Vj=Z!N&d zTNs{<0O1NZ-P?Pyiib2HUj8xQ0(tzdXlH(LNq$jY@sS;s;I7HxXYVx9jSCo- zK7v2LCRQ+_!7#W=d6s8yhg>}j5V>R>0zXG_X>oDYnc~W_k`gdnWShM02th;=tRApD z#z{l}kgm6RO!=_Qt$|!C@sq8XBXta%^PV(+9-jzkqLvU zP3YGj;DNN-?#?4@XZux1XwC@U#6MD6P+S6TsNrl1m2IT4}G^UR(8cjMp8X3}E zlvf_%v0ZI#af{70{_TSNqom#RQd-&6@nfeOPM>TP6W?XD8vQrANYinqjQ6)K4))IO z40lf6fdXVNEhzyJOKJI;Gu35v%?&m6lFv!M61&iiOGh6XH0`yOTW- zkO~i8>gSXp?$e+^`4){ku&y9$x>|5$lVd1+}K>S<_bM96UFbaSHu z-MnJNeDvk;m)K$Dczdq^@$v2DZacth2R5UMGiR#mszCPus5E$rxSCjhEgsDK!M z)lDyl<@x3Ncd$HGqOOUh%WTsQfz_?$42b8d>OhG1W%JoDWz9I&myWC=GPF@Fu!?;# znc-fpYt}ABLcOV_?3^Q&6}62LGs&L~&F$y#y3>XLpHc;h=SJXkM@KIe=WYylr`%s4 zN!=RT72cVLYS4s*FY6_A$;;+*ZSCzX4Q*|vNIO&`Sg{FAhD)QPs=Ul~-nh8o_!{oY z*!%NA)dd5frazj`tIoAIo@*yj03~Som?;XKo`iYadL>{o+Onmeu=uC zHb_;SO3k@eg#z12sc8kI!>1CcH1LbVrA528g!=ot+GDMD^bcYmtZBd=mM(emWrwn} zQ`4=G8xR**JV!R3@cZUKuj(p_wyz5fbj7uS=Z?tp8T@AANeOz0Ci$(Q5y55P2)nQl zYc#TR1ea#QuD$}py{yXL&I$L&eFZry&Op+zG3vhmB-4vo&_NrneCfJe3w zZ%E*+1cXa7+$k^3VTT}Xk+&BzNJWOk?W)9}z)0%B`cFXQFGepJjYEdPZWx9FTo0a~ zTxOsdCb~~@{}vkLj)V~*p~0JiV{(eWXl-q51-i{h1nHyH<%LnBsd=P6j1)^$dS9<8 z1_N1upTBRgyH|Mlrl4JghZ^OL5HmAckIn;e2N%6`WCFkShSsu#_&DfCTIL-S>>so} z`-}74&_ga%+&(x}xa9$ZRR7IVWRZF?~fTr}aK$R^<9@8{r4-~!3rgGD21A>B4H zIM7pAn7=V5C}aDFE2bXM#yU3vpMq50Guj%?< zuyW#U2g`7G4d@Ol%fT3xhvhyL*QuCZ{0n$;0pW8i)h$Iw{n5e$`;qGXv!WwKhY##K zv^V?Uft~MUr)E~10^MIdt^R4<>DszaKRx_GCf_aibw5`J1gZa@@-#B39{4ctz$Zl| zhrz(`!J+rF_lS~`5_f(2Sz#@h_3CPCsw%!f>gmWp++G3n#}?r^N@=P3r&4~p7Rjv- z6(Ni3;ll+V9{gy3Zgy5`>h@iq9;~W5U0GLG3j&uD+^|4rg1h?@>kx^NnW9}J_` zyOxGShe0G*QE=#RKDK6`esXXZC?fXe6&2N=uB`<=VCJ(=ce&XxY%Oi+KvN;A*3n9} z{)aG{v`VTgNQAzszPh=j2z*t$Quh|seo<9>qU6K9+k~%ytKQPqgvT&p9!N-TK_P85 zYo(;Oni?BwCG{OjfG?V=_wM?8Vz%J;CuJ3%9tsb1VcM@=1Iamr8BHKA5_lx>`_?-$ zAl49RMZ6H*v$e3DCeWBy@EG6>WKuKfVjE(& zl!9tslq+dUO7VNs(f9b9?d^Tu6nHz$IWb9N`F8iL+z2OJQcOOxIufC_}(5dsE8tc-*03y6W;yht_(T&sKG zg=7@Sn}N+Bsy4wuELBtoC8b)YK_o|n6*L8fS;?)dMhBn*}==lCm_H#JUW%VB|B?xt{8cN{Cw1wWVR6a*-e?W37nOHDG;Cn z;`h~JmXD9Ki>;Rr&i;b9+;_m=F_o2@6X6pOYG{twjfGwc5!rb_htt8`1u3{;Vmo| z>EaK3_`!!++c$1|OKBRY1bFtHtg8A{b;DUe1_)YNB`@}IamFGZ78x8Az7fO%U_QwH z@Z+59ZQC|)i$lv{3mC*gHC-V&ReiRh0Ym*Kf;3ii6k=TZhDJt3;azd_=ICwd?|?vN zzfiC#f&D(g_tJm_yLML6S_>tcTL^|muBv{Uxt8f07D1#oL~q{2;cge?eYpScZ)SsS zBpc{~1z-Y9U0|WQT6?w$<3!d#%n4a}z{<5O2EruZA&El@p=iz)B!kc1mc-AF+nYpO z2e1JIR7?N}Ut=)JF`3%{RswbbPC>rWdbtDBBQR(~6x5B|{AS$SsUKvMRP^baw{szl zH340{R5b<2n@ri>PUaQW^6!c&SLSM5>)#mmdR!9cEzTA$e_QlBJ8}=?=4NesdlLcg zVHztHl7mV=-dNln<12*Be4 z2BrzWXfhf8{F+!ng9gLkwKYdLptxRXV+*bgt`HOo*`O6UbU6FqhdDVQA=qK^wrYYT zBp5efU^J7eHo2^&`9x)$?OKqFtyujUdxyxxbhGzq&R$Tx?Ax0qO4#vUD%?DZE$bKy{SFg5Zg(d9T`(Abq=zBf@r^;RsVu;?$=9@sNxE~0h zC_$zGR->7K>VTAhs;(RjU%e98{*{57gkU}brQBX>?{m4i+>NO6wc8(F7-V=cxfXb%trF}T{LGC9LVc85L@Rnxc(l0W_)+jM?pH6vf(DV77XUOWKK`NiYGfCBWbOEx z{omgM9ZNQ78?xX3@UucBVLx(|Iy!p{#ET#NSLk0Fx%@Mhtw-bJ!W0c)yj&JgYWP3SOFQD<>S@1e}5mD*>ewkdSLI~ z&rr|Nqa{UD(aa~uN~+P#E7ay)FBQeuVWqmbEJYHk+tyB7Ks^S+nU4=2KJ?k4qs2wQ z7lTR$=i(Th0Cr-b0?hhVH@#F;i4LT1ab_Z?spW)~_3Af;Al^ED7~EioJ_Bc2@v$St zUmUBhsxDWrA~LittgzMmkZrz9#}zBBkYszxDkyc=!H)|{ip+}sJbJ7GM;OJYzNo3K zsfEOI4e+g9T^F+7K{7^)@nY4=RV!C7b=fBT6irwtE-a!Ky*vg2>x$zb>>=-0bx@69 ztR^rSaHLh6xh>EIw;gO&;bzHNj|8wO!2qb~k7K86aTZoqQC%aE)Q|=dDM~Ym79P$_ z+{|QnIY4HG&1(Uh_mj#Ni&59pqvf^W3N1TPU5)KzxoHKY!>1C6F>rs1y;*;c^6~I+ zTuTyTd$588pB}{?mR|ItxUvRxi%r#4sybTTVj0Y35KBnb2A}KiG?Pb_HT~$VKIT&`uc{k{{FtOq^bmBW*Y0R`B(P>mZ~SP zN+?w)K4eFbjF_ZlE+NR16Sw1|(@g|AzqE@6ZOl+2G@_~QDcYJ2Y-58n%@ZlFoN8YA!1P|$MO3H1Lcslnl6@#Ud*GeT8>4(Yv8zGiQx?fIa|CM8H7oG=a#Ai` z^-xiDDmj*o+dUpGxXRCDf)XZdTaz45Q5WVlT^G8ny71sqf^0NbJ(5;rb3hm3>w~j# zR}Z9L^9+gDEY(B67(cb+2`y!HHGHkQ2TYx7M`&Qq#@-aQo&#Uk#mL0MyAP`@Z zaUQiDcz^%i_xAe6C2V5{2YPuk9h^4{+p!+N`K{JitL6bOM`IsJnn19-Pq1Gcxq0(O z5ZHOUG3|YhYHaZwzNRaG!ODrZ9W295pMsI@-~o{OWMaAZ!6hVnX2MxKxd0%7mGD*u zKc3~fY9;cWBWsYG!>Z->R_3oVhcAf;3yO=2r^QdjMa9P9{?M`|7E6{3Ck0W+V7qF? z+EsRL-VR8)zs#P7q_VUnf0!{`Tw_TJ*Vq_#L?{xvl7OHkBHigxu}D2_?}oIv4i3x} zHfvT|BcCnu(VH=B*zBlvadENi7=WQbOCX#g@p}XaMF@-D1pF>J!QLTa-MR>-y@MmN z8!_yV!r9#1YOR}Fd{k^KAQebcW(G+*@L`BT@)7yHiI`<_3MV>(AR5^5(MjHJHYAa+ zm0N5mJ2udJg%yxgCg_R@9zvp*3mM!LvlNPZKXGe9EGHgZ6x^i5Xe(1v@c_G^2qYC= zxnvHZSQ8Wt0w#<@%5MlY^AU|kOcjuV^kh4d=X>6Ii62mI(*!Z}3N-}y1rNB0#Z(f? z&!Ey4(*-mEm9db>TH>_C6n-V>Dw=REmB0{a08b#An@&%k76>y^(_&aiT4X|d0n;WF zA+}HB(o<#;;x|1sgO5^TgYgV033Zy^HxSWo*FY>^%_d=MO1|R~Dw~inWEfLBFR5A_dK-iVW{exgXfD%Bo8ZfmWJYj;k zk*GMuN02{dnuq8=p2?tP01}zOB}tlIlFlSODiT@vks%iH)8qg91VMW}768u42h;&z1t0=|)Dv(l@PGwSE7KXN z>5$}ucnR@skua8yj+-^7W6@fI_Gw8ug?9l;5Uej_0Pojy%)uNiz-02b#! zXR#7bF3^?;ErDII5I%i_lM;*SladKCCS4c}K8BgKB(u9Y=HsHd5L3YfX)=}iH1>@| z^aU@0SO8C_kXM+}g432z z;u#T~4h+5&(;PTmK^g#KR0@^65Wxn7bk=&6wKeezF9@y8%R#xYL6~^W={GQTp2c?YQW=W z;stcO2|maa5a-&gJQp+3>Z1kRs1Kg&72n-DTExEW4H7M8aBZwR;*i=B#rdlm?S@E9hd42CQ;$ za9rWy$6~m;!4rvS1bj*tFWo(Z#EVRX;SB?;YMfE~ip0zXz*yV2ZUxUxKPBbjOMxKgx?Sjl4dbQT~wo&hWH z>{Gfq9SP&WNwC7j6&nT*7R8$Nvsq=o?EfAXr>6%p(K}Ga{1F{oFQ9p`^mcSZvB*=& zSh2#zUbKP~Y_=O?Ho_a}<3Z#?Lnd|WRY*c=<${87?2N;l89P7kXmrmCk@@bq3{Nz0 z`I39cnQpz}H3tWK7ki{G1;!S%8fqEmlkdB*~Z zoFPnrzvpm5gM=9KCio&z1XG8s!FQLlz!l=@?HRa^!!s?f8GH^vabd(^5Ktq5Ucv{g zvVscFY|u&Q(IhM<1TOqyca~V3F61Yoc@&UYaB>7zj>i*M;_>I^YXSqk1A$%=lc(vs zsXYt3#U_18$#CJojSA-l9Ae~Y+>2m)<5@GYHM$25kPcL*2?r_+TtS@gny5qq)?T`s zhN{dUiR!S%XQU>s!q>AFTfsPwnXzm)QH74R8!h-hpynIonRySCPZzJi6U&J-9kykM zVQ;aJn2yh>ta9dXi(_2yN^Lo{VNbro$T zp{~GgDh)mk6MePVS~w3#GE{xZNnEvd?eZnyErDZXiEZ&cKBfzvz?B0%hIJqjw|Z@C zR)Kf~PrQLAp16lcy1F5_;DlqMfU4$h1mP*ecR&(oRgx1Wg$MT+loTH-&pUMRNO9JY zlH$ArxV@Ht{18T3Y2!3>OyOS)bzuxD&&by|ozmPs|MC!`%oome!RX zC^(jvdEnr_+5>sT`MLWJ6oH$ic4qEt%GpLz~ zlwDrVcs(t1_g`N*U|_afAUyKNg?dD`J&IufiFCDyf8cG-Gb8M(z2pmqWq#GV7>rhg13*0H^ULgDgV$c;Hr9oVrzhr ztFrdxWbx8?Vo~u)@&2mDhKhdtWTYVGJ&cOz>auGcCC&o-VbKbXnS+_&#&WkbVRiKMl%uBN=a zSbVf%mw5ZT$N-v@=@$ql2>$>yBgmcM^Mzc|L+hCzG>jo8d%46BbDvJ{~uoKcijOyzP6Z!{&=U}}*YkOUDZ%Iik~2(UdZ zN5lnX`DK+2=gzgZ;>u)0RmHJ=$9Qi?1fluyNqNDM5y&bWh=k~ozW#BI=Ts^bU>qO2 z^z~P5ZC_m)?5)fzJz8?~7{nW!5i)OYt~>U&e_9gYae)DG$B(az3=KdS7hMqodH`W% zLwBc2Gj_!|^3~O`w(_yD(UIbka-5HyLHL_Q>YM8uD|ZI@`*|Q+?Z(2>RY0*tM*4wR zHo%|ee<{3Fp}N@DZ@6T*{LQ!H<3nR(UylQvnt#NE9BpWBY;LSNUV32H#!z?vfY3t) zqFOc^)DnI{$TS>)p1cuKa=y1$hb(2_kNEoXn09RZ>v3s8CfrA9WmQYFq^7x{6abeW zvPBz%e0_ZK;}6!wvymJc%p1YTj~@`YZc9f8!82+H$H%_<3aBsISeG&n!#KD21%IMbafjp z!+Zprfs}zwnQ1#RK@FUpnORawE2Wowbts=-cCzkF^`@=B83qNg{ry7yBk~Talv3nfV2f?guQX1Sw=rS5?(j=a+;B1_XtNhWN7s z12!H!uac<@npR0eYp?P0*ricqB-6+gh2l;7aP4DfaXtXI0O0_dR8x*j^;FfJ>UWEa z-&`LU!wwDI>KC~2Pzi3O8jQL+NnNMmGNR;{l|Zw#?u_B>$j4;L#<67aK{)k&2TN-! zs{s6|+L^U~$KOKMMT8;=C_65(S*1kEIpcszBPY3!z8M|_M)gP};+%z$7r{G;aNOExyi9brIl` zh~I*6%KvBSO~BI3@AYp$jT%Lwpy+567hEZd;({xR5d%g85fapaiwjW?0xARvAvzFn zCqjrDi7`6a#>B*=PLgRmou%zeGnq_#PS5Fk-u_Qd|J^&Mr!(zjIy1>+x!(K9^%mv(gOr+*(OjDlP7Wi)Z9D} zM5|Tf_6_&Tst>eD7EbH`ix`!=$?jq8Wk#|acu5P14i*+X#K+ZjmtOAZ=Bm$Sw%#+!)8!-sr8** zYOT?MOq`qwoIQ=p)X#K?@%VeGYGv(0wWP=TYziv5#o{?jEkZ>ReF%93`q zT0Z8~BMTn&bg2z6qy`HHYhG9slb6ZC59ZLtvzIuYy~5YKoIDmdoaB zOTJZaL9q%>(3p9uHT^Evgv&cS>krHafFOJoI5QcV5BMf#9eBZQgWlXy2CeRwrWbX& znR&cAo!qdxTGm+GpvM7&PHz~nnPJ>L?e`=3KEHo%F1WH12n6S*EHVt8!^WyYUIy%f zFvt;o+h6z%I)R$Yuj3c$C7tl~hRv>ZdfpfCQGCDeA3lX*oL|3kZq;Y^I#gD-8!V_+_kXzD;&--_cTCa1>%}oUY9^-4nhZ`H6CtcTH-*_E7 zszD`_?3Xmw3AlyqLf9vj;CTBvVCt~KPm0RQgmSnO!zNs9v7$fod1uuY^;iP}hF+W8 zzJ6`P?ew*T665f$b%1mBI>t2f6;*2DJjyBAsy(=EU>% z;U4*b4CJ$1?wQ0U`=_@yH?BJzp5X({%|bjtSl3uV=-A^M!V7L_B5x}1EGMH_=ATsbbTy{=Tabruf z98T547EFf&{(w^~?h@~psSUm}FZZT@wS5b{noZS=X9ydFVqpXPabVJhvMhofQ6`rM z|Jw$Ifo%AjZF15Fu64h-StLH7R|kSYVsqO?a^JdrYjI_1?r;m9(JYpUTdEsiKO^Sx z3Lx+fy<%>8g+S2I+-dB$PR{zKr~B~;@d3HsIB_OK?2zMh=hDK;tXm~+X>OLZwMaw~ zxmc_atAWnt6%?@ZxjdMz2;^qHdtw?rx&+q=TU0vZ$aP#KP z8=Kp=Zr<296PR34HDG?ZKpt`7vN{j2z#+c`XEL zadL9rHRZH+k-MH_B0yIEs<O`5;{90M91tGh!Lidfb?OYKsT#XA8076 zDnRF42L7>#-_j_mYG`Yo3vNNE_B~7;h}ZuJf4&Dn?dzKecUlhmXMGsw@c{pn*J;p- zaj#(i{=ACJl6*1DL8`^tVPoL(J8u)ZyWrH{dxXdoNI-{{Lx_3u&6DS!`{!Xr|Az_J zSU>8CqRrmFzpAXPwynCHS1UK$9j@7XKlm&)zX-z6Fi3=MeYRt24V(vg>*s(~E-tx; zjeVN#UZX*4RioV-7x<}XBs~Z?J4UahNSnHr553f^1O9OB zKSJ~4BYl19Zo{Za(WC9heo4jq?E@KM7_`|(hYcgHX?*)L#!DT+ zC#h*!`6sU6u#kN1|GB(8Kkb}$m`oa#S|~Lsq&k~=Kx4wqLjYX{hHax(_`{DLC$#0B zLQ5?TLff;cS>LfkxCEz+Kut~oHkh7p9H~vc5j4tXpHySAj>)zj1<6iK8Cl~jhWcbEoIl>H-C zlhI}Zdcwr61U3f?Vh$-(X6`v2!N;e^Sz+V26M#@r6yWa2GEI?Y3dFrA^Wz61M`_Qs_GLRv@gl zp+1GOwbx`Yjr1St(De^w;y@h6Eg8w_L{YM`u*pMEQI{@yk;x9ZN+}n$h-4iGi>%u* z;T;`4I@E(IWl;C`s+CRRJ{`;eaF<`XAu$K8{TQJZDhV$!P)sWsAeaf|8*cm;UY@@iW77k&-Vxo19kbw>8SgmqVbrWLiyDAgXXo(i z)NJ^V<^qHS3&6@Mo0wf%!UMMN?A*F{cYglvt*h&HwQ0~eXvXamQ*Mg;%G9{IA*-bh z1ZGZl+0YQ2EVDrhpeS-#nXGoZcWq@Uw1ZHwyYKGITX%MD-!K@h{R58UAS?(N1iNl_ z37fDY%h=27JLUi=SyYsX0L1JpO4g6^O$$p{i)`K6`tJ9CaOckE&d$9%;GcB^FX3eG z)Wp<;W60EVh?kd|m7S;U?HJ=??>-Orv*7_m&ib!h>N&IAOOB^^Ws$u%y$76 zQg&`Hs!@%P7%a!f$45p@0|WgAeP6e%1TbWY)H+^?(8rvtY<6B&ZdP_~{`hIzg>~qh zUE12Yv$J#Q#;u+0ix;#)DI^vQCS#AG4|LU!jDV$%D9hPR&E3x9r8Nbp$k;5wQ*sIf zey@AOKfSQJw)I_PAA$d1u|FwoX_iVmIuuf=(L^zY8GowPiAOBs$DO6sKv~(@+^o#J ztOB)WY4PHvQ zQc@^E9WIPAy@B*zKKJ-~R5-t=kZb3!Pf%la;CvT`w`{z;uK20{wQvIz}EN zJAUtMH5jVClT*UY%d5`J;c1PFOM$KJOXKeGm96iBQu)aufXNw2iKtnJ#-uQSFw>w@ zS7}URb_dupheY1pT%XG+0L7ohEvuPYT13DGLW)8`LYC^mwX5Ku2UZp2_2vD)m-(&n0aEId$(#l=;+X)oFP2WZt_-iA8Y^{dcbM8~?w z|4y?=C6)F_lxiG#e4#b<8$je4`%M zXtHNlH!dxqTMh+hRHZVdlq@B;VsoIaqeE>(Ntgz3zu95~<=WHJ)^AnGg~j!CHBBm; z$K7u}yRo(CcKHK{JQ@woLa6VERCPq!DrsqLl}nWIp%gBJ#HE9KGK14rMXqw0pg$+H-_2&&3Y7| zost-tF*@|>RY%n70R@N6{tlZkrBHcC9gG!n)C*v{S+441`M06B4J$_R^%Am!m}R3ZVjU>k%TAg z;xcxw2%q=wZBkiBpT%Of+YL&+s)f(j4fHL}&ddUNR)~c))irz`mz}jYi=Bf5LUQ(V z@cLm{pJeCfmo-T`q|$b&w7UoWnRReP+AZxZOXoZ?tRe3pFnE~aI z^PXfE z8b}#jZ1W&olLvg9u$T59m=<*?P3ECtn?@yRIwS;K-_&F<0f7AUY;a~# zt2L}6#Zl?cE+cXY^9qZX^#iY8axQBy7LXqDLswZfIN z3nS)USwm%cc`3Q{F?^zJCjY#c$P!s<6Kue4b~R{TwEGFgF6R|_i3 z1@$ti-Qge}fX#ukt7lKR#w;yWct)i_D5xriQckfTFAvf7I0{aGY4==ODN@RNOe5Bz zAvqo)sBe-fjmO=qNClYqQ%=`NzgSRJSy@w8Ra0KmghiY{nwOOYpX9wPb{=BBxlKo8 z{l+2m=ry>mtV-OW9607Vdlq~6ggX)l}scW#tv+l~(ex$ibEgAK;I|1l>vOvMmQgXIGYIj@vCdsoJ1Y98t(M z(q5&g6uyiF*#&GKc(o^`S?u)OJZ$`sOUR{0Yb$H> zA?Nt`@j>-~VW5xP_X|yjR4Z!|ifU?L9?mbT&dVw$e4DedKMz-JE^HF(%lVeECBzn- zU0oxuVRK-8ZG8cORSt}u0|s4RUk93Ai&!M8Y0A$luPTB|a7iw^bZ;))V)Ke&J6=#M z6SNLbFRfkKzPP@&fjRA}e`3Pz?!#zdP-;6`ThReaM9spQJgz`kB^2@noSdAJti0Te zJT^|dxTVGX8m0Ht)%DwmH^9hoer3T8FxF(U^_g`&t>o6{mtqP!fuztY$O~1)1dBC zD@_^&^a`r6xT!Cz&x3<&CNYODg8?TL5L#NK3zxP)=2C8aNQ6QxElnZ!omg{WA`0MN zH)QND5h1oj*dWf&h9rD$Is}!<1?7k!DQ^}JEdT{3_NItoiF z5i7=dJYdv3s8h5Ha4)yII)js%%Muh7ooG}??8N`uDB?#r0Ix8+c$FYYAoqnW`P9c7gWdqrOE4A zv5|nnNKb*v(eUS!@CZ^k{vJ;HGJIE5ES1S%vQoJD06CtCUaBsFnR@k~qSACKum@5E zJqq`{2qRHQ&%-JB{fjW%Oo^m|5oZ-~1jKC-(1{Ay{_|A{@S3RfC=ytrFw)aB+>Doe zK?#f86&XcE%zZ{OgNN&%7t4`02m~R48g?a)XEU`!O=&=#hj3VL{sfPhrkYD{; zDJ(5YDPjV23j>mdFZrJY+yLw?A_g>Dcx(cl799&d3HN-?fEW;H3@~LpU`j=~Oj0BO ztuWH(aGs2gjHFO;Wn_3%LJXC-I%1!^8xm9U&Wa+ez|&|1UHNx7iQ=2Xs4!kJ`GybIRocMnY_K97vFF z$TSeh36L+OkiLzIhyoZ%COroe2jxhxqwPRs+4yQAq5q5kxya0A)9LXsxcV7^MdFhw zxbz=c66kv#K3obX(F7WP7(x1bG!l{ur)V%IG$3~2L>W^69{!yv5J=?US}S2=n!!T8 zMUegx4cFadRz8dm;$q{X$dK3koKqnYN+5sPSzlYDf@>`ekNA8SgH6~ea~SEVG+G2{ z7agjZ&*B9&ZIm{6XqqwWeuCWXu4mzG{~I1bWfZXC63eFL<}wH(j}ZYA%dgT4+7a~H zu7N=&+5AV24xD5WQiwcfu+cwr*y%_%K+vt)1!lCxq0~La4|mgOG;Q2gIQF-N-ba$^dK%zC+c*?R|JqOS7EEg0#=n` zeo>18`ywJPIX#_9j|vYDivYs7i}ak9j;H@My)vP#9UIb}TJx~k+^Op~>*a08^d}Lh zND&keglOL&J0nQXQ;6F9KYTXpAit}wnz&ZcL{4dH*k%Udb#bHrjfW?fAW~afjGd%^F6GQs6vYuD36>(T> zPP=~4-2X2S2o&*Zh|MI4PMnyB?(Q0W7CiUe#&!|xp)Us#cNF;^y8TwHU zCpl>sGntdbV#O!N#p1T-xIB#U4_Z8sO%l-wqvOHN_$q`OkiLk@rzat2NTl41GzcE! zxe-sP@i20My+k^h`8W<;3Q-Z!3C9!Tz>_#q8jZaRIYp*?9ZA_mrP2{xgzeL>8Oc$s z1O_dVN)YXAJc#zcQ89EnUQDCY`eK)eB6`M&VB*`pjf#$mO+W*G9uXyi-se66r zMf4a_F@_f=&M@(BLVkfjoK6oXaY>&?L5oq)2>l4rzD6M@nL$)BRF?wMw-xON#X{o# zMzLsLJ#37gFu{(8ha(q0O@RO;=C%7Il153XC?!2Tc^4@>BAh~|Ht8?1MfH-ydU?C#AO;&TKNp*86f_DVdp~9KRPFx)A|5SZ ze`5^`JC#vU36yC3=y8ll(mgmx(4dcA?Z$$nh#kXXF{u>%>}hWIs|1Km29^4iMp7%l z3M`jJL!m#*JxoBB1W5X2XGH;vUBF^dkq{Kw^L_35u$Mpix}JyKT~-D&I+7gug!m~+ zYcJ_pO{W&1Dn<7fBI={Q9`Qn~6b$LeV36aan8+}Mk35N~0ryIf@B~5r4E#Opv_G$9 zvuKPoQ0ZufG}O-s41{0DG3&L2;G$kf(fvW+k3V&gd#)8AJSUw=r_#{AaV;I=Z4&8Q zMyaNoke>wvuX}`OkM=eR3szK&I2tTn;G#q$)1ISa#;8f5%2n51e*+Wn>j38N-N8Kc z`Wu(PNR45~0NkBzSlrwuK0N%IcVcn%+_mjDZv%jVtkgD)HZGkfFtUJe7NPK$Z+;h& z9q$AY+J5bgAkYgtHd}B+Ic%1t^Ub^8 z!(rCW&CPQQf#BrDbLRqA-nhPflZchSf&;$U38?&#T`!#Y%|&{BSl@VHztIqyJ#%(r z8>xqT*gLS9ICtgFtv7dW-#!oh!pT`^7%r_}zJh~^D;wvR&xK|Y(1}FgzyAKN#%hUW zGPHW*=H;7j;sfrz{XMvZUOT&S8%l&X0|ctF0%&6{2&@L7@EiWXYH%L%MEC;i+w|)@ zh58PecjfBMTi=DQ)mwMpdF$=FckZ1JE#KOC^V*G&9m)Lb;-tsxfiT+1KPl#7X?@%8GrH_Xh^k@VdlE=i zXfZH9zu*r{PI%lvB%KzySRiT65NGU>{DL zNuP9iPU468lB%<1CB%#F{3Sq_a1*Fs7hI=5Cu3kUw3qW7$v*{_% zoM#LhYYvCgJ?30F8}w8BUqM&W<8TeP0U;sR{a1rn+$e|p0o)Sb0%Lpc?Kf6~kb?71 zO%f@e^o{||wUg}>$7f?xi)YWljwCQUg{tI~fncH3Z8ZqxwT3sK%#S>H>xb|^4hFrx zfZvb9SRhnRm&axYn(TCpIXyF>a~D>FD-&bD%6uLhzzgsR{POC;r4;}L+qdAl2*InV z8JvK+NYnnAnQ5oXXte8%PTPRP>2MOc5DcALUzl?RP6rnj19rWv1-wB+1D994xs8?6 z?VDHcyz{+v02gzCx#^P=MzxrmS_S}e=1joQua?UyDhhL$ zsn)G)5Ey!6eRDJ9Iz2fx^->kgVYCkz!;C*OTVF$^@r+IT{Dhdt>hdyj!9VQ*Xd|d? zPR*-ma6sGW1{&Uq$KkXg+kg;G`DQIfqh-K2fV0znyVLH#F^@Xfco_jjsFb<#_a*=*$uvvV88K-Y{jv%>UWw8+q z&HAQLnIYSzkjs#hk`9e$5>0o);jufd79)~@!*HnWIl$tex}I6~`2d1VL6d4@bzuRR zsm}#q+NRS%@lU|dFBXeHoSpO7hy(axi`ikb;tA6>r*!~4mDLtpfD{%~MFYXrMPy&V z7a$b1CLB1X?ZWakHz%_}tuhQ7aj(VLZ?st)M%(1H-R4AR{S<)sG9e>_`+!8@Z@&$k zCV1Z|z-^v>tFEhrF!?U5sB1JB@d&dK$2^}~^q>I`d+eS`qeq8@vpq-&KE-YR044Ag zoO=)zg*^4|zPU;4T*_(@JOlKG*Vx>Tw_|r6JM=cg@UUk3^xVwro2Q4NGj;}VCI=q- zgQ!1&ARa^Zed+P}=R7WhyiJgo50m*n<`fn+iqXjuiNIIr+j=@D7eWAraT(b|KJzr_ zpF16h3_M3GrTD&@o1C-C50n)`43nJun4MeJ*w8tQy^6=g0l{!j8_q2rEv#?e+&GJN z?>!Sd?I-)c#k&Eu;q~)>3iy5g**TY^L(-C)Lu5h@aOE;_ztwD{7{4?OnETZ|2G!D) zOK$)S{lNrs-tWh!2mGhz(VYOX1lTs~vFY0ml!HWr!#(sovkJP@MpOY{^;)|TN7(X- zv!OY!XL1rb5CqWoD~SD|D$V+*=YT8B4jX#3jl6tzUM^0Oa2S{;P#Fw*gB^Pg|Im6o zui?mS1LXu3(SsuRv)?xloNnGXGc|p3ieUOCv2m|aHx}kna(~Ot!Tw?%Pew3!cC*o< z(s&$Zj~DOvO`u1?{eL_SChiofGKBL^PN5$8ymq5rqv-_aff@O)@c?!{PpIUK$N2!7k8gU)7v_5kY{ZKC_M`qz;9n>JZ2IR{mp66{ ztJ>5y=djv5C)Ubm?3BW zl3NS7O#=+jis%RzIxpAOwa^B1eP^bT^YbVGA3_}hb09lWCug5dne9ZS|FplcmV=MT z%FHaR5b3()n*RP_Kv6iZ`?JeEeR+Ky{R&#mEb@KMKL??_z-d38@SDKgq~|rF)(>df z)w16&A%2M)-)l?w# z8&|Ka&n<`6mzU2i5FTV0wF1*CHcgkfQPM0ttT`+$EXXUH3;6}s^HnNVn~r$=1fQrCQ-x|Ulcl$6Z{md|hB z*toX2y>%N$!l3Ui;aK^`sxO4R-&kL}fH@#yVlb{<+z4%~oH5$ER9MDb71jyp#f3IU zVCmu&m{{M&=!g*(htkkTxP5y&G&}7J06V*|{>FK1nPd2QV-s#hrzQg${Q;~58mjqa z%!ES3HY}f8g;VnNtt)TbLiEDU%kci!Hv$v$!G&|H=dN75_s-25?`++{9P?r*;B)pH zKxZ~L0`9CU<7NrX4j{Ka-{$s}*RR~f2Viao-YpoM_Jo#K)Cr{*UnJ*y!cxct|~m793L zhwt9Geuc1^3i>C_G60*R#yX^+IW;v`{8G;HM^n>tr$fHk)hl?!t?QmiG)eb4jD;Jo z-`@EE*1d1ty}JR!xl0@8><-|ujrf8(AcxSmIxyft=lg65vbB`ikAj=93!EbYh@4LN zPHkMca&PBti1Xcib7u=b*?fI@(kN?bK^6#Vp%7P?Db{qpoDz_yt`cYaQ*+yI-rYDo z<{Tcj+0LyKW=PxD-q^fDh~~nTcN?zOlP6`8HdLXyvYhm!T#;JRGltKdBz|FTGP`}8yZy0 z%YieYa~NpBNX<_f)v7iDH#IE@$~yc8iB|0yvmx}%*-FlV#L57h2WO-@Z^B+}W%oDx-=Ory3s#?a+C9mA@M`~q${ zf*3IQeV2$SxdYj!CCpNSL5vPS=BI7uw#L0_ucQEaOG+)w&B>Q^wCM+IC#R=09;aK8 zUyxTJ#LWE;Jhk8X{=09!1=HXS%%Cy8FVD^sL)?TcXK!i>v2lX1y26zFaz&Ry?ezHP zsv058vAXc!ZXQxdB!y3#aEX$dV_2FkF!Z#EF^7Oraw*F9&?H zpi6A@yw(iq-%cJ+Tq{644s7fZXSj3ijVqTomlpiCU#=mX=yjkuS9?e{lC2gvy@71|H+u!b~uPVS5TgY>$vz zn3lRX>6KR!6JJRHWnIp#s3_LURFhU)S4U^_{{2`y0p~<9KqU0~wJT@*P>x>+EG$fV z=DaSmS}e)QOx(LSu`mUGw27JJd}w6|?S?M1rC%ZM>`_VHy$3aS;vqK)ugs@cw){bK z%Ac()_z{5tLFKOf5}12HxjsHD{vU}ski-y+#QNbmD-cOgw--BQcOmo(-DAjp-nC9qzAO4w>^+9cEg- zz}%@>4`!V&)LqwRPh&7zM89xxeR*kV@$@P1Q@t9E8cd#AC8(?uw5arh#uHx8Lg>OO z;25Zyh1QmqPE8PqncX_#4=m2FoQGn}bw_Y%Y2mcvD%?KOA8+V`q>L>tE&^3jG0Ctp*e;TfBuxuKQl4zagPid z`jH6yCzrSKi)*?~ZtwES{K^GJY>-q&Rc6i37L!(w@pGFBy zKP*8^z_r{b>{x`4+D%wT0-w}%Hwn1qRRZzQNC?O6@QJ((bvgK@UYs4ZTP-J!j}8s= zS%8G-a9%yoXBfcoHCFJ?9X7ygl)gu*nws*GVkDtz(CtP8`2xy)n=pNZ(Aw-VtKAf4 z`fSK-uo!ybfTGpv`g?V*la5i!=vR<6HE8=(b-+u=y#Fc{2>4CznMIgfUIKr6ar3m- z0VTpwvx!K#X|NaAu7>dL_^j7_;-qKP;joXGQI&K;&@B|+R%uyNiQ;qs!#ZXk*Wg+0 za12`QqoX*e1zx4=GpIGdmUY@*odHX?DX+t2>;-a$#tJ9{>_S0Nan_g%utDf7%rc?3 zhA?EZ6;rU$;o%`&pHiujDRt^YI6Kr4x!`bnrk$2P`!R>}gk2*OR)Iw*Ed|*T3@yU- zVkNMC{qi(m42#_|G+ zv1e%k`c|i>gF$!SF_YQ+Qj|`s)ErWVDSvjPM~_Nl=pC|-p2C#ZJ3fwF7#%VI!r_)w zCT4I-wUE|YM#FO<-bjsX172vhj&v)P-G`Ki4k^J+=-@CjIAR?QUO07X{J6_8XaKpU zmQ_{qD_La?Z5q4ZA9ReFZN0rntO^exTb>%V%0n`;3>yaubvMGab=DCJL3u5}P}bod zv6@ktp&HoSBt%ZuG_)B^Xu3wNL8I&GRw5ZVD2Ldi7Mu>M>+x}`6_A)2l4vttEG1Bt z`v6m`J31gZ$;Ae&pd2)s2a%6BoL6-p(PF`BG!LnDJ%_+r^{5?AD6v7**6#40K=#?K zSS*>XMr}ujv^6_B9Sn1+RIE@bac{R$u2gqxm1@(FMy-=kWKRK)kAv@eg8P6=;cvgS z9|I@`sYK9j@}7=X$W)~7&4T-ZLWxHlQG(3*yjuoRu*IM;n3RT&?w)RqgW`CK+eYma z`%^IR4pbDf`QNP;)38DzEMWnu$ztX4E9H2*QmIe?IajDuZ9~T_!?VF-D#+X&$D7Ia z$D}2bg2J5KB(5Gms<7Tk1m;T4JtZcpjoh*?Ee1)t|A~HGMfQfM#*+4%2 z)G=x~W{C*eH4QTf7^<8(wewlYP`WI%4V5Hq=z5r@i#22g;l;koO!>Qj}jR4jqw8B?|GF z|I}$fqdzbr=SN5J>Gsj1HgqT05Cil!Vo=NK>We_Bv7kQ!8QaWOsS;HH$bGv;DLvHI zWIXA%3>r)(*jPc2uR2(IE>^h7pxQ($3Fg?ahFAMmi=I8CG6+t zY$3=MvKf>UI7I`B;LoF08&Er&b=W*KU?zA!Q;$N?Cgo?PQ__D+_>ZJ#MX4acRZhc8pW&PC9UpdQ+z z-EAETs73m1-iZ~fZEyhEVYU&A&5q_{9WqzK7V9XA&2$tz{fNUcYBgvzNAQ4eabInjsCt8Zz+Jp)JxQxD`cpw)~Z-z}pS=rr1ojp7Nvv0F?AJyGiqwbeD{ z5n9FwiQo&QsKQ6k{q_-0Aoo2Qu`i9=O+ywVfJveqksaaoZ_pUfUG@{1@E?adq}9dg zgl+CLw4)2k-q-E0RuDzj3&?7HMh-TBsQ{9j1K5C;wcozlat5oBU&O0e<>5S zRn?c|u{qxf><+E1t8 z!+N|=r;v3tmDSfbwKnmyKpq+#M_qvhxPC9rES(Ro&P@1-B&?m#&dxaIXRv#08Fx>Q zk9(Y6H`$F*%Rb~%x3voRHI-#8Z7l+b6y}@k_ESO6LU4Zh?DE>$*|Q5v3u|i|A>Tnmf+$*ka?%D zfL``m-N^fy>B%X~0TC~Qam_d5o^c&ls$0e7l=7=(JT8r$rPkWVe17b-V3oas5q6DG z2f+Oy_sEdd4kT@A`t-!)%qa{%r-RrBK5DYJ$?65=<)y_1`3Z4Zh5 z7Lg5WSgcb*ug}nqFGm)0@I^ttU;om>HOvyu<+6MK*YtU8rkK!h5W{<;Kln5juc9Y?HS zRF6Ul6-2xj@o8(T!9}ypXfk-+fW-f6#=n9G+}T=R^kX~xlw;I%L%&U zcIyur(D^pIy0VJxE6?=!acfV1v#=;9Efp45dyVwF;x1q?`V2x-1{ zZRg(3jf-oT#{M_rX&qiDq`ELl7<8g~E;~Jez6Xn~k_P1w#7y9RvfRci%c2T3T2bAGaTOdoa+tNIsicDHYdo*@@UeiBBvjt!bAUdU0N) zGxTYO`pqNiR*biK`B&E=F1fi0ahIK~3k!>gR6@s&{vE@dTHRD%!c3$mChplo+sn?$ zMGS45v`5>EE>EXbi8-uHb`f?KG5Osh;!V~UmzQwDiLYc0g!wV{koU|b zBxa?jv1%IXWQWuPLr|a5^*6IJGdN|Ky02d)yW6fq^ha}$Rxt|AWN~aKy2#H z_=thciHR!4Z8OGLNf|o}8uyS$+Ovld2L!u_4Xj2c6q|a~tqr2e>T28!))VCbk=n%t z|M5{c7dY)sr^#R$>^mYA)TE`xGnsp`7;)4+@u@|SBjJ>36sU57{MT8*`)U7BL+dq4NE5*_FyaF@6w?Rf+U)|VP-rCs;c}B5rLy(LWt46ZyXlYB~vUTku){}o+zi{dLr3uH$<732R4=K>f4po-sr!i6!AjSAC1gTQk z5E%N3huN0ZZaF$)z|8Z7wDo_vV0T5eAO_{_!utB!N*)OeB$f0t@~+5Kc6N=ZO$V_goeLXLi0P+|#D!-z(6t-F2dJR)hUtd$nB(xFZNFPQ6t>ZVsCAG61?$B~rY1h=( zmu9n*;%V_*#3CJEB0gkNS?Pc$L1_?V68;xX`XnNfmBFq(*xg;L)O70_+YTxL zOh_69*(nTWRB?7TgI`%IYJ_EN1s|jbH4-v+WXcN?e%nQQ$f71^aYRTc92zy+&YEm~ z`@S~#P31zTHHr$Y*0iEhbkk6V$xY8@QFldvDBDf?D2l}vHkLNFA-!^}MY`oRSsXE> zR~s1w2bBT(D2@pxE4_%rp)=Ub1PJjF363KDaaTq~Fhq(F3)A9?~}CE z2w6mm{+b#Uu`7Za7ZJ{2C8s37!Y7&*9)=(6COu9OfU7z9DkM>V2`w4G)Qo?%`>WkbY8UtF0-^N5o#1SCW zlQ0q~Ba2C=(4WLbzhrB6lm5u!)WTo3Q>jGORI-_92lVJDB6(4}keWx)i0Q+g6oVQ~ z6n+fp50JA(`e2C)zjY>a7mY!ugR_YMdkiiJtW!iR3y}cKj7SogKLDfAq<^GkfLjvn zgBLAC7o%eV#5|$L#u7v;Av%a}VY0G|QsO9#BxXt~1OND`KvXLbi5n}hS}6iU6~~B+ z2`21eGSn*EcMwL1WiV0Mv|kRMT1n1BmH9+l|~n|@p$RU8O&WTKl&R6 zpD$phMH84YsLZ$*k@(V2X^dDBjT%RQcr|cXX0oWXXrkf(@r{T=YaqDIaQrCqHG<uMot#$@vdZM5}i!{7Ei(EHXfAlm_et} zsc{srT2IsXyh^~Te~H9L(dkGLHeM6Z2EcrR5Ja_1Cw&>2#fsY%5fz0*F~Kc&bT=Oj>4%{&qO90-81E4&jGV0SAQ896mKrM-~CNsksk5Q0lIbk5M|4c^B+(mR8 zk?0H9B0j*=U5t1ds!llbpGhbwfT7Gdpp10Ve=}%FR7w~nJc1TMi;T+NCt)STMWUb( zjE%5@bfQX9m`}5k8B|>TCkB_tAc`siey6l(mPjHIm*z%d?}VtI&w)vknJ-dt!xJ_O zrAUY_{%Zt-$rrGqQd46R=77gL^RcM>h}x8oZMpKMUqq!m%}XORPc-9(pg36>Dei4sCYhO#1J6{KaXNCc!KO2 zL8)+`P$Jp4ucp36A~`6^4$n{K*%u3$w|Z@H*t@MMU9~` z07e!RRp#bnD~peKFr0eDM={Wmeg;%NJ(~^Z?%H~O`*MIjZTP+ieR$T| z6EA=DRr67^PAu5Eqjp9)q=xphQO@{r>~Yca=tSboiKM zbf2icrY1d|k<7|Q2l_mL_yjP%pqHMNNMK-YpE z23;TE)#qr#QKUZrlg9|HB?1fDYlZb`7y+0}bV5MCW5A+54v!&*q%geycbF}-Ll;ML zSlb53L%_j^j{Z2Enm}}Zk!a%2BIqw+VPiTy|c#Lgfq|XS}543>CSb{^(Ojsndaw2k` z?~O-i8y5c!ospOjACDJAQ2%cXH6|uLL5=N+_h)_1Isfdm(=DPyn+3;}nS{gz1$NeO za>N+?Wn4UsSPU`~iF?DS&tj;tR5JBXyW`AoP270bH*peN;FQy7OvZ?mh>h`_@EmgH zXIQ-;&;kXGqgN&-BuO;f{F~U_yWy%6vpd~`AoY9qov_zDIWaZn5Tqg|ATb4TdEq%v z*qJ#93BpUB?WQF_Hs(nRhyo1Y6zZR1V|G(xV|UY>bH25AfBex&>#4cPDIEWmWyX`^ zpHd-GgQSzQUgTn}^7qt4LLELH2hhw{2m?IoE-E?p57hVuz+4+|{q(-k_}b(w&L?bH z^cY$!F3cou&iqS0uP|pXGk!OXN-SY<3J(icVmgKtO~mYu+0D|=`GXtp-@iX>vrH2P zw4F#T(Csu3R0wJ0 zy#7FPBJCAs%HAA6fyI#GD$7sJNll80*}Z!YW*)RS!LJk+On6dwWLX1%1wA`E$URrKuJ|L1*h}FcvG!>ahL#9!7KZ}VY{y&BKF*?O0 ziT~WWOF#PHr#QTVn1FHMaD%L+fSp^;6M&?HLw6oluc>&z?ieI{cPw>x)b1Cts0|O; zV~CVpfB&NoA^Kt)9+pFTt3ixk*aPB~*YbHeg_-etk{DDJQ#{trvBXEj?2g!dKOWl} z62MC5ZzAI?4y(&Ktk{Puq>Jj*Y{I{~JC5 z)hKDNF?9agg9jgd1U&dP98g;2hrw*MHHx59R$N%dsSso`>3iadS?nH4eAw>4#b70Y z>Pp;APs;V5S^x0g+kJkW0|ag@W?J98Pg6QPT00_@}h^_&s9ci#Qz0p$VN4YpzI_iBMaEbnOGm%(iIl}tz* zW~RRqw}%jEBHkZHd-1X?s1&51O#OLGEPd_XJNF+v`1k?Dbs+mDtQO?M*)JWwe(70U z2)<@!rX)VcF-z55~Y^=@FjV@AEAqL7{QN_wFHb+@b{ zCo?w_O_iMZI4Kd`B$6La`zsa%MD<0P(9&u*Z@u>u6yV2TiGJf6(C9?XRYf^_)43I5 zurMX?Qq4?dFwld-Yd0aDwu|8=)*$ z*EuY!EiUKsax>G}SWCnwB*aI=htvL!K7vM6r5G01u#G!WY|lRSy0K06=P|QZeOO%G z&>}Xsi6zZt75O>&1xZN=1PzNP?;*z{->I}n+GjcT4bVv+e)O|X{uRd+RtFAK$VRg4 zbA`CeChmaN8aF>PhY;q9--Y{Lmeud6yU}vd%k8062k*TD(bu0m`1vmYt=k+{K-#$d z@IMqr!vRUh0Rb;Fg9#=jJ~IC6Jv5XSZ8sVUnfC7pwM*;YhDPoOKl$*JfBOZLy>Rdd zFxhMdU#tP&eYjRokdyujYH1>FezAw>_fgNNs4#y{tQ~&u$3OYtCm-DZ7`KjrWF_Eo zquGFWKZ4+(RS1iJeHTlZKz!FpJz_J`y+r@KmG8hpZx2X2d8e9aLWrj zwxJ&x`Zemqg0xh6Qfg8{d^BE&%pu2rR<-)>Pd@zc$3OYWhd;gV9UH@&EMb<00!CetcU@WJ_6a5Ds^B8Rc5ETuX@omE4?e`vj686cj9)A4r zWAp+Fgj|| z1Yci2m||rivC1Tq6!6gBZncQUGIyEwxiHY~>P&&_Hy=AUC@6Qi^38C;8kEQA2;ZOy z0a%eb6c!RiRG`)56~N;&LxUSYLs~m)@4IVF@rkFzoTaNssq>Yum;PbK9LA-xfEl&H z%K8|vCTt+}`-0X(L0zk`?{o%?%ew|kK-}>8^MhBeUPHj|UA>r-oD|~Y?I)ZRlGiUL zou`i(#pM$aK*m5IChGkF>`WnI20?*_%I@Fm+%04LPaGe(3J0!V9X#>+obfRX?PGQ} z|0dSg7mtn!Bb}51VXWTw!@lRon1zz&xe7fY>3*{M9XoXP?B&Z>TMll_n;U~Q=uLCU zOVa(v+iEg;T72xn$j4d@umzBOk2}d>)IZnI{(l(!CVOJi;K|ON)z+}wl=!j1HeWIR z|M6mI*li+gf}{^lEwTJAX3E&Ok-ovS=HBIX--=$q zJm8KY1>6n=n8tTx0JLkc)sPxDEzUz8OI!@UcpAM-(~~d=c-6!^^4v4UteSE~Zhzc`X?Sf`*1~$$Q z7EMcmP{$X9-{U9TbkK4_<^JknniLr~J}NZUN@aRB6?$LN-S+Ye4v!fL`q*f0oT5Id zo94OjOQ4|;c{(uSIDf!Z#=|szZ1MzY!ec_$g2bkDwEwr!KQVGfXk_H%04`Ksv}fuN z0P$kaI~$%06XYJIn#p6vq&e~N+%bzr-7;8N4&MbyIn%?Zg$4Lw;JK+Jjo2-WDA+|;Ke8y? z&8Nr50a%-}!p}a^n*oU}`IT}ab91vIB79K}D#};>-w|mn!>D{N8b338n`EZHdnC^o z8#Q+7!qm7)lUP-;$iyJ0y`Gp95^7dyl`^HX%2~sC;4WjLkHs7XDyHQ14^ztPKtm^` zCeNKTDQ;|l!H1Wwh)`Y+h_>}LDV>!vl?x3S)0v6>nO8lGVf^{DPknviAEr)CC31a6 z^3B@I!CeMun{6A@0j4u<$dRD_^SLha_KY?FnZ<+T~^nvwf5hKSdd*1wD zv)MqMKeLa`)%MJ+)wsgo`@Gw6a3f<}fBvUbDV6T-vw*c}S-mE^uz2;V?A$mV@3c>t zhm~eeta@&DGR<$oV0DK`>_4^2S@o2b7?S^0s9&qxuxU#Zmo>ua^0Vj9=ZZw~yBJck z{*2AbT}4={dOaMXehh8@qZIxul~Q5JTUWWcp);GBs7qJmFV2cEiTY{=Pn(a14R2?vVWmc8oLIbJ!+RvsQ2Z}FW6}IqXGABA5AgL13yC23%nrsGE;JJz zC?HqGUkZidxe`gZ?z_0M@}26IuJ(+DuVpM;_##MF(eeBj6A={>7C9=!7D&A15qVZ(6eGHE_6-UW|{5j*568D8NE#4x6V@IAS!sKr@E-QCqiL~YKJrCEz!oI#k=WRTxuqJjcLM}|ib(e601WZGxE z4S+BL?Y}x&>x_QIWz|%Tk-GkoF>gMx=sELVPE02DbYf&2$n9Z)wvj<5vC`~ohyJ6& z8m-T>Ts(T{4W`hy_HAt$x8j- z1(URQG-^yfW5{dGlyaFPjnkO^4;B;8A~#A=VweD_hQ2I852g1u!oE!U(ge4%c#K%-ki5a~EgDjUqoNA@qentJ!7`PJ%_+Ft93xM;(T2|lG)h+9matQ`l{Lfht5%DihjUE+Bd0Y*b~VSgm;LVx#L>1Xs-k zWJf3(oDV8h;ikr>b}{)};$RogpF2G~(AVZ^35-B;L&GVOWW_E=OBooOGh6c`yH)Hz zVL^CB?)<2^mDTIXBeikKt0{Bh#=S6t5~e}n)P;!%rt+=Tq?hR*Ve{c%;{1K)*lJgm z=su%YY*rJ<0E|uif7Yzj85828LV`m=Lnls&9TS400hvhLXLNeZT$$EcGptn$vc<+z z8Uo^X9Bl{Mpr@Pghk2Oj45q6 z25@R?_n85LyEC#D5zI{68Mmj;pEqUV)F}}mR&U-Bxplf=8b1)Cu2CQ&lI8|(F>`7y zDSd6N?R{qlmgI?;bwYSwdyPok6e6K#L`DSIES`8ox&Jx4yJ?-(E}H-9BNsNGY;9|8 z>+GS?Vxm0>nN6Sn+C0Yn6~MmP6DPc2L8TatQ0oe{Pf@`_szp$~XwY~jhYioN)=kmpi87bX4{pW>? zUQ1uJFnw11_~;S5+jCoiI2Y{`#7E7E`;%6mvbPiZK*FWAoR>tbA z%<1?Bew$7z17H89gH2;V6MOiDC zk#;i@hzzN)_5Y8<8%~Eh1X63XCoJ!xLKFhn4ul7}7>m-~(tljKoN%I9 z(Ic>3gGN|=jEFtQn`4`5?r^=w%D}QTX76_7>{uH=&5drEf-Ub8nw>-`@b%=wZ)OsFs?e8R>H}UQM5q z@*;?qBgirK1wNdOCuWQ-r;))!XU!A$@RconZhca(l>I#~DVfM)#*FmjIdf;vN+#GQ zFvw=oV;SEE+eC}rVn7$6a%gFcn%BahvfihCy({vZ^ZuQknj)%OybR{(ixUAQwOftc z8VE>pXp86A2AW%Xvrk^%X_C)+dVBkNd&$3%^6urP&z(CvW#Z)Nv&dz=HIdD3B>Kw0 zTlw!wPF#-|_73PzUcN8x=%qc4`(%C3FlwZ{zh^DUq|C|0aZ{6%U!F1k#ZeXxWn5XD zW}aNngnmTQ9IU^GJJ$T-^rM0Vx4v)4+aXmbYyOKf;$y}IM<>om9v>er;wuEv;?V`l zRZ6u?eM_iloY_H>i<-soeWw}y>)xeH^Oojn6N~ltgL#oMlBv*FuXbI zFzg)0=skKc2hPvmRNK`j@B6AZFE=MUGjj^i|FIEPe<0fFog1Y_qjv{xUOe~+`;*f} z_fgzD&Fo-?Pz9!BCgNPrLtPj0?@Ma=yGPT&s z2<&evjls4gf7i)2LB31hH$4j%p*I49%)Vnpu#pB63=R=F$E})+Id&P&V}}b`{p;^G zojxM&n3%b!?#H^{dv(hAsbXZJ^(5oJu|M5CvBUJh+=G^nLz);mVbfutNGiu>y{q-G zhV^uGw2^;^tlvA`HFsh>&`%bV(Z%?yL8Au^4~ILs1y-B0jVmX1iV$$xJ1f7}s6B$b zKib=R8W!}QZu{uvsV{_@xeyqgjlYRSHtY2oJ@zv-LiaMLa2a(H@X@n%>$eR?s^YTA57ajSf}9pnS{Uy{!6NVE8(F^?XJ=L z#KpJmYbaf18j(6VBAjRhPbmL8)-TL9;J=1+4l4fRh!rPN@LQW7G^yWlFi~2_!gfsqVk%-HrNj@tpqt{w6VP z$@suv;WRc;5?Mc6@r%*oH!{>V!e$H9 z5q~2LerKlnP;3*SW_gGq^icmo_{1^Nn8&2O`Z~NE;;*~z-f_X>?ZLrOIL{>GbFn?1 zi|IZQ((X_%Q0T0GF78;5bmJqZMnptPkv|5S%=FC{&L{i$>G2~&qDb$Q4A{+X7|$$} zo8|{WG)&=tdRj)j5c$HC@n(xRHu)`g6Jc!T8S!(+jf@>(wP3`#DSp2tx@!JS1BYQF z9#6(agaPn6cfQ5P=7~whMfq2*oe8P4!6Rf>DC82TZjJ$;3kSx12am`T6?^ah7<3cI zhlhkmC%qUJ8Oc(Ll_f4W@#VO9f4fnkB9y>cn9N*G9eSAKjAqXb$ihGLlV1i*IsV0o z36YUu;Z|T1UjRkeXJjN1sAjz!C_kc;#AZVMO4>i8qfj$ki5dIFmy@PMN59Bh-uQ{p z(c@+$1x=jH^=f3)xELF#pmMG>ED$$RaRA*H`-(-vK9P))$1RiRjO64+fQY@EJZJiZ zn28A!rHOYZOiTz191#RsjF}0G_FN3r&K$TxB#cC0J;NjSKzv82hO1Mw)34xj<$zh| z?x9uls2%C_n|(xZc$QA?LPVR=DT=r&Py49UA}5LoyU4{4?zrnhvz8URI2qg()Gh|) z>^I`4!qWZry}{G|Z+jX2-O-K+3d=5|LnmSqWYF-?9z3z6q_~(7 zo=P$o$bRf$2`eZfG93IonX|-C9$FKMii(R%_{XD7%aw6w}2sJ`(M8H@}?k zOGLb$Gv7W9Ushfsl{_kUBHGlM&p)xu&MGdEl}OH#EXL_>XliCrNl96W3-O(B&OJCS zt3b4OCg_eIJcxfOdpSdv5f(x;7xT`_DG~z^`O0^9$G%ZeUS3>QA_56woSr1|Eu%dx zb8{A-4JXEAMPQL|ZEiWioMmd&3cn<%j74dPvBl#)P$cjDjekH#I1kVR_n_oaE z86hvvwIIdaiD#U$qI`awUqqy)lHd-R7ydarg*!bMTh5QEHCQ35c!sP=uFn`Z%<0J+;^S@=kBHe7fx%%; z4-DDjqZO5W@=>{qi>r&X_?$90vA9AG0j@0f3*gyJ$te&`T`HcJ!G#Ah<)mf#qM_pl ztaqm9L#kvh&J{6E56i%Cub^0^RPn5`SS;a7)0S7#Lsez|ORUSiNzu8v<>i%$;ciIq zy<<~mCbkAh}>#mL#spY>tU7a1h=Pq8p(tomU z>+aIJU2SB;^RP5@UUvTJz|oC>iruLw%^T*~{lZ1w*LZZ24PHIh-`9Dxsioz}2@L$M zuED{xpP%0HQOk+?PkLzHPnk-`@Y?}z5D-G8>n}QAlrB7m@`1r~&gY)?b$;F?HAyYE zTf2KZPj_~H*1nJKT6;y!W7(O9wC9tb17jeqf4H%#s z>_6Sx(b?S8cCxGU%=v+HyG-F5nmf@XJ4eey1ZI=(jKM>5)X7cZQL)dRdP4xT&R z(*cKDI{MCBIDcW_?2)?q9kt9*LHVs)rzpA#tcO6yD9ulUJr|@4e;+!3$srm8{b#y6 zKR-lK7+$TR|7`cc57t(6ol!F8!%u*BplY*V?uv&6Vp%U<;6?HuL*hYkfI+|L>^j-n z(b+$A@zPLdXKO)5K^HZz#Hg1})-Wa@Ok3-B70g2*g-i|(p64BM;9UQyFM7J#Th8`6 z-eLQ}G04lTsq3eyoTk6-2ggJdi{4pxC_C_?>qY7OgFyy3H*n?@i*XYWH`sQ5c(CKs zhT3ggKl-e*zn@i+PCxD3Q4Os(YCtBa-<@H*bZPkFrOTIwFI~8F`NCj-|Eb=duD(-) zXISS;XZza+cT+;9tKYd_qSlvm=Jx5Xle>0q+QgK%?W^6r(U<6j@5H+!?|GLl3KW{I zp1y%|gBQC#}^yPx+D4k2Q0{kMCYjsuLh3Gk$yJL^m1{dk0z4L`liW1e*7 zU&GX4>+I_29~!y@49Vc-E5n0>C)RF4#D|20K0n(p_5VnzGH^j^1U}x*oqN}>2#4_D z%g&c&SMFTy@9#W(=){E!;ExRTU6x(GcX4pfp+n*cd+`6Y|M^VU5x_t;0GK6E_&!WD zUAoM(Cy#27FI~BNd9b(bv$p203j-It@!TokLApNK zTD5lVhMnZP(M9>x7`x*oRJ!bXW%$zRQ|+BC0NC{RpXG%V_FcYyhJH~ zx>X?fZP`MO6U)B6I&ZB1FyueEBD!$7a_iEm&pW%@K5uF2zcdU_FJHbPyYbugYgeyc zLafdn|8ObG{^QndAH2JVBqwqb-<+O`o`THFS6r{$>N`bU>-Nu2Hhs`~`2sIx*J=ID z)oWLw>%vffa}DLq*VpX$VDBz)U3Tq!uV(sWkX~pko+Tw7k8hpp_`IdPy{+|7buHDE zFI~HKL%MPE`Zb8Z#BMs%c|g1?uiXgZk_2Yfy$`nM%or&ig2l_C^A#T8JKDh|`ux*R zcCMM5TibsADkR)seEJu=qP4A#(%f&Z1JD9o7eMeTCRllvymsxX?5cF-+~wh}BVbT= zp8WJsLtaMCrac$0UH|gNjq6u0U%7&iTsVKa{o~rwwLsPF*e1a1cI;RYWxaM?3~>zt z{&#M$^T6SjmiEq$woe=KvKHm<=n(`+H-5S(29A zGZIEYA78BS`QuH;np;SN>+0%h`79+lJ}#;114#Sw`j?m3SM2KkRLpdAul$ytJN{g3Is6$IrOhXMTTb_Vw)a5uhI!*-5=)1Lkca+bV=C{^7IE>&uz1rUdRLy#)ZAaRU zwKpF>-Z?yc=xk@(_Oz`Rzqme(3M3wdlcT?X4>&X8WZ3-f2UOQspX8S`)vOlk`7i8cD~#X(@1PVYNjyM29ic~y1I#!Xa#$bM() zRPJX_RC4(xKKl4Ve^>KyrtxzJegrn`U_bp1b8;cWvK!|v4h?m+96{v)dbfE~P0a>y zxAI1h(y8UbO^luyzIcw3W6e#+I|skK@$J`tx_klV^6-9@MUvfkbaC*)#gi^dr;& zTBQFI(CW6oON0t&EG)!?oIPp2Nk;DUba3f>e^)CQru_p~|MJaOfBrMfXZ@w&o5a=( zqX;g-$O6{ef90%{`T#+m#?3> zc7EuxIFYXoUxNUwfXbM4yTFlGy9;RQ^#0TG4Owd;eORRD2`FrD>PpR}|b`|PvLo7PygD&{cQ*TO<} z4qm(l6J5St@3i^ovB7hL7lhS>7!k&GVd#tc4|nd^^zNp2E8g7n&fb$PZF`UJ`Cwb6 zhA9jWwNYZYt-BAc_?N$a``2&&`q%64wGW&gBG&DaFjlcQ&vmx#1-x=o&AS!k@*n<` zVt0ENqymworFlPTuuaWvU6-!j_~VUh-+c4!w{3eHv3)Rwws8;&J80m{X9vL5f(zx~ z5LY)JZv*rAgSq>3+DjKtw=^C;ezfU$$EB;+|Mpg>y#Q6 z=&(&){e#374qY5N^Tj8h9`EhzKQlN$91GoG3vPS23P8#A+jky1)Oh&7I`A6i;?ly8 z>1j{gvT6GV?;bqSOI#0!IMT5f<lrVGbq^uT5_{)Whmw&fQv4mm4RbfZ>o@+aGs_7Fja@Uqt z?F2V*n+-ovFYXV62=66q)6*j$AaqV%^O->mp(__J30-m-HFjb6%J8+%+ZtvrusRJ;E`t&vGEu$7n(Gyf5l6c8C#efYEH)-O)AwS3us3Pbn&rQxfn zr&IfPy}xtk{`Rd@r{A!-_R#))A2mjrn0>#-2b?*x#Si}vfiJeGs4=Mvmwr^+)yT2Z z0l3}p#Vc38`s3x{V>mcx9PZ=DXhMU_j((k_WuJ3>G^; zATv^u3i5Wg?c4Ew7vx{O_SGN%c;n0A-8*(}t=O@-2JqJkV5;|JygtXD1P>j-DW;KQ z6OATcvzM3I8Zds+wCPD1X-ijZs^0l&JC^8|UtYWZ)wLTJF@k^u-3D~Srgy7KH!l1` zihlsfhn`kb(8%~P1XWq>*3mIR6c|sMIyX5ZI;)t6s6 zfAzl`S6g=O*j8N$GHG31eKmoGrKMCuki7mD=NB?MGRtiB8#!ijL|jPHjN}P3ljczl zIj6Gq0{mzCba3xRU(3f^QJtG=>!teZm8HpJlO~MeJ;uwvX!5kmrPcu7u(;UqGn3MC z=B7r?otr{9N_qeA@9g{XE7@27yx!S&st#u7H}mIq`Q zhz+kTT3LQ~ObM&8IYPq1vQl z_~Ml-SF8YaC2L8SbC=Zl7|L7QPCB1_dbHsHrIe)F+xrh6X=rL_c)xxl-R(ajN*BwT zAJU#r9#{!_)slzHSFQw?va?Ip^@#cN1_Yv5m5;JO(1dVVr_}bmwavNhK|@`A?Y=#Ahslb+d-TxJ+QYl*nh$|D z;MV-Ssaa}%w1wJz@XUGT;}v;S0;lD(u8vk&>wkISY(8?Jt^rim#-_tyiyuDO(!RTi zrgCaxJw03|o|#-$e!XJJl6DH6c6N4m3Q~DfZD~4kuwl>cx_yle%^j^Lj~v>udskyq zvw~)Kj@1-GsN*Z|wO~g34wnn8Zf&LENgxp5aP7gP&7B>cttWPZpIyle6%@j{b&T4n z`TSvdvtCPtJ)KhL-`hL79iq|N(tNn#z_z-N8h9~>{u76{lx5^JHY*wPVGTeG6kit1 zo&Rv5Sk|si-bVjHg;Vjo+Qg-!ao_%f4K3|m-R%tx`xnky*huLrG3up#s~Ho#q&3xV zEu4-(3Yo-Q=Sj4c>I8>AZLF_7am4W$+ydUfyp+{dl+S`gQq!-SfE*DupG&K@&9Qa4 zc1ax%+8E$uYx6M{<7WM_L$Ix*r|sa5t(9xnyz_oTOAD(aH9c)uw+dQstS$u%uY8sl zaSL7Dy#z0G;vQ^AmW`egygx z^K!L-vMViJzhwSM2=D22?v?f3>1}Cg*uL$f&Q730+K=|idhd0$y}fOlct;nQx{mfg zH#hDCwj&R0D*>4IW}LpemuFbs_8?#CyW87#r0)H?J&m2MogGrg?Vj%L-ku)nlh$=o zahDZwZn@dCw|ET@BS4iEty`BLKiu z+HZJWPIn_#C-%PiD$D-knzdzxZ@&ew(#Fc{aWA5$AhWm6weQx^W0a?^Kd^6i+5TSY zMV#)Z^*4ZZ_8}SVEqhjHW#ukey{>HiTev;nDlJ+)E(%Z<8jIIaiO1|)Cl4N|t*@`! zzim||MUuPEoEeY?ZuXyn_-=MnbHirw&YiIwa3l$Mt9xa|bI04nqqKP5bnYAK={yKZ z<-P+zRWC|Nt*j@X0)vY2>0j)M{dHAT*v`%b;;WdVr0Z7aj4|;x3Z$v*wA6R5x2JI@ zaFGrBz_pz>Ywn7-@uQu^AUoaL*N2dFb~M#*sLaX$Rc_r{I1gOi{1B7yo(|B1bozfM z+Zr}+udS_bI9Ru1>%7^?udVx35Ficw1a9kT3dwi1HCI*^t^%$coHv(JDeuWF(}4KE zfBMhzIJ$THo;`2B2i$Yxfdi|luo}OnutRX*r~WfyF?vuW^}E)sTD5XD&|I#i=hw`N z34lJnSmBPnyLauWtwxVEep>tfi_S+nIn5>irxlex?z3cN{-~X{5r?#!F;@$Z0YT_Ti#j?8p=Ar70GIORFso5 z!O_9CGiUoxfKs&U{aWCO>KYDgShsR1Ie9s4eOz@1m^l8emLnf-uimm{^~#kFOfFIY z$#7ZZDR{@9uG;MY*#ayzUj2&(8Pv*X`Nc(As`t*S?J#^WqAVw=}kOv1`!5_uE@q z54>OUcCk=ezpO5PlY$-V7LSj$WEk6e5WJ_STXq8~!ySKT-LCpQd-pc<^lUrPP*lKq->xx*~VZ(&%WO_?{@-+`9Sb$0Z*Q#KiOK_?E`P=9)p<*n#1J8KcGcFf^tVZ%Sw~Rn()_&K*Mbx( z@v!=nLe4hsqLO0mp51%)HVO~nHR;-YLI$9O{Z9{9`_X^xty_VGD_+AK0K8qZa>){{ zx0$#PgEK_vYb*EE?s|LG)=UqAi(q40!~3=1xixl>iX~n9H%_iIXWDv%lN$#bCYvZ4-rD$9 zS?S6Z&y4`)cdf?|r*$ZLX3j^t9JeDY)+NQMBUkZnCTWMfI&s?S$HO z3u6^~^JGKadT=IJtS-#S%F5opqmB+{ya<+&ismi5ch~LSQ`gwd9dY1{aDmpXe-GOS zQ)n9pp|FEmo8R9I1QuLa3}o=CJ$vhbCoW6as8MxyHPybieeZ|6_Z|dh8IKChj~rg{ z<{r#f%r8ff*@?E3Egw~5cdRR3vpT!79F(`6@6X!3I99Jxcem7Ud%J4m-ralan@$g$ z8H9&Fe|qH5x}1;jLALi$H;D0DIE)7ywye%uy>!j$>b%P8o%=RrEm>nE48UFAdZcFE z+m)MYFvE|vw4c6qak!`NjpwHl*K_*7jx9$;u~m471%VZFVrx^)ma>(3OV$E%SN-0x z`n;u88l#9`FuK1?#b5#Cy1TKZjnKySuJ-0bH9PhmIf@6gl`tB*!4_OwxDxEgCB>!N zw!OD~b0(=S2}*^WD>~6C1uKfn3b%Z8gm_YdV%ar^cON)%RMb4hV3xK0N$~I3p$*yd z7iTXm--f$-dn!Swo*KM;3YFH~%bJj$wIr|nLkiqWZ4Y^KY;QYSj}`x17(tj)OrwK8 zjmIiW=V!c@y}Ek)_V+3c3K4AO2mz<4n#nsXIeTT{jzgGXSgUxgTbPcpfO(H=J3$XT z9qq2nqQ-Xm^7Zd++nQ?7D!5@20mDuGnZ`o|fy7J*kDOf#4S%8T(eH*SrZ7A>Eez=+ zC+m(K+g$^mZARA0QZNqJnu+J_RjO6)BA|qrQN7M;wNIV5r@0MFsIRMAD3f0FSZ7aP z&zS>t?^RZAIZ~BR^jlu$s^Yiaqn@*f=_c4i1R6^2KZ_tgt#52n@=hjvqOI-7*&bPs z)Yj16)60Q*qOy!Xl?@qrS^2q{Z*AOGxoLByJCk5slZchzKZ0Vc!C|YmzrSbyp<{Km zXIqY8=yr7Xkcv2PY|~pMrKOwd*HC0WFTZlzrj75s7p!OYXOsd7$LL`ZksdmCb4WE_zIRHv;ob~clZvs2Wzcm|d z;c-NDQT6YL$@)TM?6~+@iLcIIv8r@OJ%;GnvuFB;&J1*60|DL%n%t@tg)6g`Crz2` zZ6!KIZ_@kPB7z9&GWnPSLwzX|4)DsvS+lb9OAgexVT*94NCVdf`}dAJP6a={R-s;XW^%wty8NDrJee+#qt2L{g;33WkHL1F&!<0p=p5I>!w#&dJ`cfx+A zPY3q~j@E9V4$q<$mDN)9_1vt9;qhaLeKZ+;lA~gCUo~0HBf>_#Fd;s1Zo-Qp2?>)4 zl3Co+^E>;_4#|f8+23&VSQQ|68#h#Me7ks7!uZhWDDaN0FHFgKZN;m972zYrMFj-} zPZSgu5J9mlC;OGe*@=LeWTs`Nmy~BN@RSoN^1rdU6jdrB0;8}XD-#?eIXGHQE+QJG z=uV-daZ#~ooc0P}BL7{OmikKivf}cJoTN~l%_-EHj2b53qM%S#_;mS1H=w@mfW1*h zfJ;#^aUBF>$nvi)%XuSp;uKN}UYZRuSXzF5Zc3IWF!80Zh=nxIq1LBkcn{7(0i@(4 zD|RlHiXKDw^897a%bvcGnnImCDe?Bq1?j0-sj1^;2hrWkbWw^}mi>_Sd@@A@)yp2b zDHP5Up)9iEM@*mSk!8{{Y55Q7fT6?-xSrI^^!X{NW2bnA(^XcsTefq~6FVA=WQa#j zMFl_?7s-mG{O8N_o%0{0CeKbxN=RM+q{iJh=D(4+U{Z4Se1JmSvY%&VQ*}0+$bNVR zzM0&$fWoY@qG!d0%Vo>|OHfO8dP;I?Vq!{K)`Ik$Web+&6iflcBU?_@!KVu>A|%8` z@wHqgE1>#oQBg^eAeG>loUHU$QWK^mC#9uk7cO6xK7Z_#NoiTx3Yy)?j362eCh-NN z6r+7tTvQ0FmlGh9zYOdWIGp&(8`(vLMay&JL&H4n%uqo!!@HRjlqF`)(NJ=dik=r2 zNkxAzC@gV^#`2u(1*s{~$uFf6_QM2n7lczeGc8-mpbsN}N}1N``HZk^d3GkNaT8QF z_*Ph!|H{}gcB3wETxw1Z%OYhxP4yIc8aK$Lw}nwEny9DZl5#?yib~3h@^f-B(-)?_ zk(p0oRdGpf&g^_!GS!ZAoT&yW@!##Nv?QxpE}oB!q%pWT5kmD{IYB_g_mmV1V578! zZ!BMyUtCyRR#sk8lAr9Jl9OM6jJf6fnm%P3*mZIsu*~K#_#i8hl|2pl81nT7Uxd$c4Fc0>Wmh5@@UO|L3TQL zh^~Ut@(S0ATW@4i1ABH#(iF?g@*;wts%ZXAB`L=UM?p@4)`{Rbt*6D`3YrnI>wFKs z5sgLMl|=N{t!1yIB+j0lJTqEtr!;iQh7C267$5peii(S}Q%9jtpSpq3C4qhR%;F*V zC%7*Hvz#mLmKD7M&SX-`*a$Pf`O!YRuo4<-AbGRh*^AA zBR=qRRW*@g(_#}6{Gt*;t4c`$c8XfG?uCK}KUHlI>rsX_nLPv7kRd zAz!R>;j}4}5)#8uXK4!)$1&0G6&6UN9AXKZi>;kAEh?Pn9(PZ(o0$^hVtJ&hTQwWf z6KIF-ekE-|sy~ok46ICctlmu)zpRj59h*q}s#?juu?P&oM+OPri4JaVsIJNdm}}Cw zL=d@>Q&UEG5=JOFot5${HqZz2E-uN>NuL-S79LKaWe4mVAVg-Q(Mhn5KgEf$R73!G zD?KsmjdA{?5(I|Q_n`UGxTa`XL1xOdX?DMGGudrwKYsw{|3sN@s-~9!AW~ITo}V;! zT>QA1$qCa^mlxztN(u@RFkInj`NeD;)bRa+oaHIwy!C@@b>ri_5{%BS$-K} z_p~x+3dz0KjWzPyr;Oh^-IcKM41x>Si$UuTrYu)57l(=;PBkOqy zpL$$G5!7iA{_`v8Sy}AR{2aP0zuAQ_x3PSaniP;&*#$ABH^0c4FEV(>%ul zPFcI_A_y(W$f@`*p(Ibds}Cxd(H~8U&N$jKXxdGYWW{a$}(ShY0{)A$;&7; z^T{Xm_2pIB8wv}`F`|kq%Qi4FCwwZ&5AJd~E$%y$0+cw(Pdx@fl*)c9$xj`Z2wGrT zVa;wP{cmc&ZP<`shC#w1SA;PpYOgO(BT+*5JY-JyWQvHy#7X1E0j(x;`lY#;> zRx35Xcmr&6sc)D#DSughkuZjk4?=j03g(C5?~uF8-6bcvi+@sLvi~$cixD(eCRjkZ z*onyt-aygq-Cw`|@l_Q)umrC_7g<(zrJ)w27+rS)*ALld$ z_T4VYnH}vH8Z>RnwAopeH5<0Vz@N!h^ORo7p@XtQ5skbohcou))Nr!9U3A(oS9@4| zQm~Uuha7yjJUznG&mJ6sX`Puz>QOdV5OhOrsMhy_T@p zuo2@T5|O#TFN`-B{mk}=)T}ph((|h})KrvJri=}LLzJh6X;=gpCAmLmMTA=vt}-Lo zieXWivt3<6Y5X;Xy#?s&l(d|D0<#N>3$o`&jGdPLMoxDAa$@#~Ez@qM)gx_KY;2U>$>8*z!hP&~OeHMJ zB6Ku_3Ny6;QOu=DF^g`8|Bv1Lqd3n@PR|qR{@+E#<-ePW7^cjlQrNZW%aX}lir~YK z6lPE_jo{<`Js~?E8>FJRL~QVK)JaiUMcIawYPl>$HJ1b zN>oB-uoWpJ63EIyPX11Rm#fWVXJe67S8u4= zzM-ZVLjX7+fN|7vR@2SN?sQM-l`=b@0~b{))!g1%HIuES(}FRn_6%Y}1v)*LI4!@Z zvTA$vcIWNC)Kn&Nt5-XNr5YLPY_iElq9HB!K$n9ZL7}4t*C;swu zx}Q__JC)VjW!vvmrM{6F3S?r?h_E0(5AcPbq6eJ*Trk-NHZoohmB=e6#gO{-AhH>) z+~vhTNG;+A{1)6`GH=|JcT@uLO{HCt1*okfRqTO^_SlO8`{LhtFo44mFe4^%Z`7ch zsT4Yq)Wjb*a#4QMk~gYSy*ZX!g#fe=2{qqoL8dVQ3#B7f8pt{UETsbMgFGafk!SBn zcz>=|x+uR_X#=869_oYufUlLLdeJqWCzCr62>%c$AEd*JG&qs4qSmS8;`ex#RFI(* z7!gArU{ZRh%sO$GlJh}4S4y(t`L&7&4}q_ug>ErH9VuDj^5f`&Tqlu(bC2&lRLXe3 zbUErpm>UT?j%>Z}VFr-TfCoE}!~{oCR$_D))f1&USj3}|uLLp9$~)k=2*d#ndpehs zYW5rGWma4mYu)z48j;YhDr=UUkm1?FpHUeG9f1elMzyYIyBK1s~IrA|n z=Mw@`4%CMbBvW}W6v#q;!A$w-P4dr07fLdeSw8s8d>K(v{^rQ&242YVd%5xfZ2|*) zFv?gX`7=I>dku!jly}IeGSE;3+k`C0RQLIpTI=B#VgL?7rusI>YO%lqZmTM$AoAVi zI&W{XqL~d$5wa#=DDHzvVAPsoSY}31{i3#k1O@UGA0ip?_Z52pk`4k$GiTK=Ixq-? zEV8_o$;?(rl%)Jo%+BIXH3c9$h;}jvJO?FYJupHS3001^4%Ps!s58ZmR2u{vB-LXs zdfuKU7ZY$FthQLJe+h^k2Ve|Sf^i13pGsr&^tJfmW@i)JbFfFHHhYU?C=$Iqn3fPR zSi_Y5;{zz6S}(>I`$uaG6?j})AVUQIl*%XGDwQXYQ4g7?qn(UIse3Ac;HYAbf-4V+ zG%^B?#y=(PBYwuO$kDsQW>c{{$yS3xvBF3rkR8m#WMHyS-B}Mw^+;=Q2!KrW3{i4b zxhWs9#43NWJD(ya{O=~Bg{-g!8l6du3i~wl@CX)&Wp$)qI+DMHwEilVSa4AQHwk2w z|B0+-k>bfhfFI=LMJpkekPD)~bC3yCKL}_GW~;F~Rnk6VIxdhd*NB}a zCg#`}TG9TgKo2yQ!)W=h ztPpC?D0ESbjUo^hMtbZcR1R5-P(WKpQ}OxdD#{N0fAC(xmV_E)gqe8&wq&HJtB>y} zcAclM8Ex?sgEMD$VgSX0k*W&8Zt`DPd32x76Eu4OGBiZRJ=A%5SWI@`QPQZ#5hjzb zL-VL5jkETl(CU049CG=$4ksh?wE0?s>}K=}Xou zMkJIb3$+g{CJO`^LHv_+cY(<=h5=B-^iWZvq0!6gVG6eS>m4^brI;!Xed?ru`e_o1 zUNU?q5TuCXBMB5nfm|)Nq}pKfGKEYIv08i#Y9UllSy{3;Z!1B8K!-3>5lkr;n@}=* ztyPP2OH0vI!Bf^=r81hVljdZAn_=GT<~o+{oCgnX$zMhCM~)JV4@3=@ixGRMg(<|1B=jE0e;n3#-%i4(ylb0KaP;`ksEpq4K*XW(WKFjy4GbWU3p6uz*Bcs8-7ZH!6jJ z1B~K?SLv+UP$T)}f`zme=ek2*U(gyXK4zOkiSaX)*3%SbvK!T-{opPejQ{wcLZwbj zoIE~aj*0Cjbe7Osx6nImb5_!9vHN-mwJTHoRZH5j*`zXZ>H-%5hs5AYjVX+0t(>_D z!DIYUmMqC*VZaDcyDzqdKn5C(w*C{M#o-6(YSvVxbJ!o+Q2&UCg6uyezW(~8(Z~&a z5!%sNbx%*MKH;F`z@k%c3+-tVl?22NW;fIMk817c(I(5hw7kUWnelPSiKDf88cXtD zh>2Ahbtc^;8)C@P$ka03Hv(kM7t1Uo4A5x!%kqkeObDGjdTMf7%%tQvOQ6n1^Jh>f zQ~e5PqvvQ(8<5AG2S{bBmsRwtRC>llSp+DwIQ~7`-;i&p&SKQaS`@l(}e4VEkM%gtJ&@^(97<6nk*`v+N!~pp#6HM za~>Kmoh8QCK-FD19~>6$ZwoNlqecgY*VgQ=jB!9hgP#=$&_JM{of^Mhx_E!1$`icT z0Hu%7toPKW1^NVz_VWwy_42h&@(%@DcXWs?AaLXBHNHVscDYGsv4;eWo@}>=1_lt# zYch(X76N>XRu8k*SI2uJID3KYTZ<)REWx#Q-k-w4UQhG41sNhtMhZ;FPnbDl;iAIP zcBZ8Fwjft(m5*s87Z6{e4@~Qwj`{@zh8jTM^qD~ks0o1g`3H@SOhv(13|_$aSOY@G z%qyV!E0(d!Ho+1O2^uaO0ftdf>A{`}7#Zrtk@ttm@oU%m0W83!WwcJf7Ft6ok!=ky zjSig`nQaS2rfs&-YO#F-boP+2tl&rshnsCA2$wc%V8ZAbYvXu91>?&DxnK!Gx1~-3 z7bhqnAksHvkuQ?@L}weNX8|slwHDy-Vsa|xfnwq5+tZ{!xiI1AIVCniqo!JPokT;dE3(6NvSQ={e zJ#$f$)gqkMt> z!fw=)?co8|oE5nM8F3dw`Is>H;$p*NVmF4wPm5Wx;=PK- zPdfK5dOdZ_*w~~$%vcmTI#^gKLRIYy06&rSPZ@i@i8GmaWOIW z$bjink9K~3uwhbW;h31Dh=o;4Q*{=w_H8;7prXD3!ND;$-|6vri{fUC2}QjKgGXCc@bICP{(aIiHXENfa*_I+A&wDHsJ(S}i zZRBKYV!U^V4>q9AR#l#pS21&PLR`FGTx?*#*zE@n>~Fj2{(qsSizJKaJo8U!O?vO-uv^yC@+CBC(a+fz!%YRqI0Zp*a_QR94`ET zUtvXJg}TY_DD_3MY{D8&^Bd=P(IQ*v7=(X61;FRdaee^c~(G+ePVNUVK z4IB11LJ+Xrv%@(eg@g*b_NEGW8-U*cgaLE`%bTl%FtG2kO0*Lupo$aWxe{CSdk*Xn ztb-UUkzE{*TmXT-;AYJW>pxg-s)6vAm<}hWz|(My?WTYZ2j;{OkfkC1^;x0)O&oVQ^+Iaa*dnh=7>;JFfD%by|8ak*uq8@ zjDe?|uwrx<#S^*GPgq+|9K<-w9|8m;Olr}E;u-YI;0vF3S2KU{mg+2QeF4BG*T@yz zqI7!xsg!@EnBa*?D_Hsa#P|jlaA^{s#+G4JcqK*=4+WC?nZI7HmEW@ibI324DnGp` zOg{0&b;B`H!6`-jqpq$4{D{_BZ}z?p_1f3is|vDMUWIHth)~4m?CsN zaECCB-r#8K;0=h38vQ66e3m0siYH3&N{Hx@86FZ+!-!(R{v~cRe2$TXKq|CG3k##i zE*CcI# z9ng=?RDprP&hlTy62nA7hVT&3{C~o>pe?sbIrj#mQM6)2;jnTvRVaR-FdO`kD?Jz* z6(Vpn#mb87N7UAgifcMPPCR&QAKNSlrseTr{@(JLf#89q+ zSl&G}c+i-$i~J!1%Wnk|&flpULAaB<@IZ(e2noiD6&gjM*1NijUF<5k-G&C>LOHJ? zh~5-#GB-fNz<9#fqS5$*GUre&qN#wGgHV;5tBdP(ha%E2Tb;XzSA}O3z2b+sJOM}5 zXgu8Yu#ROB!*fpq9EzW^a&ig>y8elw9Mtmz(Gbmq3;^6IclR{eP|MhI4(A-y;{X$5 zi<`P|46;IW@JLMFRrm;RiaqQmG@rW|F4W82)7OLH9y^qd_7^&_nRQ#QA`XfQ^Fs{ilXnF1|iS6aupXUCru; z#Sa zQ~s*fgSiFj8rq0jK$6@4fMjv}fntM)4I&L5@Dd$xhso=K+!{f#QpQ42$&>&GaZvkt zc_R{XgyE^+vyha3%iR!Xtvh~fC3ht?iooG{;p`DGRn(=CWB3YAcp3HnQU2g5Yn5V^ zL@z&y{|n0=-xzDiu5)uB_-VfrUKDmDcv@Wl#NHOV+!Q%=mf58D&~X;x%T)eD2qqlh z&Y=k>CYMrd;$-2tX9n;`Qhdki0GlS{knOM4M@*eHPOoR4^uVrFQAZJ0+*8Pzs9l`Z zw0Wonfl?R>V*fv2pQ&MkxPwZHJ4&rC;ni{DN9ieF3I8RxKPz>Cerz5*i(IHUwV)cQ zbLaxcd=xn5-E9F(PR3DkQ|muJVca-hjY2P^1`^Pt2*j`4PSorS!76?#j?&vg6Y#~Z z1~x7b5fB~R(2lUineCXp7^Fg@DXs3}&{t?oD!aR0ST|~+ZN!fp`ul>4A|FPO+~|p) zDO7sH2!oHiG7wu@!>;2$!3u>kE-vbYps9HEQJ_MKCHXB;=1+{TF?s;cF4VA0@mIA? zfTJqhIfo${9VZ5tD-9z?Oq??}A;vGr8}-Qy9=Qr-<~SA+D-Csq^nnDO{mDa5AxbT@ z3q`LGO9N4M@1UTCbEd?-{BmR<@*^|{D$iMQPk1H--m|-&lkBz_4&MpOBNRKwfu#5g zZudZg$MnQ`apO`V!Y0NAs(716IAMhXOgT*?o*u}RQsJpb+B9Yuwce@8pto3Ub}eR+=lIF<=8ORo(AzgW_(cPw zYw@|I#H1(>Pcm#H zmBzmI#Yis!eQpgl`zMP4=_eXt^4HC>3)_dNK~;ob;N(~5m5!SC|MT=FU{Rje-@nfQE+`@(o5ME9 z4jn)c9YF!Hq7y=NIzkbFYc4`fjIl;*t<9TOt8t5Qt5Hc1Av1u$kO`tJg1`hdP4lZs z+P-hnm?mvBV%(xhl%4DUIb(kRD@I}FInTYE<-YH8&V9boIbpwjW6!3ibkyfdFII;J zL}o9D^yR!Y2^pT@y>L#{e08E`nyKI^?FN0cEDWw{AGay-){y^~)BA$3^QF&DTeS2FcRPiZaE|&xnW`6i~W)Na~yGkEBA2&X( zB$mg$x`#?mZL{@yf8m3B5PINya2&RbMu}N;LkZEC?vo=D9Bqq zJ9k0qTs*dzWPki(3CZzENk5CjQ{#JI(jSXIHK&TacI(tM!YG4p7JacF&$yUvF#qLn}81=cdnzo$jVi zcAGi_%cKsD^7I6bYI<-Kj%H#b?7pW>FF3Yq&u{)X)nfvQb7_Dm22DtvFcRVx;51I; zEEr@@P$rLz%4q0SQ^%&vBnfTYmybuh(xN440K`{55j4c%sEqKSV0n1z1nq?JiF`yx zU82?yJV7^MIMt977cY5UlPN^^*v**tb5Gs8kckuKPI#PJ5}x9gnwa86UJhUL0)_7V z;1wMmk@%YpL7OD0GIYXdYIwBA0}r^xzD|4=xI%o0YFziCfUV%@czXu!H0*fosJZ;; ziQQWc@7%(LA?lJSJHLKy=dLaK>}N8TtTeuyNobILp@bp?-hiW};xWnn|IYA^i^+NV z)$%{Tb-H}_&OZTq2lfJ`rFQSx_1Y?9{*vWsYf7G(s`0{3P^8suz!CkS{;j(+7)1Bk zwFCr5t=)9AqPpVXftS~BUawkz_i#n|?tQyAY)M?YbjcEJLN@zR2}0t3awjS$p-mMi zUJ@j_&qtnWP4?Eq<%fZ@0`rJ|-`iSIexPjaa|_b5_iWK7B_yzop6E(U47ckTLzad= zm#LV_#f4|KZQH$b>$X>RzXD>>pEkX9;I)kfy6oq6@7Y@LObnVj3;-bxCTI75Qq5V; znUuF+4t(5`eEqg;e)ZK&TVCG(a@nTs)f+aY>58A*ws+^2f@fS^UB?L8IJ-G8gTNr6 zv*?2O+!gPy^gDOFyouUSWjoibIllfGZG47l>+ZcTJbwB@z3ZF|?P+p}(Uc8Zch^U{pUpurnec|doD>LUOB#^X0o6u43RERj#5JM&m;L5RDYK(vD z?h%z=a$w_H(`#?rP2#-&vurzI|$Y6pee#7 zJSpKmC&H5>%B;gNkfu2jnf{OXnrZ zRKgS*SXV$n z?|KCIW#nY0li(>V; zIFPx4gNZG5MpFz}c5K6r<0iC{7V&rrfoCEIsG@2bJ(GL_VDay8X+B)R2>29advy)9UPXf4$-i?M>-ty zDhGV_yu8GfHpV6HtsHK&>;ro=`U^|=>Z!}5p!vua|7m> zau-vFE|7~Ol=yQT`j5j35#f7TFhYO&53WB)Sh1lX6V5 z-V~7+3k@5Y^*YK%4 zrbrjWfG`-zB9N7K>W?DpGst?8Bm~4(%)}6{c66W74!e5ZEA)SmcLVVzRsu?bgs_X^>Fgq%r-~y>dgkWlc1==sM8+8xfyO}Z*aUCl zpuXg?aY*ACF*wXO?p}0%3>py!y6WQonRI`;yRRk&yB(-bO!C)o9230}U6<{uxCgNhJd9!i`Pr6AuS<9BEE>ZlZVRdu5Un4ScE2VZc_2;)f!D~UDQ`38h(GEM6?YN9m08alvIH;o0*4K0@U4`W5A3Bhgf zr#UwU1o{RBg=;g5H-u@TgXC_kux+Z-RIyVs32sABF!}JHpFBE>j6oHw(S~i>7zTDA zm<&89s6j$B=6E%8JB10xa{Wj4nH*igVI}`VQaFMmBA;F#78XSi9e*&r`%z{W4mH=FfJ`n(Rrd|^arFe{I+9_$)-fUHp=w0owve|V%? zJqy>fKXJ#1S>k0;yl;|QGmT)VI>1m?vfgM|nymHn;YK;qCi^y6=>4q+d5VPaX_u78 zS-w6&VTo}hhbdnDf|Ce0O81?3jS2?aww0A8WkfL>s4-LFuA1>zH7O!MC;9^Z8x;oD zL5Qy=I65g#Kph1EnqCGQ4p-Dv)xUlGz~0?k2)L?2(r|L`gS+0i7+?~2nmyIgu^L(r z3`z>uY7@z05M$+-8Mplw>cv&mS{wH7-?~1UK03_%mjpv`N(2HDKFbF@N8gB;XpMT7 zIx0$=JU7CZyi5#l9}4B=zVJu`m6$BHjuzYYI?D#;mU3SX0l~2ZP&p{sK0e;Tfe|qg zA^z&<1sg+ba;159&5IOT`+ljN6)m@m2@pWpsD@ib zYJ@E;J}dy#(lot6tAWMp;2<9Wp@U9#blUqUr(*A>EX{@U?<@%p3YB91oH7CEKrJ0p z&nH2^D2ImyE`54+Vvxs7w@@nl`Fg8QTbuoMQWBY;Iz$LLpJs?Bw0x_c-nd_`=~X^N$a+htTP!FF5GTz@9uNyQ`zrPi0^W* zy(2j^DQP7E`7mF(%5_Z>mK4L~tXM5ZP#f**r%@9$-?n?h&TTL6*k?U^u3L&HDt%7& z`^+89pMT}xs+G?KC4)Q#{N5cJjaiTutBr|I)Ga`i`~;`{6E^~{teBX11c)2+V&cTA z61AJ|yKeE?P1_Fa*!G7Pi?^;T&MVBLUWT&nt4-@(C{ER-C(X;qDotk3$EqdUa9)5L z3yTND)cWLe=&Ra^ya zNup1(c~e~P;}Z4t4>1&O+qG}kmd&MkYXCmFyLH!&7dO86%i_rS^XJVAkI;#y*Lm_I zN!@juN!bOlW^x38o{y$`t92z?cWedf30NRHey?QLj?F6#zlfis+fW=H6%oM}ftd6Z z7K0g*Pbv+6E>khZZH9Nc$@Jp764SFUK3iJ)>~n?S8y942b-#FVLrHdeC}?xTf&nL( z8UN(S!tiCw!8yruT9l_(@tXDP3yVu%DqUIlt9`#LOwc~{3)8RHk$!@AXpBvrGwZM; zWHv}=8NaxX|Lrj&b=}(1LW&lxT&LH+l9wJHo|Iei;;)Mfvc%OczI2JU2*8LO1v#D3 zyyOWJux8xfxXz2n$}L=$x9Zt-rj>bXIOA+xwdz;TW-ZHOj>hFux6>5CLwQ7K2?sd; z$sywwhSfVHJu7cbLGf>kH?1`Ndey28tCs2FlsM2moCxVl;}T$%pry1tWth=IEx4A- z)NiN7rRMx{&DOl%{Cd-Ge?2F0*@ledpG8DKLz4oUp&|)+fN>LvBLE@k@rvuW)7(Oq z=4>u7Aw>BP(qK6sU$M#hz^sMg4a^UapuH7=0F+w zGD1!oh+w6JaKK9pWq95J*4fK{f3Q+$rp#WF}^K>lQD1 zDmgwQIyy2kb|TNwu7n3U4mnMHj2n}vn&gm3`wyfy?3I{A+4xA9uOF9o(!%69Ny!OX zIzaoArqVo-DNHwfdy!dDV) zT%3tTJ9@%j@WY`=swv-zEt1W${3X5tX5;QOb!yg}1#yIbVIlSK(90#%tR)-1V%7McOIlDe|^GRL0_$d!{ zDA)hxs5(hCQTjaqJ=%=dNY3V@7qHppK&G08gGV;ExTahmdiV#-@t&ogN!EzSha!{{ zN2L;mr03Jlh)gcZ&s04*7P!bkU9{)P&V3LFD>cxh!dOWSkol670p=LzzPsop{S+}D zrqB-?a)-QQ51)KU7B6u%_vwL*&+!Td@V^4$O2n9O9}vPQ4lYwpowDbV4;|Vo;CTWI zG(3H##7b3@Zc65Zh`Tf|F$4L28hMRkIJw^O({kfz8fYIerW}yO(n+chSs@arc;FzH zLjZY*5zq>3nPWacD zc6uYmS>Q+SB28iwAZJi)V(BH*EN;3n`5XYAP#JoBK208u7^R9FWgM@;kjKkAqZF=&B%d{V4 z02~;lCD`t8M9N~u$6OA=XgCb(lc^C#J~4%If+I_VUdXKnPIUyv0U(<4BV^n>LT6!# zi#RDo33#^xHx;yg+H`-i=Um{~V@#V!HgXG$vOMTu)KAcx&eIr)Bq++6XqYVwx!PnN zO#xh#<(XF8T)&i~8}DYG_?ycGvm@9Ev#Z8F$$1}(GX;y|Fk6h+#nI7z$|tEqvD&`g zkx?_%9$Yt&NF1u}xVxv2?Sq32GpD%Slz)7K)!`A*NwX6O*|3pE$Z;t&@4W} z|4I)~9f_xUszU-JB4Tyvi1TvBzC}$vGc^m z%36XzUK3tP$AY-jp^gmU00`8YZ&-q_n)~XUWqGH=TA&>RuH5?oR#oK4W!fdNffxpl z86ZCfg@l0G=o3c5I|dE+p~F-#S^Syq<>}`ctmPiJ>^LQ5Ky>Dshye*MaL7AM3+_A} zCRoam!;f`Pcqf)eHSIf1;!^*B1r!k`Z%)i= zuD0XtA*Lf)Ag(^h;Nq1zd0C6+M~8EgL<)K7PsY!!pPT?(2E?0bnS?#?0sR6Z!yHo3 z5BjUf@iQC$u<6z9J4~jP&qO7K_^|86jVOFV8vn{&QDko_tOs`18=yH)wZA4ROa?{z zwq&;XFW$QA;NGMAU)lWY7mEoFdXpOBG_6loTu-V|qe>{aw`Mk&_lQJPV0d^WVRtbW zj@fa2>2->g?K*V)*h?>!_2Y+LFR!UA|JC8wf64p;ZHv@)cuMxjEWz-jX%BzjpwOUMGrcvTiE-N4 z0Cbt{1b^Ip=N)UHWN?Mm+E8C>q28gt-wZE*_B#AQ7>K8y5?n=Z1TKJpGuWL8sf)wa zgj>D+xdG^31@qmdlHEKKn@NJ@SVSC zStOOfT&21kR}lVCThk<^WY5|Z+xOPShPv9rImyXU_#f~fj4=w8=eRE@ZU2FP-rUv* z@D5GQSgF&5gn=cg@e7UmKh=$mRFG?SZvL^!+R$+Nuzp@BM_ZNmB+oB!_;?4-REI_e zA?<$cQC^D5gojA20V1@~V3F}U ziLO$=1*kIadpq&j6hOnIw1XqYJEn@`Rbx|K>gdR*h`HLix&>KT=?isnVbMVz z+m2RI-0$*S97T~a=?iq)g;XNp7Di0s+U4f+?NX99IwmwaDp9AKt4n|S>5TNbF)`UY z51t3h3~ZE?m{3jPg1J#~v2&j`8WW$+)*E)d*+wB%)x~#H^qQCjiQ1^Jn3(i@gCSGD zy5yD0wvG$bKklBpASNv(E*8IMOoExWoaKmMu;l>Al2>w$gei%0TBrana*9UY~L8pvF#FD>4DPQFnR?-AeavYW5~l zIVN+%mMvRXuPt7hzVd0q(>VufJ9;i%>glW!QKglDE8KY!)&{HOKCw>mHN z@ZY8M%*^a9Tgo=rPt&hiw{_!|($&wEWgAv!%uP&5 znOkL}estGg49iy*7q1rgQo%XHlBaVLVq(Gqmusu*?Ok1$joGVK=Hz7SGo$CHFUXG4 z1O<9b4@gSid9tUo$C$1og)1#RF~&R|}lK?Ug3``y{#IMeY}mC6#DUEI%7a*Cs~TwnAK4zF)( z@926@T;iOlDGNc!i$#Q;sCQWLdNVG+9wHV}cXYZKO|Jc7PjSx0pQ=K$_>N8zkK?e! zE8MB4^(iU2ny~%N%^i+!#osL+d|b~sujL|)=FjDI=esY>kg-b;312$j6LS;?_TZZJ zHd|L`A0dx^-U-+ja$&d4`j5{mr>00~-R z3^kQj%&6n(U^~@(Xz{${+<1X~>**WC4%f#S1kW+44E|Xo!{W=&4geYFNAVxh*em zEEZS6f4NXB<8}86*!o&SXHQ>TM%fmMV;2LdO!6|5{x=EDs5elO{-Ql4em#}5H%Bo? z%nw<3+(!0{sp`52@>^thNtu4l$^b4ILUmK(Oh{fBHGg~UeSz#bvoq$0X@i6K^2h1i z$7EaWU2^auUhcm~1!@xrXZWk50>jc0xeMyWU2VTK8!g(gXtIk{M{_ef8Mn6=tbgPk zc(SY8-lq+do1C|NHQ8aa*y{L*sL%8YdZp_N zlt3j^rTKq>{sBIIQ42P|S>J63>v|TECruz1-v}#&gn;l95|(nz($v$d;ibx~kpK_B z;4mfZ-Jr-AmEzf2Px z5)>OAtBs#KcTS>~xQL&dY1`iVCRkTtBuvpS+po=PHbqXZrzru`bKNL)fxw$dt`iUNZ9OHN{&V@(xon5_a}2*eS@mu z-MCbBC|=Z%fY8u6OBXLrPF~3>SZGA(1V{CkALR=UK(;=Y|sd%v#E-QSoikkHG zb#?XH=Bu=D8P&*JLkUnz3N%qSUONb!V;ocb1A#y5i!Mzg(NQQokg1S!&jzpG78}sI7-F zXHyeW^{Yw>il15bi

    +lEPeMP}bFQtq=f(_2qf)7FuLtTzt9v>nxofvc%^v;6mR9fOV0$ zP9rVx95$RMEK>eLm17GwkUfm+p9{Oj>BG=oY~a^ zii*qkGFzeq^FpK3Y50JHL9IWG>54$NCKCvhvLKvFNUBQhBIb!sTUlbN_}lbF181EI zP#27b?*VM0;jMG%S-Zo^!yZaSO^fR@!1Wt=1}VfRSIzhc{;6Q#>l1l^gkKpp3$ZSy zg_so=7VMJSbjI?kNG{z%xbf`z_U6d5;TN#xgZ8+)O{0=rk*JrpL8tAqwrM+vnOR;} zsntT(^z_^+leV|8NSGKz(9X{!>>`wa&o<551q*>eW3Hg9vn5e#w6eJ;J>?#UIJ1E? z3J5iR{T@6d8hr)iFdD4VR61>bQvgnZNG;yk2O?=sZqlfhHqgm`_*dE1PRg-l4hUM zHU^19P8plExx=I|*z)}u`WA;rg1CdkMa5PNDAoJ(xLq%j0ki}2aYJg~TbiF+rqYmJ zNk{3ozC)o?$x5e0mPpD4V-(z_0Z^WudH%N_UM_kp^o0fN2J1RAZGkjP6*ISXH?<)T zGgGVttTHWMLfeH><_X&NH>HS!>ULvS=}?HKr%3A}HB&7Tx~0^wM6MWd$rF$WEUwIN zY)vg8op_e8FB3ABre`7hS_5B9Fz}yo%iux2yfQKNM4>|BB2-(HwQVSW@zAYN=ZQnm z7Ay^uCxAN}CeADnr`Tu#0%=Z|m|F%PW0398^$<5qJG7a#={?al{4R?#crh^YNC2HJ?D45DHARMeoy+BLr^XO5fQ$@8X}}8(@b)a09%5^rs!KX*LFpFq zU7@#~#x0*f86F0QX>JaLph4maK0I{1)8mtv)~&5jW;rC%(gv3Uv-r&26nfXJ^m=5?Y7q ze;(xj;mNtVwY@zKJoZz=gmG}{XNiEN&TP(^aRu5Tj?5G1NkSm-=ApxzS(snNBel+4 zpIZVL4*u8Kk?~)b!0<3G&rFU_j87A1v|0$LXJA63ld=m?EMDFVP`WBGxWGE!Ixkx^p8U@Uo0#Y<#Xbg;W1bqCt!AX!Wu{2Ab8D5>; zB#}A0tK_F-)cIA+Ac-U6*zkxr9zi5u1jK&|g(-SSl##`m&1q0u#0x~?5)q=nsbM-{ zUBF?E55Z(GNF2n+ML-R41(ScA5c8CwAcMAYM#CHgT z9ncQ1kSDj75Z}U{UjHrtkyA6{3lbhW=k>5@p zgEebql}y^7L9Ia{kg&lX13`D-G>oY6l1v12~3b@Bv z6vNIkX=ZvJUn>zR5d^r5A@vvLYvT0aPr%MUWesydycT2ZunYv~JcopP+7uKekbe!$ zPp|&@&>(IMkFnfNibuwX)|-wC8QhR--5w4LYbULeBay{-W43FvrF^Kux2i( zHgK83KCu9|*8-Gwi=)WX9u?D&U9mh3j4**XKM#fCCYQTDG`K*aQT8?$W{BhHaLmj< zO{Iy;Q%{a8@;Y&fw6L%a$2pO-$J1a!!U#^#m37wk+yt344|Lb!)Fy2kJUPND z0~rWdv4D;*j6Q?R0rdheUnpU@-%&e zhC>AmB0!8OQ!^let)MeV=IyVttzI_%izh2FLMsRef!u?rdx5-3hbVlMMV@;q9+tNm zTO9r5_~a1qR@=oITq*-WrUPSwfy;?i>gwha zLdmyxrie?VZT>c4dT8|7*4T>|$Rr_7FFZviZLM$-x&>e_kUh&Ai({~ZQdcO-ZT147 z8qmj+#{f280NZ!FF&j?I(i3Ai@QP4jt( z6`-z=e&H-3&gR7$m9kF4U1=G%Lnt0+H|8b~j!4{=G6?f@ChlePW0}IC8thzXl4s_btFmo6X=Qw5Y#zSjm01Fo zC={79%OZe$p0DkI!Z;~F$p@h0{3377N?BWg*nS>c39d$j8JvLXrG;JMug^fsWFRP& zvaX|M*i6W_cRHU-LjdB8!zwB`-6e@?)+{46bwcmp12- zP>XU4jgv)4VrK`@y_ta1j>^S_n7p#>A}!CZuP+YSRns6+lGc=4f;p*VQ-q~6M+9bO zYI>DC&E{%BhMZr-l4fr#lJ-}(C)rCoh!q&7DHS{5F@UN(1^y}Wbb{eubI; zKU*|{apLCeI%|)xHbdD_(1-{qT|fruJbF~CR5Dk&gSO5(#-u+!BS3CSg35eheSB?U zR=^c8paO;}dIu*Y8MG$!{^lrXg9^5h1+@5L6}$Ds(ERe$1YM(6vUfHHr#F>i3WdHg zLEoYfndsK@1p+$Uz2EFQ`n6@=DIJzmr^&CrWdJ6{Dflbt{Jb{2m z{Q>IO?-5u{m|~zWx5MCb>=UCPK5PV0xS-82J4F%gpxYp#&XE9#gP7@i#Hs-?My0KU zH9GY+5vG6I?$*=9Zf0?jwuNtZaCm|MrY;m{&`N$!Ag|J?B*N~#N3t}#v`#}9A4-dj z>DgT_hm3ah=)%h43vj#t-4EaYyMOrw$qQtH!R5AKF|Ja#a8ThkJ~NNY7;_UW{#iW7 z1Sq4PAvEB7B3fxnR*Pnov4yb44OAewo{-sSMswgF7@VbSjf|7fv4#=h$A5!ZV>~yY zYOPWimY~+2Ai>7Eu`AkJ-9sTd!j=mKQ}f^&0hsjtkHgELUW58Dj|@|w*U@(&FKq1Y zApC{3#AQd#eD3}X(xITNMzAzCb2z98)95H*bq_6!FD!1%trH15Y&ml`7|`lxfV&@k z4nxCpfW_xm_jZ<+QO2WZN}O1N{pqQ2o|*%pI~4LuEmJ>D0xSe!1AvY{XfZ*?sDBZC zCid9c%JvRG)PyN2o4pq_a`=p4xIw385eN-|@;pn2^yTpxG(=^})u*@`-})jn={zlq z?Q*f{KhEy$G3hIW@rfV)?Z5q*VAVp|GdD|IkSLeO3GgJ~Ub!H$8P>V`emZ$o;kbBp5?9$wm$$D!4}AXLtu#6xmb6Gb7BBc4 zU%z}E_}c&W>DXrp)>_SWsM$a1z3%j{Z(9kIHIpkHJ-(@$lfCm=!lKYx?%sX;prbNa zYON_(Ik~yH|1|I^@a?zXzceduQ@Gwcd$>J4_PJiYdAK=0kGeem=E?QlL)sqioIhUs zT|$fd!~6G-Yz}8%Z>kjEeEjh7^T*d$Uq5~L($6Vfg|jywFOE~VL0;cq-&8{ex2<;b zIPm!GHWF!`buZg4y~vU|fB*KWh&Jdvr|&-AeE#(D)5C{>4+9_nRmb&*>i9-(<9faC z;;NnVxWHVs-n|)kBN&L?hZ5Ol@1z&hTZ6g&n>T#EM5MAt4nBUot-r;W`2NGkkH;>V zIb!Tye|>vn&6XR7pB@WNh%{rp$2X4`kwm(1dUV>b=}h@oZ(a-e`w~MSR60Dny88O{ z+vg7-KU@YJ4qG;7eSCX=R4nCNw{IT1_@+XM%Xg1&8@^Pv*1LaoUzGXpuddE`i0IBH z0`>~tG9z00yG zcXNGyf>jVMH7<^t2cQ4=^4r%h@6Uaqw9{W`2kiDlEtf8q%EjZ$dN~&_zkd7S^?9b& zxVSt!IJsz$^GP-L;UE9_{Y-~(@8{2--geu_uB{#z z3V~cDa}|vyqsiBg4-fbK&f&pn=luHe9B9d~ucwyUt*+b0_aCmm{_*?Q*KLf}9^Zb% zYW(`X;Y}x^HnZo`E^pg&bd2O)U$S)m{&Obp)>Yca zAK$;bX|*n|-@kvjZe?T9WcB#&&8PRLjchuu*BQdOLPlF^7BaV<+up~4kAm-l*O_*^ zcYXEl?ZfMwLnL%~TW?>V)ia$Ntg)+xJ(v!cuP*LBeZKCL^G=!B7KxPo3S}~$wRxPk zA3lA(fq(4kuGTxcDjmut9GCmx{j1w*4Ug-mcMX@qQmh}9Pp%)n+}BG54d3QTq+-#i zKVNCY437S%k6$kvNnbo1)X)XCirHXsI?LDh7w6I2j~_mNlDh)-NN=E*Kfb-cI%$@h zE{@ve%bb4v``^zmAFf@AYQI-VWeWy5U1onRqexW_w=dD`z0O2)mv29O`V4ZCw{hG* zJH5H_=nK`5j!*|fVlXSNs!xr1-s z4!jM2xCqLEUNFu2?;o$*v05g^4#W<={No>g|NB3F|Mua-*W++7o{T4(`HHWd>{`rT zTi3^FRLb2Y3qqsG1zsSTI+t zbgtjko8e$4Tx(xCr8a}h8jn4G`dF!?%vOUrdUV|DzV`YOrJTWAC^x?1E&Sul*UM^B zv}e%h!nIP2ikxv1Up{AusZ*x2IaY&RcKSo4IPS zk+$fS5`!-i4+l>EBc6tgh_ff)eEoL#aF%vjjm}8%v|zBsf-!e4=zr>&Y(Lz2)&4@M zQax!`4hqR|m?eu8Be6*8_~`eq-`*Yj;`Y?_KYx4tRPdOLo_w=zHJalgt0|q1$yZk9 zMJK%@pD$OgG!GAt5T}(dN=$~*QMB{6`{nA()kQpH*SP-q&rjbzpB?JudvZYRGO3Cu z;<1;Ce9RvyisoUZl!;baowM^s@$BRbN6s^m~}fO$t(?!Un=X>&1EMYN|ahhr|sU|-9@%}^vA#cE7s7ruU|WLj~^yx zzxU!dJS71+J@okI%ezyLUXIg1fSv<#+K+Bu_3O=6zFsfo&+i}J#t$z4mw*1p|M2ze zZ{H4!;cO~}o!IKXKkHwfDs!o;FP}boH6}+QkF3E(;KIn|+qVyqTC1MUR^mr^y3?sd z?ZeYK@a;FL)m!u&C&O;5|Ky}{eAy``O7HI9rL=}<$}gV7eHP}!%ZK}`(m@kD%1NV( zP4ImtYqAy`y=>5|6bm7%a5eI|^y6c#+_*f?CX?mkcGPXxo9!N4Y-T4WwjUl|9op-q zKhvdE&Fb;h$B(7td7^xI^LXlG^LS>hr+xl#c>n&WQaL{FXOhWmKH+s3IaD4RkWB2aM-+%v%Z?JArsV&jwzy9&}FJC|QYPI8fJOb>K&+B)v zY*vkfi^M$Q#CYZAyc3t(!>Je|-5QDZ>rY?5ei``E{p0J6)g8)5GME4O_T}q`hjzOl zSDQWYkk{+8?a7NV*5>N;%KXIGY^QrH1VB)wO_$q;N$ug64>&>u1F0|HelPo6UWAlk zYyR-*ypumT)T(_JeJp6OJDj;}ahZhaF^u$!{=3_Aqs3`(J9E9-aR3~#_rHJp`0VQ9;Rv|vUu!?*A>MY{E*P@N1gxP7eYx1dN zqLn=V^5)a0k5#u(XNY%m-EuK<`0oAZ4{siDNL*OeJml$xl5No%LV7pRURzjoUY}ih z9J)}dT!=@mEB%MxzkT`mN~2O6OvnA>!uk7G@35`CxxY!dcBL{gm!}MrHc7K!)RTyl zvxG&;)y0L)qOlvDoFe9HK&Vt}ug^b!`{VaNKA~)TxNDl}dwhvny01Sy zp%ORf9M&Eg*Y%+Z_vuAMZ}akG8kZ}VE~N?&mwlO1hK$zJcOQQL`|rPfJv+O*yKgD? z_6;I!%n?k41jx5h3)x%C(}>(So{pT=^1Bip&*hI1J27Z04*&QYsVR<~KivSNK01R|hrUHpPf!x#S!EfARmm`A=)$*U%M4 zI7WPh%d4x)fy?8Io2!gVX>{5G+FGUPw40hI4Ubl)cKAb?UiT;;YM1P6skqtc-dtZx zF|I(|krh05zb=LsxEi<;eD~=hua}uqxlG0sFXl?!Y~|n}VG|-EAzbM8A`)k%9(PD~ zc@orx7ktdSkRBY2mJSY%t}ZXHuWzptQPsXRU2Aj?%UP}JxZgdf)vOA&Azf@8op==X zT)lUoS8Ykum*?j_8lcruMJ&|6ytur+JZausUEWrFd#XVF^r~5KarylAar+=*5~yXd zgI>4Su~?F|axtSXg$e`kjc*^VQ7dD)4dUSDCUTwN7ZOo>HQKDawO zka@$2+*L22+}G%AHUbGAfh1~0x z_D_%V!H_@I>Gw(;p4jAQoc2x=I#)DS0e3LGYdmVTYMANl1YE{=qJ8@M)$J>MiqoWi zU!ie`#ICbmJQNJ)4to6)v(9d9_0P_`I&UspN*-3)QAyz7pkBmRXba;oPiAjk-`wBb zoY!?`w^AQS8x(R!%;ye)}rS+8%dPfO`&A|A~M12}a(Eh~_J&XX=6h~;c9Q_VFy2Q4aP%dD#i z*(!y)(>*Ul!zc35TmnwmbB_ZrmdSns5L=tuFBskM&}+erul zcg#nK8D)FRC+9ZgM+5`r+Q;+?U2O)wJ!R=1F?ZN`*R{ui@Dg4E#40 zzuntE@AV38Ba$v6EpS^~9=*`+sLCYDN;2QSyt%!;uBo&sO}>~(r*)1{?flB)SMek1 z!qvrjC!K1xPS1{8Nw3Z7isU-oi?eFN=W&W8Qd=PC6@-!j&w-{>#zWBdq;X)h&rVNH zd`cQsp-Y|h>IrY|;PRs1jLVE}bEsZxUtG1ak)Vd9P}%KKJ&WUZ`eYhq=i=(NV|Te* zhp}>@9m?%)uPfEri<84xyocxXG_Ks01mpQowsCZG6o)*Xrqa7SI8BVfSjr|+RPYct zQ%;@TV&swN@~A{CRVc#;$IXVdb8&Wk$yDg&*787E@SQ%}?lg<(Xhw%dfYDpMeDm0B zcMr7gc(odK`$EuR?kc;iSr$*F(K%9;p4aMYbk8oXA^ucMz|_a`a%Yi#@Ow3yXQ3n!=SB{tL1*TnX)B( zZkpMVyMA~*@cQKO)!p^Y>k7VMB$6b(VNKRuRVd7=nhHYQU9R5f>vm60s}8+f6RcDY zI=!yR9n>Wl@?x(2^a2B~1Oxy5!|QhmiAv!>yiPRJ>?hJzOTeDYwbe|SKqax+j?T^_ z5syTQ?H5qX!iiSrjD%!{U?g$#@N{{)X(Ze`NRSs<Se(e|%myzUC7Qs+ILL@qIgYn`fBqlPmv z>E5239Nm<3syqQ-8&Ag)zE~*fQ-QK9)?4fbb@uV@{yqpb$2RrVeXiT^X%!N+IaCeF zRCbd?t{_6hj z)!ltQr8U}p0i&*QciqmLSS0i5`Q1gsu+KG`y=b%nX|P#1Jg&qNDStd3^3{*JeS4<% z`0Dk;_5HxT;Jd%)!xo?0l`$%0hC{5?8r$bSxVyR1@#T77lr%SidFCiFde}R*#8L^5 zHv-`9=^3I-!#x}$S9f>2a$QhcaM?6ceW4I7v~od5@a*W^EtGhJb~ZR0m}(6+PmY?Q zY|7*DCX1Es#i_?Df{?f5F-bVvbS7V;Oa^@JUN0U=wCY}mBb-k=^cuNJZvl}Pv-K4$ z=ZrED@p!$-SiX6A5p>pUp?bSlGf=j+Bzz4>)%oL#LNr=zRNQulC+Ie4qym{yw=x4p z!N7|YIJ;RE-;L+Z7s%&MFAE1ZDBW-GZsQU*PijlNdG&B}cU6hUigCNyW^)(~X3dsP zyRWCu5|Ii1Jld|N?QE6JWA}w)2}innadUG$aNT`%+m@)zK8w5Y`tJ7bvYW{SnXG-a z%>sXsipo#;AmkgK1s8oJUC7b33Js6%38!;TUgqiorvZxO>)VI0R;hLSy?3_{7uStk zAe-Z{brPY|DpMN_(MV#NFgFR**|RZyr&E_Gv=WWdSB@17@nrPu)g2y0xm2pN+YBLV zqEgPsLT7b;qpMLFI5MHlm?=5wQyAR80BeX5>LABJO5Kx(-3~`S9!j5`-d-PtI8u?; z8}ymNc_fx1G#{3Qjf`TF_s*~P_O|ES~DZE(1(?QMZQu|yc1StLyl4~`8@Egm!*@_nvM zDAxpxhxS47LklaA-92dretNE{ zH7u|OP#9d5%I^-kg6Nd7cx-62Yv;H>-rwKW8%IaSY2F4)z9;eM>^=u$e0EW^3uyER zIM&5MYc1v{(YYHcy-i{bIkVZ0ox|b52IHum-eF6*Jw_NsO|rky7U(b9CDqDDT=p><7OzhQ7cNr|RJ&aKARv(EIQ>hqqK4gP> z-{ne`51aLadaahX^LJQWIgPF?m+VH9#g{2niu-)IG>HiLB46wCh8($Q#=$gZGw~o) za#E8s6>@p802*j$1UVu#NZ~HnVB}Vv+6d7{AZa)2WTre4=woWDGm(sY!)YH&5J@NE z%Nqi*#+?eA9e(@{Xeo@ctjj`AKB4Csr8=d;iHriHTa9B@QLdLuk%%*lM6^(>?Ae`S z?%Nex++ChHQmh57`ckXi3T-SC_8YBcCFI8K%j%&TggT2RC6y{AihLoL&xAdGPt+UF zq?7Zr3sPa2whlvKCSNSXYKI4{ybHR~Lb-l`Ez7}EE2PYAZcO0wYlR$+wU|$4bbhPH z6HOPgX&1r@$kGB}Dyy1c7R{_${h*dLGdJ0ZbTVISH%dV-jFx*+r6Os76qL7LEfq5| zg~5b^5}3gt_=(&^9{Lx$Gf~V{2de*DtdBM`2n?69Tz ztJOlmCRXcB7EdG_cj@HY0(EL@gAokpOVz(rA8SV)xq{BHIzx6@E3S2F_K`h+*o|7P z9@5G*x=*f*?lHMx2fBz@p{-hk&2w>lJ|GtON^`8<*67(( zn>W~~RZ|W}9E8k#%Ap0k-|EYjn)Rqdr%};%_mpOncGKiA>N4DHxH-@i3{0dnZcj9q zt=CE=J$q@1%XgLw5v$6btkud%$DUX%u_WV}W-INr7`ba)zDi{mt*&d7dM1~ZZL~TW zm|U_YS1gz@2M{R8<$9{QwAoUqmTP4Pcb#c;1kL_r;UI6fnzt5&QY|iJa*@&Il5g!r zTFp+ZfwD>q_78bs(o!JT`bpZFvz*Xu~;OT4w|C@7k7>;S7bUz z$0yyR!&>K9CAF$>sgcr_cS8!r7L;{UbhZY*6P_fU$)wBC{Z*+r7KwyQ`GiyE)T@^y zDsTPpu-ok&A0iknqJaNdsdgLf;*cT5<;uAcIG@&6sUnF!GmsHrM~}$)T(Kn*$)t;U zk;=e#uI>eWsiPxY1o1A;90k9_*T%N*W*%N~*fyj=NZu=nV(2#&<*_JuXP7V!DI-MnyPAfPtH3`i7%Y&n<(nJtK z?=_(Vv4mDRTNc&u!~(s>n+-&J2S+DqJpsBimC@;H)VjiUG=LNovWcb#HS;7_2lq z?TToXI88BSbNOJvB<8Q_%nQ@g#Hqz>Itk;g(&X|--O)lJZEyvT`u*e1L8pD-w(*2= zonFL`by_K}gfb;7Ra)hUfVnA=>M5fDdyOsnv*o1I>DJrrCViq%t}48Vvu+6ViuRAQV(>!&Q)UKnS})=o#%??eYvX7Y!1XCI<;DF(@O=rn+&079!ZJd+y2klVktml z=#22}8U4O$Gn8u|cN#bjCCYh-oluBg$If_jKwZ)66 z;h%nZfu*z}=80%qT8rDKq;}txOE=?7ImM+&?#Ab zTtLlsh|Gq^h5&BdPbR{92;k#$bYWXS=yaMV1pU5%PPirbdFEDvS7H zNK)itT%gxSUQUh!E&j{8F=68H_7*o-7A0fFl!$phu33^Ae#bhf7oFZDyq`ZHpC9jx~$)tt|#K7!8@?wPLMN zZlXg5{Bc_ZO%UI2t2M{2Oe)e5dj5aYhx=` zuOA&B9d_ag@O@pBnGN>xj#jKTX*XVs6ZarcoO}U#?Q=!MW|&^vS>%ZoOu0qn_hys` zZQER-D`J%nwv>aM9|@uw-X3zi*#eal+$U16oC5Y<`sx2BO3 z4*472z!bBH`o!k4YBVbL7Wg}eXj+&f95(OHUY)&pOkVdjq15AjLXf8?nOOVaaC*SRIbg`Q__C^%4!t zChEOL!(``cXXnY(=_g6sU#^H7g=)1Da#(E4g&7QJ@V1a^KYmaOdkT?c$Dawi!XaNE z=(1d1p4U_DBNv}7DU^cqBr=>3(7)13?Mg9c(DO+P@TcOPA*f+|BGj^*4XVmnBb~d* z7E)HH&f32`Ohh|p9tlUDZn&wW#fdQp+KBU#TBDfa?_yz0LTyf*pPeO4PM$SNHb=33 z)hb@SeSeAZzqXJ#iUd*^7^n?_m_@{*VK*HdCz9s(4-P6(>Dn}$YEzTYTFygrO1wO6 zddk-yUZ0iUe|~e740@HyNX}vDAYCeodO?B<19kM}v%#UIMcE-b=Q+gtjsgu#fH@0^ zL_`E~Sw4Pv_quoe?zgX>+b)+%7s&by=5DK)DEI3|j>RbCO+4Ye7Z;jG-Chr_g)!_b zQ@~sTMCzr6Js4c1I0K%NDB#zz3}nfeFG2Uhj;J4Ubzf7ZFRQRQ@~cQe_CX5 z#j4#EWUM_$IQyFZ?EK>5z#k2Zm>|#*W(ji^s})n+H>JeGhxcDUey#?cxIkG9(MGE7 z>z(%7IwoDJ*@9kw5J}k+Ye$!t-Q&|@SjIu}9W-FGQjM>D`}(dMxqAHtLW88iY|53* z#dy(X(FIOVPg;^x>97q?!i$&4XkX`Co*wnP$1%HbY9-NwA4xJnxp7bxfVcDNr zQ86u6U@78vmq)b^{fGA-9%{kPQSs=iQNl<{%TpC=MRbLGr&%L!Z5k9)h{P%D@xy~- ze3cglKAXi6mjoikrQ4f*{qE-d>)Vsu;pG)nAZcINql}h|C6!54y}5LY#H58;eCDAU z+>QOUqw}-NBafWR;0r_pBEi6aw{KPYeEBzT-oNP|n}>d*esbDKXVV_Nx){^z zbpny;qTjDnd##>(9!?QtVU5hrF1c){C&vZ5MTa}E-DtB~Tn?S?;^6eUd(l1X`g6sY z!FdoZ8r5R?)#-V?*6sI_LONl11gW}+>?2@%HF2kCyG)r>mW^ASm?h{+Z(d(t1}gU* zm%C6lsLJ)uQAnZ)-JhRl{inU&fl@d-K8?(p7bD|;{(J(&s=+mPBJ2>$Y40wXXr zC)C;B-dZ$LojKH~*dyWQVWSYxYb6e-LC(&~*XNk9v@6|iKcUddm0&1Ny+GRXk3S57 zfDAv$qS_vOf9=!q1irUNIhUh)(k%ro4vjjMs@LM>yUW|F+uOrtwRccV+9mtyt@S0s zpMQ@~8zNzHd_-dLfBcwXvG&}z*R^u1_jvaUyg+=miDn)iKJh@d3>7=*u6fj#$;5=4ZdWjdzlSp z(;2%bjUfwTdwO(a1o<;BpmruqP0{l8+UK_|9fRqrX0o|{7n-&J%3j;v?!HcD&LiZ+ zd1O^8JjrS$ALKC^G#mt@gHO?4q2GESM@OQye9|ITyfdGKr!>3OQUEdfpox{VB!(+#2`vzPQ1dn-kDQg@} z;Q0L78%j8N5}7{OZ00?NT|PV|)bt_G~A9r(7{}qUjQop^tc$bo1|i;F_t2^f>$a{?*NC z)*nh15O{WxomZM7*4~Vf5k6}Kw84q z`KyOly++QL&nM9HIDYkbdx-eu^~Hr9xlC#DLKfi4rOY~&E035yG(}lR1|0hJ=NGVl z{W?50Ii7s=@X#x#gU5$Cv(9<@`tew+(ZYkYK+(uFLAORE&g4TTOmJ=j7T7dtWa1SQLtVOQW9Q@NLROv07@i zWLxvIi2fX%7zNsJ@Wt4Kt_ua+k;QyiEyQ}aH#etok5&u#*S<`yQK|N&fqehiA>s*l z?RKTnF5D%P=WsZoBpVw&`J~s#}mn)0HzU%A6T1WfbwUv0F zQLF@6n_#?eZ|)F&{*g)?9~c*WXGL)|GQY(#JJ4H~vzUk*#G{B%n5mJGa2s1sDweKw zih4DZOm})}>3!ryF9Ki1+D2>>zHlhnhepPjI*VV<+T#IHHMy{a>Bcj`!R;$wl!!nt0U%t0W{ns~v9pL;{lti& zAbS{ZiZD1d)J$3fom@ySGDsD2L%q>8M4PQfIT_1k5}35o#Uo=x(hx#K1q1)%$U+cp zGm}cDTF3Pt;l<;l<1k2OLKbbn>dfgqCMCiJfZ>s#nH_hf^Qz4?Mks0>BR-k=a3(H? zQ;}c*EF=ubfW00YB@poUrnDTSy=X1r_SM}!hg8XzR+>47HCt2ftnYf$2GTSEe$tnN zgQLt?Jm}u0OpcBGiX(aqXTs?4a6K83DT0YsD%j|s);-8c4mk1_gDVoZvjqn0{?6v= z3!FpXUXJdh(-Av+e&hug>8?cv4Rq6aDKnj0Fun1vlL|7{1^G^1}kI!(rqDn!9ITNuP+K?Z(&^>Bh-CXOH zJV`j9Hbqm}bO4i!|0}sh$3^;=@BbuFi(ZTjuGdS&O2)alFh<6VY-kw12B%CBK;fA> z>Gn>0XV)#22pc<3mWm_Us9dRrC{zY-W9BKf`{$Q0riDdxyt8JfV|QZ?ixVtvL_J$j zEJa*Lr~T{mtEf>K3Wp>@Yr+-Nm21_saBZ0-A|Yky#~(4;6nrOL$kyw{LM?3L(BQ(u zMR1ZOFs2WnW3e?4FRripPLWg+h)9C=pmd*agcUi(^hOI=+!Oxx!>=!=muU4$7IBVF z)y~W3FQ$l-bK63hrg?OD5OlY$&aZAUhD56{CQdogV zK)SCiRejQ(#j(F4vF+#KnJH@ug0gD0ET&O6*JuIe9>1m1x{rFz{$VQzNk3E|dAHuI z*|UZG0g%xm2Td)5F--u52zevZle4-A=0nxAhV$gl+u9r0L-wkirPX?lPx>dtw6BJj zIC4u(A+b{D^7A*=blJmJ+Ll5*#W4IiC@UtXvV}r1mrL?@`N}=H76?G5N-lFA93OVP zn5nf2VWUi?mmBN>*%pQ8sFw0^e@e%Bj>Hg@X2Vkx!g#TOgc%(^o=C0&^NFq2$a3|A z<4QbUswLfCx0=rh+CZhF(f6CxYBW+xm35Oa(jYtSm(kHFwY-o@`83LX5u2mM875W9 zdHhDEdQfhZ8x?~uXyYr=w$MJZqFdE^B3Y`GUE9mUzdV0}l4DzXIXo=fc!6mez;!{7 zN-I-{_#re>TgK>7POA-sh3rr)owqPKrlWe@XRMaXS?XJA(aYT_aUU#L9Lr5r_xs*|1lDW_&7_&qbWsSQ+xFTnWP(!N7kl z)k`^xBcn)udxG5J-t+4VY-&4VWxpfi?~0_BR77quC-aGrS-Q{GCNd}=!|gi8E9pq7 zRB>^HTp?+Ec<^sO{0m6jKjYGl^Ldh|G@rF}0vgSDTJ)(DkwPJ8R_OP|euS<%qDRe6 ztJBFPqh-7?HHR&RS$gQFCzAIRdKe?YY2~t+Y)Tfj7PzfgFg(u1?c};PJ3&=!6NvuB=tB$9*adZ)cZnk0g@?9-FzdfZ7g8YybXV zusfpA8>+U7I4N>Qsa6-y9(IcfmE362QqUHf-nCYXA&W}F+-8f+&S0RB@@_I{b0fb# zdkRkb=@-N#4E?f>w&_8|t1~$KkgQ>hoG(V5!i~kru`R}qBoZ+L&bXrj<3sMvr{X3S zdv5&2vmX&*0ZjPcP&X|+Nioalt^54IH1LZj{lmOgwz)_ot^gA%Hi$WVUC1jJ^R@m6 z!t-<@%2Q71PslfThH%$s&wp_oL&6?*84EezK3|Emt-u%UQ|D(1OI!xqs1q`GkyOQ^ zt97Oj4yp9|))d+ohm%}f?@c!v<&z=h*Wh~_-``Ku~Rz5uF)a+V;2xtZt8`uWU z?w%#wsAw3poppr*l{amTI6XP|{5eYH!C#O%gEYrP=ctlWJ9F(&=IMfq(_Ag$f`SNM z4h{GYDx);c&8*w~ zUaQr^0fmCOGc`B)*MI;0)FkS1#1%dpp4w%J_gPHPY*tY54L^G^g@mmaN_RG&%^4D= zcy@;}O|Tmh!H9_hc=jxLVFeWZm8U8btM`}5WvWaKzz&bHf>e{yq2~mAn4f+&rm&P< zR%av=e7a06C^a!RW&nur*#tT5dmKfGYx^0O%wN_-GTj~p<@f5sAYo=4!6bx%osG*3#4aO|N8S&sr>9`mdRw40^H1Cug=d+PtC${ zJ2~>wJ!eisuj?)riWj_52U`Y?5P*{00@i+pZX`F#cVS2 zh5SA00_pkCbJU4LNWJ)wbV&7SkCsmp0sbP0CrUzVGL;A;NdTH826uTE@q9DSum}CG zzl=X=9?;4cExdgGGoB<|`fy4J2L1<+X`ic?s(fHn?Fj`OA)K1YWZbTD``I&7B(qJ9 zehv0d5Ne2KNV)WY;GzkGpXTMu(V-uH{88-MMM$zW?oewZNZ(?xHW`tmPl3XMvq)I} z|44ez-pH~wORrcB=!5hJ2GB?SiIJwODjmHigAoh{!+Y<&_m<(k_nzLHWM(oA(`VJ~ z?lFQs2-2XZX8_GW4x^SCXhjV!P`LLNBglwz&ff2S-?g3HtTgR7cT7Q2>*Gy zv86HNK zoItsnpBTWo&j8y0Wqy5y({G~HALfwP@L*4F1QG#3xY4Wg{qpJA*~Rhcbq>?gy z3BHh03lYo=mOxJ1MBLMF$PXoHK(cR@JmDY~O`JA1R@RYi;XXV*&F&ptK+bZRcA8S@ zlve43%GA;9bV>+s6{&V6Q8_Obk$YZjw`#BnnE<(m6*!1 z#ihpa@Nk3<^2t%z1qzxiZV6N>88*WdFGaK}O}bHwN;hBp^4qV^7gh*?Mx|7#wW>Zj zt|L8~Wvk;S!)oTTb98ZWnDNxBv2s6~$~dViwmeB_MLw`ukATWE-7AESdDE6?7ThXPt*zouX=FU{et(e5;eL$p zcbAYugk&<5n8?}Hb7qnEg#6M>!sap>)$-KE*?8ng?N_b#d`Yj!=BsrNU*b6)45E&1 zyIocA*XCDeo=-jhNAzG97N@b)f1F#S3$*4zBM}G#TMx~^)hN+H^Aim;7Qa@{6f;6m zw0C$s%Hs>mBvmrn#v-x{o=iRYf0q$Y_VeujytFJ(>&7Fy(QMFK_RovSe7s*xMZp3Q zlyS5EpV@FN-#HkyYOT&x=S=4`DtFh`@kJs>=oj<>kWIU^CeYf>4~$B&*66QfjXrO& zUPyWYu6LEHjlm$ZkAmW$oN2W>Aql9jbhO`|VQriG#qrat7uanP39_lO`Y%Qf;D)@{ z?YPC1Y1ETmlT)WlrmCe-_6UdX!-HBe+peZ#R)t*8z@cmU31a#H^qL^O79=Lm)zuz@ zPQ#JDkSVv0$EQB5F9BON9F4of18mykTD4Lw8S;LwL5(6;aY1Lbw&5$CTG%RfgopjW`5!6%+!o;lA^V~ z#>^B8w-;sA4#inXrjp&(sF!nT5i7=GNpw(H(RgfAT_+M+BXCanCh5nM;}!zmo+gtJZ2>tIMhlj>p|Sv%%+cv&mart*yk4CJmru zd5E-{LB;d}=amJ}BNlpN+%U0b!)Nh$N{z!ah`$Y>g|V?~Zb-v}cGhnN=tH9RhEu6V zIfj8M5t+A>0P<fn@aR6&iOg z2>_Wro+*_pZasH#6$hs0c%+^^eK9*X6F)jR>11R6PAds4A%vlI1Qqa+^SYywr~)3X zSc0?`DGx~ZG_VF0mS79fGSe@>+CVA@lDTMuqoYp4mhKFzhCTTIFQSMXm+X-E;B>eU zfh@H(>KQiIA`d3Bsd7od-r7Wwv5cM?mZv8(v-;-#VXI*@v`gt=_XtVcew$K5-yzBr zGAKYKvOspwcZv|*XEMtSW>7asgyn^KDw=S!Pmzf=JzqFD?3C@%)={Q*ba>RkZf?~o zWeVUPWhgNv{w@-hMSSiKvcO{&*Ct8|e1PRG)NEMXet9zcr{2OXSLroQl>@~aVqB#r zq>qCU3VFjWmBLb}+zOA=3b}?rrLx=5H7WJ5iMMc1XdDa*bl$5(I&w42c8|jmG;2f> zl};fAkcK&7>2la$Q>rySFx-Xmu-oaecl`A4*%HJ;AWX*- z^lD66Fwzxl5OYydaKW~Neh^n=JGiG z2D29GW-W-h;8}46RvDd3E;NOKnj6X%SWOqSHvb_ zzJoYGAs2}vHt=~by6jeruP5`$vNW`oIu zY(WY@LQ;;#Hf8&Slnekq!8cVPFNV*c>GWC$Lt;=GIsQO*1WnmQc79z8IgDCFd2%HJ zD(dZR>J;_=!Hw>ipeClC+4RZ@oYn5J$_*;6P>XCC4OOn@Bks?nPMlud+}yspzlUzL zcj6KPk1kRX5WF=>_OzJn4x1gvOs?MO0jD2ICo%F6RHjf^#AULDJgo5X<~-A)rKXZ%V;-zq`76 z`G8-Kw|MnZi9jV0Gz4@GWZ}r83HzgA=*V8(e|_`mV&L_=bv6J?l^(rjSE|$~nM!T2 zc6o+j>-)F&@7`f37vuE)vkMy6oj^ ze8CW9y#M+A|M;$2#tL9H$$gOkSe^(35(=amgV_Z97h+V9O3*^0@)qf0l=16jJOS=L zgD!e{eEjYWqzE7IpZyH>T&+Nv&RCGa18F~^dGvatMlBWtWQiAW5YbIMy}2n_^*jk* zj>kx2F}SZFO@-QJ>cc-gGz)tcnbubc8h~1s866HQh|c;y0})>GA=yDKP_!}PgJN>%P8z_~d;gCi%c?T`bA_@tjdnD2w<|ci0gRs6a zdjI+B>l2TdLuFf4MwQs$NmXAzyoXn}cQES4f`L#r5DJ>iIL>oaQfvF-Y=ry>I!OIM zDy@gr{4Y# z(B2#Jf0)FhtJhwM=+Qjh4B$CqvNN-yPM;)WHzi6sO)=Q50HR7 zi7q>N7@(i7`T}l?nhX^bDO!K?`1twJB*FKhwi}?R_m_??-(yJffZ1U`tQGOq@sJvB z5WAJr)x6S4Y9-Tq9^x^#*s1k4LHe&!K zxmzlda0PCZ`dVm6NrQebT6lGM-vGG2Y0mn0Z-RrmLy}t>XIP{$j5`oZ3R)+o25R9~4feOha4x=O7?7n^b z^#kPM_qYAD-JFc*@auVOp+F)xrtjaN-PQMa4AdPAU^hDnz<5R~B9kpqfjO>I>J71E z<@NpDyLS(-?k*0?u}~q(7YYPiP(B$VncFcuxhV#{PA!eJ0Wl7|7{yMTyhWo3q-?C& z3V{FZshexa&ELGdz1Yv198m*^^#~C~HOv8NJ0JC1Ja&gnPF-7FU#Tbeavl}|gGi1T z&_@-Z%t}+@2$qZ6*N|FNqbj8Uv}+y*$bSh(CiD7pMXSYzgk>Xd1(jSTU}2Kh*EgY) z@*B32gh8L;>mv^u8T1P;jMEiBa&mkI}s zwUzH*fA=c&&R87qQ5KiM#I@uZkpJXwXFJ780(f;T;NxpWt9!zVdC4Mkct}6fM#;}Ts|FWV7!C5d<4Vx&C#C2tdW~V*lZEhHA%Dyhfqzq z9Xh}n1=}S0$FDHIA9XxHSc1yPRcm$_xSBu~29NJv-Q8VXCJY+257d6O0YPd?r4hY} ze+xFe%3wfH5lFOeKSSK}df?Nup=$bftO>3Y8Jmd1FzJUE_jh;KM`g#9<2s^7Qjf`Q zG$?eSGHaBmBUGV`hez5WUwoN-3vb$c{OxVxB!fVNhXyI|o=EWss-Lqaj3TylSZ7d{ zfnD5}K)WbVs!S1o&9AYNw#Z~@`1mhhK0aJzjp*!cQ>F3%gT@ew)rP&j-u?A`L8-P| zU9cHBH6E=2dDU2R#3)ETIwUMpw{~bi#y*I@;2m;#1TpR~{HZY5i~@z$pz^1RgBHRM z5I=alKXM`4Lm?M(#V~$(FiQ$x^Z-F7=TGH@o5u%2T>y@?4#5hziVBL3i2O~oe77jT zO!AC6C7(^F2?aV$p->KH8qFp;&s33)w1E!)%rY6&eTCMn*E`f=lp<0d2M@_M3Hcy2 zs>vb{ip+WdN_ZZ4t5hMS(A;m;>xc|zFnKF0Ge6J#BZZ@pD%Ef|Az9LH6)TZ)AmyR@ zf>?+~1)F-pid0Bt7P}SvV_PTJ&8q6aJ%FRn1KxOhc6xedhYh+rAf^VJ4D%N}kOCgo zIueS6FOX5$uM|QX(Pc*+Y7wWbQn{2*A^~XWmfMo;(XhwlGX+zEe+y1oRXdK(cgbqQSu>Q`uBB%2&1sBsvALDq1;0|DjSqT*y^PCArm=VoBFMuOISVS!WddynYff4D)71M%L^OW8i}apbW=LV z&x=T2;mH*etx?UD3&^`bxGP1QT;VQ>Ndf2(=nz{VO` zrO-|eIWj2~(`%>K$)ti@tuqT`4kwOvq}}aZq+T@!z212L==kjD_~aBp?+joV=KzG> zrV7yTEToijhfHSjdTijrGx)|Gu}Um8NqMw2mrTf{A;fXi?Tz52A0Hi^jK-jE(|OB~ z$9UvhhL0ZgU3@N2$O8s5#Sb++N0gU;nC4>G=$w{ zoNyvLdTwrUBA>y(RBCK{$0x^UXE>6elW;ncgK6n-nQbEExd3Y}=5Zy;a<>D&=Xf+6 zj@l^)mAX9t{Kc-^ic=nwqqNyuo!-ge`PKOu4#lS-4oBuM;1CEWfe^1}?sBD4kIdWd z_IusTK_{tG>>xdS+8T8lM05s-&jwY#KR!4-J2^f*Jv%+FnJgg_PTD*n5+*f5<}Ogt zJ0fJ2=nP;GAt?o1%(aEtPQ{}ZvvAq~Z8gw6*gu)TyiQLswu~g4IBF<(7MD%H2C|lp z^BbT;a^S;gHLTZz~sRdIv|i%rHm(!$BtMQgfxYv|YxQ zBMn=JU>)4$f95y*Ybu3I1!|f}TbZRa50Beces=3RK9Cn8tkz6Ik%I*iG4&TAQ z>o?n;fSpGbAT-s)n7A1v!TsZ(kN@q-Ie?}ntr*$J%PZ~}Zr6qKW>H}% zsMFX{eFhnEGI)og40LaNOH3ZeYK37BB+TKU7?ALGB*=mik`brDrE{dQy;R&Um5H`l zTnV~y^HwS0#q{hfGK47}<4SD5A6QIEMLnD&0ZR4mCsSOU{Q+8^Vi0`3ekJVy# zLep^)y^7w0jJ3VVSY08W18RVP=!^eYmLLRliKLd=a6BCK`(9)fqaDph z6xM`+FQ2SNY@Se|bSPPyt1HLguU?JwCdtm$Hf(7O24`o7Cgh8y;(U8N9QT_sgF){= z*)k~`WIPGb=R({OQjt4qp+ZmD!F2cXVn5@AeFB1aE`vp7Fqj;n-WsgJ)ZWSH3cCStkWUb-NuA=_fN@%8%8X;geDeC#9{`4#1(Qkq^oPo&^|9O zZ7^7Bic|!?$NKutj(``5#LWIwI_*K;B15u*wmS0VSMdBIMnodf@acG*SX9U`7S`5? zI~&AJr5b`wg@j6lPz$F>o}IHREoKr40^sb#-I>{EKR^4&^&NELgcI=hPv>eSoyX+y z*hq%QTdWheI9TJzyBrRSt9DPfkZZ&7Ik^xZbV%~{#l z-oTV-dTC*WxV}X}aw2L*j(|blo7qp z&2}xEl>>T%En@oFiy6Y)>>9$YaJ)d)5D`dwqt&oO+T5l|l)DIaAgnGfZ{oAERf#+> za>YuuU2C>GQq;|)>F2-9FA-M=v|S!I;^nXqiKR3lsYRn8F;tr@oF}m1Z%i9-tR$h% zET&W0V!52F)SH$1E)jk7XU}KgIhbsAe2q+_%%pRbGQ2~%DApbtk3`{75WY9Ny^D71 zE>-48#)_pK7u0<2oX#s0n*GDFd<8Ol$)C`p8oR7I!BGO9g&P?LpGal*1P>~r;d}Tb&E(h zgwYU4nr>`vk!egKL~Qe^a?v5=;lV_4NTG2U!hE@0 znkxNV85Mm9{@h`y0%{gct2-!ogh+qj;VIif^BL>Z4r%TwFCKl)`2AHhZ+*zx^aqeNhn5&#j^u?YS_6tPIA-V8U#$K19Jg?!Js8!plC9PGbrGFM zCo)A^TLB-TRQ7{Zq(>6E6VoOxcbm>wqiyp8`RpFjd6s5Y7G|IP`g~^978nhBecR&P z8Vx(AfIG$gpX4S825Z$q0A6RcQo}%~n2bh2`Vf=0oy0WwO>@u8LjoOretLRtZpB!K zTCSVpLKsRwtAmedEO@0RUm`%vDx-qDwu>EIzJ&~fZKkEtsQ+C5zdCN@^NE=dj(wY7 z(zz<_PQQzr1kbH>a#UB?64`3CUac03CBKxiu}U-R=md01Hz?9fxiVFms_ix0CMj)e zZWbGd&XljTn?u-JSGU+)bUUET%_cxdYE*00Qr5v?BNdG$M+z-QfXZyP1O{TI>@!PQ z^V3jW%&A;u)rM?RukH%KPyKRs#!$5(u>>eFbB_2yl8x zEMZOb(T<;rvok@R-xm(=&TJ6SzadkZ6ed%zw^hqUsFTWt^d9&oZsVl?w7Imqvb;qS zi$aN#RUr{FmS>-1WbZ(zw9hv?v$jm4tP)T*z&SYtBSI0WG&I`s(32vHD~dcU!OdkS%Gy0hfowYyA+mOjAyh1b)||~1 z(_T5;(m3{$i7PvdbsAr$wmGU`FNn4XSe@pdJo#q=}liz-OG9K?MSX@xf78Wrl#QMCp zy~!3KSTt-4+FeE}qSDalqO5OXq`L!$l*(-JcwNF>B7sbv{q>ip=s%25lN;3waKB7a z;$ULgMF)WsiAT$|vH|mY7L`k;Y|`XNdEwFwNDAVJ;FsE1SSCDqLKuw({fN_IU_*Vd z1q%@*{J0tDbgnB^Zq&}{IOxSfQq+m- z#BD6vv+z4_Gw2*u62HC-I}5%Axd7z|N5H{}7on*XoCFXBrR9^C=H|OYaGFaYIeP=P zD%=EHh&kH8xtPn2KnYqYB%Np+A}NWAC?hUsmxb+(hD{%{W0!IZ+L_Y9xYzI1f_mc0 z3aVAg7Iw-lq=m_F+{BWS^2Em!m2_5l;+mItIcyC@Gn4lVP^t-*@bvucqQ2A}&BoytsLmq!&^w6wyZo>Gl z_G;^p%|m_|T)jW-ZIju(%Xl$}zZ4Ep8iEMr*^|>@@A#mSU{N4#dKs`NJ^gIWQN4$? z=k|6#+aQKr_g-)W)j54Le!Hb&_5n}%zEd}%KGXCnId!qd*iFK3;0~5 zbUI7g8iB=Qv{;;FppEWdV&wl4l+*ed3N`rfNMx1av=?^UjbSYW#{?QhA9v<10_AZ3 z?5&cIM50=^pHZNblp+)vkQX<%KEwFkNJI<(V-N&nvlS;;|6rBa4s zy)ajl@D_))iddvGe|SCh8mXW@57@LB!1ytVe*3=LzIuJ~gT&mJotayJX8_OR`ijhZ z_wq7gRqCzDG3HS2Jx?<1v{;$m3m{ya&FibPSUPt#nVx=n{fLqLS1O-OLmLaND6D6z zYa8Y9;iv%FM=72ZF&Lqw-IgwgttxG@d(+9CTwa}6P3f1=3gD%W05yE)a+QirHdLhi2CnQ|oE?o3%=4ILhx^iEFC+fHBU@-?8jj~HZsc>K&1 zNsS7Z#@rlU?u8xt&H*4ErkpvR&$5vD<0*G4nTxASUp@g4JQN=n(?(&13*w+-;bd%IykZskw}=W;$ z_wN9l1i1a(p5FUN}@>;USQ=n`@-ex5ASd9K0UVT{mc8WAK?`Ia-S`)K+3hUwt$G%;mpFqGF1O-8w3&* z+-@!g8|hD9zJ3Bn;g#DRJpo_T#6IhnL4!_a7hMqy1aU3}L@z zZ4>c}(ST5ZuY(j;zFfhf?3kLhVkKlUIIaL!euQ-5%Sr#$tCuiH;cou+9v9-ebN}J^ zsCNMHFJXIgjbQM)oh}#CrdH_WG`hEaa5hM2weFW^Z=qWlzXcBBpmcxw`SZA5zMPCi zzyA3C$?vx_Do9)yp&lHhC(TMeeeve~)tir}uU;Z=0w3nf z(dpHn^Gpz3zn|n&$vVynOuj%FOZAV#zSw~i2QM+-y0!&AXfO2sGD^pC0a-37;oSzgK+pFPzrBMucLmTVJ zYa?J)-&kKFRcjWJKOXw{I820+q1-1t^&ei2Za@Cbw@+9` z@ep4OA{`rgVFbb|%wte(Oe}5G1XXP_B0^lHg`M&9$ElBwpPZjRUJnC%ne5>1Z?{6?kT;i;d!{e}f+>htxd zk1tF4K7i1F`*;8RFMs)gh=cFY2Ymni>&qZo;S_klw&lSDGLF~rXOKlws}3P(et)!d z^y%hy_~!HD$M>iEU;d<$|IP1z^OtX5KYi_;fBp8y@891cjW{OeO#6KmPdRZ~u6Fg}|u`1O^negEO%f=*_U?4`a=r8Zq3A6*^q zSMTmBZ}4G1Tz&@*`cAKEe*N+7)u7jY|N5W@UVFPhCW8=wMN$3cpy5ObhSK=)@n~X|7r>mN zw78p@^2v3(eQ?r!|LL?)|NiC2x9@q6C;I*F+r#IpQY2W!Z%@agcn*<63vz`IOFnCL zeS=}*(q+boBi;FMe|C2J_QRV|Ejs>=E%a3-5ZWsZ&rkpO@$MoKPPdxLLgi1fh2!V{ z0vv4O7HtCCvo>h7Rd|kHXj_Al66vj~VlJN>X1!V-g*PrK7|cxrtZSkCVQeom0D;0F zhtg_7GsoYtyiCltU3*rzOlLuqQ9$h(fI$hY`jp3*un6My1y*yT%rb=c2_!aiv z;qc%h6HJZ{aoEC1g|wlt6x&scN~T+%$miGAsY*kp&}|_=BhG?$Ef9-)2s z;xV;4*zW`#vE~Yd`YSjviWL2-+pJSK#q%#_7PmIUZiTmPh?sNDBi@A57SHCq42(O} zc98Fn_Z#6xI^lFUV=I^t&P@Oi%Y>!fMTs}$Gns|#U6#PB4Y+9*eXcbMA^}^oHySkQ zP<(*5Z0ff5YguUMdCORKYUFQyk~7GZmUIa38mNfXZ(&*scq$#kbal-&zM_a?u@ z{932URTFN9E4vTx?MXV-*{|QM?<~PFF!dq=YwtQdaa`m6;lQTg2o>I{gv8N1^d1vT zH6$Z^@W-kIJjphfw}&@7xY(bJ)31n(%^kFJXJ1S&udmH5EbSF*#UP8#0rUw~hsCQ@ zxI<<+U*ye|sB8hnC^q}84Z6lAYRL@Z-M zQAkn1k%2Y5wZ6`bgfrnpVlZe~E%lT0lcUqaqjvT56mY%s1Av`xUxvuL47Lg_PcL*B zZIe4W9v+lcVr!+Qgh_Hcf^DsgN#(HK7$09;9-bbaU7SNOa(aoRty`4EU38;`irsCF z2r7vBUc@Nfpo1?%^;m@SE6dwXS1eI4)JFNFx_NwgemD_Az^Qix&czKJ^H&$0nYA?q z;!N4wYc@~ChThyfjD@Qlm5WH&*y0M}iD*2RuR3%Zb^ZLP-y4AV*>4OFE`dhJXs;Sv z0Bm4xVR~X;nV)$+4W!W=MoL_}myQtyN1Q$wMWe;zu1aH^lxzb4snUsDXaDx%2EvfB zCj{Hb^O@P{7a(vv#Xl!Zq{XE*StetopvUbyJBN7V^mrfAE-ySpV{vpo{rA} z*$7#!&ADfoa=w^@gXZ}&n9OJ9fp1vZWSBE1%!gPNFcAP1m^%62&hz#0DKN{YN0r*q z+0SRLVqq^C*3~-H_2)CNivY#6v5W<1VF6L*aF}>1$vE<6mHYU@FV0R*&N29hqTr&` zu6Bm!XJ^%VD(20H#vSAdz&A6uxFmq=4B7_#Liq>$_V36b;GL24Y%?ET%ox)R=UkMj5uyd zt-)Y?7{=|t*J_<#-e8=1gN#GezPC5v?7A#E!xk8SREAhp$eIHP_<=EZX=R&XDd#es z!KhiQ?vJ`hN2i@&DA_%Qs^ab}*Fl{QxcY6&W!0(d^Ba`)b&kkVYs5m~XlfOv>!r1I zQxQ>AN5|b%t+2m;baoi^`pxOk!R6V(Nk3A8%>dx;VZxzNSr%5Y6<~bR$kgoiSOive z5Z2hP$ie>Lpj9v#qx(?&AI8(eUZK#)6|)V0xL5=E{GgNCbHG)Co)HmDMmBeIk>Shi z5tb)sceSs0xIY}X{jj_M`3)V?#r4hg%ae@H7mrm=FOLqpjY>EY4p_CgYuDF^ly$hL zR!ylr8T|GPhs!^q;tU6IkHIv!JqNEGU;oYRW!)O|?;qpx9e488Xeweh*yiV^(S|}R zdw%x$N;;=u(OH&M)ZRY=NabLt(^*oP0`C9Is|ygsGM>yBD&d=}tHVwuU5(=Jhjb8P zg$1Zi=4PKWB5q{KTVpPcd3*@r(b>&q*<#gqb+ ziK%DsSc6gkbM*Y;c9T*=GI)lN&@Dg;0`fD%&uP(3eu3z3a z3jqhj%ZtlPli3U!a(Mm1(uM+>Z7ElX!UR8fj$Z~R0;mdB{j0aHUY|a^eti!dGXS)& zA6$D5h02I)josrG6qz6s+OMYh&d>8+__1lL3Ya)tZka8yE{45jMJ zS5T-Uku?&kGSFa8mSzjQ1gYHxysMpe{EH-zW%}Tcht(enlHd$+6(}?n;gTwJzxtK~M zTQ{%n?=BAy`lH*c3wUfE+G&%maCUWfn)JI>sHlMDTig_aj8Ni&E#?mF#d*AFZ(Ioj zc%A4Dkd*Zj=H%?fIOf{x-@idPv9EAb}MdTEM1sM znNYNB&&MAQ=QLuM}Nt<8jtRPRP zP~5}oMP^SI#Es?Mdc9HecE+;UK*x&LxWqrn*qkiG!0V zY%yQ(N~9uPq`tHSV$AmHGqOINPvAW#_F`Fef}t2*4Z|2}Gu0@Sa_mTbkZ@K{whh3MFG_lSDO%?M8x17Rl8t zq)mdzQ7IRl)Unw_mJ25X))_w2VB926Gj zOy;t;pn+&ame?k)u%#xxK`5|#Hqji5CxVG&+QZ^oFni495$DosHtHD231~7p4*@S4 z6^|K+r^_j-m8G?sH&zz56rQlxR45nZc6}THB$a9g{(H>gbD35q)9Xg#evCfJK$J>6 z)nXiG4r4A~3ZYg_#-o4|Z95%7hu>Q+XOzlx3mSq(xtfgNx3-e4>Trmf!wl2lj$ntn zV`?;OIf=#z*?xq_)Fe~<`T3buhtKAZmrLbhI$djZyVXXe*>2ZcRSdR!gF$aN$Y2+z z^EOu~^y*YKo^n`4j0NKM+RCO$MSnUoy{gf>y{Sl|9Q5+DtsX*Dnm`%U8?}0?)dRV` z*U3DYn-d5K1j_2H+L+K1mjF1MnVqEw3|J?YDO3-jea5}#^>=A z>E@t4Y_vXHTc+p8fjk(RcA6as zxP2NnjaO)Qx-FnD<5>OT*$hVpeWH8=+)XxZ zenA>em*OVcuCSVEb`V+F!>_bf68%BQVoc-2G&OvS!+zT@@cLI4UQDl$w>6%WP%d@l zVlF1^OACrfDPJlCTo!%4*(o&osYX3i9rkhGMU%O~XlnGIhWN*~iT%cnGtn9m3IKg1 zt5g_^Qp|mK2s~9HoGVw0b?^c!b!($mv!zlU+;&rg$|wq-5mLiPqpnFS6NxvMFc;ls z^TI)lCVlqBMI2SuNb+b9p008#9<5gLjb^g(QW3Kf&^;W?WZVg5_HJ3eF zp+GUWw28?&os-RUjlLZMV3>`Us+p;)7Y zcwwJIE8=nImR8p$0#NGW3z9YLTAqC|J3q}ggsPQNHEUBUWpE=5hMi8Y-yb*qCZp3H z#ywHbC8IXG-K-RWPXJjqVF3%-tTO22%q^{u^*SRIBh7Nz3#DUe+yTln+{GJ=dP%j_ zRH_a8-Fh|@clsR)scQQ9ljkUN!8myG%WN>jCv0ph{VqkmR;{&~RkT;UzF@M|MTZWm z&VV6ML<i@Ste-qR;|4xc}t#rr(@Ym!~NO`<8>8ltpR?{ufSf7@$?H8P#d zjD@7tD29s7Q4iAlcDFmo?WrOHHk&guGXbvv75QxH8T!R9R&C1^nCK^JQe^`kf=;8| z&hJT;MpLNNhkh@LH4KkdX9y2LGGtV8*{oR{bU{9uo|ysq1G-)=mCmJ;sXUcoIOv0< z(jD~5dI)I6AO`~MG+{BdVevrDm&yi(f*c$&paq_T-~t`r)O2T-LKDi_6ox?JPB%vV zZnHn=_o^0C2numDO3*Cp;F0c(Q9+I?av@s{656jbWVs%Or5E@l^N^b{;dPQrHP+-H zp9@|~nqm!d4Xwm=G;rQraIOz5f@QcX2{f0^?q%N+{(phXVZ%;(QSZZd4OyRMt zPyx$a@v6@+;b`L!cxT&VP};z9J~}<_mK|ouT+#b#PExKh5#_@B5RK*HUbpaNCI{hM|)i)7LPjAPPNRn zrzp@UN~Emzdj*?I&rfwBW8W_pGY0@T9vmIl(|)7bJKW#zo6S-&l-Wr4*xo{1Ov+MXK{Kw{$kk*IS8bu!C~F2ca;udnQ$5-P)MZR{%}~aurpx}y_gnN zx~&|5Y)|>F7@)n(ax#%i?73?-du@z+FOTnTzd|9pN8@2N918a9alhLa4cb6@fkQ~8LY{?FPO@rhm|xt4nQ{>8~FnDxHv>B!YLOSJpsQ_ zt45~>Js+&ea;)0~RJM!E7b^M?=>=!Lqu}#n*9v$^dDv`zq z2%7s(t%YNXiT3;l9E66ovM*?)P*&kM*fwd?@Htx?jw4@CjKkMNu~mVF^UKG#k6*rj zKIq0mfe?oa1Q$k{b-&pZ($~W2rdSLqW1*I)6rvI5hY#;Re*X0JeLEJ6%XAzTYZ>#W zEzs$Vp1qvg>9<2&R|~r13V2oDW7zri(~rl;LL?@28NI1U$Vy$!7D8({`ryjOw-4U>nD$RQPxZNq| z19Elg9v9|!Y+KPivxr9B+}Wg)IV!6+k>9V!QiW+NuE?fUcA-#=d89v>t$dfWIj=EtSebl6)=E0j74A|EIm;QU{8V{xC$`uOSl z_lujGi=$397}q&}eE#zFz!`LVZ5E4K!dr!RmYs<2ftjC*#ou*v@?#vs`~7;=q0y#+ zwEuG9@Y?N09gritf3k*?8-AlB>P1w6>%_E5R37F=punahI+H!~{^R3^*L9cPrPW!r za1?H=@2UfimcyfUK(M*F!x`LR!)jH%2)nGjL6*atnkAtzTRn1s?KcTjXFd_!KTS{W z+12&~83w9*-u2iDvS&TfyGY8u$keze32u&u+njt~F@apzz*= z@Mp`*jw8w4ovnsi{q7M&3SU2b_?FZHB8ii$l;;dNWk6$YVj2%gnb4n$x>6u$?v)C6 z4-;25#{XHZP)OJ&tr#p8zn+35m7QI}Din79jKyX!s+7i1l|VS6I#q7GT}C62+n~uYylXAlD%5jUiA3o3TvD-ZQl-_--;a_T2GOf?0> zcgNIUsGftgpQ@1i+X1Jeba5I_SoP3ZXl-G$4ER&AJ8sfSB;3%##wM9Yw-xMmxhY%- zJ3RZZ&nrp4UC3n!q*9X~YAbCbw-=D{%FX=h4uWb-JTF_OHDqHcB&S@r^T!GBVFetI zdyfp)ZybOrv&^0vt*>puT|{2lQEBuZclhr8>$CCOhlUNHCz->crw|E&)02YB!k5%f zH&Dsq+N^9Qy&!j1Up-!*U%q+!t^-^E47Qx@Ekfw?=ktV7=Puur1Plgki?GNRJKQcu z;{5#n<*Td5j~_u5ka*o3DE8lf|NfVh&1Aa0Ziwk12a$*r`QBbIl-O@Synp%or;o4q zkk_@B7j3M{uK)7Kx4Wbx_vOobzS;@n0it|Z;aE5cqr=C_n-8DAJa_{JPm#U2v@UP_ z^AGuA;qud`S01;%yr)9?6UEi6hW*(>v+;MI9`Da1!HUNQ*773#(~rA!w)}AW_OR(J z10~60!pY;l&+J*7ciq4J+wY%?d%>z(zdk=ZTm1C>`Y=C$pF{4a5c#Acq_h zAP90ufB^Bq$qc475=DuNBvK^BUEGUXvA8c)+*!qa6D3j$wM(Q(E#0kdts_k)Xkg%p zft>9eb2ebW2OkVLhsoni=U^j190CvgldNu*K#5iLec$`N2A!goiXe}$K6e2!=^M^nPi4PFKyFqcf#9YYgY6$xkLR65=&!@(S+0ITv*p$u8Q zzk(lhe~0$?dN-rft#wjsPzxmh5o%dBnGBao#cTmgCd%Jg-*~#ey}#PouXH+Z-VRQ- zV4X+<|*1mkWsW)q7F30!)&J@n6RsfD9>NMx08FzwdjL^;*Zmq7>N1vP?pc@~LoP z5hx9&o1vW1biR@+HyUe)-OWasw%BWza0Gr?U{d)UWl+dPGOU9UJR~(j%k1v#^5~#IQjy+0dU+2=r8K_r9Rw-I zwhDcHYwKzw$Hv3d9U2RR^K*NBaRqzb`cyaO8O!kQ-(LP@8t`v2j!j7-d;HaJ6!P{ z8k}#}Bkr)n74$5NacaHf%0zn++7+3_ss4g``*Le@z1xg>W0}>fcW+<6Yx`J?(a`qA z@sB8vwMyyZQF&gBnwTKBU*8xVwS0kGzSVmTH}Ls!&=-vbNv9lz@kMVnA9NpB^{7D2 z2$hcy*t?KaPcGsz8m^T;$q$b8<1`sZZM0~B)ZY9bFIB1huMSP z4yJ9pK*P{ht6>?nT4Ba+vbe*zykDG?VW1#$(#huvsX~|QZ#GepY;VSTp#))6bO)Q5v{b7o$bvdG&&!zuOADj^N8WRwd$kkFo7#xOh1BvB{VaY zbg1A=M>CDu>+5kQ<+G>%sF21L#0d$!z|~N&hY1zS3$qJoAeL|%;j&uXDNYmXqiZ@2 z@x8mx!my6h8kvz|>v;;p3m6t3k7^n%^eRBlA%DzaUN$w+AA3As$FGwOF$(H@qn>27 z;w7a;Z-)`jXp3~$y18`P71k`9sUuL+UIPf!42^?*xJDzE>lNM=*f13k_mIFuudJOAKW-Scr8Fhv@U0+k}s>8Hl*2wy74pl+v-N z8-ZCCr)*(Crb?XDQpB!9ZB7v+(rB>I31dScBfiv^KxN(p2KU-H1sEPuH&;b_D9Sp%@B+cGGoUo)T+PrA!$7wFSUxs#Ast1T2a2>>Ykl5)cmMRo4U_hTt6H$(?Q8FE(A60} zJY2;hWIOLbW`UgET1(NT%KGY$A0MuU*;Fgy6Hf63n!7J9aUgtq@$R@AYM#I1^eXV( znRlg(Z|&9QS6_YkSWPEeQBnlLZR76g;9&dk`ugl>FVMJn)6XwU=4Z3FgA}vzZ$H7T z?{APK+-iJ{gZ0-r-og2>f3mf=SIK34A)9c1dUkqJ=&)o!CBkvF=L^Vmnw1>OavW%i zBSbz9MyHJu2yG#mQX+Wy>71kmpB%4#qXw!(zl2S6P>2 z(#aXYXTq^ZkPN5YE}v6ta20*-m`15JopiR21}EnygG?y8Oj?odgcJsm%tLx6JUQOK z2it9yCXoT@%jB1&YFm{-qV{OG4kTb`wUz@qL_R4JPN_kH3Rk+oS9qNoN5r3@yb4z# zeYk&mc^q;shpX-0YCvhh?1z9qxnK`_3n?$fz)I={B*0DExxqnycvi2GW_xS2+iR4q zODYU{OifNI8T4j7nM^vK^q{KeXw+M${r>Q<+DH`3C;jcMrWb<*%c7ZS?6(}qHJw)D zPlv;#izwie9}drsIJ&jdA7coXqZg8+yMGcO)Vn2G@DBV zY|gOWzX$YFyS)*wCvq^_UcR|JX_P_g3VJC83Xy1$X$&j=TEvc+*hG#-6jXk#+Tb!i zr8>2XpYh@nbkI=9A``>AIwKX!4GxL{@jaek*wxMAYNJ$GO}aHI)AmWfKgh-@Dw)*i z6bd1@xJwp?KUO@d&=Hnmch7+@=^PY1YD4aDFfqtY91i=TAn7Ty8kH333Ic(pfHq4e z5i*)>n_$xncMdnZw82DFKr9}P))OIbJ_&4|6hQvXs*25^=5e0hQnhmqPFj`r(G&01|07n|jRO{IwrF($L+BpnX38R4c2 zW5jrfaMEO)v^sl^X@R~KYwhBw;MZB)37BmM$3^Fg3jv;18H}8K$x4`9b$ax~xTq^p zt{yaC_e4{;gCWSjuh%o=X9Qi!w<$Cs)RRU%$mZJ#Q$^>m}}Jh!^?CKY^7u&P;E6fFHv3Y_b-sA zr@OWvp85EZRa~MEb3Z zKnqAD{3#&yLn*7>WQ2h&6qkCp!RNr=P1IpBOU5Bpo&*~uumH_t7L;P8+E*<2fq^3p z>UkA=4w%wjIYLo@P6*`;%lYF9zEG@|>y&dMrN&b&RRB*jkg^4hqXSyd0m{b(7fOzT zB+L5p#u>gCL<2MO9$wuX{Di_p7<#>groMB09MNH{O^J{T@4~0ki&lf$Ef&dy z81HoZR})g3)2vhk$_1;z+1WYHs9zMQTkHO?-KtV)EbgdH z2k5uj6SbLC%ZuTE=FbS{=UrK+Q*8~TDT}>%*u^}mTdi0G3&8HjAFeH#gvEWKP|HuD zm%T_RsCk9nzyu>`6>oFQR>Ex|Fv&{A#1g53&M~BQ*^%hXObI}T5PdoeC$-B-?VlcX z8>3+b)L4tj>9QfID6-MXdu)qxZVSmz$XS_rIh~~JHhcbfw6oDW9gP|*00W_gitDP_ zaMYzO24`kBr;3pjlga%K{v4!@})CH?&0ioe=8E?JhrKqpYi3V zm;0$4cer!hDZ8^1?j?Bi+sx#f~ zwIhrCnaSvRFX*p-@%i1&&2}Ni=5KMNzRmuC_fzO===WQ{!1gb&{R?dW9P8&;KmR?~ z&))wu`|SPK&@GS0+k}1sjc*dj{_Tp#`y1T<<9F+czvuBL+E{;IL3jxpzWsfFwO|R8 z<5!=5w+ZhLKdiI3|DzA<3Ecnjhc)hafAV2He*Op0M-Xm*295ul@zdYko`3u!Jp7+` zo!~wHSj~I>$ttu9jlSFH!|TsK{v}@j74&Q9zo2ih%}3Dppcl~hp+ANG9Qq6BFQLDN z{ucT>=pUdTLO+5&fhM6jND7VL*918s67oY~C=Ml|EW|-&s6O5=e1gBN7r*m({QCdr rx$(At!29OgfAhcHf3MBUeiZly@B7<&fyd8(N6+4WgI)YTKk@$t!=UWL literal 0 HcmV?d00001 diff --git a/Icons/Gps_Marker.svg b/Icons/Gps_Marker.svg new file mode 100644 index 0000000..58f727a --- /dev/null +++ b/Icons/Gps_Marker.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/Icons/Grab.png b/Icons/Grab.png new file mode 100644 index 0000000000000000000000000000000000000000..ef003584fc6cfe6191b443cfb79e507910ca7355 GIT binary patch literal 3418 zcmV-g4W;slP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( 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 literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/aerodrome.p.16.png b/Icons/Mapnik/aerodrome.p.16.png new file mode 100644 index 0000000000000000000000000000000000000000..8f13cd76fe4397d87c335f5f9070c13fcb08743e GIT binary patch literal 377 zcmV-<0fzpGP)C6vgqM>$6#lM6_7z0SN@OPLnQHNh8<^K1d@2+9Vr7 zu*#zgpXFk=wGhNkOCOyGA~;Pd38acaVM&Ul$hWL+_FIs>)iC!zXU?5D^jLj`oh)J1#>7udl}5j4<6po|}AV5A7@=Ab!VPXd4N8-w=~$kG#R;0R|}k);>i zY&H*$;~kF0P;cwaVHU5&@cphpmP%N{BfP&2w274Q3P15#48NMc@CFBBsO8`o7O;m) zR8beh3Es+51)s3i6nKblvQ$L{Uy(44A)Mo>EG^^4zijl=%E1>r!=@Ona~F^CARqHa z3|smBFrH)g|3_@iI*JO>_%)r1c1j3A$?$-SQ3d(u9IEGZrNlsv4WMg4WH#+dsK+MQN$ThG# chiM860}nTYZP8lOI8cyzy85}Sb4q9e0G^v5O#lD@ literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/aiga_parking1.png b/Icons/Mapnik/aiga_parking1.png new file mode 100644 index 0000000000000000000000000000000000000000..641a3c9c6f99b08e78e5d659938a1227ef5d755c GIT binary patch literal 1542 zcmV+h2Ko7kP)A{{GcsX4<35(qkSZ@o-gHjo(qLS+|JI7NN9%wAu6 z<>?+je*8yyd3i+X#IM}6#eMK9$=FAy9efkszgF&_$nidEE)z#IwbLWn1`86*P0NUHz(c0Q7OYTD< z5CCr8ya}VxD0yC4Po#y?)zyWKjSWGuCX)%ZwY8|Lt3yFSf#4c;yB$}rUd4?YH_~l0 zHHnEqx7+;|5>GycLLnjqhr^Lp{?^u3vazuts0JZ~1cO0hG#W)eFSpzMHr15A>gez9 zM`dLt-o1M#DBfnXp{c1!(jHVT5CE2zmT>XnMSS`4MNs_Nvu7o(uX=$1u(-I0>({Rf zifwFcgkCS*)7FGQ;J>4+kpJoA=jWrOq(rj1nh_X}$1yiICn&b4s7SK9nh^*9v$L~; z;;6uVSX)~Y6er~@jiv;iJb6-3oZs)4tfr;}R#jCAiu3t=lGW6VK#t=C35>_%^c|Rr zyLay*FE8(_aW7xKL^vFltga>mUcP)8=g*%P6gxaTENN|33(U*Q!|mI*@!-J&LGgqT zjEsy(+Cx@MXIU&3!Pl}Z%c82P3Nh+Xjjl$(}3676MBJlhD@cDf3dcD}% z+LE!mucNrYSS*IVzCNYfNE^)^L^2H(C=x1ABvhbCs6dfWfg+&-MM4FNgbEZ16(|xa zP$X2KNT@)OP=O+$0!1S0d|-WjJs5^LFeY2pK1df?1-^g(Ue5Gc0o{c~LIsK>DNwK1 ztNX(!gY0&d6lgM;=+bQhF`Lby#CB4k)oPXR3nUuDZnp;$+ev{AhvSpf%QR^byHMTjTk7G`rAxuW!ouH^H|$q@|^WA0Hq8 zjSynn>q|%W`7weIA3jun{P^*QKp;>M3niRI?z{$sb>KXV+% s7Z(>lJaOX0Osd#@1yY1TFXcq?FJh#x_*a~Npa1{>07*qoM6N<$f>l}IssI20 literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/airport.p.16.png b/Icons/Mapnik/airport.p.16.png new file mode 100644 index 0000000000000000000000000000000000000000..d10f5c398c534d1754391e455900a2e3a5f790eb GIT binary patch literal 389 zcmV;00eb$4P)R5*>blRqy5aTv!x&)ta{nvj|d z46T+_B)ZiogvsO$h>=_e3yVku=|rxLmtbM(CRQ)v&RrKw2C-Bk$UO#)ChiZ3^t=8( z&*%A*{GhLKf;=bwbQ)s)qS(V^3|LA6jMQ>f3&^A)>4HC`kAh}UMW_Nr9DgwhlW3uv zBeae|H-0p@z%;hmEIh;uRE0)+9kdRNCN%6I9Psph%6|E+C#ZW_hU5xlz6-Wdy~L1N zlnKytkTqbg+twvCSE%LhzedaqjDX}24nZo|#Yt+VU6ecE8M}0ZU95l}GhC8px>_74ew%tqUePod~00000NkvXXu0mjf7_OoR literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/airport.png b/Icons/Mapnik/airport.png new file mode 100644 index 0000000000000000000000000000000000000000..88cef8aa653eefb83e02f3409435f1c703c90698 GIT binary patch literal 903 zcmeAS@N?(olHy`uVBq!ia0vp^d_c_2!3-oTqJ07w7?>FXd_r6sEQ|kx0Z@DtjE2BS z3ju!nrgcC+a~60+76bE#5C}6~x?A@LD5&e{;uumfCpm$InT?H&gZHsw;X@k(@ng)B scuv@`8A$U<7^WD0Sv0#RPybLTgWNNQc;^H0C7=-WboFyt=akR{01E3TuK)l5 literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/arrow.png b/Icons/Mapnik/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..ffbb1df313f30409a157ed02f7ab223f2f3b2440 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^UO>#j!3HGb95Tg#6icy_X9x!n)NrJ90QsB+9+AZi z3_9K*%(&Ec+Df3HWQl7;NpOBzNqJ&XDnogBxn5>oc5!lIL8@MUQTpt6Hc~)Edp%to zLp(Z@|NQ@Ne^^6-XU2-mh`5WUo4Ez$2-x@^^6&Q7vXrv`22>dyJ zK%vij-o%IhPyheW@+H2haiZhAi4z+?{;zLSj2Dowf)d)VA zW3oT)A^TMx`2>fcE+rNTNeS`)KR>D$-!i%T{fbGs0mG_gD<1MNn4B=~iQfKQ6zCBK MPgg&ebxsLQ05`OKU;qFB literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/arrow_back.png b/Icons/Mapnik/arrow_back.png new file mode 100644 index 0000000000000000000000000000000000000000..309ca5da4299fa393bdb9445890b74c515c0f868 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^UO>#j!3HGb95Tg#6icy_X9x!n)NrJ90QsB+9+AZi z3_9K*%(&Ec+Df3HWQl7;NpOBzNqJ&XDnogBxn5>oc5!lIL8@MUQTpt6Hc~)E_dH!3 zLp(a)PTAPSu@pVVJ5K3le>&sw%5E~(4sgU95p+K)?9xh@%} zMY9*5h>o~8L1%gTTeUB*Oxz?Gwwk;)S712RJjo=$TsXW}y!(ZE`BQzh%WkT_WH`6% z;OBH$wEO$^JB)rS9|u2=6*0=a(%XMAJX*+}`B4{(+v~@5;ry{*e_uD1@-?41;fem& uy*4Hq41!DS|GZ%n(tG~-ll#<|oeYtYHmo0BTfG4Kl)=;0&t;ucLK6UK0f|xo literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/atm.png b/Icons/Mapnik/atm.png new file mode 100644 index 0000000000000000000000000000000000000000..9a1dd5d2d59dbae082fd6e6397ffec38de1439ba GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMO!3HF|zN>u(Qk(@Ik;M!Qe1}1p@p%4<6rkV) zPZ!6KiaA>+UgT;};Bo!E>DRQXkB^sjc` z7q-6D-M{|9+NE>2-yiN1yq~IgC*#HM-3+a4HvCe(?C+O_GrMw_ckb@_d`J7Uz-s#m zix~{vCjWfo(B?7MQ{elYixF*aKBqtX!q4iFb;pzA>}1g$zWbm3kq%Pk2#OZ3@b%Zt To5a5Z=r#sVS3j3^P6mBmI3-5W(IS3410K25_ELMI--E7@Uu)Le3yh){gZP9^OawNBmuW$zf#5E-F&!$t;us5o?O`A-NN3Oz zz1A^;)kyBdQ=CU$u9(%YMgIqr)X!(;U0G?c&w9yM!W1l72I!Bos3#~S7$R>g2L zf`?H6vx*lv!#`}l9N_Sm9BcV>zr$u_ePrHvFVg4zj6t7U>Y)uI#vp{3w+h-g^!gHoo&eS_(8?=S}r9NzQ1-}9X3a7sFl z(3bRKSd*&>$rv`e8n727Fn)g z5u><`4IJVZRxyDqc!3M;S192w4)6*`v5ZZe!!|1T7I`GNj<=X8hoxSe3g~4FU>0Za z9ZzsJ4m-eLIO|EUhnx5lfc28t(aS0AE6QC-y72iXV904WNNX;h-wbpdZutm=%|E0Pr&A zGrY%x0^NUrDuy%r3;3N=Kk;wT{+UM5S9DTlH1Q7p0{G-Zlg%c0W&i*H07*qoM6N<$ Ef?*1>PXGV_ literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/bar.p.20.png b/Icons/Mapnik/bar.p.20.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0e48b967ffdbd25fb0624a106d5786d4999d3e GIT binary patch literal 459 zcmV;+0W|)JP)>C56#xJMZAnByR5*?8lT9l`VHk$5=ZubH&YZ}{ z!e`3H53sS2oqUa&#bje=!$J`e3(Z>OC)n9cvmlMeACMm)r6`n*niz~TA7>s53nOz3 zJH@qo>%Fh;x954`&mrZ9#jw+iSJ(r3028PIoR1N`2T_z45k0=LbCdBnUPU3m!f3EB zKq;xv0$hHopjZfP2&aL7F|@Itz4dMQ-qh?>&qxWH*h=OW0R@PK2|ksqxGIe$&m7xM zWzt_hxtx`7U02c56w1kU$enI4G&n}yJrKxB(T!{#@mwkAD+HJu3ALC~JQTQ7q*c)K zknK*z;^h4@UkU-1Cvd!?b*6B7W4oi}1E_>iO}MeoBS_j1xu_=lmhh+i3qP|oUe^!W zp{fJ(!&Y~-`@U-vjS}d5verac=j~4eWCWSrOup>?NVpntnhLo>LSfJ+x8vCEOr-_) zZ5WGUy4iYLjl7dD>03jQT&k44ofy`glX(f`uqAoByDx`7I;J!Gca%qfiUBxyLEqng6t)pzOL-od02(Cg;uXhum%b#dAc};NL)_- z^S@A>Iq$%c262a_>1%iN>u^0c3OfAZ;0qH5*R=vu_UQc*2C8Q8boFyt=akR{0FE>- AH~;_u literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/bus_stop.p.12.png b/Icons/Mapnik/bus_stop.p.12.png new file mode 100644 index 0000000000000000000000000000000000000000..f290dcb44a82c38a6a9edbd4f2ce6b05e025102e GIT binary patch literal 353 zcmV-n0iOPeP)k(7i51K^VsI-+Qu&C=@y+ zDc_Qw6WIrptuV@Ifq+T#HUwa8DYn^IWPJ{t@ zEdP>cRz!?xR}O#Y)Ebj^>)rg+8WVQw)8FGK8+%GbsmKHg00000NkvXXu0mjf0ceao literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/bus_stop.png b/Icons/Mapnik/bus_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..e75f6fbe8c176dc8a37c5d2f20e594342b876712 GIT binary patch literal 904 zcmV;319$w1P)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0R8~}0RHP3)Pev2010qNS#tmYMYjL|MYjPaOc>(;000Sga6xAP0015U000aC zfV+|I0008lNklce%b$H&sVo7UDHgLy4g6HA z@uuf7lFMbh9mo7!uQN3|ies7?ukP&dcNp^av11wAm6BgJHz^GdGuYP$z>^>Vh^ztI zcK4*@gX71!d+Ab-=&f6~xOV>t_7w@-h$B*ZKDH<&1sz z_%UBBEpfeE=G@pAiPn6+xJVF1P3x~P98qaXsaV7`j7+rAZqreU3D4`{)$MHtY#ZA& zdw4sJ8FAenw$tfg07onf(=cd;A?wX1`TqWv^~cth&_Jvd-}`8*C!myOYLa=37RMV7~ZRns0A;>Gm3De}L)@)lAt9yGyj>Ex6 z8pp9VI!YaV&vlusR(Uu(%ahx;xfldY<@1PFUKUuwE_-0{&`T2QfW@cEpbBD8*#ekGJQG^pk^zFOd>GZg@@9zu^@$3Ejlu9Kk zl?pPB(W|SR9UaZ|U5!#oTf@2B^@8JIn&u7P_o>(G*tSifQ2444MOnGKF!$v^)8XFpyq nz!1zME6eL}hjFPyKq}*kR5{zTov&8_)iHRw`njxgN@xNADCA61 literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/cafe.p.16.png b/Icons/Mapnik/cafe.p.16.png new file mode 100644 index 0000000000000000000000000000000000000000..836f8a540309d5726e38f3f0c225f13ee33b7ff8 GIT binary patch literal 361 zcmV-v0ha!WP)>C56#xJM3rR#lR5*>*&#_9wP!z`T|Cgq198}z# zeF`T9H|yZ!>*UU`E5uqBkoAfH$p%BJ3JfML&_@xFraXmPRAkyV zxX1$EJm+qQu0gvS2e*jDxzeDS0m=bK!0Ug2!K^3FWW1TvYS5kxy$AVGxI(d3QH%OiSaR zV#K8Bp;e(b!K>iGgEuLPD3yMMg5X6@egToTx1M_T?m;}5Qwts>huVlDMJNWkp-IK; z#$?~|kh)U4E9snu`MvKmznKwUHlEEz7SSEe@C_SuYS3hqf~I{_LZF< zeS$DfftaSjY9Xz`Owpq@U*`S&3fCr2rMs}UV6q&(-uap2Z@zUiC&>gD$^0`K;O(7q zlE1orF%#gX74xp)W;su66$I|ij9~<-#%bq6;)^~RR0f{o$xs4I~ajh6tlL~VQs5J z5XOi=b=+ez?_>i$E>wwixT)H1NV{ig_bj#D5Ew4;>*91e;Krpqt`Qs&n%x0UH(JS~ zXPYgW-2p~m%rnfL%_UlL#&`37@4gpWZcUv&(rGWWlnzVvhf}z#Uk(961dOlL+e7;b zjs0Kj_v{hCYQ4?XGag2u|3?xcVfoW@#4MpY!AU~sU|IeRw$PX|9C0Ev00000NkvXX Hu0mjfx?$;Y literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/chair_lift.png b/Icons/Mapnik/chair_lift.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0f4740e4ce971970daa9975356fb40df328c4b GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^azM<=!VDxA@H?IaQtTz3zOL*y*rkPenVcN0RDeR9 z1s;*b3=CW!K$y{KjmZq4AWOQVuOkD)#(wTUiL5}rL4Z$)E0Asg;|4I*0OU0^95`^G zp`qbFQ2al`e=r54fh-{K7gqBGiVKtk`2~Xo5Cp>mPv5$0#wN0>FVdQ&MBb@0L}|cZU6uP literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/christian3.p.14.png b/Icons/Mapnik/christian3.p.14.png new file mode 100644 index 0000000000000000000000000000000000000000..c420f7f50a3890c27b6ec4834d933ac6190a055f GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;7_BIEH9U zJbTG7iz!fm?Lq$L?9}D6gYp$_9MOKlBB$t7Bpv-xN$$Y4Q*N_EIt4Cx@iZlL)gIdQ zCV0as{=?GG&i?;@#$aU?&&Ni&XA|c|^%Ncxy1T1wxiu5-7I{UtiBmpFewtAJp-0)S zkmIYl&MKw*T|4uRa`>L`I#T{+;v-S!90T32e>!@u2k9gW$%IvKZuL$Hb-&U2eS3&? yVsvRm#p?gJksGF=saZwS(rQpVeij-igFqGERg@_7~ zYShw22U-=Wjmb>@?_L+R7$=ivrXYBh@4R!*J?}m4gZ~Src2PP!Rvib_jc(n|6QlH$ zqw=&&4XPn#=)Mi#e*XP(y{iNOeZ7qtMf9WCXMgBjQWX zKGAgofZ7~++mKyCwjC&|@J~Zr0Q~Q+LgH4$_6LX4$umFXU%E;Fkb9dmz!rlhcD3+I zMCO~2K2DJiUN6C#25-F2VxXg7y>i>oM(KD|A@)p;RW^2Q0I>Au;wKPKg~gUtLa86w z9VXt9bKr&y-l}mWqzOyPer>Es15z3f;`S)=hdH8O@WSL{)q!?3+FtTX>>Tc`=g9Aw z$%Hm}#2>CWrJybmCh8&1$k{qOUz}{!cQkqrja8n*8TRn+TE_=~Ob>&eZANME*z}c4 zE4k|)(KY0hP9P2^V{4{_0G`gv=E+$7SJEwMa*VuoGzX0Cf V6{zgB2`&Ht002ovPDHLkV1n7`Z_oe$ literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/cliff.png b/Icons/Mapnik/cliff.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc0528bc97c6d225e1842cedf39a417c254a3ff GIT binary patch literal 26214 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 KvgG*Xd;bT<^zthJ literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/cliff2.png b/Icons/Mapnik/cliff2.png new file mode 100644 index 0000000000000000000000000000000000000000..790c7ff0edf0eba7d9a9b6abd4b30fafd9b1652e GIT binary patch literal 26214 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 literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/communications.p.20.png b/Icons/Mapnik/communications.p.20.png new file mode 100644 index 0000000000000000000000000000000000000000..100042180bb53a56e454e2f0053ef47a77a9492f GIT binary patch literal 445 zcmV;u0Yd(XP)T)4xg_Q4|L7U)I~*_Q|$!UUR_$`PBwZ_E~$y25f?YZ!|z zvKYZr%-{iDlsW9gbpQ=4VhvyM1Pl0y$1%2(O)e7b-nS$7DmrTS#9#a5hY7*%OFHrX zJO0M=FQEyexJ(#GVjR!nel?0d$4TS{{jb{+`pX0f1)s~D-{BC|3|Etwg1nYDgcdQrh6Yzf1BXS~4yUgEgSMCosX&qD3i zQ5Wi3&kHW9Az>t@g(jWj8$J{zlnHJ|(S3XphIkJ1C3#5<;7AziEIwlIHiBR9Hs@{| n8#fUf!cM_`6}vYPyfyv-Y8W}go-^DF00000NkvXXu0mjf#j?Bn literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/danger.png b/Icons/Mapnik/danger.png new file mode 100644 index 0000000000000000000000000000000000000000..2f7b943f9154cd27d5c6b82f40c06509c0db329c GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1SGcvS$+jloCO|{#S9GGLLkg|>2BR0prDJV zi(^Q|oa7(HkIi}o4zIYl*sWj6HtS38ZTtB)%t|paUa`F9eHF!?90DB+kIc5_=vfxp kaKTLKq%%|@hk+Esj)=k literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/food_bar.p.16.png b/Icons/Mapnik/food_bar.p.16.png new file mode 100644 index 0000000000000000000000000000000000000000..da043fb931544696e9884a6d5d8897fa43f10a7b GIT binary patch literal 376 zcmV-;0f+vHP)>C56#xJM8c9S!R5*>zkv}g(VHC!H&+Dcx3uZ}4 z8sP&NB@&YsUqB=_o1|E}+FdEWfyGEPZ8uhl$--djR%s%QL~>nvkA=FD{xRX1&ig*k z`^!1+fxniL^>)r*mzcuL!!+79gvCbFIU-`a-mAWpK0Pl1FhmXG5Co#}Wq`!E8I6{+ zlVk@jdDt(9moaVusLN?BsDzoI5@t*)0QbOLu^ioX8=kqy|a{dHx0n{T4vqx2)I^|raOMsvf)(oydrEZUV0)DE03@9v(j0vViJiD1? zuv@O<7Phkfyu`5}{SmvtTB|`dy6p?dFZz?7V;2}QGz`STLg4W&g$0000^C@N#294^uJcp?g|2wIIEGmCUY)Sfk10^V^?Ys4rf)7DE()eQg1EuWa4!;#@QxrpYqK<0{zF}>FVdQ&MBb@06%ni A+yDRo literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/gate.png b/Icons/Mapnik/gate.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5f3b6838173848c41712218a0c389ed464e6f6 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c4!2~4Vp1;)tq&N#aB8wRqxP?HN@zUM8KR`hl zPZ!6KiaE(2zIfh0`#C?0qvZ>u06rN;hU+h6=T2jYN(HK8@O1TaS?83{1OOnL B9T)%r literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/gate2.png b/Icons/Mapnik/gate2.png new file mode 100644 index 0000000000000000000000000000000000000000..b33e55625952ef58e78759fec0c4252d8bf0adfb GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)Q!2~4PekAq-Db50q$YKTtZXpn6ymYtj4^U9i z)5S5QVovgp&%e!$K7IViIElyZ1_SdfEsjHL#Ue#n7#Wtna?unGf2adg%;4$j=d#Wz Gp$PzHc^#7g literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/glacier.png b/Icons/Mapnik/glacier.png new file mode 100644 index 0000000000000000000000000000000000000000..05727512e1192db270096d77ba8d3dda18101e9d GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^8bGYT!2~4VpI;jeq&N#aB8wRqxP?HN@zUM8KR`hp zPZ!6KiaBr38uBtQa4>K9`MsmL(}7LK_m}zQc^wftV%a5e8vr~ TiW^&ij$rU~^>bP0l+XkK9*;ve literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/grave_yard.png b/Icons/Mapnik/grave_yard.png new file mode 100644 index 0000000000000000000000000000000000000000..74995335bdf9482df810ad8444d4de21c6d76b10 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zu-yV-MprN24?sc564!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SRc)B=- zSoB_J~M4DD}DY&~On=mij7fg$w_V g^X=Q;e6KFVdQ&MBb@08n0RegFUf literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/halt.png b/Icons/Mapnik/halt.png new file mode 100644 index 0000000000000000000000000000000000000000..40852268950f04d2c7a8e7586753b06dd0c433bb GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1SHiab7}%9&H|6fVg?3oArNM~bhqvgP*A|r n#WAE}PV$PJI}GkTM+zA>DoHJTlbP0l+XkK62uh! literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/hospital.p.16.png b/Icons/Mapnik/hospital.p.16.png new file mode 100644 index 0000000000000000000000000000000000000000..dd4febf2bd3604768042a755497a7401b7dd1664 GIT binary patch literal 557 zcmV+|0@D47P)LlRsz_K^Vn<-|TMgBzS^< zKt&N_mMdZr2na$1EdoNoN;@rLBTCqq2!f5Ix=?l!r@m?(MG@D1XD&-Tvus}}0D!L-bbDv;g(|`}m?n+AXxZV*EQtSs^Jjj)wn^y+CT>Yk~Tjkzf0Jm9$ zb1r7JQloTBF$sXeNzm5q^kT^Lsa8ftX}mCG&H_)|)-dOi*`wG(YHDv+&}->h(I3$L z&=L)IbRekVA7n71#9biK8Un~t44)0jvGtSOOM*@|5x8JTUboP2;0U;H+XD2N1Lu9l z@23G(O3NvTgIV$kKBjvi<&hn%7S<4af=>W7%7?Z>2r2dpEFNa!S4RiE?4JfMhZK97 zofrdr0lvm00`Q*FfZ`1L1W!|6$5U2RYLrI>vs+2#VzlO<#^4>d*wes#p0P^1XT#4l v&)x1U*&(n!2C*RTBEHY{F&S-z_}}^sJo}h|Bl)k~00000NkvXXu0mjfS+Djf literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/hospital.png b/Icons/Mapnik/hospital.png new file mode 100644 index 0000000000000000000000000000000000000000..74a249c09dcbf8b4624d4a570ca83894a24941a0 GIT binary patch literal 491 zcmVd}r2?9r&)V@LT z1g5i0X`ezcN}4nx7O8F03gVw)=k)Z9(Zhj(V`u)4o!!|vCy9bN7XfXc1vG(%MW(<9 zFabtLn}W0ebgl-x0(D?vkf}u*<}vUI^pL&|^pb)@Mern83*H6QUF_JQYB_7uRI*q; zDT6%$hP0raMw38L&a>p+aO zEnfLQCT(%<-Y&51tu+=%%d25~=+c0#h|p)DEu2e$yQB2v;M=)l+&9wL7)=B#L2BnQ z%$?VzJ~VAASozXr{$Y`AHG5jmz}tzEAME=D7#B(o)&Qmm`hxkHS8={=_IYzb-xD5s zjC0k}bp~w=Ogu0mJoEw1U4N!QGcd-;+X(6r`Y|oBztprnq|GJ6A+dHE3X;o)!wtvR h%?E4|7@(zp0l${HvRy{X$WZ_Q002ovPDHLkV1kcV%n$$o literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/hotel2.p.20.png b/Icons/Mapnik/hotel2.p.20.png new file mode 100644 index 0000000000000000000000000000000000000000..a4411346ac28b3496f626e612da9278cc0868f44 GIT binary patch literal 368 zcmV-$0gwKPP)8yefA+TFoS|q7r+JN{3+l2%c0%Duq z&ifLA51{w}X+sJna3N`uE>$#$uJkII!OK?R1-hgj5jTL^+Qu%PmYB=I7x*-(Nq>nQ^#09CL*hhp zzDI3fH?KEpEE1j(6&7+$&Pmxu#2;+r{GddcJ1rCQO{Y{eYo>xIax5mk$nV&H+y>?e z0%!6fj**9dmqGf9Z;7K6|F97DXK*1It`)6c_^p_}9Oe`~o0b`> z!$f4Ki@>L-;avL&uWFT3#dt4~3O4YN2t6w5-BnCwI{w*aQGD$Zz9_!>46m{3ce_qg!^#Rh7S@)N@=~Hs$Kv9002ovPDHLkV1mJ%rzQXZ literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/jewish3.p.16.png b/Icons/Mapnik/jewish3.p.16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a11447d1b5ac797ef5fc07e3cc4d7434ab81c06 GIT binary patch literal 397 zcmV;80doF{P)nTP$H3?KlXo3vDGfOA}93`3Dc7Kg5Ii7C9w9W>|h4_kPHS`)t&U0+8Q zG^xymzySJjTHxN{xfJqC9OXowK^7UTh236E;BPe9z`8VnQ4Hd^Xz#O!lW$eadGp*s z4KKoeLke*Qi&()|e3zzB#|3_1KNld4G7Hga*nWyb>0%w=B=$C>Xzopr07wZW=>Px# literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/level_crossing.png b/Icons/Mapnik/level_crossing.png new file mode 100644 index 0000000000000000000000000000000000000000..5002f6de9de07f37c1067c8ba25215799c98a1d2 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j+1SGu;4zvI%&H|6fVg?3oArNM~bhqvgP*Bg) z#WAE}PVx#J{hz;IiyJX@888@bVre#TluJm|Q51*2-~G>wV`Hs) zuYzLefe=AaWH3F+L08tUBHASpDbW*Zz@Uw2P_!s2Xi=23$;z;T2zpQmJ!q3Hq9@ft zO3|^I`#&ujBW*@qcs7@N9^XCZ-g6I3uxKoY`VNGN^Yo4 zY;Zom7nA~`#R5$9S!f4aI|fgUnqgx)e$<(r04*q$c_D)sXld2F*y~4cbKN8D4j_{v z?nEB(q7-NtR7~^Ew>G3>l|_LA5z5TiDGSaEJs%eoB?E$s_36aS|9}7nF~c8m=9_{4 zN+~9WEiRXD%cO`81NKKTOa{!!%N_DT&?NDBJW!0P-bDNYg$H&3Cp-9w3$FrRurTm` zm*uSq)H60wJ(9xA=09EWx8#KxW$Fi?V&Lw3iz@R)g<{f%j{VL-qp zC$d|??iNm77eXbnbATTK>k3T=2^Do-8y)s)(vR;p5=f?vU%r2EGw`&asw=G53itIv zX3Y@3bXbka+6B>2!MEm4`k_bzKY2%X?fl5SoUvXo15_!(E0XJ$bi<4_GCf1g1!hV1 z1!GC&g8bF4H{?oAn|;;M~SDf$X}ORvUI-C~1yKeP6SiPCm##`!{aPdDu{0wkvS%u+N99_viX literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/london-tube-24.png b/Icons/Mapnik/london-tube-24.png new file mode 100644 index 0000000000000000000000000000000000000000..04c17956f70ec3c4d6d80bfa47d112aa1a7b9bbf GIT binary patch literal 621 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 literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/motorway_shield1.png b/Icons/Mapnik/motorway_shield1.png new file mode 100644 index 0000000000000000000000000000000000000000..40111a62a3916c00ae77a003aff17e4eb6114109 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2e8a!(h>5R2aAoEfzVs?5yJ63jmn zM7co>ZSKqLfsF6cm%OU``*8J@_xAq}MMwZa%8?%ukM?}o>S3C4aa*_iJNw@U4!Epx z%SpI0A<)@vfuar%5ctQ{Ce7IU@Q!Ja>HdEoLb=jTth!(Suhq8tb7X^0`x+(&hT|5}cn_Ql40p%1~Zju9umYU7Va)kgAtols@~NjTBH(t*47) zh(&L5&WzdwR%T{r3+CJdUSe!)Z3SUs%lH>D-SJ<)dkdRRE>6P%~H@wf+1zmn{ vU4Ea}VV#Jdzt8Xgke+YH9dMaRBZ8Abp-3go`JQJb&>;+-u6{1-oD!MhT|5}cn_Ql40p%1~Zju9umYU7Va)kgAtols@~NjTBH(g{O;S zh(~8~&Wzdxvl|;1wlw}*(9W9mv7XOtn*WzgUyrZ1-^0VhqpAZWc;>v(sXvvp_UFsg z%GZAm&;R%5@A2a<`rI2E15dl_%5SZ?@+t6iCR2n25bXQ^=kTSSFJ8D;MgDsJ-ac-| mQ(KTR_H}<3Mz3XKwPpA%BX^%sBt{wN1_n=8KbLh*2~7Y=3s|!N literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/motorway_shield4.png b/Icons/Mapnik/motorway_shield4.png new file mode 100644 index 0000000000000000000000000000000000000000..56d7ab81c3eed35980f3d6c7a58d41c6ac067cc5 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT=!3HEZI^Ek1q}Y|gW!U_%O?XxI14-? ziy0UgIY5{(GpgPRDA@1m;uzv_{Oz@ayo`Y&tq=e2`7Sh**Q{#>mxEbvl)%schs}SpL>mdKI;Vst0J5=F^#A|> literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/motorway_shield5.png b/Icons/Mapnik/motorway_shield5.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc5d35b1a79607a1d1ed1071631a873a7fa96dc GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^x6I7X*oh1%m zU|by`At7-nB65aZ2Umf;bjEc7ruFtUQ-A$^9xuVo%*@=}BO&iRXZpTt4%S@)5nJ9q zYX5!S&cJ|oi}MM_#eK`fB}z^99$2yXC99jPufD;njH*V(ml+KBB+$(r@ z%fY%$pyKbt)gsKyM=q|e`~Oq?+nclLjf`c&8xuqs-1jJ_wY04Z2D*>I)78&qol`;+ E0PWOC;Q#;t literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/motorway_shield6.png b/Icons/Mapnik/motorway_shield6.png new file mode 100644 index 0000000000000000000000000000000000000000..3ece3f0a231f0db055bb2bb071e944fd0d735b92 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^CO|C6!3HEJN%rRfscD`rjv*eM$vHD>6I7X*oh1%` zU|1a?At7-nB65aZ2Umf;bjI}nrnveaT3>&k-)|ts1_Y9Zc5N2=wQC#8L{t+lZtIqR zXaD=a0h0@S3(X|HUPxeHEGP9Q;fiy!Y)@6jhUP$i-ZFzXHb)K}IB?*@ldI}&H>J^5_ BPUrvt literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/mud.png b/Icons/Mapnik/mud.png new file mode 100644 index 0000000000000000000000000000000000000000..fe031f674234b206db8a37981d8d94409ff053af GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih7b4PE}WEN8L)YCnk=bY!9Qn!<;|&30c&;_| zYfreV-`+_v?B;kc#n7&4Hz|gl9Pg(XE_>R@kadUR9~g{6ieViqP?g0D7SXKAqFI&2 zD(29w%3>Bv7_Z9W;q3b3s*z%t!UdY>{jmObQ0@)OKfT}&;1fkzH@~tXDD?mU002ov JPDHLkV1k1giV6S# literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/nature_reserve.png b/Icons/Mapnik/nature_reserve.png new file mode 100644 index 0000000000000000000000000000000000000000..da01ec8b69f6d1a63849dde5b542599a221f4ad6 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^qChOc!2~2{y;hV5Qk(@Ik;M!Q+(IDCcM4vE9zFgp1)@~TQ9H5!w!wV1*HXlXSfM(kndGFTW8X~U}uxe k|H%*jHTLZf{Ojy$4>VQHZC%?OBcM?Xp00i_>zopr0EYi9{Qv*} literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/nature_reserve2.png b/Icons/Mapnik/nature_reserve2.png new file mode 100644 index 0000000000000000000000000000000000000000..c804a8e795665df911ec474c6773a06d289ef182 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^T0m^T!2~2AN@ikMD>td-$=!My~(( zjX)S3j3^P6C8|^$rq-fjvF97=3wqe0c6QtF@`g&OE~wSudAyrb99Uc2J^#^%`(1M3Q%>Jdw!Kp1e?;5rQ_lWhh9TVN5~OsK zmRP$Pw6bcx)jGAdu7N*x@!h!@!rDuO1$A@6n-B9gsGNVN{VygkZ&IJZI*s(FH$(Tc z#b-{PafCZ>f40FwjdHEJiCbKHgv39+`Fw)6VTSYaZ8a*fLef`LgPXl&_U{)y*AZM< z7Qt`EaA|H$-Co9fiyixZlsBX&y;bEbqd!amdY!@3)z4*} HQ$iB}5Q%uK literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/parking.png b/Icons/Mapnik/parking.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3ad06041a7054f9b45e509d9c52de0a0b9b56c GIT binary patch literal 409 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ z@c4l+V|{s#GEh*m#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDFy~cF;5rA z5R2ZWlQ()h1&SQ2KR++wV$u~Q6HAjVTefyNpFR7Rb=TIf{2k71-JO#kEttLd!W==5 zZYAEP{3?D`ftH#NN2XjaxO)9_;m0QVn0GtxTi!3{i|KQ_cC~?Bf%iyYGowi3o_#|0 z+FaK=)|>uX^_gwy?S!qH8{FjYt#!~^JF)cc|DN9(`M2eq7O`z!db~B|=r#V5{fQ~n zcS?EYP5NiG((xJdIxPY113$TW)SCA14>9@RYus8Ce&iyDO#9wBdcv|T555TaDHW8l zl#4gX-%R+gB_Wb`anMprEFw zi(^Q|oa7zF&-s|`dJgTpApc9g@P)c{F00004b3#c}2nYxW zd(?KjpZm-g7b?_x zuT(6uwYfR7@}bpAQfm*DQtD%+QrV~-9nA!%XJ@_C+Dr){UPB#j_~aI!Njws~1Qa0g zfkc(oF=@I0w3YY19VKSl+#TRu73WsThE+0O#rstdRn~TnvDTJ=p0L(F0%)_CJC66@ zoGStEBFnNifKHZjL1G2~0q`z>m;XSNq~F(`0J;F7nF~xigr+d z(;dumF6hU}aMGdCY^FkpXx6iaI!Y%1Knn2|#)bS2Q8f5D5*|7_7P&z8qv5D*44iXM z)4nJ z@c4l+V|{s#GEh*m#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWD=hPZ!4! zi{7^r9Jv}Cc$keJHPQ xFGTI_GQQLBzQ4kep=z0mR=?Q~=6eDgnDy-+Ov~^-)>- z^_QQm3w-lIdEJY}4Sc$73JZ?#UQJpezd&8i(V;CRSB3G%*1m@CVrs>qkq71%#!KIp meX`??&72D}wtv#EVx0DrFLKMHrSd=rFnGH9xvX1pV=I6J$}@~LNLn5|>fsU&JA1ysb~>FVdQ&MBb@0Oi;gjQ{`u literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/post_box.p.16.png b/Icons/Mapnik/post_box.p.16.png new file mode 100644 index 0000000000000000000000000000000000000000..3119cc135629b89585f14ed279fffa92d5b2557b GIT binary patch literal 367 zcmV-#0g(QQP)idy zac~hjDJ?oUIEY=m1?>go0<2eHC(*%naL@*HtKiKz*_gJG_#KBBNn$9jg70)VocB3@ z@aLuSAZTGPyjA}k0lpL>Sfq>N zvxhPy*u#xJoEuPg#k^J7Xd=itwjTAi@rvd*qlbvP5HaBr0QASnV-b>d)+0d;`r+)h zT3=luo5Ql2Vx)oXJWo@TDwv8$v#$0BpttMni!oi_OWM3(09eP0W-C`GZ4Jm0fXEI; zHheER%-{5VhlAuOiuEO^HDFK=P_zU!iDG?!+9^*KWj|>ETSdUX;1fusXQNuffN=l- N002ovPDHLkV1f?um;3+# literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/post_box.png b/Icons/Mapnik/post_box.png new file mode 100644 index 0000000000000000000000000000000000000000..87314974ec64484dc461a7735b805cf4577e0e23 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ z@c4l+V|{s#GEh*m#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWIZro-U3d z7QII=@AYL46kvJqUXk79`I!<&MwfGQEz}pWCAA3n?qD_YTF|0>KvHm$FozD)5rH3b zb1pO0X59;7Vz=b7QmmS(-uFMq}ZQS%-Dmpu}?Zm~`( zmOVG3<@l=_@ib2r!8B3tr#e=5?v|17kI?72QSsBUpel*R%#nLA+IQxJ&+PjijzHTWS4`3?6%vwifGArt=3`w7{mM29Ol>a{mt`#{!>v> zE3Wn95O!e)s(6X#c$lQwQqkX6f}5DYdraac?uGZQ7;g?n3sbYp^S_u%0X~D>IFHZe zWI=0i7H^X@yYM?fE3WNDj5fMGVEBP2IM^JFR!_|?zp1q1+CYfe#v{z(OOFNp*oQ%U0f*Z)Hc!up^ zxCJM0I>17@F2*o|p)lWunFtSX8&BnBt;LQ1#1)dP!}su^lND&iwPEbRr5<2eqj;C3 zS*Hp~n%xas$K>VpQU%8`l%!cl(VV1NTmF;W!2v`Cun+sgQ9mYWHd5U9ms)Xc1CGhd ks{2#sG$xWXTP*s20-Ek`#3Qth-T(jq07*qoM6N<$f>$x+lK=n! literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/post_office.png b/Icons/Mapnik/post_office.png new file mode 100644 index 0000000000000000000000000000000000000000..42d9054ff646df6a3f6fb18531df5fb8a1072e4c GIT binary patch literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ z@c4l+V|{s#GEh*m#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDFy~cDNh&2 z5R2ZmlNaVOIf}TRSJA$<(6Bpkqv+ZQ#|P}c7)6*BISRVnAN^$HS$0$2VXd-8kV|gl z=C&4jh0^UwWw(P~n59%tp6!$NuGaYd*=jeTbc1D#C5^v(72yvhab* z1$~=TsmZ_h%?@WhHb3U6<0poPywBz=ROwmZxc1wrlt)F}&pwx5`f`qOSIBC;#ezCw z8*Yk7&-RtzQ|yYl^yTEwHDAiOr*iSI8O%OdRhyTyHNmR&@x?4%IRP0FmLQRvcWUCJ z^p;voyOn#|Vq5jTeA7S`)B0c4ZWNL1>7FK_cBY+ zeCOyPc!||XrPONs!=O8!3a+af1Y#Pi1-#2A+)w+`Ipc|K2lMpCna1pG54Q=3_XR#J zzw?0Eze4uGj>F39_S-5ZicWi|Ds#xHXR^gF3Gwn3J5wt!d0JNpehadpEaktF(>)Q|Nr*PR&o2w{?@0|CD;C~&v|9QGQsrE&!576$%idW563ikD@T0(mV5i( bRZPFM4bUG=Ra=)z4*}Q$iB}<%}!5 literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/power_tower.png b/Icons/Mapnik/power_tower.png new file mode 100644 index 0000000000000000000000000000000000000000..2c963ad10f45560092d79959a97a90b10f00dea9 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j+1SGu;4zvI%&H|6fVg?3oArNM~bhqvgP*By= z#WAE}PI5+m_F)$ufmheRzZYl`Xf2rF$+p8Og)MLEjk8Bx80MQMl{^%EGzX}G!PC{x JWt~$(69DZtAuRv^ literal 0 HcmV?d00001 diff --git a/Icons/Mapnik/power_wind.png b/Icons/Mapnik/power_wind.png new file mode 100644 index 0000000000000000000000000000000000000000..29aeb7a0ba15d2f786c27d47cf62e15e48ce1377 GIT binary patch literal 638 zcmV-^0)hRBP) zb7eXpP<3K#X=6lhZDDC{3IM|#R_6c!0q;pfK~#90V+aTcVEF(4Kgsy#&z}skva$~t zPMtbMvgY5ve>2F)$UHPPH9bnQ=70bGF{r7jT@@D>e-1K;WCN_Nt@m+rbAS8v=@XdG z@csLDhOb}0f=wo*IWaMDIy*c2@3642#V|3jproYa6QIN|2?>d(1_lPF{Qdn`fec30 z{Nu+D27Z42j~*T#8;(l58ynjnR#w)(pip*ob=?9AaYIAHlTJ=f z+tFQx)v3RJ{bDFDFRuq_(AU>Lt*)+q(bCd#A2zi_1)P_c*K|%!&TpWwBFlh<3m47- z`v1A6rsgHG445)y%EGLyto@*X-nwjE>x+r>A#DQBmSx0i$+3(FTO3gzi`JR(c5IgYwP$_wR{!fp?tu5eYYm7i6bI z=P2is{7(EI$Tq+_-1;259s75(4KNNizRYaT{D)c^